MailPoet Newsletters (New) - Version 3.3.1

Version Description

  • 2017-12-14 =
  • Fixed: newsletter open/click rates are properly displayed in listings. Thanks to all who have reported the issue!
Download this release

Release Info

Developer wysija
Plugin Icon 128x128 MailPoet Newsletters (New)
Version 3.3.1
Comparing to
See all releases

Code changes from version 3.2.4 to 3.3.1

Files changed (248) hide show
  1. assets/js/{admin.dfed86f0.js → admin.2f3f63a4.js} +218 -200
  2. assets/js/{admin_vendor.8b1d6679.js → admin_vendor.ebb1a493.js} +170 -137
  3. assets/js/{mailpoet.0a2f113c.js → mailpoet.a5fa72ae.js} +7 -5
  4. assets/js/manifest.json +4 -4
  5. assets/js/{vendor.16d46c95.js → vendor.3c206dd6.js} +1 -1
  6. lang/mailpoet-ca.mo +0 -0
  7. lang/mailpoet-da_DK.mo +0 -0
  8. lang/mailpoet-de_DE.mo +0 -0
  9. lang/mailpoet-en_GB.mo +0 -0
  10. lang/mailpoet-es_ES.mo +0 -0
  11. lang/mailpoet-fa_IR.mo +0 -0
  12. lang/mailpoet-fr_CA.mo +0 -0
  13. lang/mailpoet-fr_FR.mo +0 -0
  14. lang/mailpoet-it_IT.mo +0 -0
  15. lang/mailpoet-ja.mo +0 -0
  16. lang/mailpoet-nl_NL.mo +0 -0
  17. lang/mailpoet-pl_PL.mo +0 -0
  18. lang/mailpoet-pt_BR.mo +0 -0
  19. lang/mailpoet-pt_PT.mo +0 -0
  20. lang/mailpoet-ru_RU.mo +0 -0
  21. lang/mailpoet-sq.mo +0 -0
  22. lang/mailpoet-sv_SE.mo +0 -0
  23. lang/mailpoet-tr_TR.mo +0 -0
  24. lang/mailpoet.pot +4 -4
  25. lib/Config/Localizer.php +11 -0
  26. lib/Config/Populator.php +2 -0
  27. mailpoet.php +3 -3
  28. readme.txt +9 -2
  29. vendor/autoload.php +1 -1
  30. vendor/bin/index.php +0 -0
  31. vendor/bin/security-checker +32 -0
  32. vendor/composer/autoload_classmap.php +117 -0
  33. vendor/composer/autoload_namespaces.php +1 -0
  34. vendor/composer/autoload_psr4.php +4 -0
  35. vendor/composer/autoload_real.php +7 -7
  36. vendor/composer/autoload_static.php +149 -5
  37. vendor/composer/ca-bundle/composer.json +54 -0
  38. vendor/composer/ca-bundle/index.php +0 -0
  39. vendor/composer/ca-bundle/res/cacert.pem +3646 -0
  40. vendor/composer/ca-bundle/res/index.php +0 -0
  41. vendor/composer/ca-bundle/src/CaBundle.php +308 -0
  42. vendor/composer/ca-bundle/src/index.php +0 -0
  43. vendor/composer/installed.json +282 -0
  44. vendor/psr/index.php +0 -0
  45. vendor/psr/log/.gitignore +1 -0
  46. vendor/psr/log/Psr/Log/AbstractLogger.php +128 -0
  47. vendor/psr/log/Psr/Log/InvalidArgumentException.php +7 -0
  48. vendor/psr/log/Psr/Log/LogLevel.php +18 -0
  49. vendor/psr/log/Psr/Log/LoggerAwareInterface.php +18 -0
  50. vendor/psr/log/Psr/Log/LoggerAwareTrait.php +26 -0
  51. vendor/psr/log/Psr/Log/LoggerInterface.php +123 -0
  52. vendor/psr/log/Psr/Log/LoggerTrait.php +140 -0
  53. vendor/psr/log/Psr/Log/NullLogger.php +28 -0
  54. vendor/psr/log/Psr/Log/Test/LoggerInterfaceTest.php +140 -0
  55. vendor/psr/log/Psr/Log/Test/index.php +0 -0
  56. vendor/psr/log/Psr/Log/index.php +0 -0
  57. vendor/psr/log/Psr/index.php +0 -0
  58. vendor/psr/log/composer.json +26 -0
  59. vendor/psr/log/index.php +0 -0
  60. vendor/sensiolabs/index.php +0 -0
  61. vendor/sensiolabs/security-checker/.gitignore +2 -0
  62. vendor/sensiolabs/security-checker/SensioLabs/Security/Command/SecurityCheckerCommand.php +114 -0
  63. vendor/sensiolabs/security-checker/SensioLabs/Security/Command/index.php +0 -0
  64. vendor/sensiolabs/security-checker/SensioLabs/Security/Crawler/BaseCrawler.php +106 -0
  65. vendor/sensiolabs/security-checker/SensioLabs/Security/Crawler/CrawlerInterface.php +31 -0
  66. vendor/sensiolabs/security-checker/SensioLabs/Security/Crawler/CurlCrawler.php +98 -0
  67. vendor/sensiolabs/security-checker/SensioLabs/Security/Crawler/DefaultCrawler.php +49 -0
  68. vendor/sensiolabs/security-checker/SensioLabs/Security/Crawler/FileGetContentsCrawler.php +89 -0
  69. vendor/sensiolabs/security-checker/SensioLabs/Security/Crawler/index.php +0 -0
  70. vendor/sensiolabs/security-checker/SensioLabs/Security/Exception/ExceptionInterface.php +16 -0
  71. vendor/sensiolabs/security-checker/SensioLabs/Security/Exception/HttpException.php +16 -0
  72. vendor/sensiolabs/security-checker/SensioLabs/Security/Exception/RuntimeException.php +16 -0
  73. vendor/sensiolabs/security-checker/SensioLabs/Security/Exception/index.php +0 -0
  74. vendor/sensiolabs/security-checker/SensioLabs/Security/Formatters/FormatterInterface.php +26 -0
  75. vendor/sensiolabs/security-checker/SensioLabs/Security/Formatters/JsonFormatter.php +33 -0
  76. vendor/sensiolabs/security-checker/SensioLabs/Security/Formatters/SimpleFormatter.php +68 -0
  77. vendor/sensiolabs/security-checker/SensioLabs/Security/Formatters/TextFormatter.php +60 -0
  78. vendor/sensiolabs/security-checker/SensioLabs/Security/Formatters/index.php +0 -0
  79. vendor/sensiolabs/security-checker/SensioLabs/Security/Resources/index.php +0 -0
  80. vendor/sensiolabs/security-checker/SensioLabs/Security/Resources/security.sensiolabs.org.crt +25 -0
  81. vendor/sensiolabs/security-checker/SensioLabs/Security/SecurityChecker.php +69 -0
  82. vendor/sensiolabs/security-checker/SensioLabs/Security/index.php +0 -0
  83. vendor/sensiolabs/security-checker/SensioLabs/index.php +0 -0
  84. vendor/sensiolabs/security-checker/box.json +25 -0
  85. vendor/sensiolabs/security-checker/composer.json +24 -0
  86. vendor/sensiolabs/security-checker/index.php +0 -0
  87. vendor/sensiolabs/security-checker/security-checker +32 -0
  88. vendor/symfony/console/.gitignore +3 -0
  89. vendor/symfony/console/Application.php +1134 -0
  90. vendor/symfony/console/Command/Command.php +645 -0
  91. vendor/symfony/console/Command/HelpCommand.php +81 -0
  92. vendor/symfony/console/Command/ListCommand.php +90 -0
  93. vendor/symfony/console/Command/LockableTrait.php +63 -0
  94. vendor/symfony/console/Command/index.php +0 -0
  95. vendor/symfony/console/ConsoleEvents.php +60 -0
  96. vendor/symfony/console/DependencyInjection/AddConsoleCommandPass.php +56 -0
  97. vendor/symfony/console/DependencyInjection/index.php +0 -0
  98. vendor/symfony/console/Descriptor/ApplicationDescription.php +152 -0
  99. vendor/symfony/console/Descriptor/Descriptor.php +107 -0
  100. vendor/symfony/console/Descriptor/DescriptorInterface.php +31 -0
  101. vendor/symfony/console/Descriptor/JsonDescriptor.php +168 -0
  102. vendor/symfony/console/Descriptor/MarkdownDescriptor.php +182 -0
  103. vendor/symfony/console/Descriptor/TextDescriptor.php +342 -0
  104. vendor/symfony/console/Descriptor/XmlDescriptor.php +251 -0
  105. vendor/symfony/console/Descriptor/index.php +0 -0
  106. vendor/symfony/console/Event/ConsoleCommandEvent.php +60 -0
  107. vendor/symfony/console/Event/ConsoleErrorEvent.php +83 -0
  108. vendor/symfony/console/Event/ConsoleEvent.php +67 -0
  109. vendor/symfony/console/Event/ConsoleExceptionEvent.php +71 -0
  110. vendor/symfony/console/Event/ConsoleTerminateEvent.php +58 -0
  111. vendor/symfony/console/Event/index.php +0 -0
  112. vendor/symfony/console/EventListener/ErrorListener.php +91 -0
  113. vendor/symfony/console/EventListener/index.php +0 -0
  114. vendor/symfony/console/Exception/CommandNotFoundException.php +43 -0
  115. vendor/symfony/console/Exception/ExceptionInterface.php +21 -0
  116. vendor/symfony/console/Exception/InvalidArgumentException.php +19 -0
  117. vendor/symfony/console/Exception/InvalidOptionException.php +21 -0
  118. vendor/symfony/console/Exception/LogicException.php +19 -0
  119. vendor/symfony/console/Exception/RuntimeException.php +19 -0
  120. vendor/symfony/console/Exception/index.php +0 -0
  121. vendor/symfony/console/Formatter/OutputFormatter.php +242 -0
  122. vendor/symfony/console/Formatter/OutputFormatterInterface.php +71 -0
  123. vendor/symfony/console/Formatter/OutputFormatterStyle.php +219 -0
  124. vendor/symfony/console/Formatter/OutputFormatterStyleInterface.php +62 -0
  125. vendor/symfony/console/Formatter/OutputFormatterStyleStack.php +109 -0
  126. vendor/symfony/console/Formatter/index.php +0 -0
  127. vendor/symfony/console/Helper/DebugFormatterHelper.php +127 -0
  128. vendor/symfony/console/Helper/DescriptorHelper.php +94 -0
  129. vendor/symfony/console/Helper/FormatterHelper.php +106 -0
  130. vendor/symfony/console/Helper/Helper.php +138 -0
  131. vendor/symfony/console/Helper/HelperInterface.php +39 -0
  132. vendor/symfony/console/Helper/HelperSet.php +108 -0
  133. vendor/symfony/console/Helper/InputAwareHelper.php +33 -0
  134. vendor/symfony/console/Helper/ProcessHelper.php +144 -0
  135. vendor/symfony/console/Helper/ProgressBar.php +617 -0
  136. vendor/symfony/console/Helper/ProgressIndicator.php +271 -0
  137. vendor/symfony/console/Helper/QuestionHelper.php +461 -0
  138. vendor/symfony/console/Helper/SymfonyQuestionHelper.php +120 -0
  139. vendor/symfony/console/Helper/Table.php +695 -0
  140. vendor/symfony/console/Helper/TableCell.php +76 -0
  141. vendor/symfony/console/Helper/TableSeparator.php +25 -0
  142. vendor/symfony/console/Helper/TableStyle.php +258 -0
  143. vendor/symfony/console/Helper/index.php +0 -0
  144. vendor/symfony/console/Input/ArgvInput.php +351 -0
  145. vendor/symfony/console/Input/ArrayInput.php +206 -0
  146. vendor/symfony/console/Input/Input.php +203 -0
  147. vendor/symfony/console/Input/InputArgument.php +129 -0
  148. vendor/symfony/console/Input/InputAwareInterface.php +28 -0
  149. vendor/symfony/console/Input/InputDefinition.php +402 -0
  150. vendor/symfony/console/Input/InputInterface.php +157 -0
  151. vendor/symfony/console/Input/InputOption.php +208 -0
  152. vendor/symfony/console/Input/StreamableInputInterface.php +37 -0
  153. vendor/symfony/console/Input/StringInput.php +72 -0
  154. vendor/symfony/console/Input/index.php +0 -0
  155. vendor/symfony/console/Logger/ConsoleLogger.php +119 -0
  156. vendor/symfony/console/Logger/index.php +0 -0
  157. vendor/symfony/console/Output/BufferedOutput.php +45 -0
  158. vendor/symfony/console/Output/ConsoleOutput.php +152 -0
  159. vendor/symfony/console/Output/ConsoleOutputInterface.php +30 -0
  160. vendor/symfony/console/Output/NullOutput.php +123 -0
  161. vendor/symfony/console/Output/Output.php +175 -0
  162. vendor/symfony/console/Output/OutputInterface.php +114 -0
  163. vendor/symfony/console/Output/StreamOutput.php +103 -0
  164. vendor/symfony/console/Output/index.php +0 -0
  165. vendor/symfony/console/Question/ChoiceQuestion.php +189 -0
  166. vendor/symfony/console/Question/ConfirmationQuestion.php +59 -0
  167. vendor/symfony/console/Question/Question.php +246 -0
  168. vendor/symfony/console/Question/index.php +0 -0
  169. vendor/symfony/console/Resources/bin/hiddeninput.exe +0 -0
  170. vendor/symfony/console/Resources/bin/index.php +0 -0
  171. vendor/symfony/console/Resources/index.php +0 -0
  172. vendor/symfony/console/Style/OutputStyle.php +155 -0
  173. vendor/symfony/console/Style/StyleInterface.php +154 -0
  174. vendor/symfony/console/Style/SymfonyStyle.php +429 -0
  175. vendor/symfony/console/Style/index.php +0 -0
  176. vendor/symfony/console/Terminal.php +137 -0
  177. vendor/symfony/console/Tester/ApplicationTester.php +176 -0
  178. vendor/symfony/console/Tester/CommandTester.php +156 -0
  179. vendor/symfony/console/Tester/index.php +0 -0
  180. vendor/symfony/console/Tests/ApplicationTest.php +1493 -0
  181. vendor/symfony/console/Tests/Command/CommandTest.php +434 -0
  182. vendor/symfony/console/Tests/Command/HelpCommandTest.php +71 -0
  183. vendor/symfony/console/Tests/Command/ListCommandTest.php +113 -0
  184. vendor/symfony/console/Tests/Command/LockableTraitTest.php +59 -0
  185. vendor/symfony/console/Tests/Command/index.php +0 -0
  186. vendor/symfony/console/Tests/DependencyInjection/AddConsoleCommandPassTest.php +123 -0
  187. vendor/symfony/console/Tests/DependencyInjection/index.php +0 -0
  188. vendor/symfony/console/Tests/Descriptor/AbstractDescriptorTest.php +107 -0
  189. vendor/symfony/console/Tests/Descriptor/JsonDescriptorTest.php +35 -0
  190. vendor/symfony/console/Tests/Descriptor/MarkdownDescriptorTest.php +45 -0
  191. vendor/symfony/console/Tests/Descriptor/ObjectsProvider.php +82 -0
  192. vendor/symfony/console/Tests/Descriptor/TextDescriptorTest.php +53 -0
  193. vendor/symfony/console/Tests/Descriptor/XmlDescriptorTest.php +27 -0
  194. vendor/symfony/console/Tests/Descriptor/index.php +0 -0
  195. vendor/symfony/console/Tests/EventListener/ErrorListenerTest.php +156 -0
  196. vendor/symfony/console/Tests/EventListener/index.php +0 -0
  197. vendor/symfony/console/Tests/Fixtures/BarBucCommand.php +11 -0
  198. vendor/symfony/console/Tests/Fixtures/DescriptorApplication1.php +18 -0
  199. vendor/symfony/console/Tests/Fixtures/DescriptorApplication2.php +26 -0
  200. vendor/symfony/console/Tests/Fixtures/DescriptorApplicationMbString.php +24 -0
  201. vendor/symfony/console/Tests/Fixtures/DescriptorCommand1.php +27 -0
  202. vendor/symfony/console/Tests/Fixtures/DescriptorCommand2.php +32 -0
  203. vendor/symfony/console/Tests/Fixtures/DescriptorCommand3.php +27 -0
  204. vendor/symfony/console/Tests/Fixtures/DescriptorCommand4.php +25 -0
  205. vendor/symfony/console/Tests/Fixtures/DescriptorCommandMbString.php +32 -0
  206. vendor/symfony/console/Tests/Fixtures/DummyOutput.php +36 -0
  207. vendor/symfony/console/Tests/Fixtures/Foo1Command.php +26 -0
  208. vendor/symfony/console/Tests/Fixtures/Foo2Command.php +21 -0
  209. vendor/symfony/console/Tests/Fixtures/Foo3Command.php +29 -0
  210. vendor/symfony/console/Tests/Fixtures/Foo4Command.php +11 -0
  211. vendor/symfony/console/Tests/Fixtures/Foo5Command.php +10 -0
  212. vendor/symfony/console/Tests/Fixtures/Foo6Command.php +12 -0
  213. vendor/symfony/console/Tests/Fixtures/FooCommand.php +33 -0
  214. vendor/symfony/console/Tests/Fixtures/FooLock2Command.php +28 -0
  215. vendor/symfony/console/Tests/Fixtures/FooLockCommand.php +27 -0
  216. vendor/symfony/console/Tests/Fixtures/FooOptCommand.php +36 -0
  217. vendor/symfony/console/Tests/Fixtures/FooSubnamespaced1Command.php +26 -0
  218. vendor/symfony/console/Tests/Fixtures/FooSubnamespaced2Command.php +26 -0
  219. vendor/symfony/console/Tests/Fixtures/FoobarCommand.php +25 -0
  220. vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/command/command_0.php +11 -0
  221. vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/command/command_1.php +13 -0
  222. vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/command/command_10.php +17 -0
  223. vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/command/command_11.php +12 -0
  224. vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/command/command_12.php +13 -0
  225. vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/command/command_13.php +14 -0
  226. vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/command/command_14.php +17 -0
  227. vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/command/command_15.php +14 -0
  228. vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/command/command_16.php +15 -0
  229. vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/command/command_17.php +13 -0
  230. vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/command/command_2.php +16 -0
  231. vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/command/command_3.php +12 -0
  232. vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/command/command_4.php +34 -0
  233. vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/command/command_5.php +37 -0
  234. vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/command/command_6.php +16 -0
  235. vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/command/command_7.php +15 -0
  236. vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/command/command_8.php +26 -0
  237. vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/command/command_9.php +11 -0
  238. vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/command/index.php +0 -0
  239. vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/command/interactive_command_1.php +19 -0
  240. vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/index.php +0 -0
  241. vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/output/index.php +0 -0
  242. vendor/symfony/console/Tests/Fixtures/Style/index.php +0 -0
  243. vendor/symfony/console/Tests/Fixtures/TestCommand.php +28 -0
  244. vendor/symfony/console/Tests/Fixtures/application_1.json +156 -0
  245. vendor/symfony/console/Tests/Fixtures/application_1.xml +104 -0
  246. vendor/symfony/console/Tests/Fixtures/application_2.json +509 -0
  247. vendor/symfony/console/Tests/Fixtures/application_2.xml +254 -0
  248. vendor/symfony/console/Tests/Fixtures/command_1.json +0 -0
assets/js/{admin.dfed86f0.js → admin.2f3f63a4.js} RENAMED
@@ -92,7 +92,7 @@ webpackJsonp([0],{
92
 
93
  var messages = {
94
  onTrash: function onTrash(response) {
95
- var count = ~ ~response.meta.count;
96
  var message = null;
97
 
98
  if (count === 1) {
@@ -103,7 +103,7 @@ webpackJsonp([0],{
103
  _mailpoet2['default'].Notice.success(message);
104
  },
105
  onDelete: function onDelete(response) {
106
- var count = ~ ~response.meta.count;
107
  var message = null;
108
 
109
  if (count === 1) {
@@ -114,7 +114,7 @@ webpackJsonp([0],{
114
  _mailpoet2['default'].Notice.success(message);
115
  },
116
  onRestore: function onRestore(response) {
117
- var count = ~ ~response.meta.count;
118
  var message = null;
119
 
120
  if (count === 1) {
@@ -150,7 +150,7 @@ webpackJsonp([0],{
150
  }
151
  };
152
 
153
- var bulk_actions = [{
154
  name: 'moveToList',
155
  label: _mailpoet2['default'].I18n.t('moveToList'),
156
  onSelect: function onSelect() {
@@ -167,11 +167,11 @@ webpackJsonp([0],{
167
  },
168
  getData: function getData() {
169
  return {
170
- segment_id: ~ ~(0, _jquery2['default'])('#move_to_segment').val()
171
  };
172
  },
173
  onSuccess: function onSuccess(response) {
174
- _mailpoet2['default'].Notice.success(_mailpoet2['default'].I18n.t('multipleSubscribersMovedToList').replace('%$1d', (~ ~response.meta.count).toLocaleString()).replace('%$2s', response.meta.segment));
175
  }
176
  }, {
177
  name: 'addToList',
@@ -190,11 +190,11 @@ webpackJsonp([0],{
190
  },
191
  getData: function getData() {
192
  return {
193
- segment_id: ~ ~(0, _jquery2['default'])('#add_to_segment').val()
194
  };
195
  },
196
  onSuccess: function onSuccess(response) {
197
- _mailpoet2['default'].Notice.success(_mailpoet2['default'].I18n.t('multipleSubscribersAddedToList').replace('%$1d', (~ ~response.meta.count).toLocaleString()).replace('%$2s', response.meta.segment));
198
  }
199
  }, {
200
  name: 'removeFromList',
@@ -213,23 +213,23 @@ webpackJsonp([0],{
213
  },
214
  getData: function getData() {
215
  return {
216
- segment_id: ~ ~(0, _jquery2['default'])('#remove_from_segment').val()
217
  };
218
  },
219
  onSuccess: function onSuccess(response) {
220
- _mailpoet2['default'].Notice.success(_mailpoet2['default'].I18n.t('multipleSubscribersRemovedFromList').replace('%$1d', (~ ~response.meta.count).toLocaleString()).replace('%$2s', response.meta.segment));
221
  }
222
  }, {
223
  name: 'removeFromAllLists',
224
  label: _mailpoet2['default'].I18n.t('removeFromAllLists'),
225
  onSuccess: function onSuccess(response) {
226
- _mailpoet2['default'].Notice.success(_mailpoet2['default'].I18n.t('multipleSubscribersRemovedFromAllLists').replace('%$1d', (~ ~response.meta.count).toLocaleString()));
227
  }
228
  }, {
229
  name: 'sendConfirmationEmail',
230
  label: _mailpoet2['default'].I18n.t('resendConfirmationEmail'),
231
  onSuccess: function onSuccess(response) {
232
- _mailpoet2['default'].Notice.success(_mailpoet2['default'].I18n.t('multipleConfirmationEmailsSent').replace('%$1d', (~ ~response.meta.count).toLocaleString()));
233
  }
234
  }, {
235
  name: 'trash',
@@ -237,7 +237,7 @@ webpackJsonp([0],{
237
  onSuccess: messages.onTrash
238
  }];
239
 
240
- var item_actions = [{
241
  name: 'edit',
242
  label: _mailpoet2['default'].I18n.t('edit'),
243
  link: function link(subscriber) {
@@ -250,17 +250,17 @@ webpackJsonp([0],{
250
  }, {
251
  name: 'trash',
252
  display: function display(subscriber) {
253
- return !!(~ ~subscriber.wp_user_id === 0);
254
  }
255
  }];
256
 
257
  var SubscriberList = _react2['default'].createClass({
258
  displayName: 'SubscriberList',
259
 
260
- getSegmentFromId: function getSegmentFromId(segment_id) {
261
  var result = false;
262
- window.mailpoet_segments.map(function (segment) {
263
- if (segment.id === segment_id) {
264
  result = segment;
265
  }
266
  });
@@ -269,7 +269,7 @@ webpackJsonp([0],{
269
  renderItem: function renderItem(subscriber, actions) {
270
  var _this = this;
271
 
272
- var row_classes = (0, _classnames2['default'])('manage-column', 'column-primary', 'has-row-actions', 'column-username');
273
 
274
  var status = '';
275
 
@@ -289,6 +289,10 @@ webpackJsonp([0],{
289
  case 'bounced':
290
  status = _mailpoet2['default'].I18n.t('bounced');
291
  break;
 
 
 
 
292
  }
293
 
294
  var segments = false;
@@ -296,20 +300,20 @@ webpackJsonp([0],{
296
  // Subscriptions
297
  if (subscriber.subscriptions.length > 0) {
298
  (function () {
299
- var subscribed_segments = [];
300
 
301
- subscriber.subscriptions.map(function (subscription) {
302
  var segment = _this.getSegmentFromId(subscription.segment_id);
303
  if (segment === false) return;
304
  if (subscription.status === 'subscribed') {
305
- subscribed_segments.push(segment.name);
306
  }
307
  });
308
 
309
  segments = _react2['default'].createElement(
310
  'span',
311
  null,
312
- subscribed_segments.join(', ')
313
  );
314
  })();
315
  }
@@ -319,7 +323,7 @@ webpackJsonp([0],{
319
  null,
320
  _react2['default'].createElement(
321
  'td',
322
- { className: row_classes },
323
  _react2['default'].createElement(
324
  'strong',
325
  null,
@@ -413,8 +417,8 @@ webpackJsonp([0],{
413
  endpoint: 'subscribers',
414
  onRenderItem: this.renderItem,
415
  columns: columns,
416
- bulk_actions: bulk_actions,
417
- item_actions: item_actions,
418
  messages: messages,
419
  sort_by: 'created_at',
420
  sort_order: 'desc'
@@ -449,21 +453,21 @@ webpackJsonp([0],{
449
  label: MailPoet.I18n.t('email'),
450
  type: 'text',
451
  disabled: function disabled(subscriber) {
452
- return ~ ~(subscriber.wp_user_id > 0);
453
  }
454
  }, {
455
  name: 'first_name',
456
  label: MailPoet.I18n.t('firstname'),
457
  type: 'text',
458
  disabled: function disabled(subscriber) {
459
- return ~ ~(subscriber.wp_user_id > 0);
460
  }
461
  }, {
462
  name: 'last_name',
463
  label: MailPoet.I18n.t('lastname'),
464
  type: 'text',
465
  disabled: function disabled(subscriber) {
466
- return ~ ~(subscriber.wp_user_id > 0);
467
  }
468
  }, {
469
  name: 'status',
@@ -476,7 +480,7 @@ webpackJsonp([0],{
476
  bounced: MailPoet.I18n.t('bounced')
477
  },
478
  filter: function filter(subscriber, value) {
479
- if (~ ~subscriber.wp_user_id > 0 && value === 'unconfirmed') {
480
  return false;
481
  }
482
  return true;
@@ -494,14 +498,14 @@ webpackJsonp([0],{
494
  return null;
495
  }
496
 
497
- return subscriber.subscriptions.map(function (subscription) {
498
- if (subscription.status === 'subscribed') {
499
- return subscription.segment_id;
500
- }
501
  });
502
  },
503
  filter: function filter(segment) {
504
- return !!(!segment.deleted_at && segment.type === 'default');
505
  },
506
  getLabel: function getLabel(segment) {
507
  return segment.name + ' (' + segment.subscribers + ')';
@@ -510,13 +514,13 @@ webpackJsonp([0],{
510
  var label = '';
511
 
512
  if (subscriber.subscriptions !== undefined) {
513
- subscriber.subscriptions.map(function (subscription) {
514
  if (segment.id === subscription.segment_id) {
515
  label = segment.name;
516
 
517
  if (subscription.status === 'unsubscribed') {
518
- var unsubscribed_at = MailPoet.Date.format(subscription.updated_at);
519
- label += ' (%$1s)'.replace('%$1s', MailPoet.I18n.t('unsubscribedOn').replace('%$1s', unsubscribed_at));
520
  }
521
  }
522
  });
@@ -525,23 +529,23 @@ webpackJsonp([0],{
525
  }
526
  }];
527
 
528
- var custom_fields = window.mailpoet_custom_fields || [];
529
- custom_fields.map(function (custom_field) {
530
  var field = {
531
- name: 'cf_' + custom_field.id,
532
- label: custom_field.name,
533
- type: custom_field.type
534
  };
535
- if (custom_field.params) {
536
- field.params = custom_field.params;
537
  }
538
 
539
- if (custom_field.params.values) {
540
- field.values = custom_field.params.values;
541
  }
542
 
543
  // add placeholders for selects (date, select)
544
- switch (custom_field.type) {
545
  case 'date':
546
  field.year_placeholder = MailPoet.I18n.t('year');
547
  field.month_placeholder = MailPoet.I18n.t('month');
@@ -551,6 +555,10 @@ webpackJsonp([0],{
551
  case 'select':
552
  field.placeholder = '-';
553
  break;
 
 
 
 
554
  }
555
 
556
  fields.push(field);
@@ -569,7 +577,7 @@ webpackJsonp([0],{
569
  };
570
 
571
  var beforeFormContent = function beforeFormContent(subscriber) {
572
- if (~ ~subscriber.wp_user_id > 0) {
573
  return React.createElement(
574
  'p',
575
  { className: 'description' },
@@ -585,6 +593,7 @@ webpackJsonp([0],{
585
  })
586
  );
587
  }
 
588
  };
589
 
590
  var afterFormContent = function afterFormContent() {
@@ -709,10 +718,10 @@ webpackJsonp([0],{
709
  var container = document.getElementById('newsletters_container');
710
 
711
  if (container) {
712
- var extra_routes = [];
713
- extra_routes = _wpJsHooks2['default'].applyFilters('mailpoet_newsletters_before_router', extra_routes);
714
 
715
- var mailpoet_listing = _reactDom2['default'].render(_react2['default'].createElement(
716
  _reactRouter.Router,
717
  { history: history },
718
  _react2['default'].createElement(
@@ -729,13 +738,13 @@ webpackJsonp([0],{
729
  _react2['default'].createElement(_reactRouter.Route, { path: 'new/notification', component: _newslettersTypesNotificationNotificationJsx2['default'] }),
730
  _react2['default'].createElement(_reactRouter.Route, { name: 'template', path: 'template/:id', component: _newslettersTemplatesJsx2['default'] }),
731
  _react2['default'].createElement(_reactRouter.Route, { path: 'send/:id', component: _newslettersSendJsx2['default'] }),
732
- extra_routes.map(function (rt) {
733
  return _react2['default'].createElement(_reactRouter.Route, { key: rt.path, path: rt.path, component: rt.component });
734
  })
735
  )
736
  ), container);
737
 
738
- window.mailpoet_listing = mailpoet_listing;
739
  }
740
  /* Listings */ /* Newsletter: type selection */ /* New newsletter: types */ /* Template selection */ /* Sending options */ /* Extra routes */
741
 
@@ -971,6 +980,7 @@ webpackJsonp([0],{
971
  };
972
 
973
  reader.readAsText(file);
 
974
  },
975
  render: function render() {
976
  return _react2['default'].createElement(
@@ -10466,10 +10476,10 @@ webpackJsonp([0],{
10466
  return true;
10467
  },
10468
  render: function render() {
10469
- var isPaused = this.state.item.status == 'sending' && this.state.item.queue && this.state.item.queue.status == 'paused';
10470
  var fields = this.state.fields.map(function (field) {
10471
  var newField = field;
10472
- if (field.name == 'segments' || field.name == 'options') {
10473
  newField.disabled = isPaused;
10474
  }
10475
  return newField;
@@ -10574,10 +10584,10 @@ webpackJsonp([0],{
10574
  getLabel: function getLabel(segment) {
10575
  return segment.name + ' (' + parseInt(segment.subscribers, 10).toLocaleString() + ')';
10576
  },
10577
- transformChangedValue: function transformChangedValue(segment_ids) {
10578
- var all_segments = this.state.items;
10579
- return _.map(segment_ids, function (id) {
10580
- return _.find(all_segments, function (segment) {
10581
  return segment.id === id;
10582
  });
10583
  });
@@ -10946,7 +10956,7 @@ webpackJsonp([0],{
10946
  },
10947
  propagateChange: function propagateChange() {
10948
  if (this.props.onChange) {
10949
- return this.props.onChange({
10950
  target: {
10951
  name: this.props.name || '',
10952
  value: this.getDateTime()
@@ -11083,10 +11093,10 @@ webpackJsonp([0],{
11083
  getLabel: function getLabel(segment) {
11084
  return segment.name + ' (' + parseInt(segment.subscribers, 10).toLocaleString() + ')';
11085
  },
11086
- transformChangedValue: function transformChangedValue(segment_ids) {
11087
- var all_segments = this.state.items;
11088
- return _.map(segment_ids, function (id) {
11089
- return _.find(all_segments, function (segment) {
11090
  return segment.id === id;
11091
  });
11092
  });
@@ -11420,11 +11430,11 @@ webpackJsonp([0],{
11420
 
11421
  var _newslettersListingsMixinsJsx = __webpack_require__(530);
11422
 
11423
- var mailpoet_tracking_enabled = !!window.mailpoet_tracking_enabled;
11424
 
11425
  var messages = {
11426
  onTrash: function onTrash(response) {
11427
- var count = ~ ~response.meta.count;
11428
  var message = null;
11429
 
11430
  if (count === 1) {
@@ -11435,7 +11445,7 @@ webpackJsonp([0],{
11435
  _mailpoet2['default'].Notice.success(message);
11436
  },
11437
  onDelete: function onDelete(response) {
11438
- var count = ~ ~response.meta.count;
11439
  var message = null;
11440
 
11441
  if (count === 1) {
@@ -11446,7 +11456,7 @@ webpackJsonp([0],{
11446
  _mailpoet2['default'].Notice.success(message);
11447
  },
11448
  onRestore: function onRestore(response) {
11449
- var count = ~ ~response.meta.count;
11450
  var message = null;
11451
 
11452
  if (count === 1) {
@@ -11471,14 +11481,14 @@ webpackJsonp([0],{
11471
  }, {
11472
  name: 'statistics',
11473
  label: _mailpoet2['default'].I18n.t('statistics'),
11474
- display: mailpoet_tracking_enabled
11475
  }, {
11476
  name: 'sent_at',
11477
  label: _mailpoet2['default'].I18n.t('sentOn'),
11478
  sortable: true
11479
  }];
11480
 
11481
- var bulk_actions = [{
11482
  name: 'trash',
11483
  label: _mailpoet2['default'].I18n.t('moveToTrash'),
11484
  onSuccess: messages.onTrash
@@ -11488,7 +11498,7 @@ webpackJsonp([0],{
11488
  var redirectToEditing = function redirectToEditing() {
11489
  window.location.href = '?page=mailpoet-newsletter-editor&id=' + newsletter.id;
11490
  };
11491
- if (!newsletter.queue || newsletter.status != 'sending' || newsletter.queue.status !== null) {
11492
  redirectToEditing();
11493
  } else {
11494
  (0, _reactConfirmAlert.confirmAlert)({
@@ -11501,7 +11511,7 @@ webpackJsonp([0],{
11501
  }
11502
  };
11503
 
11504
- var newsletter_actions = [{
11505
  name: 'view',
11506
  link: function link(newsletter) {
11507
  return _react2['default'].createElement(
@@ -11541,7 +11551,7 @@ webpackJsonp([0],{
11541
  }];
11542
 
11543
  _wpJsHooks2['default'].addFilter('mailpoet_newsletters_listings_standard_actions', _newslettersListingsMixinsJsx.StatisticsMixin.addStatsCTAAction);
11544
- newsletter_actions = _wpJsHooks2['default'].applyFilters('mailpoet_newsletters_listings_standard_actions', newsletter_actions);
11545
 
11546
  var NewsletterListStandard = _react2['default'].createClass({
11547
  displayName: 'NewsletterListStandard',
@@ -11587,7 +11597,7 @@ webpackJsonp([0],{
11587
  { className: 'column', 'data-colname': _mailpoet2['default'].I18n.t('lists') },
11588
  segments
11589
  ),
11590
- mailpoet_tracking_enabled === true ? _react2['default'].createElement(
11591
  'td',
11592
  { className: 'column', 'data-colname': _mailpoet2['default'].I18n.t('statistics') },
11593
  this.renderStatistics(newsletter, undefined, meta.current_time)
@@ -11632,8 +11642,8 @@ webpackJsonp([0],{
11632
  base_url: 'standard',
11633
  onRenderItem: this.renderItem,
11634
  columns: columns,
11635
- bulk_actions: bulk_actions,
11636
- item_actions: newsletter_actions,
11637
  messages: messages,
11638
  auto_refresh: true,
11639
  sort_by: 'sent_at',
@@ -11810,14 +11820,14 @@ webpackJsonp([0],{
11810
  }
11811
  });
11812
  },
11813
- renderQueueStatus: function renderQueueStatus(newsletter, mailer_log) {
11814
  if (!newsletter.queue) {
11815
  return _react2['default'].createElement(
11816
  'span',
11817
  null,
11818
  _mailpoet2['default'].I18n.t('notSentYet')
11819
  );
11820
- } else if (mailer_log.status === 'paused' && newsletter.queue.status !== 'completed') {
11821
  return _react2['default'].createElement(
11822
  'span',
11823
  null,
@@ -11879,12 +11889,12 @@ webpackJsonp([0],{
11879
  );
11880
  }
11881
 
11882
- var progress_bar_width = 0;
11883
 
11884
  if (isNaN(percentage)) {
11885
  percentage = _mailpoet2['default'].I18n.t('noSubscribers');
11886
  } else {
11887
- progress_bar_width = percentage;
11888
  percentage += '%';
11889
  }
11890
 
@@ -11896,7 +11906,7 @@ webpackJsonp([0],{
11896
  { className: progressClasses },
11897
  _react2['default'].createElement('span', {
11898
  className: 'mailpoet_progress_bar',
11899
- style: { width: progress_bar_width + '%' }
11900
  }),
11901
  _react2['default'].createElement(
11902
  'span',
@@ -11918,8 +11928,8 @@ webpackJsonp([0],{
11918
  };
11919
 
11920
  var StatisticsMixin = {
11921
- renderStatistics: function renderStatistics(newsletter, is_sent, current_time) {
11922
- var sent = is_sent;
11923
  if (sent === undefined) {
11924
  // condition for standard and post notification listings
11925
  sent = newsletter.statistics && newsletter.queue && newsletter.queue.status !== 'scheduled';
@@ -11937,50 +11947,50 @@ webpackJsonp([0],{
11937
  params = _wpJsHooks2['default'].applyFilters('mailpoet_newsletters_listing_stats_before', params, newsletter);
11938
 
11939
  // welcome emails provide explicit total_sent value
11940
- var total_sent = ~ ~(newsletter.total_sent || newsletter.queue.count_processed);
11941
 
11942
- var percentage_clicked = 0;
11943
- var percentage_opened = 0;
11944
- var percentage_unsubscribed = 0;
11945
 
11946
- if (total_sent > 0) {
11947
- percentage_clicked = newsletter.statistics.clicked * 100 / total_sent;
11948
- percentage_opened = newsletter.statistics.opened * 100 / total_sent;
11949
- percentage_unsubscribed = newsletter.statistics.unsubscribed * 100 / total_sent;
11950
  }
11951
 
11952
  // format to 1 decimal place
11953
- var percentage_clicked_display = _mailpoet2['default'].Num.toLocaleFixed(percentage_clicked, 1);
11954
- var percentage_opened_display = _mailpoet2['default'].Num.toLocaleFixed(percentage_opened, 1);
11955
- var percentage_unsubscribed_display = _mailpoet2['default'].Num.toLocaleFixed(percentage_unsubscribed, 1);
11956
-
11957
- var show_stats_timeout = undefined;
11958
- var newsletter_date = undefined;
11959
- var sent_hours_ago = undefined;
11960
- var too_early_for_stats = undefined;
11961
- var show_kb_link = undefined;
11962
- if (current_time !== undefined) {
11963
  // standard emails and post notifications:
11964
  // display green box for newsletters that were just sent
11965
- show_stats_timeout = 6; // in hours
11966
- newsletter_date = newsletter.queue.scheduled_at || newsletter.queue.created_at;
11967
- sent_hours_ago = (0, _moment2['default'])(current_time).diff((0, _moment2['default'])(newsletter_date), 'hours');
11968
- too_early_for_stats = sent_hours_ago < show_stats_timeout;
11969
- show_kb_link = true;
11970
  } else {
11971
  // welcome emails: no green box and KB link
11972
- too_early_for_stats = false;
11973
- show_kb_link = false;
11974
  }
11975
 
11976
  var improveStatsKBLink = 'http://beta.docs.mailpoet.com/article/191-how-to-improve-my-open-and-click-rates';
11977
 
11978
  // thresholds to display badges
11979
- var min_newsletters_sent = 20;
11980
- var min_newsletter_opens = 5;
11981
 
11982
  var content = undefined;
11983
- if (total_sent >= min_newsletters_sent && newsletter.statistics.opened >= min_newsletter_opens && !too_early_for_stats) {
11984
  // display stats with badges
11985
  content = _react2['default'].createElement(
11986
  'div',
@@ -11991,12 +12001,12 @@ webpackJsonp([0],{
11991
  _react2['default'].createElement(
11992
  'span',
11993
  null,
11994
- percentage_opened_display,
11995
  '% '
11996
  ),
11997
  _react2['default'].createElement(_newslettersBadgesStatsJsx2['default'], {
11998
  stat: 'opened',
11999
- rate: percentage_opened,
12000
  tooltipId: 'opened-' + newsletter.id
12001
  })
12002
  ),
@@ -12006,12 +12016,12 @@ webpackJsonp([0],{
12006
  _react2['default'].createElement(
12007
  'span',
12008
  null,
12009
- percentage_clicked_display,
12010
  '% '
12011
  ),
12012
  _react2['default'].createElement(_newslettersBadgesStatsJsx2['default'], {
12013
  stat: 'clicked',
12014
- rate: percentage_clicked,
12015
  tooltipId: 'clicked-' + newsletter.id
12016
  })
12017
  ),
@@ -12021,7 +12031,7 @@ webpackJsonp([0],{
12021
  _react2['default'].createElement(
12022
  'span',
12023
  { className: 'mailpoet_stat_hidden' },
12024
- percentage_unsubscribed_display,
12025
  '%'
12026
  )
12027
  )
@@ -12034,36 +12044,36 @@ webpackJsonp([0],{
12034
  _react2['default'].createElement(
12035
  'span',
12036
  { className: 'mailpoet_stats_text' },
12037
- percentage_opened_display,
12038
  '%,',
12039
  ' ',
12040
- percentage_clicked_display,
12041
  '%',
12042
  _react2['default'].createElement(
12043
  'span',
12044
  { className: 'mailpoet_stat_hidden' },
12045
  ', ',
12046
- percentage_unsubscribed_display,
12047
  '%'
12048
  )
12049
  ),
12050
- too_early_for_stats && _react2['default'].createElement(
12051
  'div',
12052
  { className: 'mailpoet_badge mailpoet_badge_green' },
12053
- _mailpoet2['default'].I18n.t('checkBackInHours').replace('%$1d', show_stats_timeout - sent_hours_ago)
12054
  )
12055
  );
12056
  }
12057
 
12058
  // thresholds to display bad open rate help
12059
- var max_percentage_opened = 5;
12060
- var min_sent_hours_ago = 24;
12061
- var min_total_sent = 10;
12062
 
12063
- var after_content = undefined;
12064
- if (show_kb_link && percentage_opened < max_percentage_opened && sent_hours_ago >= min_sent_hours_ago && total_sent >= min_total_sent) {
12065
  // help link for bad open rate
12066
- after_content = _react2['default'].createElement(
12067
  'div',
12068
  null,
12069
  _react2['default'].createElement(
@@ -12078,7 +12088,7 @@ webpackJsonp([0],{
12078
  );
12079
  }
12080
 
12081
- if (total_sent > 0 && params.link) {
12082
  // wrap content in a link
12083
  if (params.externalLink) {
12084
  return _react2['default'].createElement(
@@ -12093,7 +12103,7 @@ webpackJsonp([0],{
12093
  },
12094
  content
12095
  ),
12096
- after_content
12097
  );
12098
  }
12099
  return _react2['default'].createElement(
@@ -12108,7 +12118,7 @@ webpackJsonp([0],{
12108
  },
12109
  content
12110
  ),
12111
- after_content
12112
  );
12113
  }
12114
 
@@ -12116,7 +12126,7 @@ webpackJsonp([0],{
12116
  'div',
12117
  null,
12118
  content,
12119
- after_content
12120
  );
12121
  },
12122
  addStatsCTAAction: function addStatsCTAAction(actions) {
@@ -12134,8 +12144,8 @@ webpackJsonp([0],{
12134
  },
12135
  display: function display(newsletter) {
12136
  // welcome emails provide explicit total_sent value
12137
- var count_processed = newsletter.queue && newsletter.queue.count_processed;
12138
- return ~ ~(newsletter.total_sent || count_processed) > 0;
12139
  }
12140
  });
12141
  return actions;
@@ -12163,8 +12173,8 @@ webpackJsonp([0],{
12163
  }
12164
  },
12165
  getMailerError: function getMailerError(state) {
12166
- var mailer_error_notice = undefined;
12167
- var mailer_check_settings_notice = (0, _reactStringReplace2['default'])(_mailpoet2['default'].I18n.t('mailerCheckSettingsNotice'), /\[link\](.*?)\[\/link\]/g, function (match) {
12168
  return _react2['default'].createElement(
12169
  'a',
12170
  { href: '?page=mailpoet-settings#mta', key: 'check-sending' },
@@ -12172,12 +12182,12 @@ webpackJsonp([0],{
12172
  );
12173
  });
12174
  if (state.meta.mta_log.error.operation === 'send') {
12175
- mailer_error_notice = _mailpoet2['default'].I18n.t('mailerSendErrorNotice').replace('%$1s', state.meta.mta_method).replace('%$2s', state.meta.mta_log.error.error_message);
12176
  } else {
12177
- mailer_error_notice = _mailpoet2['default'].I18n.t('mailerConnectionErrorNotice').replace('%$1s', state.meta.mta_log.error.error_message);
12178
  }
12179
  if (state.meta.mta_log.error.error_code) {
12180
- mailer_error_notice += ' ' + _mailpoet2['default'].I18n.t('mailerErrorCode').replace('%$1s', state.meta.mta_log.error.error_code);
12181
  }
12182
  return _react2['default'].createElement(
12183
  'div',
@@ -12185,12 +12195,12 @@ webpackJsonp([0],{
12185
  _react2['default'].createElement(
12186
  'p',
12187
  null,
12188
- mailer_error_notice
12189
  ),
12190
  _react2['default'].createElement(
12191
  'p',
12192
  null,
12193
- mailer_check_settings_notice
12194
  ),
12195
  _react2['default'].createElement(
12196
  'p',
@@ -12270,13 +12280,13 @@ webpackJsonp([0],{
12270
 
12271
  var _wpJsHooks2 = _interopRequireDefault(_wpJsHooks);
12272
 
12273
- var mailpoet_roles = window.mailpoet_roles || {};
12274
- var mailpoet_segments = window.mailpoet_segments || {};
12275
- var mailpoet_tracking_enabled = !!window.mailpoet_tracking_enabled;
12276
 
12277
  var messages = {
12278
  onTrash: function onTrash(response) {
12279
- var count = ~ ~response.meta.count;
12280
  var message = null;
12281
 
12282
  if (count === 1) {
@@ -12287,7 +12297,7 @@ webpackJsonp([0],{
12287
  _mailpoet2['default'].Notice.success(message);
12288
  },
12289
  onDelete: function onDelete(response) {
12290
- var count = ~ ~response.meta.count;
12291
  var message = null;
12292
 
12293
  if (count === 1) {
@@ -12298,7 +12308,7 @@ webpackJsonp([0],{
12298
  _mailpoet2['default'].Notice.success(message);
12299
  },
12300
  onRestore: function onRestore(response) {
12301
- var count = ~ ~response.meta.count;
12302
  var message = null;
12303
 
12304
  if (count === 1) {
@@ -12324,20 +12334,20 @@ webpackJsonp([0],{
12324
  }, {
12325
  name: 'statistics',
12326
  label: _mailpoet2['default'].I18n.t('statistics'),
12327
- display: mailpoet_tracking_enabled
12328
  }, {
12329
  name: 'updated_at',
12330
  label: _mailpoet2['default'].I18n.t('lastModifiedOn'),
12331
  sortable: true
12332
  }];
12333
 
12334
- var bulk_actions = [{
12335
  name: 'trash',
12336
  label: _mailpoet2['default'].I18n.t('moveToTrash'),
12337
  onSuccess: messages.onTrash
12338
  }];
12339
 
12340
- var newsletter_actions = [{
12341
  name: 'view',
12342
  link: function link(newsletter) {
12343
  return _react2['default'].createElement(
@@ -12360,7 +12370,7 @@ webpackJsonp([0],{
12360
  }];
12361
 
12362
  _wpJsHooks2['default'].addFilter('mailpoet_newsletters_listings_welcome_notification_actions', _newslettersListingsMixinsJsx.StatisticsMixin.addStatsCTAAction);
12363
- newsletter_actions = _wpJsHooks2['default'].applyFilters('mailpoet_newsletters_listings_welcome_notification_actions', newsletter_actions);
12364
 
12365
  var NewsletterListWelcome = _react2['default'].createClass({
12366
  displayName: 'NewsletterListWelcome',
@@ -12378,7 +12388,7 @@ webpackJsonp([0],{
12378
  endpoint: 'newsletters',
12379
  action: 'setStatus',
12380
  data: {
12381
- id: ~ ~e.target.getAttribute('data-id'),
12382
  status: e.target.value
12383
  }
12384
  }).done(function (response) {
@@ -12395,7 +12405,7 @@ webpackJsonp([0],{
12395
  });
12396
  },
12397
  renderStatus: function renderStatus(newsletter) {
12398
- var total_sent = _mailpoet2['default'].I18n.t('sentToXSubscribers').replace('%$1d', newsletter.total_sent.toLocaleString());
12399
 
12400
  return _react2['default'].createElement(
12401
  'div',
@@ -12425,7 +12435,7 @@ webpackJsonp([0],{
12425
  _react2['default'].createElement(
12426
  'p',
12427
  null,
12428
- total_sent
12429
  )
12430
  );
12431
  },
@@ -12441,14 +12451,14 @@ webpackJsonp([0],{
12441
  if (newsletter.options.role === 'mailpoet_all') {
12442
  sendingEvent = _mailpoet2['default'].I18n.t('welcomeEventWPUserAnyRole');
12443
  } else {
12444
- sendingEvent = _mailpoet2['default'].I18n.t('welcomeEventWPUserWithRole').replace('%$1s', mailpoet_roles[newsletter.options.role]);
12445
  }
12446
  break;
12447
 
12448
- case 'segment':
12449
  // get segment
12450
- segment = _underscore2['default'].find(mailpoet_segments, function (seg) {
12451
- return ~ ~seg.id === ~ ~newsletter.options.segment;
12452
  });
12453
 
12454
  if (segment === undefined) {
@@ -12478,6 +12488,10 @@ webpackJsonp([0],{
12478
  case 'weeks':
12479
  sendingDelay = _mailpoet2['default'].I18n.t('sendingDelayWeeks').replace('%$1d', newsletter.options.afterTimeNumber);
12480
  break;
 
 
 
 
12481
  }
12482
  sendingEvent += ' [' + sendingDelay + ']';
12483
  }
@@ -12524,7 +12538,7 @@ webpackJsonp([0],{
12524
  { className: 'column', 'data-colname': _mailpoet2['default'].I18n.t('settings') },
12525
  this.renderSettings(newsletter)
12526
  ),
12527
- mailpoet_tracking_enabled === true ? _react2['default'].createElement(
12528
  'td',
12529
  { className: 'column', 'data-colname': _mailpoet2['default'].I18n.t('statistics') },
12530
  this.renderStatistics(newsletter, newsletter.total_sent > 0 && newsletter.statistics)
@@ -12565,8 +12579,8 @@ webpackJsonp([0],{
12565
  base_url: 'welcome',
12566
  onRenderItem: this.renderItem,
12567
  columns: columns,
12568
- bulk_actions: bulk_actions,
12569
- item_actions: newsletter_actions,
12570
  messages: messages,
12571
  auto_refresh: true,
12572
  sort_by: 'updated_at',
@@ -12616,7 +12630,7 @@ webpackJsonp([0],{
12616
 
12617
  var messages = {
12618
  onTrash: function onTrash(response) {
12619
- var count = ~ ~response.meta.count;
12620
  var message = null;
12621
 
12622
  if (count === 1) {
@@ -12627,7 +12641,7 @@ webpackJsonp([0],{
12627
  _mailpoet2['default'].Notice.success(message);
12628
  },
12629
  onDelete: function onDelete(response) {
12630
- var count = ~ ~response.meta.count;
12631
  var message = null;
12632
 
12633
  if (count === 1) {
@@ -12638,7 +12652,7 @@ webpackJsonp([0],{
12638
  _mailpoet2['default'].Notice.success(message);
12639
  },
12640
  onRestore: function onRestore(response) {
12641
- var count = ~ ~response.meta.count;
12642
  var message = null;
12643
 
12644
  if (count === 1) {
@@ -12671,13 +12685,13 @@ webpackJsonp([0],{
12671
  sortable: true
12672
  }];
12673
 
12674
- var bulk_actions = [{
12675
  name: 'trash',
12676
  label: _mailpoet2['default'].I18n.t('moveToTrash'),
12677
  onSuccess: messages.onTrash
12678
  }];
12679
 
12680
- var newsletter_actions = [{
12681
  name: 'view',
12682
  link: function link(newsletter) {
12683
  return _react2['default'].createElement(
@@ -12737,7 +12751,7 @@ webpackJsonp([0],{
12737
  endpoint: 'newsletters',
12738
  action: 'setStatus',
12739
  data: {
12740
- id: ~ ~e.target.getAttribute('data-id'),
12741
  status: e.target.value
12742
  }
12743
  }).done(function (response) {
@@ -12812,6 +12826,10 @@ webpackJsonp([0],{
12812
  case 'immediately':
12813
  sendingFrequency = _mailpoet2['default'].I18n.t('sendImmediately');
12814
  break;
 
 
 
 
12815
  }
12816
 
12817
  return _react2['default'].createElement(
@@ -12823,7 +12841,7 @@ webpackJsonp([0],{
12823
  );
12824
  },
12825
  renderHistoryLink: function renderHistoryLink(newsletter) {
12826
- var childrenCount = ~ ~newsletter.children_count;
12827
  if (childrenCount === 0) {
12828
  return _mailpoet2['default'].I18n.t('notSentYet');
12829
  }
@@ -12909,8 +12927,8 @@ webpackJsonp([0],{
12909
  base_url: 'notification',
12910
  onRenderItem: this.renderItem,
12911
  columns: columns,
12912
- bulk_actions: bulk_actions,
12913
- item_actions: newsletter_actions,
12914
  messages: messages,
12915
  auto_refresh: true,
12916
  sort_by: 'updated_at',
@@ -12960,7 +12978,7 @@ webpackJsonp([0],{
12960
 
12961
  var _newslettersListingsMixinsJsx = __webpack_require__(530);
12962
 
12963
- var mailpoet_tracking_enabled = !!window.mailpoet_tracking_enabled;
12964
 
12965
  var columns = [{
12966
  name: 'subject',
@@ -12974,13 +12992,13 @@ webpackJsonp([0],{
12974
  }, {
12975
  name: 'statistics',
12976
  label: _mailpoet2['default'].I18n.t('statistics'),
12977
- display: mailpoet_tracking_enabled
12978
  }, {
12979
  name: 'sent_at',
12980
  label: _mailpoet2['default'].I18n.t('sentOn')
12981
  }];
12982
 
12983
- var newsletter_actions = [{
12984
  name: 'view',
12985
  link: function link(newsletter) {
12986
  return _react2['default'].createElement(
@@ -12992,7 +13010,7 @@ webpackJsonp([0],{
12992
  }];
12993
 
12994
  _wpJsHooks2['default'].addFilter('mailpoet_newsletters_listings_notification_history_actions', _newslettersListingsMixinsJsx.StatisticsMixin.addStatsCTAAction);
12995
- newsletter_actions = _wpJsHooks2['default'].applyFilters('mailpoet_newsletters_listings_notification_history_actions', newsletter_actions);
12996
 
12997
  var NewsletterListNotificationHistory = _react2['default'].createClass({
12998
  displayName: 'NewsletterListNotificationHistory',
@@ -13035,7 +13053,7 @@ webpackJsonp([0],{
13035
  { className: 'column', 'data-colname': _mailpoet2['default'].I18n.t('lists') },
13036
  segments
13037
  ),
13038
- mailpoet_tracking_enabled === true ? _react2['default'].createElement(
13039
  'td',
13040
  { className: 'column', 'data-colname': _mailpoet2['default'].I18n.t('statistics') },
13041
  this.renderStatistics(newsletter, undefined, meta.current_time)
@@ -13080,7 +13098,7 @@ webpackJsonp([0],{
13080
  base_url: 'notification/history/:parent_id',
13081
  onRenderItem: this.renderItem,
13082
  columns: columns,
13083
- item_actions: newsletter_actions,
13084
  auto_refresh: true,
13085
  sort_by: 'sent_at',
13086
  sort_order: 'desc',
@@ -13202,7 +13220,7 @@ webpackJsonp([0],{
13202
 
13203
  var messages = {
13204
  onTrash: function onTrash(response) {
13205
- var count = ~ ~response.meta.count;
13206
  var message = null;
13207
 
13208
  if (count === 1) {
@@ -13213,7 +13231,7 @@ webpackJsonp([0],{
13213
  _mailpoet2['default'].Notice.success(message);
13214
  },
13215
  onDelete: function onDelete(response) {
13216
- var count = ~ ~response.meta.count;
13217
  var message = null;
13218
 
13219
  if (count === 1) {
@@ -13224,7 +13242,7 @@ webpackJsonp([0],{
13224
  _mailpoet2['default'].Notice.success(message);
13225
  },
13226
  onRestore: function onRestore(response) {
13227
- var count = ~ ~response.meta.count;
13228
  var message = null;
13229
 
13230
  if (count === 1) {
@@ -13236,13 +13254,13 @@ webpackJsonp([0],{
13236
  }
13237
  };
13238
 
13239
- var bulk_actions = [{
13240
  name: 'trash',
13241
  label: _mailpoet2['default'].I18n.t('moveToTrash'),
13242
  onSuccess: messages.onTrash
13243
  }];
13244
 
13245
- var item_actions = [{
13246
  name: 'edit',
13247
  link: function link(item) {
13248
  return _react2['default'].createElement(
@@ -13339,22 +13357,22 @@ webpackJsonp([0],{
13339
  renderItem: function renderItem(segment, actions) {
13340
  var rowClasses = (0, _classnames2['default'])('manage-column', 'column-primary', 'has-row-actions');
13341
 
13342
- var subscribed = ~ ~(segment.subscribers_count.subscribed || 0);
13343
- var unconfirmed = ~ ~(segment.subscribers_count.unconfirmed || 0);
13344
- var unsubscribed = ~ ~(segment.subscribers_count.unsubscribed || 0);
13345
- var bounced = ~ ~(segment.subscribers_count.bounced || 0);
13346
 
13347
- var segment_name = undefined;
13348
 
13349
  if (segment.type === 'wp_users') {
13350
  // the WP users segment is not editable so just display its name
13351
- segment_name = _react2['default'].createElement(
13352
  'span',
13353
  { className: 'row-title' },
13354
  segment.name
13355
  );
13356
  } else {
13357
- segment_name = _react2['default'].createElement(
13358
  _reactRouter.Link,
13359
  {
13360
  className: 'row-title',
@@ -13373,7 +13391,7 @@ webpackJsonp([0],{
13373
  _react2['default'].createElement(
13374
  'strong',
13375
  null,
13376
- segment_name
13377
  ),
13378
  actions
13379
  ),
@@ -13457,8 +13475,8 @@ webpackJsonp([0],{
13457
  endpoint: 'segments',
13458
  onRenderItem: this.renderItem,
13459
  columns: columns,
13460
- bulk_actions: bulk_actions,
13461
- item_actions: item_actions,
13462
  sort_by: 'name',
13463
  sort_order: 'asc'
13464
  })
@@ -13639,7 +13657,7 @@ webpackJsonp([0],{
13639
 
13640
  var messages = {
13641
  onTrash: function onTrash(response) {
13642
- var count = ~ ~response.meta.count;
13643
  var message = null;
13644
 
13645
  if (count === 1) {
@@ -13650,7 +13668,7 @@ webpackJsonp([0],{
13650
  _mailpoet2['default'].Notice.success(message);
13651
  },
13652
  onDelete: function onDelete(response) {
13653
- var count = ~ ~response.meta.count;
13654
  var message = null;
13655
 
13656
  if (count === 1) {
@@ -13661,7 +13679,7 @@ webpackJsonp([0],{
13661
  _mailpoet2['default'].Notice.success(message);
13662
  },
13663
  onRestore: function onRestore(response) {
13664
- var count = ~ ~response.meta.count;
13665
  var message = null;
13666
 
13667
  if (count === 1) {
@@ -13673,13 +13691,13 @@ webpackJsonp([0],{
13673
  }
13674
  };
13675
 
13676
- var bulk_actions = [{
13677
  name: 'trash',
13678
  label: _mailpoet2['default'].I18n.t('moveToTrash'),
13679
  onSuccess: messages.onTrash
13680
  }];
13681
 
13682
- var item_actions = [{
13683
  name: 'edit',
13684
  label: _mailpoet2['default'].I18n.t('edit'),
13685
  link: function link(item) {
@@ -13734,7 +13752,7 @@ webpackJsonp([0],{
13734
  });
13735
  },
13736
  renderItem: function renderItem(form, actions) {
13737
- var row_classes = (0, _classnames2['default'])('manage-column', 'column-primary', 'has-row-actions');
13738
 
13739
  var segments = window.mailpoet_segments.filter(function (segment) {
13740
  return _jquery2['default'].inArray(segment.id, form.segments) !== -1;
@@ -13751,7 +13769,7 @@ webpackJsonp([0],{
13751
  null,
13752
  _react2['default'].createElement(
13753
  'td',
13754
- { className: row_classes },
13755
  _react2['default'].createElement(
13756
  'strong',
13757
  null,
@@ -13815,8 +13833,8 @@ webpackJsonp([0],{
13815
  endpoint: 'forms',
13816
  onRenderItem: this.renderItem,
13817
  columns: columns,
13818
- bulk_actions: bulk_actions,
13819
- item_actions: item_actions
13820
  })
13821
  );
13822
  }
@@ -15990,7 +16008,7 @@ webpackJsonp([0],{
15990
  }
15991
 
15992
  function renderMSSSection(data) {
15993
- if (!data.mss.enabled) return;
15994
 
15995
  var status = data.mss.enabled.isReachable;
15996
 
92
 
93
  var messages = {
94
  onTrash: function onTrash(response) {
95
+ var count = Number(response.meta.count);
96
  var message = null;
97
 
98
  if (count === 1) {
103
  _mailpoet2['default'].Notice.success(message);
104
  },
105
  onDelete: function onDelete(response) {
106
+ var count = Number(response.meta.count);
107
  var message = null;
108
 
109
  if (count === 1) {
114
  _mailpoet2['default'].Notice.success(message);
115
  },
116
  onRestore: function onRestore(response) {
117
+ var count = Number(response.meta.count);
118
  var message = null;
119
 
120
  if (count === 1) {
150
  }
151
  };
152
 
153
+ var bulkActions = [{
154
  name: 'moveToList',
155
  label: _mailpoet2['default'].I18n.t('moveToList'),
156
  onSelect: function onSelect() {
167
  },
168
  getData: function getData() {
169
  return {
170
+ segment_id: Number((0, _jquery2['default'])('#move_to_segment').val())
171
  };
172
  },
173
  onSuccess: function onSuccess(response) {
174
+ _mailpoet2['default'].Notice.success(_mailpoet2['default'].I18n.t('multipleSubscribersMovedToList').replace('%$1d', Number(response.meta.count).toLocaleString()).replace('%$2s', response.meta.segment));
175
  }
176
  }, {
177
  name: 'addToList',
190
  },
191
  getData: function getData() {
192
  return {
193
+ segment_id: Number((0, _jquery2['default'])('#add_to_segment').val())
194
  };
195
  },
196
  onSuccess: function onSuccess(response) {
197
+ _mailpoet2['default'].Notice.success(_mailpoet2['default'].I18n.t('multipleSubscribersAddedToList').replace('%$1d', Number(response.meta.count).toLocaleString()).replace('%$2s', response.meta.segment));
198
  }
199
  }, {
200
  name: 'removeFromList',
213
  },
214
  getData: function getData() {
215
  return {
216
+ segment_id: Number((0, _jquery2['default'])('#remove_from_segment').val())
217
  };
218
  },
219
  onSuccess: function onSuccess(response) {
220
+ _mailpoet2['default'].Notice.success(_mailpoet2['default'].I18n.t('multipleSubscribersRemovedFromList').replace('%$1d', Number(response.meta.count).toLocaleString()).replace('%$2s', response.meta.segment));
221
  }
222
  }, {
223
  name: 'removeFromAllLists',
224
  label: _mailpoet2['default'].I18n.t('removeFromAllLists'),
225
  onSuccess: function onSuccess(response) {
226
+ _mailpoet2['default'].Notice.success(_mailpoet2['default'].I18n.t('multipleSubscribersRemovedFromAllLists').replace('%$1d', Number(response.meta.count).toLocaleString()));
227
  }
228
  }, {
229
  name: 'sendConfirmationEmail',
230
  label: _mailpoet2['default'].I18n.t('resendConfirmationEmail'),
231
  onSuccess: function onSuccess(response) {
232
+ _mailpoet2['default'].Notice.success(_mailpoet2['default'].I18n.t('multipleConfirmationEmailsSent').replace('%$1d', Number(response.meta.count).toLocaleString()));
233
  }
234
  }, {
235
  name: 'trash',
237
  onSuccess: messages.onTrash
238
  }];
239
 
240
+ var itemActions = [{
241
  name: 'edit',
242
  label: _mailpoet2['default'].I18n.t('edit'),
243
  link: function link(subscriber) {
250
  }, {
251
  name: 'trash',
252
  display: function display(subscriber) {
253
+ return Number(subscriber.wp_user_id) === 0;
254
  }
255
  }];
256
 
257
  var SubscriberList = _react2['default'].createClass({
258
  displayName: 'SubscriberList',
259
 
260
+ getSegmentFromId: function getSegmentFromId(segmentId) {
261
  var result = false;
262
+ window.mailpoet_segments.forEach(function (segment) {
263
+ if (segment.id === segmentId) {
264
  result = segment;
265
  }
266
  });
269
  renderItem: function renderItem(subscriber, actions) {
270
  var _this = this;
271
 
272
+ var rowClasses = (0, _classnames2['default'])('manage-column', 'column-primary', 'has-row-actions', 'column-username');
273
 
274
  var status = '';
275
 
289
  case 'bounced':
290
  status = _mailpoet2['default'].I18n.t('bounced');
291
  break;
292
+
293
+ default:
294
+ status = 'Invalid';
295
+ break;
296
  }
297
 
298
  var segments = false;
300
  // Subscriptions
301
  if (subscriber.subscriptions.length > 0) {
302
  (function () {
303
+ var subscribedSegments = [];
304
 
305
+ subscriber.subscriptions.forEach(function (subscription) {
306
  var segment = _this.getSegmentFromId(subscription.segment_id);
307
  if (segment === false) return;
308
  if (subscription.status === 'subscribed') {
309
+ subscribedSegments.push(segment.name);
310
  }
311
  });
312
 
313
  segments = _react2['default'].createElement(
314
  'span',
315
  null,
316
+ subscribedSegments.join(', ')
317
  );
318
  })();
319
  }
323
  null,
324
  _react2['default'].createElement(
325
  'td',
326
+ { className: rowClasses },
327
  _react2['default'].createElement(
328
  'strong',
329
  null,
417
  endpoint: 'subscribers',
418
  onRenderItem: this.renderItem,
419
  columns: columns,
420
+ bulk_actions: bulkActions,
421
+ item_actions: itemActions,
422
  messages: messages,
423
  sort_by: 'created_at',
424
  sort_order: 'desc'
453
  label: MailPoet.I18n.t('email'),
454
  type: 'text',
455
  disabled: function disabled(subscriber) {
456
+ return Number(subscriber.wp_user_id > 0);
457
  }
458
  }, {
459
  name: 'first_name',
460
  label: MailPoet.I18n.t('firstname'),
461
  type: 'text',
462
  disabled: function disabled(subscriber) {
463
+ return Number(subscriber.wp_user_id > 0);
464
  }
465
  }, {
466
  name: 'last_name',
467
  label: MailPoet.I18n.t('lastname'),
468
  type: 'text',
469
  disabled: function disabled(subscriber) {
470
+ return Number(subscriber.wp_user_id > 0);
471
  }
472
  }, {
473
  name: 'status',
480
  bounced: MailPoet.I18n.t('bounced')
481
  },
482
  filter: function filter(subscriber, value) {
483
+ if (Number(subscriber.wp_user_id) > 0 && value === 'unconfirmed') {
484
  return false;
485
  }
486
  return true;
498
  return null;
499
  }
500
 
501
+ return subscriber.subscriptions.filter(function (subscription) {
502
+ return subscription.status === 'subscribed';
503
+ }).map(function (subscription) {
504
+ return subscription.segment_id;
505
  });
506
  },
507
  filter: function filter(segment) {
508
+ return !segment.deleted_at && segment.type === 'default';
509
  },
510
  getLabel: function getLabel(segment) {
511
  return segment.name + ' (' + segment.subscribers + ')';
514
  var label = '';
515
 
516
  if (subscriber.subscriptions !== undefined) {
517
+ subscriber.subscriptions.forEach(function (subscription) {
518
  if (segment.id === subscription.segment_id) {
519
  label = segment.name;
520
 
521
  if (subscription.status === 'unsubscribed') {
522
+ var unsubscribedAt = MailPoet.Date.format(subscription.updated_at);
523
+ label += ' (%$1s)'.replace('%$1s', MailPoet.I18n.t('unsubscribedOn').replace('%$1s', unsubscribedAt));
524
  }
525
  }
526
  });
529
  }
530
  }];
531
 
532
+ var customFields = window.mailpoet_custom_fields || [];
533
+ customFields.forEach(function (customField) {
534
  var field = {
535
+ name: 'cf_' + customField.id,
536
+ label: customField.name,
537
+ type: customField.type
538
  };
539
+ if (customField.params) {
540
+ field.params = customField.params;
541
  }
542
 
543
+ if (customField.params.values) {
544
+ field.values = customField.params.values;
545
  }
546
 
547
  // add placeholders for selects (date, select)
548
+ switch (customField.type) {
549
  case 'date':
550
  field.year_placeholder = MailPoet.I18n.t('year');
551
  field.month_placeholder = MailPoet.I18n.t('month');
555
  case 'select':
556
  field.placeholder = '-';
557
  break;
558
+
559
+ default:
560
+ field.placeholder = '';
561
+ break;
562
  }
563
 
564
  fields.push(field);
577
  };
578
 
579
  var beforeFormContent = function beforeFormContent(subscriber) {
580
+ if (Number(subscriber.wp_user_id) > 0) {
581
  return React.createElement(
582
  'p',
583
  { className: 'description' },
593
  })
594
  );
595
  }
596
+ return undefined;
597
  };
598
 
599
  var afterFormContent = function afterFormContent() {
718
  var container = document.getElementById('newsletters_container');
719
 
720
  if (container) {
721
+ var extraRoutes = [];
722
+ extraRoutes = _wpJsHooks2['default'].applyFilters('mailpoet_newsletters_before_router', extraRoutes);
723
 
724
+ var mailpoetListing = _reactDom2['default'].render(_react2['default'].createElement(
725
  _reactRouter.Router,
726
  { history: history },
727
  _react2['default'].createElement(
738
  _react2['default'].createElement(_reactRouter.Route, { path: 'new/notification', component: _newslettersTypesNotificationNotificationJsx2['default'] }),
739
  _react2['default'].createElement(_reactRouter.Route, { name: 'template', path: 'template/:id', component: _newslettersTemplatesJsx2['default'] }),
740
  _react2['default'].createElement(_reactRouter.Route, { path: 'send/:id', component: _newslettersSendJsx2['default'] }),
741
+ extraRoutes.map(function (rt) {
742
  return _react2['default'].createElement(_reactRouter.Route, { key: rt.path, path: rt.path, component: rt.component });
743
  })
744
  )
745
  ), container);
746
 
747
+ window.mailpoet_listing = mailpoetListing;
748
  }
749
  /* Listings */ /* Newsletter: type selection */ /* New newsletter: types */ /* Template selection */ /* Sending options */ /* Extra routes */
750
 
980
  };
981
 
982
  reader.readAsText(file);
983
+ return true;
984
  },
985
  render: function render() {
986
  return _react2['default'].createElement(
10476
  return true;
10477
  },
10478
  render: function render() {
10479
+ var isPaused = this.state.item.status === 'sending' && this.state.item.queue && this.state.item.queue.status === 'paused';
10480
  var fields = this.state.fields.map(function (field) {
10481
  var newField = field;
10482
+ if (field.name === 'segments' || field.name === 'options') {
10483
  newField.disabled = isPaused;
10484
  }
10485
  return newField;
10584
  getLabel: function getLabel(segment) {
10585
  return segment.name + ' (' + parseInt(segment.subscribers, 10).toLocaleString() + ')';
10586
  },
10587
+ transformChangedValue: function transformChangedValue(segmentIds) {
10588
+ var allSegments = this.state.items;
10589
+ return _.map(segmentIds, function (id) {
10590
+ return _.find(allSegments, function (segment) {
10591
  return segment.id === id;
10592
  });
10593
  });
10956
  },
10957
  propagateChange: function propagateChange() {
10958
  if (this.props.onChange) {
10959
+ this.props.onChange({
10960
  target: {
10961
  name: this.props.name || '',
10962
  value: this.getDateTime()
11093
  getLabel: function getLabel(segment) {
11094
  return segment.name + ' (' + parseInt(segment.subscribers, 10).toLocaleString() + ')';
11095
  },
11096
+ transformChangedValue: function transformChangedValue(segmentIds) {
11097
+ var allSegments = this.state.items;
11098
+ return _.map(segmentIds, function (id) {
11099
+ return _.find(allSegments, function (segment) {
11100
  return segment.id === id;
11101
  });
11102
  });
11430
 
11431
  var _newslettersListingsMixinsJsx = __webpack_require__(530);
11432
 
11433
+ var mailpoetTrackingEnabled = !!window.mailpoet_tracking_enabled;
11434
 
11435
  var messages = {
11436
  onTrash: function onTrash(response) {
11437
+ var count = Number(response.meta.count);
11438
  var message = null;
11439
 
11440
  if (count === 1) {
11445
  _mailpoet2['default'].Notice.success(message);
11446
  },
11447
  onDelete: function onDelete(response) {
11448
+ var count = Number(response.meta.count);
11449
  var message = null;
11450
 
11451
  if (count === 1) {
11456
  _mailpoet2['default'].Notice.success(message);
11457
  },
11458
  onRestore: function onRestore(response) {
11459
+ var count = Number(response.meta.count);
11460
  var message = null;
11461
 
11462
  if (count === 1) {
11481
  }, {
11482
  name: 'statistics',
11483
  label: _mailpoet2['default'].I18n.t('statistics'),
11484
+ display: mailpoetTrackingEnabled
11485
  }, {
11486
  name: 'sent_at',
11487
  label: _mailpoet2['default'].I18n.t('sentOn'),
11488
  sortable: true
11489
  }];
11490
 
11491
+ var bulkActions = [{
11492
  name: 'trash',
11493
  label: _mailpoet2['default'].I18n.t('moveToTrash'),
11494
  onSuccess: messages.onTrash
11498
  var redirectToEditing = function redirectToEditing() {
11499
  window.location.href = '?page=mailpoet-newsletter-editor&id=' + newsletter.id;
11500
  };
11501
+ if (!newsletter.queue || newsletter.status !== 'sending' || newsletter.queue.status !== null) {
11502
  redirectToEditing();
11503
  } else {
11504
  (0, _reactConfirmAlert.confirmAlert)({
11511
  }
11512
  };
11513
 
11514
+ var newsletterActions = [{
11515
  name: 'view',
11516
  link: function link(newsletter) {
11517
  return _react2['default'].createElement(
11551
  }];
11552
 
11553
  _wpJsHooks2['default'].addFilter('mailpoet_newsletters_listings_standard_actions', _newslettersListingsMixinsJsx.StatisticsMixin.addStatsCTAAction);
11554
+ newsletterActions = _wpJsHooks2['default'].applyFilters('mailpoet_newsletters_listings_standard_actions', newsletterActions);
11555
 
11556
  var NewsletterListStandard = _react2['default'].createClass({
11557
  displayName: 'NewsletterListStandard',
11597
  { className: 'column', 'data-colname': _mailpoet2['default'].I18n.t('lists') },
11598
  segments
11599
  ),
11600
+ mailpoetTrackingEnabled === true ? _react2['default'].createElement(
11601
  'td',
11602
  { className: 'column', 'data-colname': _mailpoet2['default'].I18n.t('statistics') },
11603
  this.renderStatistics(newsletter, undefined, meta.current_time)
11642
  base_url: 'standard',
11643
  onRenderItem: this.renderItem,
11644
  columns: columns,
11645
+ bulk_actions: bulkActions,
11646
+ item_actions: newsletterActions,
11647
  messages: messages,
11648
  auto_refresh: true,
11649
  sort_by: 'sent_at',
11820
  }
11821
  });
11822
  },
11823
+ renderQueueStatus: function renderQueueStatus(newsletter, mailerLog) {
11824
  if (!newsletter.queue) {
11825
  return _react2['default'].createElement(
11826
  'span',
11827
  null,
11828
  _mailpoet2['default'].I18n.t('notSentYet')
11829
  );
11830
+ } else if (mailerLog.status === 'paused' && newsletter.queue.status !== 'completed') {
11831
  return _react2['default'].createElement(
11832
  'span',
11833
  null,
11889
  );
11890
  }
11891
 
11892
+ var progressBarWidth = 0;
11893
 
11894
  if (isNaN(percentage)) {
11895
  percentage = _mailpoet2['default'].I18n.t('noSubscribers');
11896
  } else {
11897
+ progressBarWidth = percentage;
11898
  percentage += '%';
11899
  }
11900
 
11906
  { className: progressClasses },
11907
  _react2['default'].createElement('span', {
11908
  className: 'mailpoet_progress_bar',
11909
+ style: { width: progressBarWidth + '%' }
11910
  }),
11911
  _react2['default'].createElement(
11912
  'span',
11928
  };
11929
 
11930
  var StatisticsMixin = {
11931
+ renderStatistics: function renderStatistics(newsletter, isSent, currentTime) {
11932
+ var sent = isSent;
11933
  if (sent === undefined) {
11934
  // condition for standard and post notification listings
11935
  sent = newsletter.statistics && newsletter.queue && newsletter.queue.status !== 'scheduled';
11947
  params = _wpJsHooks2['default'].applyFilters('mailpoet_newsletters_listing_stats_before', params, newsletter);
11948
 
11949
  // welcome emails provide explicit total_sent value
11950
+ var totalSent = Number(newsletter.total_sent || newsletter.queue.count_processed);
11951
 
11952
+ var percentageClicked = 0;
11953
+ var percentageOpened = 0;
11954
+ var percentageUnsubscribed = 0;
11955
 
11956
+ if (totalSent > 0) {
11957
+ percentageClicked = newsletter.statistics.clicked * 100 / totalSent;
11958
+ percentageOpened = newsletter.statistics.opened * 100 / totalSent;
11959
+ percentageUnsubscribed = newsletter.statistics.unsubscribed * 100 / totalSent;
11960
  }
11961
 
11962
  // format to 1 decimal place
11963
+ var percentageClickedDisplay = _mailpoet2['default'].Num.toLocaleFixed(percentageClicked, 1);
11964
+ var percentageOpenedDisplay = _mailpoet2['default'].Num.toLocaleFixed(percentageOpened, 1);
11965
+ var percentageUnsubscribedDisplay = _mailpoet2['default'].Num.toLocaleFixed(percentageUnsubscribed, 1);
11966
+
11967
+ var showStatsTimeout = undefined;
11968
+ var newsletterDate = undefined;
11969
+ var sentHoursAgo = undefined;
11970
+ var tooEarlyForStats = undefined;
11971
+ var showKbLink = undefined;
11972
+ if (currentTime !== undefined) {
11973
  // standard emails and post notifications:
11974
  // display green box for newsletters that were just sent
11975
+ showStatsTimeout = 6; // in hours
11976
+ newsletterDate = newsletter.queue.scheduled_at || newsletter.queue.created_at;
11977
+ sentHoursAgo = (0, _moment2['default'])(currentTime).diff((0, _moment2['default'])(newsletterDate), 'hours');
11978
+ tooEarlyForStats = sentHoursAgo < showStatsTimeout;
11979
+ showKbLink = true;
11980
  } else {
11981
  // welcome emails: no green box and KB link
11982
+ tooEarlyForStats = false;
11983
+ showKbLink = false;
11984
  }
11985
 
11986
  var improveStatsKBLink = 'http://beta.docs.mailpoet.com/article/191-how-to-improve-my-open-and-click-rates';
11987
 
11988
  // thresholds to display badges
11989
+ var minNewslettersSent = 20;
11990
+ var minNewsletterOpens = 5;
11991
 
11992
  var content = undefined;
11993
+ if (totalSent >= minNewslettersSent && newsletter.statistics.opened >= minNewsletterOpens && !tooEarlyForStats) {
11994
  // display stats with badges
11995
  content = _react2['default'].createElement(
11996
  'div',
12001
  _react2['default'].createElement(
12002
  'span',
12003
  null,
12004
+ percentageOpenedDisplay,
12005
  '% '
12006
  ),
12007
  _react2['default'].createElement(_newslettersBadgesStatsJsx2['default'], {
12008
  stat: 'opened',
12009
+ rate: percentageOpened,
12010
  tooltipId: 'opened-' + newsletter.id
12011
  })
12012
  ),
12016
  _react2['default'].createElement(
12017
  'span',
12018
  null,
12019
+ percentageClickedDisplay,
12020
  '% '
12021
  ),
12022
  _react2['default'].createElement(_newslettersBadgesStatsJsx2['default'], {
12023
  stat: 'clicked',
12024
+ rate: percentageClicked,
12025
  tooltipId: 'clicked-' + newsletter.id
12026
  })
12027
  ),
12031
  _react2['default'].createElement(
12032
  'span',
12033
  { className: 'mailpoet_stat_hidden' },
12034
+ percentageUnsubscribedDisplay,
12035
  '%'
12036
  )
12037
  )
12044
  _react2['default'].createElement(
12045
  'span',
12046
  { className: 'mailpoet_stats_text' },
12047
+ percentageOpenedDisplay,
12048
  '%,',
12049
  ' ',
12050
+ percentageClickedDisplay,
12051
  '%',
12052
  _react2['default'].createElement(
12053
  'span',
12054
  { className: 'mailpoet_stat_hidden' },
12055
  ', ',
12056
+ percentageUnsubscribedDisplay,
12057
  '%'
12058
  )
12059
  ),
12060
+ tooEarlyForStats && _react2['default'].createElement(
12061
  'div',
12062
  { className: 'mailpoet_badge mailpoet_badge_green' },
12063
+ _mailpoet2['default'].I18n.t('checkBackInHours').replace('%$1d', showStatsTimeout - sentHoursAgo)
12064
  )
12065
  );
12066
  }
12067
 
12068
  // thresholds to display bad open rate help
12069
+ var maxPercentageOpened = 5;
12070
+ var minSentHoursAgo = 24;
12071
+ var minTotalSent = 10;
12072
 
12073
+ var afterContent = undefined;
12074
+ if (showKbLink && percentageOpened < maxPercentageOpened && sentHoursAgo >= minSentHoursAgo && totalSent >= minTotalSent) {
12075
  // help link for bad open rate
12076
+ afterContent = _react2['default'].createElement(
12077
  'div',
12078
  null,
12079
  _react2['default'].createElement(
12088
  );
12089
  }
12090
 
12091
+ if (totalSent > 0 && params.link) {
12092
  // wrap content in a link
12093
  if (params.externalLink) {
12094
  return _react2['default'].createElement(
12103
  },
12104
  content
12105
  ),
12106
+ afterContent
12107
  );
12108
  }
12109
  return _react2['default'].createElement(
12118
  },
12119
  content
12120
  ),
12121
+ afterContent
12122
  );
12123
  }
12124
 
12126
  'div',
12127
  null,
12128
  content,
12129
+ afterContent
12130
  );
12131
  },
12132
  addStatsCTAAction: function addStatsCTAAction(actions) {
12144
  },
12145
  display: function display(newsletter) {
12146
  // welcome emails provide explicit total_sent value
12147
+ var countProcessed = newsletter.queue && newsletter.queue.count_processed;
12148
+ return Number(newsletter.total_sent || countProcessed) > 0;
12149
  }
12150
  });
12151
  return actions;
12173
  }
12174
  },
12175
  getMailerError: function getMailerError(state) {
12176
+ var mailerErrorNotice = undefined;
12177
+ var mailerCheckSettingsNotice = (0, _reactStringReplace2['default'])(_mailpoet2['default'].I18n.t('mailerCheckSettingsNotice'), /\[link\](.*?)\[\/link\]/g, function (match) {
12178
  return _react2['default'].createElement(
12179
  'a',
12180
  { href: '?page=mailpoet-settings#mta', key: 'check-sending' },
12182
  );
12183
  });
12184
  if (state.meta.mta_log.error.operation === 'send') {
12185
+ mailerErrorNotice = _mailpoet2['default'].I18n.t('mailerSendErrorNotice').replace('%$1s', state.meta.mta_method).replace('%$2s', state.meta.mta_log.error.error_message);
12186
  } else {
12187
+ mailerErrorNotice = _mailpoet2['default'].I18n.t('mailerConnectionErrorNotice').replace('%$1s', state.meta.mta_log.error.error_message);
12188
  }
12189
  if (state.meta.mta_log.error.error_code) {
12190
+ mailerErrorNotice += ' ' + _mailpoet2['default'].I18n.t('mailerErrorCode').replace('%$1s', state.meta.mta_log.error.error_code);
12191
  }
12192
  return _react2['default'].createElement(
12193
  'div',
12195
  _react2['default'].createElement(
12196
  'p',
12197
  null,
12198
+ mailerErrorNotice
12199
  ),
12200
  _react2['default'].createElement(
12201
  'p',
12202
  null,
12203
+ mailerCheckSettingsNotice
12204
  ),
12205
  _react2['default'].createElement(
12206
  'p',
12280
 
12281
  var _wpJsHooks2 = _interopRequireDefault(_wpJsHooks);
12282
 
12283
+ var mailpoetRoles = window.mailpoet_roles || {};
12284
+ var mailpoetSegments = window.mailpoet_segments || {};
12285
+ var mailpoetTrackingEnabled = !!window.mailpoet_tracking_enabled;
12286
 
12287
  var messages = {
12288
  onTrash: function onTrash(response) {
12289
+ var count = Number(response.meta.count);
12290
  var message = null;
12291
 
12292
  if (count === 1) {
12297
  _mailpoet2['default'].Notice.success(message);
12298
  },
12299
  onDelete: function onDelete(response) {
12300
+ var count = Number(response.meta.count);
12301
  var message = null;
12302
 
12303
  if (count === 1) {
12308
  _mailpoet2['default'].Notice.success(message);
12309
  },
12310
  onRestore: function onRestore(response) {
12311
+ var count = Number(response.meta.count);
12312
  var message = null;
12313
 
12314
  if (count === 1) {
12334
  }, {
12335
  name: 'statistics',
12336
  label: _mailpoet2['default'].I18n.t('statistics'),
12337
+ display: mailpoetTrackingEnabled
12338
  }, {
12339
  name: 'updated_at',
12340
  label: _mailpoet2['default'].I18n.t('lastModifiedOn'),
12341
  sortable: true
12342
  }];
12343
 
12344
+ var bulkActions = [{
12345
  name: 'trash',
12346
  label: _mailpoet2['default'].I18n.t('moveToTrash'),
12347
  onSuccess: messages.onTrash
12348
  }];
12349
 
12350
+ var newsletterActions = [{
12351
  name: 'view',
12352
  link: function link(newsletter) {
12353
  return _react2['default'].createElement(
12370
  }];
12371
 
12372
  _wpJsHooks2['default'].addFilter('mailpoet_newsletters_listings_welcome_notification_actions', _newslettersListingsMixinsJsx.StatisticsMixin.addStatsCTAAction);
12373
+ newsletterActions = _wpJsHooks2['default'].applyFilters('mailpoet_newsletters_listings_welcome_notification_actions', newsletterActions);
12374
 
12375
  var NewsletterListWelcome = _react2['default'].createClass({
12376
  displayName: 'NewsletterListWelcome',
12388
  endpoint: 'newsletters',
12389
  action: 'setStatus',
12390
  data: {
12391
+ id: Number(e.target.getAttribute('data-id')),
12392
  status: e.target.value
12393
  }
12394
  }).done(function (response) {
12405
  });
12406
  },
12407
  renderStatus: function renderStatus(newsletter) {
12408
+ var totalSent = _mailpoet2['default'].I18n.t('sentToXSubscribers').replace('%$1d', newsletter.total_sent.toLocaleString());
12409
 
12410
  return _react2['default'].createElement(
12411
  'div',
12435
  _react2['default'].createElement(
12436
  'p',
12437
  null,
12438
+ totalSent
12439
  )
12440
  );
12441
  },
12451
  if (newsletter.options.role === 'mailpoet_all') {
12452
  sendingEvent = _mailpoet2['default'].I18n.t('welcomeEventWPUserAnyRole');
12453
  } else {
12454
+ sendingEvent = _mailpoet2['default'].I18n.t('welcomeEventWPUserWithRole').replace('%$1s', mailpoetRoles[newsletter.options.role]);
12455
  }
12456
  break;
12457
 
12458
+ default:
12459
  // get segment
12460
+ segment = _underscore2['default'].find(mailpoetSegments, function (seg) {
12461
+ return Number(seg.id) === Number(newsletter.options.segment);
12462
  });
12463
 
12464
  if (segment === undefined) {
12488
  case 'weeks':
12489
  sendingDelay = _mailpoet2['default'].I18n.t('sendingDelayWeeks').replace('%$1d', newsletter.options.afterTimeNumber);
12490
  break;
12491
+
12492
+ default:
12493
+ sendingDelay = 'Invalid sending delay';
12494
+ break;
12495
  }
12496
  sendingEvent += ' [' + sendingDelay + ']';
12497
  }
12538
  { className: 'column', 'data-colname': _mailpoet2['default'].I18n.t('settings') },
12539
  this.renderSettings(newsletter)
12540
  ),
12541
+ mailpoetTrackingEnabled === true ? _react2['default'].createElement(
12542
  'td',
12543
  { className: 'column', 'data-colname': _mailpoet2['default'].I18n.t('statistics') },
12544
  this.renderStatistics(newsletter, newsletter.total_sent > 0 && newsletter.statistics)
12579
  base_url: 'welcome',
12580
  onRenderItem: this.renderItem,
12581
  columns: columns,
12582
+ bulk_actions: bulkActions,
12583
+ item_actions: newsletterActions,
12584
  messages: messages,
12585
  auto_refresh: true,
12586
  sort_by: 'updated_at',
12630
 
12631
  var messages = {
12632
  onTrash: function onTrash(response) {
12633
+ var count = Number(response.meta.count);
12634
  var message = null;
12635
 
12636
  if (count === 1) {
12641
  _mailpoet2['default'].Notice.success(message);
12642
  },
12643
  onDelete: function onDelete(response) {
12644
+ var count = Number(response.meta.count);
12645
  var message = null;
12646
 
12647
  if (count === 1) {
12652
  _mailpoet2['default'].Notice.success(message);
12653
  },
12654
  onRestore: function onRestore(response) {
12655
+ var count = Number(response.meta.count);
12656
  var message = null;
12657
 
12658
  if (count === 1) {
12685
  sortable: true
12686
  }];
12687
 
12688
+ var bulkActions = [{
12689
  name: 'trash',
12690
  label: _mailpoet2['default'].I18n.t('moveToTrash'),
12691
  onSuccess: messages.onTrash
12692
  }];
12693
 
12694
+ var newsletterActions = [{
12695
  name: 'view',
12696
  link: function link(newsletter) {
12697
  return _react2['default'].createElement(
12751
  endpoint: 'newsletters',
12752
  action: 'setStatus',
12753
  data: {
12754
+ id: Number(e.target.getAttribute('data-id')),
12755
  status: e.target.value
12756
  }
12757
  }).done(function (response) {
12826
  case 'immediately':
12827
  sendingFrequency = _mailpoet2['default'].I18n.t('sendImmediately');
12828
  break;
12829
+
12830
+ default:
12831
+ sendingFrequency = 'Invalid sending frequency';
12832
+ break;
12833
  }
12834
 
12835
  return _react2['default'].createElement(
12841
  );
12842
  },
12843
  renderHistoryLink: function renderHistoryLink(newsletter) {
12844
+ var childrenCount = Number(newsletter.children_count);
12845
  if (childrenCount === 0) {
12846
  return _mailpoet2['default'].I18n.t('notSentYet');
12847
  }
12927
  base_url: 'notification',
12928
  onRenderItem: this.renderItem,
12929
  columns: columns,
12930
+ bulk_actions: bulkActions,
12931
+ item_actions: newsletterActions,
12932
  messages: messages,
12933
  auto_refresh: true,
12934
  sort_by: 'updated_at',
12978
 
12979
  var _newslettersListingsMixinsJsx = __webpack_require__(530);
12980
 
12981
+ var mailpoetTrackingEnabled = !!window.mailpoet_tracking_enabled;
12982
 
12983
  var columns = [{
12984
  name: 'subject',
12992
  }, {
12993
  name: 'statistics',
12994
  label: _mailpoet2['default'].I18n.t('statistics'),
12995
+ display: mailpoetTrackingEnabled
12996
  }, {
12997
  name: 'sent_at',
12998
  label: _mailpoet2['default'].I18n.t('sentOn')
12999
  }];
13000
 
13001
+ var newsletterActions = [{
13002
  name: 'view',
13003
  link: function link(newsletter) {
13004
  return _react2['default'].createElement(
13010
  }];
13011
 
13012
  _wpJsHooks2['default'].addFilter('mailpoet_newsletters_listings_notification_history_actions', _newslettersListingsMixinsJsx.StatisticsMixin.addStatsCTAAction);
13013
+ newsletterActions = _wpJsHooks2['default'].applyFilters('mailpoet_newsletters_listings_notification_history_actions', newsletterActions);
13014
 
13015
  var NewsletterListNotificationHistory = _react2['default'].createClass({
13016
  displayName: 'NewsletterListNotificationHistory',
13053
  { className: 'column', 'data-colname': _mailpoet2['default'].I18n.t('lists') },
13054
  segments
13055
  ),
13056
+ mailpoetTrackingEnabled === true ? _react2['default'].createElement(
13057
  'td',
13058
  { className: 'column', 'data-colname': _mailpoet2['default'].I18n.t('statistics') },
13059
  this.renderStatistics(newsletter, undefined, meta.current_time)
13098
  base_url: 'notification/history/:parent_id',
13099
  onRenderItem: this.renderItem,
13100
  columns: columns,
13101
+ item_actions: newsletterActions,
13102
  auto_refresh: true,
13103
  sort_by: 'sent_at',
13104
  sort_order: 'desc',
13220
 
13221
  var messages = {
13222
  onTrash: function onTrash(response) {
13223
+ var count = Number(response.meta.count);
13224
  var message = null;
13225
 
13226
  if (count === 1) {
13231
  _mailpoet2['default'].Notice.success(message);
13232
  },
13233
  onDelete: function onDelete(response) {
13234
+ var count = Number(response.meta.count);
13235
  var message = null;
13236
 
13237
  if (count === 1) {
13242
  _mailpoet2['default'].Notice.success(message);
13243
  },
13244
  onRestore: function onRestore(response) {
13245
+ var count = Number(response.meta.count);
13246
  var message = null;
13247
 
13248
  if (count === 1) {
13254
  }
13255
  };
13256
 
13257
+ var bulkActions = [{
13258
  name: 'trash',
13259
  label: _mailpoet2['default'].I18n.t('moveToTrash'),
13260
  onSuccess: messages.onTrash
13261
  }];
13262
 
13263
+ var itemActions = [{
13264
  name: 'edit',
13265
  link: function link(item) {
13266
  return _react2['default'].createElement(
13357
  renderItem: function renderItem(segment, actions) {
13358
  var rowClasses = (0, _classnames2['default'])('manage-column', 'column-primary', 'has-row-actions');
13359
 
13360
+ var subscribed = Number(segment.subscribers_count.subscribed || 0);
13361
+ var unconfirmed = Number(segment.subscribers_count.unconfirmed || 0);
13362
+ var unsubscribed = Number(segment.subscribers_count.unsubscribed || 0);
13363
+ var bounced = Number(segment.subscribers_count.bounced || 0);
13364
 
13365
+ var segmentName = undefined;
13366
 
13367
  if (segment.type === 'wp_users') {
13368
  // the WP users segment is not editable so just display its name
13369
+ segmentName = _react2['default'].createElement(
13370
  'span',
13371
  { className: 'row-title' },
13372
  segment.name
13373
  );
13374
  } else {
13375
+ segmentName = _react2['default'].createElement(
13376
  _reactRouter.Link,
13377
  {
13378
  className: 'row-title',
13391
  _react2['default'].createElement(
13392
  'strong',
13393
  null,
13394
+ segmentName
13395
  ),
13396
  actions
13397
  ),
13475
  endpoint: 'segments',
13476
  onRenderItem: this.renderItem,
13477
  columns: columns,
13478
+ bulk_actions: bulkActions,
13479
+ item_actions: itemActions,
13480
  sort_by: 'name',
13481
  sort_order: 'asc'
13482
  })
13657
 
13658
  var messages = {
13659
  onTrash: function onTrash(response) {
13660
+ var count = Number(response.meta.count);
13661
  var message = null;
13662
 
13663
  if (count === 1) {
13668
  _mailpoet2['default'].Notice.success(message);
13669
  },
13670
  onDelete: function onDelete(response) {
13671
+ var count = Number(response.meta.count);
13672
  var message = null;
13673
 
13674
  if (count === 1) {
13679
  _mailpoet2['default'].Notice.success(message);
13680
  },
13681
  onRestore: function onRestore(response) {
13682
+ var count = Number(response.meta.count);
13683
  var message = null;
13684
 
13685
  if (count === 1) {
13691
  }
13692
  };
13693
 
13694
+ var bulkActions = [{
13695
  name: 'trash',
13696
  label: _mailpoet2['default'].I18n.t('moveToTrash'),
13697
  onSuccess: messages.onTrash
13698
  }];
13699
 
13700
+ var itemActions = [{
13701
  name: 'edit',
13702
  label: _mailpoet2['default'].I18n.t('edit'),
13703
  link: function link(item) {
13752
  });
13753
  },
13754
  renderItem: function renderItem(form, actions) {
13755
+ var rowClasses = (0, _classnames2['default'])('manage-column', 'column-primary', 'has-row-actions');
13756
 
13757
  var segments = window.mailpoet_segments.filter(function (segment) {
13758
  return _jquery2['default'].inArray(segment.id, form.segments) !== -1;
13769
  null,
13770
  _react2['default'].createElement(
13771
  'td',
13772
+ { className: rowClasses },
13773
  _react2['default'].createElement(
13774
  'strong',
13775
  null,
13833
  endpoint: 'forms',
13834
  onRenderItem: this.renderItem,
13835
  columns: columns,
13836
+ bulk_actions: bulkActions,
13837
+ item_actions: itemActions
13838
  })
13839
  );
13840
  }
16008
  }
16009
 
16010
  function renderMSSSection(data) {
16011
+ if (!data.mss.enabled) return undefined;
16012
 
16013
  var status = data.mss.enabled.isReachable;
16014
 
assets/js/{admin_vendor.8b1d6679.js → admin_vendor.ebb1a493.js} RENAMED
@@ -30794,26 +30794,22 @@ webpackJsonp([1],[
30794
  );
30795
  }
30796
 
30797
- var custom_actions = this.props.item_actions;
30798
- var item_actions = false;
30799
 
30800
- if (custom_actions.length > 0) {
30801
  (function () {
30802
- var is_first = true;
30803
- item_actions = custom_actions.map(function (action, index) {
30804
- if (action.display !== undefined) {
30805
- if (action.display(_this.props.item) === false) {
30806
- return;
30807
- }
30808
- }
30809
-
30810
- var custom_action = null;
30811
 
30812
  if (action.name === 'trash') {
30813
- custom_action = _react2['default'].createElement(
30814
  'span',
30815
  { key: 'action-' + index, className: 'trash' },
30816
- !is_first ? ' | ' : '',
30817
  _react2['default'].createElement(
30818
  'a',
30819
  {
@@ -30823,28 +30819,28 @@ webpackJsonp([1],[
30823
  )
30824
  );
30825
  } else if (action.refresh) {
30826
- custom_action = _react2['default'].createElement(
30827
  'span',
30828
  {
30829
  onClick: _this.props.onRefreshItems,
30830
  key: 'action-' + index, className: action.name },
30831
- !is_first ? ' | ' : '',
30832
  action.link(_this.props.item)
30833
  );
30834
  } else if (action.link) {
30835
- custom_action = _react2['default'].createElement(
30836
  'span',
30837
  {
30838
  key: 'action-' + index, className: action.name },
30839
- !is_first ? ' | ' : '',
30840
  action.link(_this.props.item)
30841
  );
30842
  } else {
30843
- custom_action = _react2['default'].createElement(
30844
  'span',
30845
  {
30846
  key: 'action-' + index, className: action.name },
30847
- !is_first ? ' | ' : '',
30848
  _react2['default'].createElement(
30849
  'a',
30850
  { href: 'javascript:;', onClick: action.onClick !== undefined ? action.onClick.bind(null, _this.props.item, _this.props.onRefreshItems) : false },
@@ -30853,15 +30849,15 @@ webpackJsonp([1],[
30853
  );
30854
  }
30855
 
30856
- if (custom_action !== null && is_first === true) {
30857
- is_first = false;
30858
  }
30859
 
30860
- return custom_action;
30861
  });
30862
  })();
30863
  } else {
30864
- item_actions = _react2['default'].createElement(
30865
  'span',
30866
  { className: 'edit' },
30867
  _react2['default'].createElement(
@@ -30927,7 +30923,7 @@ webpackJsonp([1],[
30927
  _react2['default'].createElement(
30928
  'div',
30929
  { className: 'row-actions' },
30930
- item_actions
30931
  ),
30932
  _react2['default'].createElement(
30933
  'button',
@@ -30943,11 +30939,11 @@ webpackJsonp([1],[
30943
  );
30944
  }
30945
 
30946
- var row_classes = (0, _classnames2['default'])({ 'is-expanded': this.state.expanded });
30947
 
30948
  return _react2['default'].createElement(
30949
  'tr',
30950
- { className: row_classes, 'data-automation-id': 'listing_item_' + this.props.item.id },
30951
  checkbox,
30952
  this.props.onRenderItem(this.props.item, actions)
30953
  );
@@ -30984,7 +30980,7 @@ webpackJsonp([1],[
30984
  )
30985
  );
30986
  }
30987
- var select_all_classes = (0, _classnames2['default'])('mailpoet_select_all', { mailpoet_hidden: this.props.selection === false || this.props.count <= this.props.limit
30988
  });
30989
 
30990
  return _react2['default'].createElement(
@@ -30992,7 +30988,7 @@ webpackJsonp([1],[
30992
  null,
30993
  _react2['default'].createElement(
30994
  'tr',
30995
- { className: select_all_classes },
30996
  _react2['default'].createElement(
30997
  'td',
30998
  { colSpan: this.props.columns.length + (this.props.is_selectable ? 1 : 0) },
@@ -31067,7 +31063,7 @@ webpackJsonp([1],[
31067
  var state = this.getInitialState();
31068
  // check for url params
31069
  if (params.splat) {
31070
- params.splat.split('/').map(function (param) {
31071
  var _getParam = _this3.getParam(param);
31072
 
31073
  var _getParam2 = _slicedToArray(_getParam, 2);
@@ -31078,7 +31074,7 @@ webpackJsonp([1],[
31078
  var filters = {};
31079
  switch (key) {
31080
  case 'filter':
31081
- value.split('&').map(function (pair) {
31082
  var _pair$split = pair.split('=');
31083
 
31084
  var _pair$split2 = _slicedToArray(_pair$split, 2);
@@ -31099,7 +31095,7 @@ webpackJsonp([1],[
31099
 
31100
  // limit per page
31101
  if (this.props.limit !== undefined) {
31102
- state.limit = Math.abs(~ ~this.props.limit);
31103
  }
31104
 
31105
  // sort by
@@ -31140,12 +31136,17 @@ webpackJsonp([1],[
31140
  } else if (value === Boolean(value)) {
31141
  value = value.toString();
31142
  }
31143
-
31144
- if (value !== '' && value !== null) {
31145
- return key + '[' + value + ']';
31146
- }
31147
- }).filter(function (key) {
31148
- return key !== undefined;
 
 
 
 
 
31149
  }).join('/');
31150
 
31151
  // set url
@@ -31157,22 +31158,22 @@ webpackJsonp([1],[
31157
  }
31158
  },
31159
  getUrlWithParams: function getUrlWithParams(params) {
31160
- var base_url = this.props.base_url !== undefined ? this.props.base_url : null;
31161
 
31162
- if (base_url !== null) {
31163
- base_url = this.setBaseUrlParams(base_url);
31164
- return '/' + base_url + '/' + params;
31165
  }
31166
  return '/' + params;
31167
  },
31168
- setBaseUrlParams: function setBaseUrlParams(base_url) {
31169
  var _this5 = this;
31170
 
31171
- var ret = base_url;
31172
  if (ret.indexOf(':') !== -1) {
31173
  (function () {
31174
  var params = _this5.getParams();
31175
- Object.keys(params).map(function (key) {
31176
  if (ret.indexOf(':' + key) !== -1) {
31177
  ret = ret.replace(':' + key, params[key]);
31178
  }
@@ -31346,10 +31347,10 @@ webpackJsonp([1],[
31346
  }), { scroll: true });
31347
  });
31348
  },
31349
- handleBulkAction: function handleBulkAction(selected_ids, params) {
31350
  var _this12 = this;
31351
 
31352
- if (this.state.selection === false && this.state.selected_ids.length === 0 && selected_ids !== 'all') {
31353
  return false;
31354
  }
31355
 
@@ -31364,8 +31365,8 @@ webpackJsonp([1],[
31364
  group: this.state.group,
31365
  search: this.state.search
31366
  };
31367
- if (selected_ids !== 'all') {
31368
- data.listing.selection = selected_ids;
31369
  }
31370
 
31371
  return _mailpoet2['default'].Ajax.post({
@@ -31395,47 +31396,47 @@ webpackJsonp([1],[
31395
  _this13.setParams();
31396
  });
31397
  },
31398
- handleSort: function handleSort(sort_by) {
31399
  var _this14 = this;
31400
 
31401
- var sort_order = arguments.length <= 1 || arguments[1] === undefined ? 'asc' : arguments[1];
31402
 
31403
  this.setState({
31404
- sort_by: sort_by,
31405
- sort_order: sort_order === 'asc' ? 'asc' : 'desc'
31406
  }, function () {
31407
  _this14.setParams();
31408
  });
31409
  },
31410
- handleSelectItem: function handleSelectItem(id, is_checked) {
31411
- var selected_ids = this.state.selected_ids;
31412
  var selection = false;
31413
 
31414
- if (is_checked) {
31415
- selected_ids = _jquery2['default'].merge(selected_ids, [id]);
31416
  // check whether all items on the page are selected
31417
  if ((0, _jquery2['default'])('tbody .check-column :checkbox:not(:checked)').length === 0) {
31418
  selection = 'page';
31419
  }
31420
  } else {
31421
- selected_ids.splice(selected_ids.indexOf(id), 1);
31422
  }
31423
 
31424
  this.setState({
31425
  selection: selection,
31426
- selected_ids: selected_ids
31427
  });
31428
  },
31429
- handleSelectItems: function handleSelectItems(is_checked) {
31430
- if (is_checked === false) {
31431
  this.clearSelection();
31432
  } else {
31433
- var selected_ids = this.state.items.map(function (item) {
31434
- return ~ ~item.id;
31435
  });
31436
 
31437
  this.setState({
31438
- selected_ids: selected_ids,
31439
  selection: 'page'
31440
  });
31441
  }
@@ -31501,8 +31502,8 @@ webpackJsonp([1],[
31501
  },
31502
  render: function render() {
31503
  var items = this.state.items;
31504
- var sort_by = this.state.sort_by;
31505
- var sort_order = this.state.sort_order;
31506
 
31507
  // columns
31508
  var columns = this.props.columns || [];
@@ -31511,10 +31512,10 @@ webpackJsonp([1],[
31511
  });
31512
 
31513
  // bulk actions
31514
- var bulk_actions = this.props.bulk_actions || [];
31515
 
31516
- if (this.state.group === 'trash' && bulk_actions.length > 0) {
31517
- bulk_actions = [{
31518
  name: 'restore',
31519
  label: _mailpoet2['default'].I18n.t('restore'),
31520
  onSuccess: this.props.messages.onRestore
@@ -31526,9 +31527,9 @@ webpackJsonp([1],[
31526
  }
31527
 
31528
  // item actions
31529
- var item_actions = this.props.item_actions || [];
31530
 
31531
- var table_classes = (0, _classnames2['default'])('mailpoet_listing_table', 'wp-list-table', 'widefat', 'fixed', 'striped', { mailpoet_listing_loading: this.state.loading });
31532
 
31533
  // search
31534
  var search = _react2['default'].createElement(_listingSearchJsx2['default'], {
@@ -31565,7 +31566,7 @@ webpackJsonp([1],[
31565
  { className: 'tablenav top clearfix' },
31566
  _react2['default'].createElement(_listingBulk_actionsJsx2['default'], {
31567
  count: this.state.count,
31568
- bulk_actions: bulk_actions,
31569
  selection: this.state.selection,
31570
  selected_ids: this.state.selected_ids,
31571
  onBulkAction: this.handleBulkAction }),
@@ -31585,7 +31586,7 @@ webpackJsonp([1],[
31585
  ),
31586
  _react2['default'].createElement(
31587
  'table',
31588
- { className: table_classes },
31589
  _react2['default'].createElement(
31590
  'thead',
31591
  null,
@@ -31593,10 +31594,10 @@ webpackJsonp([1],[
31593
  onSort: this.handleSort,
31594
  onSelectItems: this.handleSelectItems,
31595
  selection: this.state.selection,
31596
- sort_by: sort_by,
31597
- sort_order: sort_order,
31598
  columns: columns,
31599
- is_selectable: bulk_actions.length > 0 })
31600
  ),
31601
  _react2['default'].createElement(ListingItems, {
31602
  onRenderItem: this.handleRenderItem,
@@ -31605,7 +31606,7 @@ webpackJsonp([1],[
31605
  onTrashItem: this.handleTrashItem,
31606
  onRefreshItems: this.handleRefreshItems,
31607
  columns: columns,
31608
- is_selectable: bulk_actions.length > 0,
31609
  onSelectItem: this.handleSelectItem,
31610
  onSelectAll: this.handleSelectAll,
31611
  selection: this.state.selection,
@@ -31614,7 +31615,7 @@ webpackJsonp([1],[
31614
  group: this.state.group,
31615
  count: this.state.count,
31616
  limit: this.state.limit,
31617
- item_actions: item_actions,
31618
  messages: messages,
31619
  items: items }),
31620
  _react2['default'].createElement(
@@ -31624,10 +31625,10 @@ webpackJsonp([1],[
31624
  onSort: this.handleSort,
31625
  onSelectItems: this.handleSelectItems,
31626
  selection: this.state.selection,
31627
- sort_by: sort_by,
31628
- sort_order: sort_order,
31629
  columns: columns,
31630
- is_selectable: bulk_actions.length > 0 })
31631
  )
31632
  ),
31633
  _react2['default'].createElement(
@@ -31635,7 +31636,7 @@ webpackJsonp([1],[
31635
  { className: 'tablenav bottom' },
31636
  _react2['default'].createElement(_listingBulk_actionsJsx2['default'], {
31637
  count: this.state.count,
31638
- bulk_actions: bulk_actions,
31639
  selection: this.state.selection,
31640
  selected_ids: this.state.selected_ids,
31641
  onBulkAction: this.handleBulkAction }),
@@ -33254,7 +33255,7 @@ webpackJsonp([1],[
33254
  return;
33255
  }
33256
 
33257
- var selected_ids = this.props.selection !== 'all' ? this.props.selected_ids : [];
33258
 
33259
  var data = action.getData !== undefined ? action.getData() : {};
33260
 
@@ -33266,7 +33267,7 @@ webpackJsonp([1],[
33266
  }
33267
 
33268
  if (data.action) {
33269
- var promise = this.props.onBulkAction(selected_ids, data);
33270
  if (promise !== false) {
33271
  promise.then(onSuccess);
33272
  }
@@ -33278,10 +33279,10 @@ webpackJsonp([1],[
33278
  });
33279
  },
33280
  getSelectedAction: function getSelectedAction() {
33281
- var selected_action = this.refs.action.value;
33282
- if (selected_action.length > 0) {
33283
  var action = this.props.bulk_actions.filter(function (act) {
33284
- return act.name === selected_action;
33285
  });
33286
 
33287
  if (action.length > 0) {
@@ -33416,9 +33417,9 @@ webpackJsonp([1],[
33416
  displayName: 'ListingColumn',
33417
 
33418
  handleSort: function handleSort() {
33419
- var sort_by = this.props.column.name;
33420
- var sort_order = this.props.column.sorted === 'asc' ? 'desc' : 'asc';
33421
- this.props.onSort(sort_by, sort_order);
33422
  },
33423
  render: function render() {
33424
  var classes = (0, _classnames2['default'])('manage-column', { 'column-primary': this.props.column.is_primary }, { sortable: this.props.column.sortable }, this.props.column.sorted, { sorted: this.props.sort_by === this.props.column.name });
@@ -33490,7 +33491,7 @@ webpackJsonp([1],[
33490
  this.setPage(this.constrainPage(parseInt(this.props.page, 10) + 1));
33491
  },
33492
  constrainPage: function constrainPage(page) {
33493
- return Math.min(Math.max(1, Math.abs(~ ~page)), this.getLastPage());
33494
  },
33495
  handleSetManualPage: function handleSetManualPage(e) {
33496
  if (e.which === 13) {
@@ -33663,11 +33664,12 @@ webpackJsonp([1],[
33663
  var classes = classNames('tablenav-pages', { 'one-page': this.props.count <= this.props.limit });
33664
 
33665
  var numberOfItemsLabel = undefined;
33666
- if (this.props.count == 1) {
33667
  numberOfItemsLabel = MailPoet.I18n.t('numberOfItemsSingular');
33668
  } else {
33669
- numberOfItemsLabel = MailPoet.I18n.t('numberOfItemsMultiple').replace('%$1d', this.props.count.toLocaleString());
33670
  }
 
33671
  return React.createElement(
33672
  'div',
33673
  { className: classes },
@@ -33768,12 +33770,11 @@ webpackJsonp([1],[
33768
  className: classes,
33769
  onClick: _this.handleSelect.bind(_this, group.name) },
33770
  group.label,
33771
- ' ',
33772
  React.createElement(
33773
  'span',
33774
  { className: 'count' },
33775
  '(',
33776
- group.count.toLocaleString(),
33777
  ')'
33778
  )
33779
  )
@@ -33805,7 +33806,7 @@ webpackJsonp([1],[
33805
  var _this = this;
33806
 
33807
  var filters = {};
33808
- this.getAvailableFilters().map(function (filter, i) {
33809
  filters[_this.refs['filter-' + i].name] = _this.refs['filter-' + i].value;
33810
  });
33811
  if (this.props.onBeforeSelectFilter) {
@@ -33825,16 +33826,16 @@ webpackJsonp([1],[
33825
  componentDidUpdate: function componentDidUpdate() {
33826
  var _this2 = this;
33827
 
33828
- var selected_filters = this.props.filter;
33829
- this.getAvailableFilters().map(function (filter, i) {
33830
- if (selected_filters[filter] !== undefined && selected_filters[filter]) {
33831
- jQuery(_this2.refs['filter-' + i]).val(selected_filters[filter]).trigger('change');
33832
  }
33833
  });
33834
  },
33835
  render: function render() {
33836
  var filters = this.props.filters;
33837
- var available_filters = this.getAvailableFilters().map(function (filter, i) {
33838
  return React.createElement(
33839
  'select',
33840
  {
@@ -33857,7 +33858,7 @@ webpackJsonp([1],[
33857
 
33858
  var button = undefined;
33859
 
33860
- if (available_filters.length > 0) {
33861
  button = React.createElement('input', {
33862
  id: 'post-query-submit',
33863
  onClick: this.handleFilterAction,
@@ -33866,9 +33867,9 @@ webpackJsonp([1],[
33866
  className: 'button' });
33867
  }
33868
 
33869
- var empty_trash = undefined;
33870
  if (this.props.group === 'trash') {
33871
- empty_trash = React.createElement('input', {
33872
  onClick: this.handleEmptyTrash,
33873
  type: 'submit',
33874
  value: MailPoet.I18n.t('emptyTrash'),
@@ -33879,9 +33880,9 @@ webpackJsonp([1],[
33879
  return React.createElement(
33880
  'div',
33881
  { className: 'alignleft actions actions' },
33882
- available_filters,
33883
  button,
33884
- empty_trash
33885
  );
33886
  }
33887
  });
@@ -33917,7 +33918,7 @@ webpackJsonp([1],[
33917
  return this.state.select2 === true;
33918
  },
33919
  componentDidMount: function componentDidMount() {
33920
- if (this.allowMultipleValues()) {
33921
  this.setupSelect2();
33922
  }
33923
  },
@@ -33927,7 +33928,7 @@ webpackJsonp([1],[
33927
  }
33928
  },
33929
  componentWillUnmount: function componentWillUnmount() {
33930
- if (this.allowMultipleValues()) {
33931
  this.destroySelect2();
33932
  }
33933
  },
@@ -33985,9 +33986,14 @@ webpackJsonp([1],[
33985
  return null;
33986
  },
33987
  loadCachedItems: function loadCachedItems() {
 
33988
  if (typeof window['mailpoet_' + this.props.field.endpoint] !== 'undefined') {
33989
- var items = window['mailpoet_' + this.props.field.endpoint];
 
 
 
33990
 
 
33991
  if (this.props.field.filter !== undefined) {
33992
  items = items.filter(this.props.field.filter);
33993
  }
@@ -34041,6 +34047,14 @@ webpackJsonp([1],[
34041
  }
34042
  return value;
34043
  },
 
 
 
 
 
 
 
 
34044
  render: function render() {
34045
  var _this = this;
34046
 
@@ -34070,6 +34084,7 @@ webpackJsonp([1],[
34070
  multiple: this.props.field.multiple,
34071
  defaultValue: this.getSelectedValues()
34072
  }, this.props.field.validation),
 
34073
  options
34074
  );
34075
  }
@@ -39893,8 +39908,6 @@ webpackJsonp([1],[
39893
  if (props.item === undefined) {
39894
  this.refs.form.reset();
39895
  }
39896
- } else {
39897
- this.loadItem(props.params.id);
39898
  }
39899
  },
39900
  loadItem: function loadItem(id) {
@@ -39914,6 +39927,9 @@ webpackJsonp([1],[
39914
  loading: false,
39915
  item: response.data
39916
  });
 
 
 
39917
  }).fail(function () {
39918
  _this.setState({
39919
  loading: false,
@@ -39939,9 +39955,9 @@ webpackJsonp([1],[
39939
 
39940
  // only get values from displayed fields
39941
  var item = {};
39942
- this.props.fields.map(function (field) {
39943
  if (field.fields !== undefined) {
39944
- field.fields.map(function (subfield) {
39945
  item[subfield.name] = _this2.state.item[subfield.name];
39946
  });
39947
  } else {
@@ -40140,6 +40156,10 @@ webpackJsonp([1],[
40140
  case 'reactComponent':
40141
  field = React.createElement(data.field.component, data);
40142
  break;
 
 
 
 
40143
  }
40144
 
40145
  if (inline === true) {
@@ -40186,7 +40206,7 @@ webpackJsonp([1],[
40186
 
40187
  return React.createElement(
40188
  'tr',
40189
- null,
40190
  React.createElement(
40191
  'th',
40192
  { scope: 'row' },
@@ -40267,7 +40287,7 @@ webpackJsonp([1],[
40267
  type: "text",
40268
  className: "regular-text",
40269
  name: this.props.field.name,
40270
- id: 'field_' + this.props.field.name,
40271
  value: this.props.item[this.props.field.name],
40272
  placeholder: this.props.field.placeholder,
40273
  defaultValue: this.props.field.defaultValue,
@@ -40340,11 +40360,10 @@ webpackJsonp([1],[
40340
  keys = Object.keys(this.props.field.values);
40341
  }
40342
 
40343
- var options = keys.map(function (value, index) {
40344
- if (filter !== false && filter(_this.props.item, value) === false) {
40345
- return;
40346
- }
40347
-
40348
  return _react2['default'].createElement(
40349
  'option',
40350
  {
@@ -40374,11 +40393,11 @@ webpackJsonp([1],[
40374
  /* 298 */
40375
  /***/ function(module, exports, __webpack_require__) {
40376
 
40377
- var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;'use strict';
40378
 
40379
  !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(2)], __WEBPACK_AMD_DEFINE_RESULT__ = function (React) {
40380
  var FormFieldRadio = React.createClass({
40381
- displayName: 'FormFieldRadio',
40382
 
40383
  render: function render() {
40384
  var _this = this;
@@ -40387,17 +40406,17 @@ webpackJsonp([1],[
40387
  return false;
40388
  }
40389
 
40390
- var selected_value = this.props.item[this.props.field.name];
40391
  var options = Object.keys(this.props.field.values).map(function (value, index) {
40392
  return React.createElement(
40393
- 'p',
40394
- { key: 'radio-' + index },
40395
  React.createElement(
40396
- 'label',
40397
  null,
40398
- React.createElement('input', {
40399
- type: 'radio',
40400
- checked: selected_value === value,
40401
  value: value,
40402
  onChange: _this.props.onValueChange,
40403
  name: _this.props.field.name }),
@@ -40407,7 +40426,7 @@ webpackJsonp([1],[
40407
  });
40408
 
40409
  return React.createElement(
40410
- 'div',
40411
  null,
40412
  options
40413
  );
@@ -40440,7 +40459,7 @@ webpackJsonp([1],[
40440
 
40441
  // isChecked will be true only if the value is "1"
40442
  // it will be false in case value is "0" or empty
40443
- var isChecked = !! ~ ~this.props.item[this.props.field.name];
40444
  var options = Object.keys(this.props.field.values).map(function (value, index) {
40445
  return React.createElement(
40446
  'p',
@@ -40710,6 +40729,11 @@ webpackJsonp([1],[
40710
  year: this.state.year
40711
  };
40712
  break;
 
 
 
 
 
40713
  }
40714
 
40715
  return value;
@@ -40728,7 +40752,7 @@ webpackJsonp([1],[
40728
  field = matches[1];
40729
  property = matches[2];
40730
 
40731
- var value = ~ ~e.target.value;
40732
 
40733
  this.setState(_defineProperty({}, '' + property, value), function () {
40734
  _this.props.onValueChange({
@@ -40782,6 +40806,13 @@ webpackJsonp([1],[
40782
  day: _this2.state.day,
40783
  placeholder: _this2.props.field.day_placeholder
40784
  });
 
 
 
 
 
 
 
40785
  }
40786
  });
40787
 
@@ -40804,7 +40835,7 @@ webpackJsonp([1],[
40804
  /***/ function(module, exports, __webpack_require__) {
40805
 
40806
  var require;/* WEBPACK VAR INJECTION */(function(module) {//! moment.js
40807
- //! version : 2.19.3
40808
  //! authors : Tim Wood, Iskren Chernev, Moment.js contributors
40809
  //! license : MIT
40810
  //! momentjs.com
@@ -42834,7 +42865,7 @@ webpackJsonp([1],[
42834
  // note: all values past the year are optional and will default to the lowest possible value.
42835
  // [year, month, day , hour, minute, second, millisecond]
42836
  function configFromArray (config) {
42837
- var i, date, input = [], currentDate, yearToUse;
42838
 
42839
  if (config._d) {
42840
  return;
@@ -42884,6 +42915,8 @@ webpackJsonp([1],[
42884
  }
42885
 
42886
  config._d = (config._useUTC ? createUTCDate : createDate).apply(null, input);
 
 
42887
  // Apply timezone offset from input. The actual utcOffset can be changed
42888
  // with parseZone.
42889
  if (config._tzm != null) {
@@ -42895,7 +42928,7 @@ webpackJsonp([1],[
42895
  }
42896
 
42897
  // check for mismatching day of week
42898
- if (config._w && typeof config._w.d !== 'undefined' && config._w.d !== config._d.getDay()) {
42899
  getParsingFlags(config).weekdayMismatch = true;
42900
  }
42901
  }
@@ -44471,7 +44504,7 @@ webpackJsonp([1],[
44471
 
44472
  addParseToken(['D', 'DD'], DATE);
44473
  addParseToken('Do', function (input, array) {
44474
- array[DATE] = toInt(input.match(match1to2)[0], 10);
44475
  });
44476
 
44477
  // MOMENTS
@@ -45283,7 +45316,7 @@ webpackJsonp([1],[
45283
  // Side effect imports
45284
 
45285
 
45286
- hooks.version = '2.19.3';
45287
 
45288
  setHookCallback(createLocal);
45289
 
30794
  );
30795
  }
30796
 
30797
+ var customActions = this.props.item_actions;
30798
+ var itemActions = false;
30799
 
30800
+ if (customActions.length > 0) {
30801
  (function () {
30802
+ var isFirst = true;
30803
+ itemActions = customActions.filter(function (action) {
30804
+ return action.display === undefined || action.display(_this.props.item);
30805
+ }).map(function (action, index) {
30806
+ var customAction = null;
 
 
 
 
30807
 
30808
  if (action.name === 'trash') {
30809
+ customAction = _react2['default'].createElement(
30810
  'span',
30811
  { key: 'action-' + index, className: 'trash' },
30812
+ !isFirst ? ' | ' : '',
30813
  _react2['default'].createElement(
30814
  'a',
30815
  {
30819
  )
30820
  );
30821
  } else if (action.refresh) {
30822
+ customAction = _react2['default'].createElement(
30823
  'span',
30824
  {
30825
  onClick: _this.props.onRefreshItems,
30826
  key: 'action-' + index, className: action.name },
30827
+ !isFirst ? ' | ' : '',
30828
  action.link(_this.props.item)
30829
  );
30830
  } else if (action.link) {
30831
+ customAction = _react2['default'].createElement(
30832
  'span',
30833
  {
30834
  key: 'action-' + index, className: action.name },
30835
+ !isFirst ? ' | ' : '',
30836
  action.link(_this.props.item)
30837
  );
30838
  } else {
30839
+ customAction = _react2['default'].createElement(
30840
  'span',
30841
  {
30842
  key: 'action-' + index, className: action.name },
30843
+ !isFirst ? ' | ' : '',
30844
  _react2['default'].createElement(
30845
  'a',
30846
  { href: 'javascript:;', onClick: action.onClick !== undefined ? action.onClick.bind(null, _this.props.item, _this.props.onRefreshItems) : false },
30849
  );
30850
  }
30851
 
30852
+ if (customAction !== null && isFirst === true) {
30853
+ isFirst = false;
30854
  }
30855
 
30856
+ return customAction;
30857
  });
30858
  })();
30859
  } else {
30860
+ itemActions = _react2['default'].createElement(
30861
  'span',
30862
  { className: 'edit' },
30863
  _react2['default'].createElement(
30923
  _react2['default'].createElement(
30924
  'div',
30925
  { className: 'row-actions' },
30926
+ itemActions
30927
  ),
30928
  _react2['default'].createElement(
30929
  'button',
30939
  );
30940
  }
30941
 
30942
+ var rowClasses = (0, _classnames2['default'])({ 'is-expanded': this.state.expanded });
30943
 
30944
  return _react2['default'].createElement(
30945
  'tr',
30946
+ { className: rowClasses, 'data-automation-id': 'listing_item_' + this.props.item.id },
30947
  checkbox,
30948
  this.props.onRenderItem(this.props.item, actions)
30949
  );
30980
  )
30981
  );
30982
  }
30983
+ var selectAllClasses = (0, _classnames2['default'])('mailpoet_select_all', { mailpoet_hidden: this.props.selection === false || this.props.count <= this.props.limit
30984
  });
30985
 
30986
  return _react2['default'].createElement(
30988
  null,
30989
  _react2['default'].createElement(
30990
  'tr',
30991
+ { className: selectAllClasses },
30992
  _react2['default'].createElement(
30993
  'td',
30994
  { colSpan: this.props.columns.length + (this.props.is_selectable ? 1 : 0) },
31063
  var state = this.getInitialState();
31064
  // check for url params
31065
  if (params.splat) {
31066
+ params.splat.split('/').forEach(function (param) {
31067
  var _getParam = _this3.getParam(param);
31068
 
31069
  var _getParam2 = _slicedToArray(_getParam, 2);
31074
  var filters = {};
31075
  switch (key) {
31076
  case 'filter':
31077
+ value.split('&').forEach(function (pair) {
31078
  var _pair$split = pair.split('=');
31079
 
31080
  var _pair$split2 = _slicedToArray(_pair$split, 2);
31095
 
31096
  // limit per page
31097
  if (this.props.limit !== undefined) {
31098
+ state.limit = Math.abs(Number(this.props.limit));
31099
  }
31100
 
31101
  // sort by
31136
  } else if (value === Boolean(value)) {
31137
  value = value.toString();
31138
  }
31139
+ return {
31140
+ key: key,
31141
+ value: value
31142
+ };
31143
+ }).filter(function (_ref) {
31144
+ var value = _ref.value;
31145
+ return value !== '' && value !== null;
31146
+ }).map(function (_ref2) {
31147
+ var key = _ref2.key;
31148
+ var value = _ref2.value;
31149
+ return key + '[' + value + ']';
31150
  }).join('/');
31151
 
31152
  // set url
31158
  }
31159
  },
31160
  getUrlWithParams: function getUrlWithParams(params) {
31161
+ var baseUrl = this.props.base_url !== undefined ? this.props.base_url : null;
31162
 
31163
+ if (baseUrl !== null) {
31164
+ baseUrl = this.setBaseUrlParams(baseUrl);
31165
+ return '/' + baseUrl + '/' + params;
31166
  }
31167
  return '/' + params;
31168
  },
31169
+ setBaseUrlParams: function setBaseUrlParams(baseUrl) {
31170
  var _this5 = this;
31171
 
31172
+ var ret = baseUrl;
31173
  if (ret.indexOf(':') !== -1) {
31174
  (function () {
31175
  var params = _this5.getParams();
31176
+ Object.keys(params).forEach(function (key) {
31177
  if (ret.indexOf(':' + key) !== -1) {
31178
  ret = ret.replace(':' + key, params[key]);
31179
  }
31347
  }), { scroll: true });
31348
  });
31349
  },
31350
+ handleBulkAction: function handleBulkAction(selectedIds, params) {
31351
  var _this12 = this;
31352
 
31353
+ if (this.state.selection === false && this.state.selected_ids.length === 0 && selectedIds !== 'all') {
31354
  return false;
31355
  }
31356
 
31365
  group: this.state.group,
31366
  search: this.state.search
31367
  };
31368
+ if (selectedIds !== 'all') {
31369
+ data.listing.selection = selectedIds;
31370
  }
31371
 
31372
  return _mailpoet2['default'].Ajax.post({
31396
  _this13.setParams();
31397
  });
31398
  },
31399
+ handleSort: function handleSort(sortBy) {
31400
  var _this14 = this;
31401
 
31402
+ var sortOrder = arguments.length <= 1 || arguments[1] === undefined ? 'asc' : arguments[1];
31403
 
31404
  this.setState({
31405
+ sort_by: sortBy,
31406
+ sort_order: sortOrder === 'asc' ? 'asc' : 'desc'
31407
  }, function () {
31408
  _this14.setParams();
31409
  });
31410
  },
31411
+ handleSelectItem: function handleSelectItem(id, isChecked) {
31412
+ var selectedIds = this.state.selected_ids;
31413
  var selection = false;
31414
 
31415
+ if (isChecked) {
31416
+ selectedIds = _jquery2['default'].merge(selectedIds, [id]);
31417
  // check whether all items on the page are selected
31418
  if ((0, _jquery2['default'])('tbody .check-column :checkbox:not(:checked)').length === 0) {
31419
  selection = 'page';
31420
  }
31421
  } else {
31422
+ selectedIds.splice(selectedIds.indexOf(id), 1);
31423
  }
31424
 
31425
  this.setState({
31426
  selection: selection,
31427
+ selected_ids: selectedIds
31428
  });
31429
  },
31430
+ handleSelectItems: function handleSelectItems(isChecked) {
31431
+ if (isChecked === false) {
31432
  this.clearSelection();
31433
  } else {
31434
+ var selectedIds = this.state.items.map(function (item) {
31435
+ return Number(item.id);
31436
  });
31437
 
31438
  this.setState({
31439
+ selected_ids: selectedIds,
31440
  selection: 'page'
31441
  });
31442
  }
31502
  },
31503
  render: function render() {
31504
  var items = this.state.items;
31505
+ var sortBy = this.state.sort_by;
31506
+ var sortOrder = this.state.sort_order;
31507
 
31508
  // columns
31509
  var columns = this.props.columns || [];
31512
  });
31513
 
31514
  // bulk actions
31515
+ var bulkActions = this.props.bulk_actions || [];
31516
 
31517
+ if (this.state.group === 'trash' && bulkActions.length > 0) {
31518
+ bulkActions = [{
31519
  name: 'restore',
31520
  label: _mailpoet2['default'].I18n.t('restore'),
31521
  onSuccess: this.props.messages.onRestore
31527
  }
31528
 
31529
  // item actions
31530
+ var itemActions = this.props.item_actions || [];
31531
 
31532
+ var tableClasses = (0, _classnames2['default'])('mailpoet_listing_table', 'wp-list-table', 'widefat', 'fixed', 'striped', { mailpoet_listing_loading: this.state.loading });
31533
 
31534
  // search
31535
  var search = _react2['default'].createElement(_listingSearchJsx2['default'], {
31566
  { className: 'tablenav top clearfix' },
31567
  _react2['default'].createElement(_listingBulk_actionsJsx2['default'], {
31568
  count: this.state.count,
31569
+ bulk_actions: bulkActions,
31570
  selection: this.state.selection,
31571
  selected_ids: this.state.selected_ids,
31572
  onBulkAction: this.handleBulkAction }),
31586
  ),
31587
  _react2['default'].createElement(
31588
  'table',
31589
+ { className: tableClasses },
31590
  _react2['default'].createElement(
31591
  'thead',
31592
  null,
31594
  onSort: this.handleSort,
31595
  onSelectItems: this.handleSelectItems,
31596
  selection: this.state.selection,
31597
+ sort_by: sortBy,
31598
+ sort_order: sortOrder,
31599
  columns: columns,
31600
+ is_selectable: bulkActions.length > 0 })
31601
  ),
31602
  _react2['default'].createElement(ListingItems, {
31603
  onRenderItem: this.handleRenderItem,
31606
  onTrashItem: this.handleTrashItem,
31607
  onRefreshItems: this.handleRefreshItems,
31608
  columns: columns,
31609
+ is_selectable: bulkActions.length > 0,
31610
  onSelectItem: this.handleSelectItem,
31611
  onSelectAll: this.handleSelectAll,
31612
  selection: this.state.selection,
31615
  group: this.state.group,
31616
  count: this.state.count,
31617
  limit: this.state.limit,
31618
+ item_actions: itemActions,
31619
  messages: messages,
31620
  items: items }),
31621
  _react2['default'].createElement(
31625
  onSort: this.handleSort,
31626
  onSelectItems: this.handleSelectItems,
31627
  selection: this.state.selection,
31628
+ sort_by: sortBy,
31629
+ sort_order: sortOrder,
31630
  columns: columns,
31631
+ is_selectable: bulkActions.length > 0 })
31632
  )
31633
  ),
31634
  _react2['default'].createElement(
31636
  { className: 'tablenav bottom' },
31637
  _react2['default'].createElement(_listingBulk_actionsJsx2['default'], {
31638
  count: this.state.count,
31639
+ bulk_actions: bulkActions,
31640
  selection: this.state.selection,
31641
  selected_ids: this.state.selected_ids,
31642
  onBulkAction: this.handleBulkAction }),
33255
  return;
33256
  }
33257
 
33258
+ var selectedIds = this.props.selection !== 'all' ? this.props.selected_ids : [];
33259
 
33260
  var data = action.getData !== undefined ? action.getData() : {};
33261
 
33267
  }
33268
 
33269
  if (data.action) {
33270
+ var promise = this.props.onBulkAction(selectedIds, data);
33271
  if (promise !== false) {
33272
  promise.then(onSuccess);
33273
  }
33279
  });
33280
  },
33281
  getSelectedAction: function getSelectedAction() {
33282
+ var selectedAction = this.refs.action.value;
33283
+ if (selectedAction.length > 0) {
33284
  var action = this.props.bulk_actions.filter(function (act) {
33285
+ return act.name === selectedAction;
33286
  });
33287
 
33288
  if (action.length > 0) {
33417
  displayName: 'ListingColumn',
33418
 
33419
  handleSort: function handleSort() {
33420
+ var sortBy = this.props.column.name;
33421
+ var sortOrder = this.props.column.sorted === 'asc' ? 'desc' : 'asc';
33422
+ this.props.onSort(sortBy, sortOrder);
33423
  },
33424
  render: function render() {
33425
  var classes = (0, _classnames2['default'])('manage-column', { 'column-primary': this.props.column.is_primary }, { sortable: this.props.column.sortable }, this.props.column.sorted, { sorted: this.props.sort_by === this.props.column.name });
33491
  this.setPage(this.constrainPage(parseInt(this.props.page, 10) + 1));
33492
  },
33493
  constrainPage: function constrainPage(page) {
33494
+ return Math.min(Math.max(1, Math.abs(Number(page))), this.getLastPage());
33495
  },
33496
  handleSetManualPage: function handleSetManualPage(e) {
33497
  if (e.which === 13) {
33664
  var classes = classNames('tablenav-pages', { 'one-page': this.props.count <= this.props.limit });
33665
 
33666
  var numberOfItemsLabel = undefined;
33667
+ if (Number(this.props.count) === 1) {
33668
  numberOfItemsLabel = MailPoet.I18n.t('numberOfItemsSingular');
33669
  } else {
33670
+ numberOfItemsLabel = MailPoet.I18n.t('numberOfItemsMultiple').replace('%$1d', parseInt(this.props.count, 10).toLocaleString());
33671
  }
33672
+
33673
  return React.createElement(
33674
  'div',
33675
  { className: classes },
33770
  className: classes,
33771
  onClick: _this.handleSelect.bind(_this, group.name) },
33772
  group.label,
 
33773
  React.createElement(
33774
  'span',
33775
  { className: 'count' },
33776
  '(',
33777
+ parseInt(group.count, 10).toLocaleString(),
33778
  ')'
33779
  )
33780
  )
33806
  var _this = this;
33807
 
33808
  var filters = {};
33809
+ this.getAvailableFilters().forEach(function (filter, i) {
33810
  filters[_this.refs['filter-' + i].name] = _this.refs['filter-' + i].value;
33811
  });
33812
  if (this.props.onBeforeSelectFilter) {
33826
  componentDidUpdate: function componentDidUpdate() {
33827
  var _this2 = this;
33828
 
33829
+ var selectedFilters = this.props.filter;
33830
+ this.getAvailableFilters().forEach(function (filter, i) {
33831
+ if (selectedFilters[filter] !== undefined && selectedFilters[filter]) {
33832
+ jQuery(_this2.refs['filter-' + i]).val(selectedFilters[filter]).trigger('change');
33833
  }
33834
  });
33835
  },
33836
  render: function render() {
33837
  var filters = this.props.filters;
33838
+ var availableFilters = this.getAvailableFilters().map(function (filter, i) {
33839
  return React.createElement(
33840
  'select',
33841
  {
33858
 
33859
  var button = undefined;
33860
 
33861
+ if (availableFilters.length > 0) {
33862
  button = React.createElement('input', {
33863
  id: 'post-query-submit',
33864
  onClick: this.handleFilterAction,
33867
  className: 'button' });
33868
  }
33869
 
33870
+ var emptyTrash = undefined;
33871
  if (this.props.group === 'trash') {
33872
+ emptyTrash = React.createElement('input', {
33873
  onClick: this.handleEmptyTrash,
33874
  type: 'submit',
33875
  value: MailPoet.I18n.t('emptyTrash'),
33880
  return React.createElement(
33881
  'div',
33882
  { className: 'alignleft actions actions' },
33883
+ availableFilters,
33884
  button,
33885
+ emptyTrash
33886
  );
33887
  }
33888
  });
33918
  return this.state.select2 === true;
33919
  },
33920
  componentDidMount: function componentDidMount() {
33921
+ if (this.allowMultipleValues() || this.props.field.forceSelect2) {
33922
  this.setupSelect2();
33923
  }
33924
  },
33928
  }
33929
  },
33930
  componentWillUnmount: function componentWillUnmount() {
33931
+ if (this.allowMultipleValues() || this.props.field.forceSelect2) {
33932
  this.destroySelect2();
33933
  }
33934
  },
33986
  return null;
33987
  },
33988
  loadCachedItems: function loadCachedItems() {
33989
+ var items = undefined;
33990
  if (typeof window['mailpoet_' + this.props.field.endpoint] !== 'undefined') {
33991
+ items = window['mailpoet_' + this.props.field.endpoint];
33992
+ } else if (this.props.field.values !== undefined) {
33993
+ items = this.props.field.values;
33994
+ }
33995
 
33996
+ if (Array.isArray(items)) {
33997
  if (this.props.field.filter !== undefined) {
33998
  items = items.filter(this.props.field.filter);
33999
  }
34047
  }
34048
  return value;
34049
  },
34050
+ insertEmptyOption: function insertEmptyOption() {
34051
+ // https://select2.org/placeholders
34052
+ // For single selects only, in order for the placeholder value to appear,
34053
+ // we must have a blank <option> as the first option in the <select> control.
34054
+ if (this.allowMultipleValues()) return undefined;
34055
+ if (this.props.field.placeholder) return React.createElement('option', null);
34056
+ return undefined;
34057
+ },
34058
  render: function render() {
34059
  var _this = this;
34060
 
34084
  multiple: this.props.field.multiple,
34085
  defaultValue: this.getSelectedValues()
34086
  }, this.props.field.validation),
34087
+ this.insertEmptyOption(),
34088
  options
34089
  );
34090
  }
39908
  if (props.item === undefined) {
39909
  this.refs.form.reset();
39910
  }
 
 
39911
  }
39912
  },
39913
  loadItem: function loadItem(id) {
39927
  loading: false,
39928
  item: response.data
39929
  });
39930
+ if (typeof _this.props.onItemLoad === 'function') {
39931
+ _this.props.onItemLoad(response.data);
39932
+ }
39933
  }).fail(function () {
39934
  _this.setState({
39935
  loading: false,
39955
 
39956
  // only get values from displayed fields
39957
  var item = {};
39958
+ this.props.fields.forEach(function (field) {
39959
  if (field.fields !== undefined) {
39960
+ field.fields.forEach(function (subfield) {
39961
  item[subfield.name] = _this2.state.item[subfield.name];
39962
  });
39963
  } else {
40156
  case 'reactComponent':
40157
  field = React.createElement(data.field.component, data);
40158
  break;
40159
+
40160
+ default:
40161
+ field = 'invalid';
40162
+ break;
40163
  }
40164
 
40165
  if (inline === true) {
40206
 
40207
  return React.createElement(
40208
  'tr',
40209
+ { className: 'form-field-row-' + this.props.field.name },
40210
  React.createElement(
40211
  'th',
40212
  { scope: 'row' },
40287
  type: "text",
40288
  className: "regular-text",
40289
  name: this.props.field.name,
40290
+ id: "field_" + this.props.field.name,
40291
  value: this.props.item[this.props.field.name],
40292
  placeholder: this.props.field.placeholder,
40293
  defaultValue: this.props.field.defaultValue,
40360
  keys = Object.keys(this.props.field.values);
40361
  }
40362
 
40363
+ var options = keys.filter(function (value) {
40364
+ if (filter === false) return true;
40365
+ return filter(_this.props.item, value);
40366
+ }).map(function (value, index) {
 
40367
  return _react2['default'].createElement(
40368
  'option',
40369
  {
40393
  /* 298 */
40394
  /***/ function(module, exports, __webpack_require__) {
40395
 
40396
+ var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;"use strict";
40397
 
40398
  !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(2)], __WEBPACK_AMD_DEFINE_RESULT__ = function (React) {
40399
  var FormFieldRadio = React.createClass({
40400
+ displayName: "FormFieldRadio",
40401
 
40402
  render: function render() {
40403
  var _this = this;
40406
  return false;
40407
  }
40408
 
40409
+ var selectedValue = this.props.item[this.props.field.name];
40410
  var options = Object.keys(this.props.field.values).map(function (value, index) {
40411
  return React.createElement(
40412
+ "p",
40413
+ { key: "radio-" + index },
40414
  React.createElement(
40415
+ "label",
40416
  null,
40417
+ React.createElement("input", {
40418
+ type: "radio",
40419
+ checked: selectedValue === value,
40420
  value: value,
40421
  onChange: _this.props.onValueChange,
40422
  name: _this.props.field.name }),
40426
  });
40427
 
40428
  return React.createElement(
40429
+ "div",
40430
  null,
40431
  options
40432
  );
40459
 
40460
  // isChecked will be true only if the value is "1"
40461
  // it will be false in case value is "0" or empty
40462
+ var isChecked = !!Number(this.props.item[this.props.field.name]);
40463
  var options = Object.keys(this.props.field.values).map(function (value, index) {
40464
  return React.createElement(
40465
  'p',
40729
  year: this.state.year
40730
  };
40731
  break;
40732
+ default:
40733
+ value = {
40734
+ value: 'invalid type'
40735
+ };
40736
+ break;
40737
  }
40738
 
40739
  return value;
40752
  field = matches[1];
40753
  property = matches[2];
40754
 
40755
+ var value = Number(e.target.value);
40756
 
40757
  this.setState(_defineProperty({}, '' + property, value), function () {
40758
  _this.props.onValueChange({
40806
  day: _this2.state.day,
40807
  placeholder: _this2.props.field.day_placeholder
40808
  });
40809
+
40810
+ default:
40811
+ return React.createElement(
40812
+ 'div',
40813
+ null,
40814
+ 'Invalid date type'
40815
+ );
40816
  }
40817
  });
40818
 
40835
  /***/ function(module, exports, __webpack_require__) {
40836
 
40837
  var require;/* WEBPACK VAR INJECTION */(function(module) {//! moment.js
40838
+ //! version : 2.19.4
40839
  //! authors : Tim Wood, Iskren Chernev, Moment.js contributors
40840
  //! license : MIT
40841
  //! momentjs.com
42865
  // note: all values past the year are optional and will default to the lowest possible value.
42866
  // [year, month, day , hour, minute, second, millisecond]
42867
  function configFromArray (config) {
42868
+ var i, date, input = [], currentDate, expectedWeekday, yearToUse;
42869
 
42870
  if (config._d) {
42871
  return;
42915
  }
42916
 
42917
  config._d = (config._useUTC ? createUTCDate : createDate).apply(null, input);
42918
+ expectedWeekday = config._useUTC ? config._d.getUTCDay() : config._d.getDay();
42919
+
42920
  // Apply timezone offset from input. The actual utcOffset can be changed
42921
  // with parseZone.
42922
  if (config._tzm != null) {
42928
  }
42929
 
42930
  // check for mismatching day of week
42931
+ if (config._w && typeof config._w.d !== 'undefined' && config._w.d !== expectedWeekday) {
42932
  getParsingFlags(config).weekdayMismatch = true;
42933
  }
42934
  }
44504
 
44505
  addParseToken(['D', 'DD'], DATE);
44506
  addParseToken('Do', function (input, array) {
44507
+ array[DATE] = toInt(input.match(match1to2)[0]);
44508
  });
44509
 
44510
  // MOMENTS
45316
  // Side effect imports
45317
 
45318
 
45319
+ hooks.version = '2.19.4';
45320
 
45321
  setHookCallback(createLocal);
45322
 
assets/js/{mailpoet.0a2f113c.js → mailpoet.a5fa72ae.js} RENAMED
@@ -23905,7 +23905,7 @@ webpackJsonp([3],[
23905
  /***/ function(module, exports, __webpack_require__) {
23906
 
23907
  var require;/* WEBPACK VAR INJECTION */(function(module) {//! moment.js
23908
- //! version : 2.19.3
23909
  //! authors : Tim Wood, Iskren Chernev, Moment.js contributors
23910
  //! license : MIT
23911
  //! momentjs.com
@@ -25935,7 +25935,7 @@ webpackJsonp([3],[
25935
  // note: all values past the year are optional and will default to the lowest possible value.
25936
  // [year, month, day , hour, minute, second, millisecond]
25937
  function configFromArray (config) {
25938
- var i, date, input = [], currentDate, yearToUse;
25939
 
25940
  if (config._d) {
25941
  return;
@@ -25985,6 +25985,8 @@ webpackJsonp([3],[
25985
  }
25986
 
25987
  config._d = (config._useUTC ? createUTCDate : createDate).apply(null, input);
 
 
25988
  // Apply timezone offset from input. The actual utcOffset can be changed
25989
  // with parseZone.
25990
  if (config._tzm != null) {
@@ -25996,7 +25998,7 @@ webpackJsonp([3],[
25996
  }
25997
 
25998
  // check for mismatching day of week
25999
- if (config._w && typeof config._w.d !== 'undefined' && config._w.d !== config._d.getDay()) {
26000
  getParsingFlags(config).weekdayMismatch = true;
26001
  }
26002
  }
@@ -27572,7 +27574,7 @@ webpackJsonp([3],[
27572
 
27573
  addParseToken(['D', 'DD'], DATE);
27574
  addParseToken('Do', function (input, array) {
27575
- array[DATE] = toInt(input.match(match1to2)[0], 10);
27576
  });
27577
 
27578
  // MOMENTS
@@ -28384,7 +28386,7 @@ webpackJsonp([3],[
28384
  // Side effect imports
28385
 
28386
 
28387
- hooks.version = '2.19.3';
28388
 
28389
  setHookCallback(createLocal);
28390
 
23905
  /***/ function(module, exports, __webpack_require__) {
23906
 
23907
  var require;/* WEBPACK VAR INJECTION */(function(module) {//! moment.js
23908
+ //! version : 2.19.4
23909
  //! authors : Tim Wood, Iskren Chernev, Moment.js contributors
23910
  //! license : MIT
23911
  //! momentjs.com
25935
  // note: all values past the year are optional and will default to the lowest possible value.
25936
  // [year, month, day , hour, minute, second, millisecond]
25937
  function configFromArray (config) {
25938
+ var i, date, input = [], currentDate, expectedWeekday, yearToUse;
25939
 
25940
  if (config._d) {
25941
  return;
25985
  }
25986
 
25987
  config._d = (config._useUTC ? createUTCDate : createDate).apply(null, input);
25988
+ expectedWeekday = config._useUTC ? config._d.getUTCDay() : config._d.getDay();
25989
+
25990
  // Apply timezone offset from input. The actual utcOffset can be changed
25991
  // with parseZone.
25992
  if (config._tzm != null) {
25998
  }
25999
 
26000
  // check for mismatching day of week
26001
+ if (config._w && typeof config._w.d !== 'undefined' && config._w.d !== expectedWeekday) {
26002
  getParsingFlags(config).weekdayMismatch = true;
26003
  }
26004
  }
27574
 
27575
  addParseToken(['D', 'DD'], DATE);
27576
  addParseToken('Do', function (input, array) {
27577
+ array[DATE] = toInt(input.match(match1to2)[0]);
27578
  });
27579
 
27580
  // MOMENTS
28386
  // Side effect imports
28387
 
28388
 
28389
+ hooks.version = '2.19.4';
28390
 
28391
  setHookCallback(createLocal);
28392
 
assets/js/manifest.json CHANGED
@@ -1,10 +1,10 @@
1
  {
2
  "mp2migrator.js": "mp2migrator.81060f18.js",
3
  "public.js": "public.3d1d91ad.js",
4
- "admin.js": "admin.dfed86f0.js",
5
- "admin_vendor.js": "admin_vendor.8b1d6679.js",
6
  "form_editor.js": "form_editor.cc7529b3.js",
7
- "mailpoet.js": "mailpoet.0a2f113c.js",
8
  "newsletter_editor.js": "newsletter_editor.e7b87b92.js",
9
- "vendor.js": "vendor.16d46c95.js"
10
  }
1
  {
2
  "mp2migrator.js": "mp2migrator.81060f18.js",
3
  "public.js": "public.3d1d91ad.js",
4
+ "admin.js": "admin.2f3f63a4.js",
5
+ "admin_vendor.js": "admin_vendor.ebb1a493.js",
6
  "form_editor.js": "form_editor.cc7529b3.js",
7
+ "mailpoet.js": "mailpoet.a5fa72ae.js",
8
  "newsletter_editor.js": "newsletter_editor.e7b87b92.js",
9
+ "vendor.js": "vendor.3c206dd6.js"
10
  }
assets/js/{vendor.16d46c95.js → vendor.3c206dd6.js} RENAMED
@@ -76,7 +76,7 @@
76
  /******/ script.charset = 'utf-8';
77
  /******/ script.async = true;
78
 
79
- /******/ script.src = __webpack_require__.p + "" + ({"0":"admin","1":"admin_vendor","2":"form_editor","3":"mailpoet","4":"newsletter_editor"}[chunkId]||chunkId) + "." + {"0":"dfed86f0","1":"8b1d6679","2":"cc7529b3","3":"0a2f113c","4":"e7b87b92"}[chunkId] + ".chunk.js";
80
  /******/ head.appendChild(script);
81
  /******/ }
82
  /******/ };
76
  /******/ script.charset = 'utf-8';
77
  /******/ script.async = true;
78
 
79
+ /******/ script.src = __webpack_require__.p + "" + ({"0":"admin","1":"admin_vendor","2":"form_editor","3":"mailpoet","4":"newsletter_editor"}[chunkId]||chunkId) + "." + {"0":"2f3f63a4","1":"ebb1a493","2":"cc7529b3","3":"a5fa72ae","4":"e7b87b92"}[chunkId] + ".chunk.js";
80
  /******/ head.appendChild(script);
81
  /******/ }
82
  /******/ };
lang/mailpoet-ca.mo CHANGED
Binary file
lang/mailpoet-da_DK.mo CHANGED
Binary file
lang/mailpoet-de_DE.mo CHANGED
Binary file
lang/mailpoet-en_GB.mo CHANGED
Binary file
lang/mailpoet-es_ES.mo CHANGED
Binary file
lang/mailpoet-fa_IR.mo CHANGED
Binary file
lang/mailpoet-fr_CA.mo CHANGED
Binary file
lang/mailpoet-fr_FR.mo CHANGED
Binary file
lang/mailpoet-it_IT.mo CHANGED
Binary file
lang/mailpoet-ja.mo CHANGED
Binary file
lang/mailpoet-nl_NL.mo CHANGED
Binary file
lang/mailpoet-pl_PL.mo CHANGED
Binary file
lang/mailpoet-pt_BR.mo CHANGED
Binary file
lang/mailpoet-pt_PT.mo CHANGED
Binary file
lang/mailpoet-ru_RU.mo CHANGED
Binary file
lang/mailpoet-sq.mo CHANGED
Binary file
lang/mailpoet-sv_SE.mo CHANGED
Binary file
lang/mailpoet-tr_TR.mo CHANGED
Binary file
lang/mailpoet.pot CHANGED
@@ -4,7 +4,7 @@ msgid ""
4
  msgstr ""
5
  "Project-Id-Version: \n"
6
  "Report-Msgid-Bugs-To: http://support.mailpoet.com/\n"
7
- "POT-Creation-Date: 2017-12-05 16:47:51+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=utf-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
@@ -475,11 +475,11 @@ msgid ""
475
  "might work within a MultiSite environment, we don’t support it."
476
  msgstr ""
477
 
478
- #: lib/Config/Populator.php:156
479
  msgid "My First List"
480
  msgstr ""
481
 
482
- #: lib/Config/Populator.php:158
483
  msgid "This list is automatically created when you install MailPoet."
484
  msgstr ""
485
 
@@ -5353,7 +5353,7 @@ msgstr ""
5353
  msgid "Care to Give Your Opinion?"
5354
  msgstr ""
5355
 
5356
- #: views/update.html:109 views/welcome.html:60
5357
  msgid "Awesome! Now, take me to MailPoet"
5358
  msgstr ""
5359
 
4
  msgstr ""
5
  "Project-Id-Version: \n"
6
  "Report-Msgid-Bugs-To: http://support.mailpoet.com/\n"
7
+ "POT-Creation-Date: 2017-12-14 17:40:45+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=utf-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
475
  "might work within a MultiSite environment, we don’t support it."
476
  msgstr ""
477
 
478
+ #: lib/Config/Populator.php:158
479
  msgid "My First List"
480
  msgstr ""
481
 
482
+ #: lib/Config/Populator.php:160
483
  msgid "This list is automatically created when you install MailPoet."
484
  msgstr ""
485
 
5353
  msgid "Care to Give Your Opinion?"
5354
  msgstr ""
5355
 
5356
+ #: views/update.html:116 views/welcome.html:60
5357
  msgid "Awesome! Now, take me to MailPoet"
5358
  msgstr ""
5359
 
lib/Config/Localizer.php CHANGED
@@ -35,4 +35,15 @@ class Localizer {
35
  );
36
  return $locale;
37
  }
 
 
 
 
 
 
 
 
 
 
 
38
  }
35
  );
36
  return $locale;
37
  }
38
+
39
+ function forceLoadWebsiteLocaleText() {
40
+ $language_path = sprintf(
41
+ '%s/%s-%s.mo',
42
+ Env::$languages_path,
43
+ Env::$plugin_name,
44
+ get_locale()
45
+ );
46
+ unload_textdomain(Env::$plugin_name);
47
+ load_textdomain(Env::$plugin_name, $language_path);
48
+ }
49
  }
lib/Config/Populator.php CHANGED
@@ -57,6 +57,8 @@ class Populator {
57
  }
58
 
59
  function up() {
 
 
60
  $this->convertExistingDataToUTF8();
61
  $this->migrateSimpleScheduledTasks();
62
  $this->populateNewsletterSentAtField();
57
  }
58
 
59
  function up() {
60
+ $localizer = new Localizer();
61
+ $localizer->forceLoadWebsiteLocaleText();
62
  $this->convertExistingDataToUTF8();
63
  $this->migrateSimpleScheduledTasks();
64
  $this->populateNewsletterSentAtField();
mailpoet.php CHANGED
@@ -4,12 +4,12 @@ if(!defined('ABSPATH')) exit;
4
 
5
  /*
6
  * Plugin Name: MailPoet 3 (New)
7
- * Version: 3.2.4
8
  * Plugin URI: http://www.mailpoet.com
9
  * Description: Create and send newsletters, post notifications and welcome emails from your WordPress.
10
  * Author: MailPoet
11
  * Author URI: http://www.mailpoet.com
12
- * Requires at least: 4.6
13
  * Tested up to: 4.9
14
  *
15
  * Domain Path: /lang/
@@ -20,7 +20,7 @@ if(!defined('ABSPATH')) exit;
20
  */
21
 
22
  $mailpoet_plugin = array(
23
- 'version' => '3.2.4',
24
  'filename' => __FILE__,
25
  'path' => dirname(__FILE__),
26
  'autoloader' => dirname(__FILE__) . '/vendor/autoload.php',
4
 
5
  /*
6
  * Plugin Name: MailPoet 3 (New)
7
+ * Version: 3.3.1
8
  * Plugin URI: http://www.mailpoet.com
9
  * Description: Create and send newsletters, post notifications and welcome emails from your WordPress.
10
  * Author: MailPoet
11
  * Author URI: http://www.mailpoet.com
12
+ * Requires at least: 4.7
13
  * Tested up to: 4.9
14
  *
15
  * Domain Path: /lang/
20
  */
21
 
22
  $mailpoet_plugin = array(
23
+ 'version' => '3.3.1',
24
  'filename' => __FILE__,
25
  'path' => dirname(__FILE__),
26
  'autoloader' => dirname(__FILE__) . '/vendor/autoload.php',
readme.txt CHANGED
@@ -1,10 +1,10 @@
1
  === MailPoet 3 (New) ===
2
  Contributors: mailpoet, wysija
3
  Tags: newsletter, email, welcome email, post notification, autoresponder, signup, subscription, SMTP
4
- Requires at least: 4.6
5
  Tested up to: 4.9
6
  Requires PHP: 5.3
7
- Stable tag: 3.2.4
8
  License: GPLv3
9
  License URI: https://www.gnu.org/licenses/gpl-3.0.html
10
 
@@ -116,6 +116,13 @@ Stop by our [support site](https://www.mailpoet.com/support).
116
 
117
  == Changelog ==
118
 
 
 
 
 
 
 
 
119
  = 3.2.4 - 2017-12-05 =
120
  * Improved: [mailpoet_manage_subscription] always renders for logged in WP users. Thx Jon, Sean, Steve & metaglyphics;
121
  * Fixed: migration from MailPoet 2 on hosts with missing "mbstring" PHP extension. Thanks Alvaro!
1
  === MailPoet 3 (New) ===
2
  Contributors: mailpoet, wysija
3
  Tags: newsletter, email, welcome email, post notification, autoresponder, signup, subscription, SMTP
4
+ Requires at least: 4.7
5
  Tested up to: 4.9
6
  Requires PHP: 5.3
7
+ Stable tag: 3.3.1
8
  License: GPLv3
9
  License URI: https://www.gnu.org/licenses/gpl-3.0.html
10
 
116
 
117
  == Changelog ==
118
 
119
+ = 3.3.1 - 2017-12-14 =
120
+ * Fixed: newsletter open/click rates are properly displayed in listings. Thanks to all who have reported the issue!
121
+
122
+ = 3.3.0 - 2017-12-12 =
123
+ * Premium: you can now segment your subscribers by email opens or clicks;
124
+ * Fixed: default newsletter templates will not be duplicated when user switches profile language to one that's different from the system's.
125
+
126
  = 3.2.4 - 2017-12-05 =
127
  * Improved: [mailpoet_manage_subscription] always renders for logged in WP users. Thx Jon, Sean, Steve & metaglyphics;
128
  * Fixed: migration from MailPoet 2 on hosts with missing "mbstring" PHP extension. Thanks Alvaro!
vendor/autoload.php CHANGED
@@ -4,4 +4,4 @@
4
 
5
  require_once __DIR__ . '/composer/autoload_real.php';
6
 
7
- return ComposerAutoloaderInit46dc1bc911be5f4f030ee9cfb1b2a6de::getLoader();
4
 
5
  require_once __DIR__ . '/composer/autoload_real.php';
6
 
7
+ return ComposerAutoloaderInit89733ab7d4db12a2ea456cdbee009de8::getLoader();
vendor/bin/index.php ADDED
File without changes
vendor/bin/security-checker ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env php
2
+ <?php
3
+
4
+ /*
5
+ * This file is part of the SensioLabs Security Checker.
6
+ *
7
+ * (c) Fabien Potencier
8
+ *
9
+ * For the full copyright and license information, please view the LICENSE
10
+ * file that was distributed with this source code.
11
+ */
12
+
13
+ function includeIfExists($file)
14
+ {
15
+ if (file_exists($file)) {
16
+ return include $file;
17
+ }
18
+ }
19
+
20
+ if ((!$loader = includeIfExists(__DIR__.'/vendor/autoload.php')) && (!$loader = includeIfExists(__DIR__.'/../../autoload.php'))) {
21
+ die('You must set up the project dependencies, run the following commands:'.PHP_EOL.
22
+ 'curl -sS https://getcomposer.org/installer | php'.PHP_EOL.
23
+ 'php composer.phar install'.PHP_EOL);
24
+ }
25
+
26
+ use Symfony\Component\Console\Application;
27
+ use SensioLabs\Security\Command\SecurityCheckerCommand;
28
+ use SensioLabs\Security\SecurityChecker;
29
+
30
+ $console = new Application('SensioLabs Security Checker', SecurityChecker::VERSION);
31
+ $console->add(new SecurityCheckerCommand(new SecurityChecker()));
32
+ $console->run();
vendor/composer/autoload_classmap.php CHANGED
@@ -9,6 +9,7 @@ return array(
9
  'Carbon\\Carbon' => $vendorDir . '/nesbot/carbon/src/Carbon/Carbon.php',
10
  'Carbon\\CarbonInterval' => $vendorDir . '/nesbot/carbon/src/Carbon/CarbonInterval.php',
11
  'Carbon\\Exceptions\\InvalidDateException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/InvalidDateException.php',
 
12
  'Cron\\AbstractField' => $vendorDir . '/mtdowling/cron-expression/src/Cron/AbstractField.php',
13
  'Cron\\CronExpression' => $vendorDir . '/mtdowling/cron-expression/src/Cron/CronExpression.php',
14
  'Cron\\DayOfMonthField' => $vendorDir . '/mtdowling/cron-expression/src/Cron/DayOfMonthField.php',
@@ -260,6 +261,16 @@ return array(
260
  'ORM' => $vendorDir . '/j4mie/idiorm/idiorm.php',
261
  'ORMWrapper' => $vendorDir . '/j4mie/paris/paris.php',
262
  'ParisMethodMissingException' => $vendorDir . '/j4mie/paris/paris.php',
 
 
 
 
 
 
 
 
 
 
263
  'Sabberworm\\CSS\\CSSList\\AtRuleBlockList' => $vendorDir . '/sabberworm/php-css-parser/lib/Sabberworm/CSS/CSSList/AtRuleBlockList.php',
264
  'Sabberworm\\CSS\\CSSList\\CSSBlockList' => $vendorDir . '/sabberworm/php-css-parser/lib/Sabberworm/CSS/CSSList/CSSBlockList.php',
265
  'Sabberworm\\CSS\\CSSList\\CSSList' => $vendorDir . '/sabberworm/php-css-parser/lib/Sabberworm/CSS/CSSList/CSSList.php',
@@ -293,9 +304,115 @@ return array(
293
  'Sabberworm\\CSS\\Value\\URL' => $vendorDir . '/sabberworm/php-css-parser/lib/Sabberworm/CSS/Value/URL.php',
294
  'Sabberworm\\CSS\\Value\\Value' => $vendorDir . '/sabberworm/php-css-parser/lib/Sabberworm/CSS/Value/Value.php',
295
  'Sabberworm\\CSS\\Value\\ValueList' => $vendorDir . '/sabberworm/php-css-parser/lib/Sabberworm/CSS/Value/ValueList.php',
 
 
 
 
 
 
 
 
 
 
 
 
 
 
296
  'Sudzy\\Engine' => $baseDir . '/lib/Util/Sudzy/Engine.php',
297
  'Sudzy\\ValidModel' => $baseDir . '/lib/Util/Sudzy/ValidModel.php',
298
  'Sudzy\\ValidationException' => $baseDir . '/lib/Util/Sudzy/ValidationException.php',
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
299
  'Symfony\\Component\\Translation\\Catalogue\\AbstractOperation' => $vendorDir . '/symfony/translation/Catalogue/AbstractOperation.php',
300
  'Symfony\\Component\\Translation\\Catalogue\\DiffOperation' => $vendorDir . '/symfony/translation/Catalogue/DiffOperation.php',
301
  'Symfony\\Component\\Translation\\Catalogue\\MergeOperation' => $vendorDir . '/symfony/translation/Catalogue/MergeOperation.php',
9
  'Carbon\\Carbon' => $vendorDir . '/nesbot/carbon/src/Carbon/Carbon.php',
10
  'Carbon\\CarbonInterval' => $vendorDir . '/nesbot/carbon/src/Carbon/CarbonInterval.php',
11
  'Carbon\\Exceptions\\InvalidDateException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/InvalidDateException.php',
12
+ 'Composer\\CaBundle\\CaBundle' => $vendorDir . '/composer/ca-bundle/src/CaBundle.php',
13
  'Cron\\AbstractField' => $vendorDir . '/mtdowling/cron-expression/src/Cron/AbstractField.php',
14
  'Cron\\CronExpression' => $vendorDir . '/mtdowling/cron-expression/src/Cron/CronExpression.php',
15
  'Cron\\DayOfMonthField' => $vendorDir . '/mtdowling/cron-expression/src/Cron/DayOfMonthField.php',
261
  'ORM' => $vendorDir . '/j4mie/idiorm/idiorm.php',
262
  'ORMWrapper' => $vendorDir . '/j4mie/paris/paris.php',
263
  'ParisMethodMissingException' => $vendorDir . '/j4mie/paris/paris.php',
264
+ 'Psr\\Log\\AbstractLogger' => $vendorDir . '/psr/log/Psr/Log/AbstractLogger.php',
265
+ 'Psr\\Log\\InvalidArgumentException' => $vendorDir . '/psr/log/Psr/Log/InvalidArgumentException.php',
266
+ 'Psr\\Log\\LogLevel' => $vendorDir . '/psr/log/Psr/Log/LogLevel.php',
267
+ 'Psr\\Log\\LoggerAwareInterface' => $vendorDir . '/psr/log/Psr/Log/LoggerAwareInterface.php',
268
+ 'Psr\\Log\\LoggerAwareTrait' => $vendorDir . '/psr/log/Psr/Log/LoggerAwareTrait.php',
269
+ 'Psr\\Log\\LoggerInterface' => $vendorDir . '/psr/log/Psr/Log/LoggerInterface.php',
270
+ 'Psr\\Log\\LoggerTrait' => $vendorDir . '/psr/log/Psr/Log/LoggerTrait.php',
271
+ 'Psr\\Log\\NullLogger' => $vendorDir . '/psr/log/Psr/Log/NullLogger.php',
272
+ 'Psr\\Log\\Test\\DummyTest' => $vendorDir . '/psr/log/Psr/Log/Test/LoggerInterfaceTest.php',
273
+ 'Psr\\Log\\Test\\LoggerInterfaceTest' => $vendorDir . '/psr/log/Psr/Log/Test/LoggerInterfaceTest.php',
274
  'Sabberworm\\CSS\\CSSList\\AtRuleBlockList' => $vendorDir . '/sabberworm/php-css-parser/lib/Sabberworm/CSS/CSSList/AtRuleBlockList.php',
275
  'Sabberworm\\CSS\\CSSList\\CSSBlockList' => $vendorDir . '/sabberworm/php-css-parser/lib/Sabberworm/CSS/CSSList/CSSBlockList.php',
276
  'Sabberworm\\CSS\\CSSList\\CSSList' => $vendorDir . '/sabberworm/php-css-parser/lib/Sabberworm/CSS/CSSList/CSSList.php',
304
  'Sabberworm\\CSS\\Value\\URL' => $vendorDir . '/sabberworm/php-css-parser/lib/Sabberworm/CSS/Value/URL.php',
305
  'Sabberworm\\CSS\\Value\\Value' => $vendorDir . '/sabberworm/php-css-parser/lib/Sabberworm/CSS/Value/Value.php',
306
  'Sabberworm\\CSS\\Value\\ValueList' => $vendorDir . '/sabberworm/php-css-parser/lib/Sabberworm/CSS/Value/ValueList.php',
307
+ 'SensioLabs\\Security\\Command\\SecurityCheckerCommand' => $vendorDir . '/sensiolabs/security-checker/SensioLabs/Security/Command/SecurityCheckerCommand.php',
308
+ 'SensioLabs\\Security\\Crawler\\BaseCrawler' => $vendorDir . '/sensiolabs/security-checker/SensioLabs/Security/Crawler/BaseCrawler.php',
309
+ 'SensioLabs\\Security\\Crawler\\CrawlerInterface' => $vendorDir . '/sensiolabs/security-checker/SensioLabs/Security/Crawler/CrawlerInterface.php',
310
+ 'SensioLabs\\Security\\Crawler\\CurlCrawler' => $vendorDir . '/sensiolabs/security-checker/SensioLabs/Security/Crawler/CurlCrawler.php',
311
+ 'SensioLabs\\Security\\Crawler\\DefaultCrawler' => $vendorDir . '/sensiolabs/security-checker/SensioLabs/Security/Crawler/DefaultCrawler.php',
312
+ 'SensioLabs\\Security\\Crawler\\FileGetContentsCrawler' => $vendorDir . '/sensiolabs/security-checker/SensioLabs/Security/Crawler/FileGetContentsCrawler.php',
313
+ 'SensioLabs\\Security\\Exception\\ExceptionInterface' => $vendorDir . '/sensiolabs/security-checker/SensioLabs/Security/Exception/ExceptionInterface.php',
314
+ 'SensioLabs\\Security\\Exception\\HttpException' => $vendorDir . '/sensiolabs/security-checker/SensioLabs/Security/Exception/HttpException.php',
315
+ 'SensioLabs\\Security\\Exception\\RuntimeException' => $vendorDir . '/sensiolabs/security-checker/SensioLabs/Security/Exception/RuntimeException.php',
316
+ 'SensioLabs\\Security\\Formatters\\FormatterInterface' => $vendorDir . '/sensiolabs/security-checker/SensioLabs/Security/Formatters/FormatterInterface.php',
317
+ 'SensioLabs\\Security\\Formatters\\JsonFormatter' => $vendorDir . '/sensiolabs/security-checker/SensioLabs/Security/Formatters/JsonFormatter.php',
318
+ 'SensioLabs\\Security\\Formatters\\SimpleFormatter' => $vendorDir . '/sensiolabs/security-checker/SensioLabs/Security/Formatters/SimpleFormatter.php',
319
+ 'SensioLabs\\Security\\Formatters\\TextFormatter' => $vendorDir . '/sensiolabs/security-checker/SensioLabs/Security/Formatters/TextFormatter.php',
320
+ 'SensioLabs\\Security\\SecurityChecker' => $vendorDir . '/sensiolabs/security-checker/SensioLabs/Security/SecurityChecker.php',
321
  'Sudzy\\Engine' => $baseDir . '/lib/Util/Sudzy/Engine.php',
322
  'Sudzy\\ValidModel' => $baseDir . '/lib/Util/Sudzy/ValidModel.php',
323
  'Sudzy\\ValidationException' => $baseDir . '/lib/Util/Sudzy/ValidationException.php',
324
+ 'Symfony\\Component\\Console\\Application' => $vendorDir . '/symfony/console/Application.php',
325
+ 'Symfony\\Component\\Console\\Command\\Command' => $vendorDir . '/symfony/console/Command/Command.php',
326
+ 'Symfony\\Component\\Console\\Command\\HelpCommand' => $vendorDir . '/symfony/console/Command/HelpCommand.php',
327
+ 'Symfony\\Component\\Console\\Command\\ListCommand' => $vendorDir . '/symfony/console/Command/ListCommand.php',
328
+ 'Symfony\\Component\\Console\\Command\\LockableTrait' => $vendorDir . '/symfony/console/Command/LockableTrait.php',
329
+ 'Symfony\\Component\\Console\\ConsoleEvents' => $vendorDir . '/symfony/console/ConsoleEvents.php',
330
+ 'Symfony\\Component\\Console\\DependencyInjection\\AddConsoleCommandPass' => $vendorDir . '/symfony/console/DependencyInjection/AddConsoleCommandPass.php',
331
+ 'Symfony\\Component\\Console\\Descriptor\\ApplicationDescription' => $vendorDir . '/symfony/console/Descriptor/ApplicationDescription.php',
332
+ 'Symfony\\Component\\Console\\Descriptor\\Descriptor' => $vendorDir . '/symfony/console/Descriptor/Descriptor.php',
333
+ 'Symfony\\Component\\Console\\Descriptor\\DescriptorInterface' => $vendorDir . '/symfony/console/Descriptor/DescriptorInterface.php',
334
+ 'Symfony\\Component\\Console\\Descriptor\\JsonDescriptor' => $vendorDir . '/symfony/console/Descriptor/JsonDescriptor.php',
335
+ 'Symfony\\Component\\Console\\Descriptor\\MarkdownDescriptor' => $vendorDir . '/symfony/console/Descriptor/MarkdownDescriptor.php',
336
+ 'Symfony\\Component\\Console\\Descriptor\\TextDescriptor' => $vendorDir . '/symfony/console/Descriptor/TextDescriptor.php',
337
+ 'Symfony\\Component\\Console\\Descriptor\\XmlDescriptor' => $vendorDir . '/symfony/console/Descriptor/XmlDescriptor.php',
338
+ 'Symfony\\Component\\Console\\EventListener\\ErrorListener' => $vendorDir . '/symfony/console/EventListener/ErrorListener.php',
339
+ 'Symfony\\Component\\Console\\Event\\ConsoleCommandEvent' => $vendorDir . '/symfony/console/Event/ConsoleCommandEvent.php',
340
+ 'Symfony\\Component\\Console\\Event\\ConsoleErrorEvent' => $vendorDir . '/symfony/console/Event/ConsoleErrorEvent.php',
341
+ 'Symfony\\Component\\Console\\Event\\ConsoleEvent' => $vendorDir . '/symfony/console/Event/ConsoleEvent.php',
342
+ 'Symfony\\Component\\Console\\Event\\ConsoleExceptionEvent' => $vendorDir . '/symfony/console/Event/ConsoleExceptionEvent.php',
343
+ 'Symfony\\Component\\Console\\Event\\ConsoleTerminateEvent' => $vendorDir . '/symfony/console/Event/ConsoleTerminateEvent.php',
344
+ 'Symfony\\Component\\Console\\Exception\\CommandNotFoundException' => $vendorDir . '/symfony/console/Exception/CommandNotFoundException.php',
345
+ 'Symfony\\Component\\Console\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/console/Exception/ExceptionInterface.php',
346
+ 'Symfony\\Component\\Console\\Exception\\InvalidArgumentException' => $vendorDir . '/symfony/console/Exception/InvalidArgumentException.php',
347
+ 'Symfony\\Component\\Console\\Exception\\InvalidOptionException' => $vendorDir . '/symfony/console/Exception/InvalidOptionException.php',
348
+ 'Symfony\\Component\\Console\\Exception\\LogicException' => $vendorDir . '/symfony/console/Exception/LogicException.php',
349
+ 'Symfony\\Component\\Console\\Exception\\RuntimeException' => $vendorDir . '/symfony/console/Exception/RuntimeException.php',
350
+ 'Symfony\\Component\\Console\\Formatter\\OutputFormatter' => $vendorDir . '/symfony/console/Formatter/OutputFormatter.php',
351
+ 'Symfony\\Component\\Console\\Formatter\\OutputFormatterInterface' => $vendorDir . '/symfony/console/Formatter/OutputFormatterInterface.php',
352
+ 'Symfony\\Component\\Console\\Formatter\\OutputFormatterStyle' => $vendorDir . '/symfony/console/Formatter/OutputFormatterStyle.php',
353
+ 'Symfony\\Component\\Console\\Formatter\\OutputFormatterStyleInterface' => $vendorDir . '/symfony/console/Formatter/OutputFormatterStyleInterface.php',
354
+ 'Symfony\\Component\\Console\\Formatter\\OutputFormatterStyleStack' => $vendorDir . '/symfony/console/Formatter/OutputFormatterStyleStack.php',
355
+ 'Symfony\\Component\\Console\\Helper\\DebugFormatterHelper' => $vendorDir . '/symfony/console/Helper/DebugFormatterHelper.php',
356
+ 'Symfony\\Component\\Console\\Helper\\DescriptorHelper' => $vendorDir . '/symfony/console/Helper/DescriptorHelper.php',
357
+ 'Symfony\\Component\\Console\\Helper\\FormatterHelper' => $vendorDir . '/symfony/console/Helper/FormatterHelper.php',
358
+ 'Symfony\\Component\\Console\\Helper\\Helper' => $vendorDir . '/symfony/console/Helper/Helper.php',
359
+ 'Symfony\\Component\\Console\\Helper\\HelperInterface' => $vendorDir . '/symfony/console/Helper/HelperInterface.php',
360
+ 'Symfony\\Component\\Console\\Helper\\HelperSet' => $vendorDir . '/symfony/console/Helper/HelperSet.php',
361
+ 'Symfony\\Component\\Console\\Helper\\InputAwareHelper' => $vendorDir . '/symfony/console/Helper/InputAwareHelper.php',
362
+ 'Symfony\\Component\\Console\\Helper\\ProcessHelper' => $vendorDir . '/symfony/console/Helper/ProcessHelper.php',
363
+ 'Symfony\\Component\\Console\\Helper\\ProgressBar' => $vendorDir . '/symfony/console/Helper/ProgressBar.php',
364
+ 'Symfony\\Component\\Console\\Helper\\ProgressIndicator' => $vendorDir . '/symfony/console/Helper/ProgressIndicator.php',
365
+ 'Symfony\\Component\\Console\\Helper\\QuestionHelper' => $vendorDir . '/symfony/console/Helper/QuestionHelper.php',
366
+ 'Symfony\\Component\\Console\\Helper\\SymfonyQuestionHelper' => $vendorDir . '/symfony/console/Helper/SymfonyQuestionHelper.php',
367
+ 'Symfony\\Component\\Console\\Helper\\Table' => $vendorDir . '/symfony/console/Helper/Table.php',
368
+ 'Symfony\\Component\\Console\\Helper\\TableCell' => $vendorDir . '/symfony/console/Helper/TableCell.php',
369
+ 'Symfony\\Component\\Console\\Helper\\TableSeparator' => $vendorDir . '/symfony/console/Helper/TableSeparator.php',
370
+ 'Symfony\\Component\\Console\\Helper\\TableStyle' => $vendorDir . '/symfony/console/Helper/TableStyle.php',
371
+ 'Symfony\\Component\\Console\\Input\\ArgvInput' => $vendorDir . '/symfony/console/Input/ArgvInput.php',
372
+ 'Symfony\\Component\\Console\\Input\\ArrayInput' => $vendorDir . '/symfony/console/Input/ArrayInput.php',
373
+ 'Symfony\\Component\\Console\\Input\\Input' => $vendorDir . '/symfony/console/Input/Input.php',
374
+ 'Symfony\\Component\\Console\\Input\\InputArgument' => $vendorDir . '/symfony/console/Input/InputArgument.php',
375
+ 'Symfony\\Component\\Console\\Input\\InputAwareInterface' => $vendorDir . '/symfony/console/Input/InputAwareInterface.php',
376
+ 'Symfony\\Component\\Console\\Input\\InputDefinition' => $vendorDir . '/symfony/console/Input/InputDefinition.php',
377
+ 'Symfony\\Component\\Console\\Input\\InputInterface' => $vendorDir . '/symfony/console/Input/InputInterface.php',
378
+ 'Symfony\\Component\\Console\\Input\\InputOption' => $vendorDir . '/symfony/console/Input/InputOption.php',
379
+ 'Symfony\\Component\\Console\\Input\\StreamableInputInterface' => $vendorDir . '/symfony/console/Input/StreamableInputInterface.php',
380
+ 'Symfony\\Component\\Console\\Input\\StringInput' => $vendorDir . '/symfony/console/Input/StringInput.php',
381
+ 'Symfony\\Component\\Console\\Logger\\ConsoleLogger' => $vendorDir . '/symfony/console/Logger/ConsoleLogger.php',
382
+ 'Symfony\\Component\\Console\\Output\\BufferedOutput' => $vendorDir . '/symfony/console/Output/BufferedOutput.php',
383
+ 'Symfony\\Component\\Console\\Output\\ConsoleOutput' => $vendorDir . '/symfony/console/Output/ConsoleOutput.php',
384
+ 'Symfony\\Component\\Console\\Output\\ConsoleOutputInterface' => $vendorDir . '/symfony/console/Output/ConsoleOutputInterface.php',
385
+ 'Symfony\\Component\\Console\\Output\\NullOutput' => $vendorDir . '/symfony/console/Output/NullOutput.php',
386
+ 'Symfony\\Component\\Console\\Output\\Output' => $vendorDir . '/symfony/console/Output/Output.php',
387
+ 'Symfony\\Component\\Console\\Output\\OutputInterface' => $vendorDir . '/symfony/console/Output/OutputInterface.php',
388
+ 'Symfony\\Component\\Console\\Output\\StreamOutput' => $vendorDir . '/symfony/console/Output/StreamOutput.php',
389
+ 'Symfony\\Component\\Console\\Question\\ChoiceQuestion' => $vendorDir . '/symfony/console/Question/ChoiceQuestion.php',
390
+ 'Symfony\\Component\\Console\\Question\\ConfirmationQuestion' => $vendorDir . '/symfony/console/Question/ConfirmationQuestion.php',
391
+ 'Symfony\\Component\\Console\\Question\\Question' => $vendorDir . '/symfony/console/Question/Question.php',
392
+ 'Symfony\\Component\\Console\\Style\\OutputStyle' => $vendorDir . '/symfony/console/Style/OutputStyle.php',
393
+ 'Symfony\\Component\\Console\\Style\\StyleInterface' => $vendorDir . '/symfony/console/Style/StyleInterface.php',
394
+ 'Symfony\\Component\\Console\\Style\\SymfonyStyle' => $vendorDir . '/symfony/console/Style/SymfonyStyle.php',
395
+ 'Symfony\\Component\\Console\\Terminal' => $vendorDir . '/symfony/console/Terminal.php',
396
+ 'Symfony\\Component\\Console\\Tester\\ApplicationTester' => $vendorDir . '/symfony/console/Tester/ApplicationTester.php',
397
+ 'Symfony\\Component\\Console\\Tester\\CommandTester' => $vendorDir . '/symfony/console/Tester/CommandTester.php',
398
+ 'Symfony\\Component\\Debug\\BufferingLogger' => $vendorDir . '/symfony/debug/BufferingLogger.php',
399
+ 'Symfony\\Component\\Debug\\Debug' => $vendorDir . '/symfony/debug/Debug.php',
400
+ 'Symfony\\Component\\Debug\\DebugClassLoader' => $vendorDir . '/symfony/debug/DebugClassLoader.php',
401
+ 'Symfony\\Component\\Debug\\ErrorHandler' => $vendorDir . '/symfony/debug/ErrorHandler.php',
402
+ 'Symfony\\Component\\Debug\\ExceptionHandler' => $vendorDir . '/symfony/debug/ExceptionHandler.php',
403
+ 'Symfony\\Component\\Debug\\Exception\\ClassNotFoundException' => $vendorDir . '/symfony/debug/Exception/ClassNotFoundException.php',
404
+ 'Symfony\\Component\\Debug\\Exception\\ContextErrorException' => $vendorDir . '/symfony/debug/Exception/ContextErrorException.php',
405
+ 'Symfony\\Component\\Debug\\Exception\\FatalErrorException' => $vendorDir . '/symfony/debug/Exception/FatalErrorException.php',
406
+ 'Symfony\\Component\\Debug\\Exception\\FatalThrowableError' => $vendorDir . '/symfony/debug/Exception/FatalThrowableError.php',
407
+ 'Symfony\\Component\\Debug\\Exception\\FlattenException' => $vendorDir . '/symfony/debug/Exception/FlattenException.php',
408
+ 'Symfony\\Component\\Debug\\Exception\\OutOfMemoryException' => $vendorDir . '/symfony/debug/Exception/OutOfMemoryException.php',
409
+ 'Symfony\\Component\\Debug\\Exception\\SilencedErrorContext' => $vendorDir . '/symfony/debug/Exception/SilencedErrorContext.php',
410
+ 'Symfony\\Component\\Debug\\Exception\\UndefinedFunctionException' => $vendorDir . '/symfony/debug/Exception/UndefinedFunctionException.php',
411
+ 'Symfony\\Component\\Debug\\Exception\\UndefinedMethodException' => $vendorDir . '/symfony/debug/Exception/UndefinedMethodException.php',
412
+ 'Symfony\\Component\\Debug\\FatalErrorHandler\\ClassNotFoundFatalErrorHandler' => $vendorDir . '/symfony/debug/FatalErrorHandler/ClassNotFoundFatalErrorHandler.php',
413
+ 'Symfony\\Component\\Debug\\FatalErrorHandler\\FatalErrorHandlerInterface' => $vendorDir . '/symfony/debug/FatalErrorHandler/FatalErrorHandlerInterface.php',
414
+ 'Symfony\\Component\\Debug\\FatalErrorHandler\\UndefinedFunctionFatalErrorHandler' => $vendorDir . '/symfony/debug/FatalErrorHandler/UndefinedFunctionFatalErrorHandler.php',
415
+ 'Symfony\\Component\\Debug\\FatalErrorHandler\\UndefinedMethodFatalErrorHandler' => $vendorDir . '/symfony/debug/FatalErrorHandler/UndefinedMethodFatalErrorHandler.php',
416
  'Symfony\\Component\\Translation\\Catalogue\\AbstractOperation' => $vendorDir . '/symfony/translation/Catalogue/AbstractOperation.php',
417
  'Symfony\\Component\\Translation\\Catalogue\\DiffOperation' => $vendorDir . '/symfony/translation/Catalogue/DiffOperation.php',
418
  'Symfony\\Component\\Translation\\Catalogue\\MergeOperation' => $vendorDir . '/symfony/translation/Catalogue/MergeOperation.php',
vendor/composer/autoload_namespaces.php CHANGED
@@ -7,5 +7,6 @@ $baseDir = dirname($vendorDir);
7
 
8
  return array(
9
  'Twig_' => array($vendorDir . '/twig/twig/lib'),
 
10
  'Sabberworm\\CSS' => array($vendorDir . '/sabberworm/php-css-parser/lib'),
11
  );
7
 
8
  return array(
9
  'Twig_' => array($vendorDir . '/twig/twig/lib'),
10
+ 'SensioLabs\\Security' => array($vendorDir . '/sensiolabs/security-checker'),
11
  'Sabberworm\\CSS' => array($vendorDir . '/sabberworm/php-css-parser/lib'),
12
  );
vendor/composer/autoload_psr4.php CHANGED
@@ -10,9 +10,13 @@ return array(
10
  'Symfony\\Polyfill\\Php72\\' => array($vendorDir . '/symfony/polyfill-php72'),
11
  'Symfony\\Polyfill\\Mbstring\\' => array($vendorDir . '/symfony/polyfill-mbstring'),
12
  'Symfony\\Component\\Translation\\' => array($vendorDir . '/symfony/translation'),
 
 
13
  'Sudzy\\' => array($baseDir . '/lib/Util/Sudzy'),
 
14
  'MailPoet\\' => array($baseDir . '/lib'),
15
  'Html2Text\\' => array($vendorDir . '/soundasleep/html2text/src'),
16
  'Cron\\' => array($vendorDir . '/mtdowling/cron-expression/src/Cron'),
 
17
  'Carbon\\' => array($vendorDir . '/nesbot/carbon/src/Carbon'),
18
  );
10
  'Symfony\\Polyfill\\Php72\\' => array($vendorDir . '/symfony/polyfill-php72'),
11
  'Symfony\\Polyfill\\Mbstring\\' => array($vendorDir . '/symfony/polyfill-mbstring'),
12
  'Symfony\\Component\\Translation\\' => array($vendorDir . '/symfony/translation'),
13
+ 'Symfony\\Component\\Debug\\' => array($vendorDir . '/symfony/debug'),
14
+ 'Symfony\\Component\\Console\\' => array($vendorDir . '/symfony/console'),
15
  'Sudzy\\' => array($baseDir . '/lib/Util/Sudzy'),
16
+ 'Psr\\Log\\' => array($vendorDir . '/psr/log/Psr/Log'),
17
  'MailPoet\\' => array($baseDir . '/lib'),
18
  'Html2Text\\' => array($vendorDir . '/soundasleep/html2text/src'),
19
  'Cron\\' => array($vendorDir . '/mtdowling/cron-expression/src/Cron'),
20
+ 'Composer\\CaBundle\\' => array($vendorDir . '/composer/ca-bundle/src'),
21
  'Carbon\\' => array($vendorDir . '/nesbot/carbon/src/Carbon'),
22
  );
vendor/composer/autoload_real.php CHANGED
@@ -2,7 +2,7 @@
2
 
3
  // autoload_real.php @generated by Composer
4
 
5
- class ComposerAutoloaderInit46dc1bc911be5f4f030ee9cfb1b2a6de
6
  {
7
  private static $loader;
8
 
@@ -19,15 +19,15 @@ class ComposerAutoloaderInit46dc1bc911be5f4f030ee9cfb1b2a6de
19
  return self::$loader;
20
  }
21
 
22
- spl_autoload_register(array('ComposerAutoloaderInit46dc1bc911be5f4f030ee9cfb1b2a6de', 'loadClassLoader'), true, true);
23
  self::$loader = $loader = new \Composer\Autoload\ClassLoader();
24
- spl_autoload_unregister(array('ComposerAutoloaderInit46dc1bc911be5f4f030ee9cfb1b2a6de', 'loadClassLoader'));
25
 
26
  $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
27
  if ($useStaticLoader) {
28
  require_once __DIR__ . '/autoload_static.php';
29
 
30
- call_user_func(\Composer\Autoload\ComposerStaticInit46dc1bc911be5f4f030ee9cfb1b2a6de::getInitializer($loader));
31
  } else {
32
  $map = require __DIR__ . '/autoload_namespaces.php';
33
  foreach ($map as $namespace => $path) {
@@ -48,19 +48,19 @@ class ComposerAutoloaderInit46dc1bc911be5f4f030ee9cfb1b2a6de
48
  $loader->register(true);
49
 
50
  if ($useStaticLoader) {
51
- $includeFiles = Composer\Autoload\ComposerStaticInit46dc1bc911be5f4f030ee9cfb1b2a6de::$files;
52
  } else {
53
  $includeFiles = require __DIR__ . '/autoload_files.php';
54
  }
55
  foreach ($includeFiles as $fileIdentifier => $file) {
56
- composerRequire46dc1bc911be5f4f030ee9cfb1b2a6de($fileIdentifier, $file);
57
  }
58
 
59
  return $loader;
60
  }
61
  }
62
 
63
- function composerRequire46dc1bc911be5f4f030ee9cfb1b2a6de($fileIdentifier, $file)
64
  {
65
  if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
66
  require $file;
2
 
3
  // autoload_real.php @generated by Composer
4
 
5
+ class ComposerAutoloaderInit89733ab7d4db12a2ea456cdbee009de8
6
  {
7
  private static $loader;
8
 
19
  return self::$loader;
20
  }
21
 
22
+ spl_autoload_register(array('ComposerAutoloaderInit89733ab7d4db12a2ea456cdbee009de8', 'loadClassLoader'), true, true);
23
  self::$loader = $loader = new \Composer\Autoload\ClassLoader();
24
+ spl_autoload_unregister(array('ComposerAutoloaderInit89733ab7d4db12a2ea456cdbee009de8', 'loadClassLoader'));
25
 
26
  $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
27
  if ($useStaticLoader) {
28
  require_once __DIR__ . '/autoload_static.php';
29
 
30
+ call_user_func(\Composer\Autoload\ComposerStaticInit89733ab7d4db12a2ea456cdbee009de8::getInitializer($loader));
31
  } else {
32
  $map = require __DIR__ . '/autoload_namespaces.php';
33
  foreach ($map as $namespace => $path) {
48
  $loader->register(true);
49
 
50
  if ($useStaticLoader) {
51
+ $includeFiles = Composer\Autoload\ComposerStaticInit89733ab7d4db12a2ea456cdbee009de8::$files;
52
  } else {
53
  $includeFiles = require __DIR__ . '/autoload_files.php';
54
  }
55
  foreach ($includeFiles as $fileIdentifier => $file) {
56
+ composerRequire89733ab7d4db12a2ea456cdbee009de8($fileIdentifier, $file);
57
  }
58
 
59
  return $loader;
60
  }
61
  }
62
 
63
+ function composerRequire89733ab7d4db12a2ea456cdbee009de8($fileIdentifier, $file)
64
  {
65
  if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
66
  require $file;
vendor/composer/autoload_static.php CHANGED
@@ -4,7 +4,7 @@
4
 
5
  namespace Composer\Autoload;
6
 
7
- class ComposerStaticInit46dc1bc911be5f4f030ee9cfb1b2a6de
8
  {
9
  public static $files = array (
10
  '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php',
@@ -22,8 +22,14 @@ class ComposerStaticInit46dc1bc911be5f4f030ee9cfb1b2a6de
22
  'Symfony\\Polyfill\\Php72\\' => 23,
23
  'Symfony\\Polyfill\\Mbstring\\' => 26,
24
  'Symfony\\Component\\Translation\\' => 30,
 
 
25
  'Sudzy\\' => 6,
26
  ),
 
 
 
 
27
  'M' =>
28
  array (
29
  'MailPoet\\' => 9,
@@ -35,6 +41,7 @@ class ComposerStaticInit46dc1bc911be5f4f030ee9cfb1b2a6de
35
  'C' =>
36
  array (
37
  'Cron\\' => 5,
 
38
  'Carbon\\' => 7,
39
  ),
40
  );
@@ -56,10 +63,22 @@ class ComposerStaticInit46dc1bc911be5f4f030ee9cfb1b2a6de
56
  array (
57
  0 => __DIR__ . '/..' . '/symfony/translation',
58
  ),
 
 
 
 
 
 
 
 
59
  'Sudzy\\' =>
60
  array (
61
  0 => __DIR__ . '/../..' . '/lib/Util/Sudzy',
62
  ),
 
 
 
 
63
  'MailPoet\\' =>
64
  array (
65
  0 => __DIR__ . '/../..' . '/lib',
@@ -72,6 +91,10 @@ class ComposerStaticInit46dc1bc911be5f4f030ee9cfb1b2a6de
72
  array (
73
  0 => __DIR__ . '/..' . '/mtdowling/cron-expression/src/Cron',
74
  ),
 
 
 
 
75
  'Carbon\\' =>
76
  array (
77
  0 => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon',
@@ -88,6 +111,10 @@ class ComposerStaticInit46dc1bc911be5f4f030ee9cfb1b2a6de
88
  ),
89
  'S' =>
90
  array (
 
 
 
 
91
  'Sabberworm\\CSS' =>
92
  array (
93
  0 => __DIR__ . '/..' . '/sabberworm/php-css-parser/lib',
@@ -99,6 +126,7 @@ class ComposerStaticInit46dc1bc911be5f4f030ee9cfb1b2a6de
99
  'Carbon\\Carbon' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Carbon.php',
100
  'Carbon\\CarbonInterval' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/CarbonInterval.php',
101
  'Carbon\\Exceptions\\InvalidDateException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/InvalidDateException.php',
 
102
  'Cron\\AbstractField' => __DIR__ . '/..' . '/mtdowling/cron-expression/src/Cron/AbstractField.php',
103
  'Cron\\CronExpression' => __DIR__ . '/..' . '/mtdowling/cron-expression/src/Cron/CronExpression.php',
104
  'Cron\\DayOfMonthField' => __DIR__ . '/..' . '/mtdowling/cron-expression/src/Cron/DayOfMonthField.php',
@@ -350,6 +378,16 @@ class ComposerStaticInit46dc1bc911be5f4f030ee9cfb1b2a6de
350
  'ORM' => __DIR__ . '/..' . '/j4mie/idiorm/idiorm.php',
351
  'ORMWrapper' => __DIR__ . '/..' . '/j4mie/paris/paris.php',
352
  'ParisMethodMissingException' => __DIR__ . '/..' . '/j4mie/paris/paris.php',
 
 
 
 
 
 
 
 
 
 
353
  'Sabberworm\\CSS\\CSSList\\AtRuleBlockList' => __DIR__ . '/..' . '/sabberworm/php-css-parser/lib/Sabberworm/CSS/CSSList/AtRuleBlockList.php',
354
  'Sabberworm\\CSS\\CSSList\\CSSBlockList' => __DIR__ . '/..' . '/sabberworm/php-css-parser/lib/Sabberworm/CSS/CSSList/CSSBlockList.php',
355
  'Sabberworm\\CSS\\CSSList\\CSSList' => __DIR__ . '/..' . '/sabberworm/php-css-parser/lib/Sabberworm/CSS/CSSList/CSSList.php',
@@ -383,9 +421,115 @@ class ComposerStaticInit46dc1bc911be5f4f030ee9cfb1b2a6de
383
  'Sabberworm\\CSS\\Value\\URL' => __DIR__ . '/..' . '/sabberworm/php-css-parser/lib/Sabberworm/CSS/Value/URL.php',
384
  'Sabberworm\\CSS\\Value\\Value' => __DIR__ . '/..' . '/sabberworm/php-css-parser/lib/Sabberworm/CSS/Value/Value.php',
385
  'Sabberworm\\CSS\\Value\\ValueList' => __DIR__ . '/..' . '/sabberworm/php-css-parser/lib/Sabberworm/CSS/Value/ValueList.php',
 
 
 
 
 
 
 
 
 
 
 
 
 
 
386
  'Sudzy\\Engine' => __DIR__ . '/../..' . '/lib/Util/Sudzy/Engine.php',
387
  'Sudzy\\ValidModel' => __DIR__ . '/../..' . '/lib/Util/Sudzy/ValidModel.php',
388
  'Sudzy\\ValidationException' => __DIR__ . '/../..' . '/lib/Util/Sudzy/ValidationException.php',
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
389
  'Symfony\\Component\\Translation\\Catalogue\\AbstractOperation' => __DIR__ . '/..' . '/symfony/translation/Catalogue/AbstractOperation.php',
390
  'Symfony\\Component\\Translation\\Catalogue\\DiffOperation' => __DIR__ . '/..' . '/symfony/translation/Catalogue/DiffOperation.php',
391
  'Symfony\\Component\\Translation\\Catalogue\\MergeOperation' => __DIR__ . '/..' . '/symfony/translation/Catalogue/MergeOperation.php',
@@ -841,10 +985,10 @@ class ComposerStaticInit46dc1bc911be5f4f030ee9cfb1b2a6de
841
  public static function getInitializer(ClassLoader $loader)
842
  {
843
  return \Closure::bind(function () use ($loader) {
844
- $loader->prefixLengthsPsr4 = ComposerStaticInit46dc1bc911be5f4f030ee9cfb1b2a6de::$prefixLengthsPsr4;
845
- $loader->prefixDirsPsr4 = ComposerStaticInit46dc1bc911be5f4f030ee9cfb1b2a6de::$prefixDirsPsr4;
846
- $loader->prefixesPsr0 = ComposerStaticInit46dc1bc911be5f4f030ee9cfb1b2a6de::$prefixesPsr0;
847
- $loader->classMap = ComposerStaticInit46dc1bc911be5f4f030ee9cfb1b2a6de::$classMap;
848
 
849
  }, null, ClassLoader::class);
850
  }
4
 
5
  namespace Composer\Autoload;
6
 
7
+ class ComposerStaticInit89733ab7d4db12a2ea456cdbee009de8
8
  {
9
  public static $files = array (
10
  '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php',
22
  'Symfony\\Polyfill\\Php72\\' => 23,
23
  'Symfony\\Polyfill\\Mbstring\\' => 26,
24
  'Symfony\\Component\\Translation\\' => 30,
25
+ 'Symfony\\Component\\Debug\\' => 24,
26
+ 'Symfony\\Component\\Console\\' => 26,
27
  'Sudzy\\' => 6,
28
  ),
29
+ 'P' =>
30
+ array (
31
+ 'Psr\\Log\\' => 8,
32
+ ),
33
  'M' =>
34
  array (
35
  'MailPoet\\' => 9,
41
  'C' =>
42
  array (
43
  'Cron\\' => 5,
44
+ 'Composer\\CaBundle\\' => 18,
45
  'Carbon\\' => 7,
46
  ),
47
  );
63
  array (
64
  0 => __DIR__ . '/..' . '/symfony/translation',
65
  ),
66
+ 'Symfony\\Component\\Debug\\' =>
67
+ array (
68
+ 0 => __DIR__ . '/..' . '/symfony/debug',
69
+ ),
70
+ 'Symfony\\Component\\Console\\' =>
71
+ array (
72
+ 0 => __DIR__ . '/..' . '/symfony/console',
73
+ ),
74
  'Sudzy\\' =>
75
  array (
76
  0 => __DIR__ . '/../..' . '/lib/Util/Sudzy',
77
  ),
78
+ 'Psr\\Log\\' =>
79
+ array (
80
+ 0 => __DIR__ . '/..' . '/psr/log/Psr/Log',
81
+ ),
82
  'MailPoet\\' =>
83
  array (
84
  0 => __DIR__ . '/../..' . '/lib',
91
  array (
92
  0 => __DIR__ . '/..' . '/mtdowling/cron-expression/src/Cron',
93
  ),
94
+ 'Composer\\CaBundle\\' =>
95
+ array (
96
+ 0 => __DIR__ . '/..' . '/composer/ca-bundle/src',
97
+ ),
98
  'Carbon\\' =>
99
  array (
100
  0 => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon',
111
  ),
112
  'S' =>
113
  array (
114
+ 'SensioLabs\\Security' =>
115
+ array (
116
+ 0 => __DIR__ . '/..' . '/sensiolabs/security-checker',
117
+ ),
118
  'Sabberworm\\CSS' =>
119
  array (
120
  0 => __DIR__ . '/..' . '/sabberworm/php-css-parser/lib',
126
  'Carbon\\Carbon' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Carbon.php',
127
  'Carbon\\CarbonInterval' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/CarbonInterval.php',
128
  'Carbon\\Exceptions\\InvalidDateException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/InvalidDateException.php',
129
+ 'Composer\\CaBundle\\CaBundle' => __DIR__ . '/..' . '/composer/ca-bundle/src/CaBundle.php',
130
  'Cron\\AbstractField' => __DIR__ . '/..' . '/mtdowling/cron-expression/src/Cron/AbstractField.php',
131
  'Cron\\CronExpression' => __DIR__ . '/..' . '/mtdowling/cron-expression/src/Cron/CronExpression.php',
132
  'Cron\\DayOfMonthField' => __DIR__ . '/..' . '/mtdowling/cron-expression/src/Cron/DayOfMonthField.php',
378
  'ORM' => __DIR__ . '/..' . '/j4mie/idiorm/idiorm.php',
379
  'ORMWrapper' => __DIR__ . '/..' . '/j4mie/paris/paris.php',
380
  'ParisMethodMissingException' => __DIR__ . '/..' . '/j4mie/paris/paris.php',
381
+ 'Psr\\Log\\AbstractLogger' => __DIR__ . '/..' . '/psr/log/Psr/Log/AbstractLogger.php',
382
+ 'Psr\\Log\\InvalidArgumentException' => __DIR__ . '/..' . '/psr/log/Psr/Log/InvalidArgumentException.php',
383
+ 'Psr\\Log\\LogLevel' => __DIR__ . '/..' . '/psr/log/Psr/Log/LogLevel.php',
384
+ 'Psr\\Log\\LoggerAwareInterface' => __DIR__ . '/..' . '/psr/log/Psr/Log/LoggerAwareInterface.php',
385
+ 'Psr\\Log\\LoggerAwareTrait' => __DIR__ . '/..' . '/psr/log/Psr/Log/LoggerAwareTrait.php',
386
+ 'Psr\\Log\\LoggerInterface' => __DIR__ . '/..' . '/psr/log/Psr/Log/LoggerInterface.php',
387
+ 'Psr\\Log\\LoggerTrait' => __DIR__ . '/..' . '/psr/log/Psr/Log/LoggerTrait.php',
388
+ 'Psr\\Log\\NullLogger' => __DIR__ . '/..' . '/psr/log/Psr/Log/NullLogger.php',
389
+ 'Psr\\Log\\Test\\DummyTest' => __DIR__ . '/..' . '/psr/log/Psr/Log/Test/LoggerInterfaceTest.php',
390
+ 'Psr\\Log\\Test\\LoggerInterfaceTest' => __DIR__ . '/..' . '/psr/log/Psr/Log/Test/LoggerInterfaceTest.php',
391
  'Sabberworm\\CSS\\CSSList\\AtRuleBlockList' => __DIR__ . '/..' . '/sabberworm/php-css-parser/lib/Sabberworm/CSS/CSSList/AtRuleBlockList.php',
392
  'Sabberworm\\CSS\\CSSList\\CSSBlockList' => __DIR__ . '/..' . '/sabberworm/php-css-parser/lib/Sabberworm/CSS/CSSList/CSSBlockList.php',
393
  'Sabberworm\\CSS\\CSSList\\CSSList' => __DIR__ . '/..' . '/sabberworm/php-css-parser/lib/Sabberworm/CSS/CSSList/CSSList.php',
421
  'Sabberworm\\CSS\\Value\\URL' => __DIR__ . '/..' . '/sabberworm/php-css-parser/lib/Sabberworm/CSS/Value/URL.php',
422
  'Sabberworm\\CSS\\Value\\Value' => __DIR__ . '/..' . '/sabberworm/php-css-parser/lib/Sabberworm/CSS/Value/Value.php',
423
  'Sabberworm\\CSS\\Value\\ValueList' => __DIR__ . '/..' . '/sabberworm/php-css-parser/lib/Sabberworm/CSS/Value/ValueList.php',
424
+ 'SensioLabs\\Security\\Command\\SecurityCheckerCommand' => __DIR__ . '/..' . '/sensiolabs/security-checker/SensioLabs/Security/Command/SecurityCheckerCommand.php',
425
+ 'SensioLabs\\Security\\Crawler\\BaseCrawler' => __DIR__ . '/..' . '/sensiolabs/security-checker/SensioLabs/Security/Crawler/BaseCrawler.php',
426
+ 'SensioLabs\\Security\\Crawler\\CrawlerInterface' => __DIR__ . '/..' . '/sensiolabs/security-checker/SensioLabs/Security/Crawler/CrawlerInterface.php',
427
+ 'SensioLabs\\Security\\Crawler\\CurlCrawler' => __DIR__ . '/..' . '/sensiolabs/security-checker/SensioLabs/Security/Crawler/CurlCrawler.php',
428
+ 'SensioLabs\\Security\\Crawler\\DefaultCrawler' => __DIR__ . '/..' . '/sensiolabs/security-checker/SensioLabs/Security/Crawler/DefaultCrawler.php',
429
+ 'SensioLabs\\Security\\Crawler\\FileGetContentsCrawler' => __DIR__ . '/..' . '/sensiolabs/security-checker/SensioLabs/Security/Crawler/FileGetContentsCrawler.php',
430
+ 'SensioLabs\\Security\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/sensiolabs/security-checker/SensioLabs/Security/Exception/ExceptionInterface.php',
431
+ 'SensioLabs\\Security\\Exception\\HttpException' => __DIR__ . '/..' . '/sensiolabs/security-checker/SensioLabs/Security/Exception/HttpException.php',
432
+ 'SensioLabs\\Security\\Exception\\RuntimeException' => __DIR__ . '/..' . '/sensiolabs/security-checker/SensioLabs/Security/Exception/RuntimeException.php',
433
+ 'SensioLabs\\Security\\Formatters\\FormatterInterface' => __DIR__ . '/..' . '/sensiolabs/security-checker/SensioLabs/Security/Formatters/FormatterInterface.php',
434
+ 'SensioLabs\\Security\\Formatters\\JsonFormatter' => __DIR__ . '/..' . '/sensiolabs/security-checker/SensioLabs/Security/Formatters/JsonFormatter.php',
435
+ 'SensioLabs\\Security\\Formatters\\SimpleFormatter' => __DIR__ . '/..' . '/sensiolabs/security-checker/SensioLabs/Security/Formatters/SimpleFormatter.php',
436
+ 'SensioLabs\\Security\\Formatters\\TextFormatter' => __DIR__ . '/..' . '/sensiolabs/security-checker/SensioLabs/Security/Formatters/TextFormatter.php',
437
+ 'SensioLabs\\Security\\SecurityChecker' => __DIR__ . '/..' . '/sensiolabs/security-checker/SensioLabs/Security/SecurityChecker.php',
438
  'Sudzy\\Engine' => __DIR__ . '/../..' . '/lib/Util/Sudzy/Engine.php',
439
  'Sudzy\\ValidModel' => __DIR__ . '/../..' . '/lib/Util/Sudzy/ValidModel.php',
440
  'Sudzy\\ValidationException' => __DIR__ . '/../..' . '/lib/Util/Sudzy/ValidationException.php',
441
+ 'Symfony\\Component\\Console\\Application' => __DIR__ . '/..' . '/symfony/console/Application.php',
442
+ 'Symfony\\Component\\Console\\Command\\Command' => __DIR__ . '/..' . '/symfony/console/Command/Command.php',
443
+ 'Symfony\\Component\\Console\\Command\\HelpCommand' => __DIR__ . '/..' . '/symfony/console/Command/HelpCommand.php',
444
+ 'Symfony\\Component\\Console\\Command\\ListCommand' => __DIR__ . '/..' . '/symfony/console/Command/ListCommand.php',
445
+ 'Symfony\\Component\\Console\\Command\\LockableTrait' => __DIR__ . '/..' . '/symfony/console/Command/LockableTrait.php',
446
+ 'Symfony\\Component\\Console\\ConsoleEvents' => __DIR__ . '/..' . '/symfony/console/ConsoleEvents.php',
447
+ 'Symfony\\Component\\Console\\DependencyInjection\\AddConsoleCommandPass' => __DIR__ . '/..' . '/symfony/console/DependencyInjection/AddConsoleCommandPass.php',
448
+ 'Symfony\\Component\\Console\\Descriptor\\ApplicationDescription' => __DIR__ . '/..' . '/symfony/console/Descriptor/ApplicationDescription.php',
449
+ 'Symfony\\Component\\Console\\Descriptor\\Descriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/Descriptor.php',
450
+ 'Symfony\\Component\\Console\\Descriptor\\DescriptorInterface' => __DIR__ . '/..' . '/symfony/console/Descriptor/DescriptorInterface.php',
451
+ 'Symfony\\Component\\Console\\Descriptor\\JsonDescriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/JsonDescriptor.php',
452
+ 'Symfony\\Component\\Console\\Descriptor\\MarkdownDescriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/MarkdownDescriptor.php',
453
+ 'Symfony\\Component\\Console\\Descriptor\\TextDescriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/TextDescriptor.php',
454
+ 'Symfony\\Component\\Console\\Descriptor\\XmlDescriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/XmlDescriptor.php',
455
+ 'Symfony\\Component\\Console\\EventListener\\ErrorListener' => __DIR__ . '/..' . '/symfony/console/EventListener/ErrorListener.php',
456
+ 'Symfony\\Component\\Console\\Event\\ConsoleCommandEvent' => __DIR__ . '/..' . '/symfony/console/Event/ConsoleCommandEvent.php',
457
+ 'Symfony\\Component\\Console\\Event\\ConsoleErrorEvent' => __DIR__ . '/..' . '/symfony/console/Event/ConsoleErrorEvent.php',
458
+ 'Symfony\\Component\\Console\\Event\\ConsoleEvent' => __DIR__ . '/..' . '/symfony/console/Event/ConsoleEvent.php',
459
+ 'Symfony\\Component\\Console\\Event\\ConsoleExceptionEvent' => __DIR__ . '/..' . '/symfony/console/Event/ConsoleExceptionEvent.php',
460
+ 'Symfony\\Component\\Console\\Event\\ConsoleTerminateEvent' => __DIR__ . '/..' . '/symfony/console/Event/ConsoleTerminateEvent.php',
461
+ 'Symfony\\Component\\Console\\Exception\\CommandNotFoundException' => __DIR__ . '/..' . '/symfony/console/Exception/CommandNotFoundException.php',
462
+ 'Symfony\\Component\\Console\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/console/Exception/ExceptionInterface.php',
463
+ 'Symfony\\Component\\Console\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/symfony/console/Exception/InvalidArgumentException.php',
464
+ 'Symfony\\Component\\Console\\Exception\\InvalidOptionException' => __DIR__ . '/..' . '/symfony/console/Exception/InvalidOptionException.php',
465
+ 'Symfony\\Component\\Console\\Exception\\LogicException' => __DIR__ . '/..' . '/symfony/console/Exception/LogicException.php',
466
+ 'Symfony\\Component\\Console\\Exception\\RuntimeException' => __DIR__ . '/..' . '/symfony/console/Exception/RuntimeException.php',
467
+ 'Symfony\\Component\\Console\\Formatter\\OutputFormatter' => __DIR__ . '/..' . '/symfony/console/Formatter/OutputFormatter.php',
468
+ 'Symfony\\Component\\Console\\Formatter\\OutputFormatterInterface' => __DIR__ . '/..' . '/symfony/console/Formatter/OutputFormatterInterface.php',
469
+ 'Symfony\\Component\\Console\\Formatter\\OutputFormatterStyle' => __DIR__ . '/..' . '/symfony/console/Formatter/OutputFormatterStyle.php',
470
+ 'Symfony\\Component\\Console\\Formatter\\OutputFormatterStyleInterface' => __DIR__ . '/..' . '/symfony/console/Formatter/OutputFormatterStyleInterface.php',
471
+ 'Symfony\\Component\\Console\\Formatter\\OutputFormatterStyleStack' => __DIR__ . '/..' . '/symfony/console/Formatter/OutputFormatterStyleStack.php',
472
+ 'Symfony\\Component\\Console\\Helper\\DebugFormatterHelper' => __DIR__ . '/..' . '/symfony/console/Helper/DebugFormatterHelper.php',
473
+ 'Symfony\\Component\\Console\\Helper\\DescriptorHelper' => __DIR__ . '/..' . '/symfony/console/Helper/DescriptorHelper.php',
474
+ 'Symfony\\Component\\Console\\Helper\\FormatterHelper' => __DIR__ . '/..' . '/symfony/console/Helper/FormatterHelper.php',
475
+ 'Symfony\\Component\\Console\\Helper\\Helper' => __DIR__ . '/..' . '/symfony/console/Helper/Helper.php',
476
+ 'Symfony\\Component\\Console\\Helper\\HelperInterface' => __DIR__ . '/..' . '/symfony/console/Helper/HelperInterface.php',
477
+ 'Symfony\\Component\\Console\\Helper\\HelperSet' => __DIR__ . '/..' . '/symfony/console/Helper/HelperSet.php',
478
+ 'Symfony\\Component\\Console\\Helper\\InputAwareHelper' => __DIR__ . '/..' . '/symfony/console/Helper/InputAwareHelper.php',
479
+ 'Symfony\\Component\\Console\\Helper\\ProcessHelper' => __DIR__ . '/..' . '/symfony/console/Helper/ProcessHelper.php',
480
+ 'Symfony\\Component\\Console\\Helper\\ProgressBar' => __DIR__ . '/..' . '/symfony/console/Helper/ProgressBar.php',
481
+ 'Symfony\\Component\\Console\\Helper\\ProgressIndicator' => __DIR__ . '/..' . '/symfony/console/Helper/ProgressIndicator.php',
482
+ 'Symfony\\Component\\Console\\Helper\\QuestionHelper' => __DIR__ . '/..' . '/symfony/console/Helper/QuestionHelper.php',
483
+ 'Symfony\\Component\\Console\\Helper\\SymfonyQuestionHelper' => __DIR__ . '/..' . '/symfony/console/Helper/SymfonyQuestionHelper.php',
484
+ 'Symfony\\Component\\Console\\Helper\\Table' => __DIR__ . '/..' . '/symfony/console/Helper/Table.php',
485
+ 'Symfony\\Component\\Console\\Helper\\TableCell' => __DIR__ . '/..' . '/symfony/console/Helper/TableCell.php',
486
+ 'Symfony\\Component\\Console\\Helper\\TableSeparator' => __DIR__ . '/..' . '/symfony/console/Helper/TableSeparator.php',
487
+ 'Symfony\\Component\\Console\\Helper\\TableStyle' => __DIR__ . '/..' . '/symfony/console/Helper/TableStyle.php',
488
+ 'Symfony\\Component\\Console\\Input\\ArgvInput' => __DIR__ . '/..' . '/symfony/console/Input/ArgvInput.php',
489
+ 'Symfony\\Component\\Console\\Input\\ArrayInput' => __DIR__ . '/..' . '/symfony/console/Input/ArrayInput.php',
490
+ 'Symfony\\Component\\Console\\Input\\Input' => __DIR__ . '/..' . '/symfony/console/Input/Input.php',
491
+ 'Symfony\\Component\\Console\\Input\\InputArgument' => __DIR__ . '/..' . '/symfony/console/Input/InputArgument.php',
492
+ 'Symfony\\Component\\Console\\Input\\InputAwareInterface' => __DIR__ . '/..' . '/symfony/console/Input/InputAwareInterface.php',
493
+ 'Symfony\\Component\\Console\\Input\\InputDefinition' => __DIR__ . '/..' . '/symfony/console/Input/InputDefinition.php',
494
+ 'Symfony\\Component\\Console\\Input\\InputInterface' => __DIR__ . '/..' . '/symfony/console/Input/InputInterface.php',
495
+ 'Symfony\\Component\\Console\\Input\\InputOption' => __DIR__ . '/..' . '/symfony/console/Input/InputOption.php',
496
+ 'Symfony\\Component\\Console\\Input\\StreamableInputInterface' => __DIR__ . '/..' . '/symfony/console/Input/StreamableInputInterface.php',
497
+ 'Symfony\\Component\\Console\\Input\\StringInput' => __DIR__ . '/..' . '/symfony/console/Input/StringInput.php',
498
+ 'Symfony\\Component\\Console\\Logger\\ConsoleLogger' => __DIR__ . '/..' . '/symfony/console/Logger/ConsoleLogger.php',
499
+ 'Symfony\\Component\\Console\\Output\\BufferedOutput' => __DIR__ . '/..' . '/symfony/console/Output/BufferedOutput.php',
500
+ 'Symfony\\Component\\Console\\Output\\ConsoleOutput' => __DIR__ . '/..' . '/symfony/console/Output/ConsoleOutput.php',
501
+ 'Symfony\\Component\\Console\\Output\\ConsoleOutputInterface' => __DIR__ . '/..' . '/symfony/console/Output/ConsoleOutputInterface.php',
502
+ 'Symfony\\Component\\Console\\Output\\NullOutput' => __DIR__ . '/..' . '/symfony/console/Output/NullOutput.php',
503
+ 'Symfony\\Component\\Console\\Output\\Output' => __DIR__ . '/..' . '/symfony/console/Output/Output.php',
504
+ 'Symfony\\Component\\Console\\Output\\OutputInterface' => __DIR__ . '/..' . '/symfony/console/Output/OutputInterface.php',
505
+ 'Symfony\\Component\\Console\\Output\\StreamOutput' => __DIR__ . '/..' . '/symfony/console/Output/StreamOutput.php',
506
+ 'Symfony\\Component\\Console\\Question\\ChoiceQuestion' => __DIR__ . '/..' . '/symfony/console/Question/ChoiceQuestion.php',
507
+ 'Symfony\\Component\\Console\\Question\\ConfirmationQuestion' => __DIR__ . '/..' . '/symfony/console/Question/ConfirmationQuestion.php',
508
+ 'Symfony\\Component\\Console\\Question\\Question' => __DIR__ . '/..' . '/symfony/console/Question/Question.php',
509
+ 'Symfony\\Component\\Console\\Style\\OutputStyle' => __DIR__ . '/..' . '/symfony/console/Style/OutputStyle.php',
510
+ 'Symfony\\Component\\Console\\Style\\StyleInterface' => __DIR__ . '/..' . '/symfony/console/Style/StyleInterface.php',
511
+ 'Symfony\\Component\\Console\\Style\\SymfonyStyle' => __DIR__ . '/..' . '/symfony/console/Style/SymfonyStyle.php',
512
+ 'Symfony\\Component\\Console\\Terminal' => __DIR__ . '/..' . '/symfony/console/Terminal.php',
513
+ 'Symfony\\Component\\Console\\Tester\\ApplicationTester' => __DIR__ . '/..' . '/symfony/console/Tester/ApplicationTester.php',
514
+ 'Symfony\\Component\\Console\\Tester\\CommandTester' => __DIR__ . '/..' . '/symfony/console/Tester/CommandTester.php',
515
+ 'Symfony\\Component\\Debug\\BufferingLogger' => __DIR__ . '/..' . '/symfony/debug/BufferingLogger.php',
516
+ 'Symfony\\Component\\Debug\\Debug' => __DIR__ . '/..' . '/symfony/debug/Debug.php',
517
+ 'Symfony\\Component\\Debug\\DebugClassLoader' => __DIR__ . '/..' . '/symfony/debug/DebugClassLoader.php',
518
+ 'Symfony\\Component\\Debug\\ErrorHandler' => __DIR__ . '/..' . '/symfony/debug/ErrorHandler.php',
519
+ 'Symfony\\Component\\Debug\\ExceptionHandler' => __DIR__ . '/..' . '/symfony/debug/ExceptionHandler.php',
520
+ 'Symfony\\Component\\Debug\\Exception\\ClassNotFoundException' => __DIR__ . '/..' . '/symfony/debug/Exception/ClassNotFoundException.php',
521
+ 'Symfony\\Component\\Debug\\Exception\\ContextErrorException' => __DIR__ . '/..' . '/symfony/debug/Exception/ContextErrorException.php',
522
+ 'Symfony\\Component\\Debug\\Exception\\FatalErrorException' => __DIR__ . '/..' . '/symfony/debug/Exception/FatalErrorException.php',
523
+ 'Symfony\\Component\\Debug\\Exception\\FatalThrowableError' => __DIR__ . '/..' . '/symfony/debug/Exception/FatalThrowableError.php',
524
+ 'Symfony\\Component\\Debug\\Exception\\FlattenException' => __DIR__ . '/..' . '/symfony/debug/Exception/FlattenException.php',
525
+ 'Symfony\\Component\\Debug\\Exception\\OutOfMemoryException' => __DIR__ . '/..' . '/symfony/debug/Exception/OutOfMemoryException.php',
526
+ 'Symfony\\Component\\Debug\\Exception\\SilencedErrorContext' => __DIR__ . '/..' . '/symfony/debug/Exception/SilencedErrorContext.php',
527
+ 'Symfony\\Component\\Debug\\Exception\\UndefinedFunctionException' => __DIR__ . '/..' . '/symfony/debug/Exception/UndefinedFunctionException.php',
528
+ 'Symfony\\Component\\Debug\\Exception\\UndefinedMethodException' => __DIR__ . '/..' . '/symfony/debug/Exception/UndefinedMethodException.php',
529
+ 'Symfony\\Component\\Debug\\FatalErrorHandler\\ClassNotFoundFatalErrorHandler' => __DIR__ . '/..' . '/symfony/debug/FatalErrorHandler/ClassNotFoundFatalErrorHandler.php',
530
+ 'Symfony\\Component\\Debug\\FatalErrorHandler\\FatalErrorHandlerInterface' => __DIR__ . '/..' . '/symfony/debug/FatalErrorHandler/FatalErrorHandlerInterface.php',
531
+ 'Symfony\\Component\\Debug\\FatalErrorHandler\\UndefinedFunctionFatalErrorHandler' => __DIR__ . '/..' . '/symfony/debug/FatalErrorHandler/UndefinedFunctionFatalErrorHandler.php',
532
+ 'Symfony\\Component\\Debug\\FatalErrorHandler\\UndefinedMethodFatalErrorHandler' => __DIR__ . '/..' . '/symfony/debug/FatalErrorHandler/UndefinedMethodFatalErrorHandler.php',
533
  'Symfony\\Component\\Translation\\Catalogue\\AbstractOperation' => __DIR__ . '/..' . '/symfony/translation/Catalogue/AbstractOperation.php',
534
  'Symfony\\Component\\Translation\\Catalogue\\DiffOperation' => __DIR__ . '/..' . '/symfony/translation/Catalogue/DiffOperation.php',
535
  'Symfony\\Component\\Translation\\Catalogue\\MergeOperation' => __DIR__ . '/..' . '/symfony/translation/Catalogue/MergeOperation.php',
985
  public static function getInitializer(ClassLoader $loader)
986
  {
987
  return \Closure::bind(function () use ($loader) {
988
+ $loader->prefixLengthsPsr4 = ComposerStaticInit89733ab7d4db12a2ea456cdbee009de8::$prefixLengthsPsr4;
989
+ $loader->prefixDirsPsr4 = ComposerStaticInit89733ab7d4db12a2ea456cdbee009de8::$prefixDirsPsr4;
990
+ $loader->prefixesPsr0 = ComposerStaticInit89733ab7d4db12a2ea456cdbee009de8::$prefixesPsr0;
991
+ $loader->classMap = ComposerStaticInit89733ab7d4db12a2ea456cdbee009de8::$classMap;
992
 
993
  }, null, ClassLoader::class);
994
  }
vendor/composer/ca-bundle/composer.json ADDED
@@ -0,0 +1,54 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "composer/ca-bundle",
3
+ "description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.",
4
+ "type": "library",
5
+ "license": "MIT",
6
+ "keywords": [
7
+ "cabundle",
8
+ "cacert",
9
+ "certificate",
10
+ "ssl",
11
+ "tls"
12
+ ],
13
+ "authors": [
14
+ {
15
+ "name": "Jordi Boggiano",
16
+ "email": "j.boggiano@seld.be",
17
+ "homepage": "http://seld.be"
18
+ }
19
+ ],
20
+ "support": {
21
+ "irc": "irc://irc.freenode.org/composer",
22
+ "issues": "https://github.com/composer/ca-bundle/issues"
23
+ },
24
+ "require": {
25
+ "ext-openssl": "*",
26
+ "ext-pcre": "*",
27
+ "php": "^5.3.2 || ^7.0"
28
+ },
29
+ "require-dev": {
30
+ "phpunit/phpunit": "^4.8.35",
31
+ "psr/log": "^1.0",
32
+ "symfony/process": "^2.5 || ^3.0 || ^4.0"
33
+ },
34
+ "autoload": {
35
+ "psr-4": {
36
+ "Composer\\CaBundle\\": "src"
37
+ }
38
+ },
39
+ "autoload-dev": {
40
+ "psr-4": {
41
+ "Composer\\CaBundle\\": "tests"
42
+ }
43
+ },
44
+ "extra": {
45
+ "branch-alias": {
46
+ "dev-master": "1.x-dev"
47
+ }
48
+ },
49
+ "config": {
50
+ "platform": {
51
+ "php": "5.3.9"
52
+ }
53
+ }
54
+ }
vendor/composer/ca-bundle/index.php ADDED
File without changes
vendor/composer/ca-bundle/res/cacert.pem ADDED
@@ -0,0 +1,3646 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ##
2
+ ## Bundle of CA Root Certificates
3
+ ##
4
+ ## Certificate data from Mozilla as of: Wed Sep 20 03:12:05 2017 GMT
5
+ ##
6
+ ## This is a bundle of X.509 certificates of public Certificate Authorities
7
+ ## (CA). These were automatically extracted from Mozilla's root certificates
8
+ ## file (certdata.txt). This file can be found in the mozilla source tree:
9
+ ## https://hg.mozilla.org/releases/mozilla-release/raw-file/default/security/nss/lib/ckfw/builtins/certdata.txt
10
+ ##
11
+ ## It contains the certificates in PEM format and therefore
12
+ ## can be directly used with curl / libcurl / php_curl, or with
13
+ ## an Apache+mod_ssl webserver for SSL client authentication.
14
+ ## Just configure this file as the SSLCACertificateFile.
15
+ ##
16
+ ## Conversion done with mk-ca-bundle.pl version 1.27.
17
+ ## SHA256: 2b2dbe5244e0047e088c597998883a913f6c5fffd1cb5c0fe5a368c8466cb2ec
18
+ ##
19
+
20
+
21
+ GlobalSign Root CA
22
+ ==================
23
+ -----BEGIN CERTIFICATE-----
24
+ MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx
25
+ GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds
26
+ b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV
27
+ BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD
28
+ VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa
29
+ DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc
30
+ THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb
31
+ Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP
32
+ c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX
33
+ gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
34
+ HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF
35
+ AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj
36
+ Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG
37
+ j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH
38
+ hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC
39
+ X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==
40
+ -----END CERTIFICATE-----
41
+
42
+ GlobalSign Root CA - R2
43
+ =======================
44
+ -----BEGIN CERTIFICATE-----
45
+ MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv
46
+ YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh
47
+ bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT
48
+ aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln
49
+ bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6
50
+ ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp
51
+ s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN
52
+ S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL
53
+ TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C
54
+ ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E
55
+ FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i
56
+ YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN
57
+ BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp
58
+ 9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu
59
+ 01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7
60
+ 9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7
61
+ TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg==
62
+ -----END CERTIFICATE-----
63
+
64
+ Verisign Class 3 Public Primary Certification Authority - G3
65
+ ============================================================
66
+ -----BEGIN CERTIFICATE-----
67
+ MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV
68
+ UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
69
+ cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
70
+ IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh
71
+ dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw
72
+ CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy
73
+ dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv
74
+ cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg
75
+ Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
76
+ ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1
77
+ EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc
78
+ cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw
79
+ EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj
80
+ 055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA
81
+ ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f
82
+ j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC
83
+ /Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0
84
+ xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa
85
+ t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ==
86
+ -----END CERTIFICATE-----
87
+
88
+ Entrust.net Premium 2048 Secure Server CA
89
+ =========================================
90
+ -----BEGIN CERTIFICATE-----
91
+ MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u
92
+ ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp
93
+ bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV
94
+ BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx
95
+ NzUwNTFaFw0yOTA3MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3
96
+ d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl
97
+ MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u
98
+ ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
99
+ MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL
100
+ Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr
101
+ hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW
102
+ nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi
103
+ VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo0IwQDAOBgNVHQ8BAf8E
104
+ BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJ
105
+ KoZIhvcNAQEFBQADggEBADubj1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPy
106
+ T/4xmf3IDExoU8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf
107
+ zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5bu/8j72gZyxKT
108
+ J1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+bYQLCIt+jerXmCHG8+c8eS9e
109
+ nNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/ErfF6adulZkMV8gzURZVE=
110
+ -----END CERTIFICATE-----
111
+
112
+ Baltimore CyberTrust Root
113
+ =========================
114
+ -----BEGIN CERTIFICATE-----
115
+ MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE
116
+ ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li
117
+ ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC
118
+ SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs
119
+ dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME
120
+ uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB
121
+ UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C
122
+ G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9
123
+ XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr
124
+ l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI
125
+ VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB
126
+ BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh
127
+ cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5
128
+ hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa
129
+ Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H
130
+ RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp
131
+ -----END CERTIFICATE-----
132
+
133
+ AddTrust External Root
134
+ ======================
135
+ -----BEGIN CERTIFICATE-----
136
+ MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
137
+ QWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD
138
+ VQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw
139
+ NDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU
140
+ cnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg
141
+ Um9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821
142
+ +iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw
143
+ Tz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo
144
+ aSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy
145
+ 2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7
146
+ 7+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P
147
+ BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTL
148
+ VBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRk
149
+ VHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB
150
+ IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl
151
+ j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5
152
+ 6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355
153
+ e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u
154
+ G+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ=
155
+ -----END CERTIFICATE-----
156
+
157
+ Entrust Root Certification Authority
158
+ ====================================
159
+ -----BEGIN CERTIFICATE-----
160
+ MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV
161
+ BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw
162
+ b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG
163
+ A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0
164
+ MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu
165
+ MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu
166
+ Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v
167
+ dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
168
+ ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz
169
+ A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww
170
+ Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68
171
+ j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN
172
+ rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw
173
+ DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1
174
+ MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH
175
+ hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA
176
+ A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM
177
+ Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa
178
+ v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS
179
+ W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0
180
+ tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8
181
+ -----END CERTIFICATE-----
182
+
183
+ GeoTrust Global CA
184
+ ==================
185
+ -----BEGIN CERTIFICATE-----
186
+ MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK
187
+ Ew1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQw
188
+ MDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j
189
+ LjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
190
+ CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjo
191
+ BbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet
192
+ 8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+Vc
193
+ T4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagU
194
+ vTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTAD
195
+ AQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVk
196
+ DBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Q
197
+ zxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4
198
+ d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2
199
+ mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6p
200
+ XE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm
201
+ Mw==
202
+ -----END CERTIFICATE-----
203
+
204
+ GeoTrust Universal CA
205
+ =====================
206
+ -----BEGIN CERTIFICATE-----
207
+ MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN
208
+ R2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1
209
+ MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IElu
210
+ Yy4xHjAcBgNVBAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP
211
+ ADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9t
212
+ JPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0e
213
+ RXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs
214
+ 7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d
215
+ 8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7V
216
+ qnJNk22CDtucvc+081xdVHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3Cga
217
+ Rr0BHdCXteGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hB
218
+ Z3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9Fi1jUIxaS5BZu
219
+ KGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+nhutxx9z3SxPGWX9f5NAEC7S8O08
220
+ ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0
221
+ XG0D08DYj3rWMB8GA1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIB
222
+ hjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc
223
+ aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2
224
+ qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvL
225
+ oJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsK
226
+ xr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxF
227
+ KyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2
228
+ DFKWkoRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslK
229
+ xfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9fJP/P6EU
230
+ p8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6ZKy7PtXny3YuxadIwVyQD8vI
231
+ P/rmMuGNG2+k5o7Y+SlIis5z/iw=
232
+ -----END CERTIFICATE-----
233
+
234
+ GeoTrust Universal CA 2
235
+ =======================
236
+ -----BEGIN CERTIFICATE-----
237
+ MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN
238
+ R2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0
239
+ MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3Qg
240
+ SW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUA
241
+ A4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0
242
+ DE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17
243
+ j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8Q
244
+ JqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw76L5GG//a
245
+ QMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2
246
+ WP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP
247
+ 20gaXT73y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAn
248
+ ZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgfksILAAX/8sgC
249
+ SqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4Lt1ZrtmhN79UNdxzMk+MBB4zsslG
250
+ 8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2
251
+ +/CfXGJx7Tz0RzgQKzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E
252
+ BAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z
253
+ dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ
254
+ 4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+
255
+ mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpq
256
+ A1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpg
257
+ Y+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiP
258
+ pm8m1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7d
259
+ FGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9VhdBLtUp
260
+ gn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm
261
+ X36vWkzaH6byHCx+rgIW0lbQL1dTR+iS
262
+ -----END CERTIFICATE-----
263
+
264
+ Visa eCommerce Root
265
+ ===================
266
+ -----BEGIN CERTIFICATE-----
267
+ MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQG
268
+ EwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2Ug
269
+ QXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2
270
+ WhcNMjIwNjI0MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMm
271
+ VmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv
272
+ bW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfL
273
+ F9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8b
274
+ RaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81q6UCzyr0
275
+ TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI
276
+ /k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzs
277
+ GHxBvfaLdXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG
278
+ MB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOCAQEAX/FBfXxc
279
+ CLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcRzCSs00Rsca4BIGsDoo8Ytyk6feUW
280
+ YFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pz
281
+ zkWKsKZJ/0x9nXGIxHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu
282
+ YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt
283
+ 398znM/jra6O1I7mT1GvFpLgXPYHDw==
284
+ -----END CERTIFICATE-----
285
+
286
+ Certum Root CA
287
+ ==============
288
+ -----BEGIN CERTIFICATE-----
289
+ MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQK
290
+ ExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBDQTAeFw0wMjA2MTExMDQ2Mzla
291
+ Fw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8u
292
+ by4xEjAQBgNVBAMTCUNlcnR1bSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6x
293
+ wS7TT3zNJc4YPk/EjG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdL
294
+ kKWoePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GIULdtlkIJ
295
+ 89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapuOb7kky/ZR6By6/qmW6/K
296
+ Uz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUgAKpoC6EahQGcxEZjgoi2IrHu/qpGWX7P
297
+ NSzVttpd90gzFFS269lvzs2I1qsb2pY7HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkq
298
+ hkiG9w0BAQUFAAOCAQEAuI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+
299
+ GXYkHAQaTOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTgxSvg
300
+ GrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1qCjqTE5s7FCMTY5w/
301
+ 0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5xO/fIR/RpbxXyEV6DHpx8Uq79AtoS
302
+ qFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs6GAqm4VKQPNriiTsBhYscw==
303
+ -----END CERTIFICATE-----
304
+
305
+ Comodo AAA Services root
306
+ ========================
307
+ -----BEGIN CERTIFICATE-----
308
+ MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS
309
+ R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg
310
+ TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw
311
+ MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl
312
+ c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV
313
+ BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
314
+ ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG
315
+ C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs
316
+ i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW
317
+ Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH
318
+ Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK
319
+ Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f
320
+ BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl
321
+ cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz
322
+ LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm
323
+ 7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz
324
+ Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z
325
+ 8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C
326
+ 12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg==
327
+ -----END CERTIFICATE-----
328
+
329
+ QuoVadis Root CA
330
+ ================
331
+ -----BEGIN CERTIFICATE-----
332
+ MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE
333
+ ChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0
334
+ eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz
335
+ MTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp
336
+ cyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD
337
+ EyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF
338
+ AAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk
339
+ J0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL
340
+ F8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL
341
+ YzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen
342
+ AScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w
343
+ PQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y
344
+ ZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7
345
+ MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj
346
+ YXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs
347
+ ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh
348
+ Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW
349
+ Fmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu
350
+ BgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw
351
+ FwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0
352
+ aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6
353
+ tlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo
354
+ fFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul
355
+ LsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x
356
+ gI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi
357
+ 5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi
358
+ 5nrQNiOKSnQ2+Q==
359
+ -----END CERTIFICATE-----
360
+
361
+ QuoVadis Root CA 2
362
+ ==================
363
+ -----BEGIN CERTIFICATE-----
364
+ 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
390
+ -----END CERTIFICATE-----
391
+
392
+ QuoVadis Root CA 3
393
+ ==================
394
+ -----BEGIN CERTIFICATE-----
395
+ MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT
396
+ EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMzAeFw0wNjExMjQx
397
+ OTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
398
+ aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4IC
399
+ DwAwggIKAoICAQDMV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNgg
400
+ DhoB4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUrH556VOij
401
+ KTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd8lyyBTNvijbO0BNO/79K
402
+ DDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9CabwvvWhDFlaJKjdhkf2mrk7AyxRllDdLkgbv
403
+ BNDInIjbC3uBr7E9KsRlOni27tyAsdLTmZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwp
404
+ p5ijJUMv7/FfJuGITfhebtfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8
405
+ nT8KKdjcT5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDtWAEX
406
+ MJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZc6tsgLjoC2SToJyM
407
+ Gf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A4iLItLRkT9a6fUg+qGkM17uGcclz
408
+ uD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYDVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHT
409
+ BgkrBgEEAb5YAAMwgcUwgZMGCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmlj
410
+ YXRlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0
411
+ aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudC4wLQYIKwYB
412
+ BQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2NwczALBgNVHQ8EBAMCAQYwHQYD
413
+ VR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4GA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4
414
+ ywLQoUmkRzBFMQswCQYDVQQGEwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UE
415
+ AxMSUXVvVmFkaXMgUm9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZV
416
+ qyM07ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSemd1o417+s
417
+ hvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd+LJ2w/w4E6oM3kJpK27z
418
+ POuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2
419
+ Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadNt54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp
420
+ 8kokUvd0/bpO5qgdAm6xDYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBC
421
+ bjPsMZ57k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6szHXu
422
+ g/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0jWy10QJLZYxkNc91p
423
+ vGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbr
424
+ qZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto=
425
+ -----END CERTIFICATE-----
426
+
427
+ Security Communication Root CA
428
+ ==============================
429
+ -----BEGIN CERTIFICATE-----
430
+ MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP
431
+ U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw
432
+ HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP
433
+ U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw
434
+ ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw
435
+ 8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM
436
+ DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX
437
+ 5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd
438
+ DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2
439
+ JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw
440
+ DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g
441
+ 0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a
442
+ mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ
443
+ s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ
444
+ 6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi
445
+ FL39vmwLAw==
446
+ -----END CERTIFICATE-----
447
+
448
+ Sonera Class 2 Root CA
449
+ ======================
450
+ -----BEGIN CERTIFICATE-----
451
+ MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG
452
+ U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw
453
+ NjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh
454
+ IENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3
455
+ /Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT
456
+ dXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG
457
+ f+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P
458
+ tOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH
459
+ nfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT
460
+ XjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt
461
+ 0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI
462
+ cbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph
463
+ Oe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx
464
+ EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH
465
+ llpwrN9M
466
+ -----END CERTIFICATE-----
467
+
468
+ Camerfirma Chambers of Commerce Root
469
+ ====================================
470
+ -----BEGIN CERTIFICATE-----
471
+ MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe
472
+ QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i
473
+ ZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAx
474
+ NjEzNDNaFw0zNzA5MzAxNjEzNDRaMH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZp
475
+ cm1hIFNBIENJRiBBODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3Jn
476
+ MSIwIAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0BAQEFAAOC
477
+ AQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtbunXF/KGIJPov7coISjlU
478
+ xFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0dBmpAPrMMhe5cG3nCYsS4No41XQEMIwRH
479
+ NaqbYE6gZj3LJgqcQKH0XZi/caulAGgq7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jW
480
+ DA+wWFjbw2Y3npuRVDM30pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFV
481
+ d9oKDMyXroDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIGA1Ud
482
+ EwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5jaGFtYmVyc2lnbi5v
483
+ cmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p26EpW1eLTXYGduHRooowDgYDVR0P
484
+ AQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hh
485
+ bWJlcnNpZ24ub3JnMCcGA1UdEgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYD
486
+ VR0gBFEwTzBNBgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz
487
+ aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEBAAxBl8IahsAi
488
+ fJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZdp0AJPaxJRUXcLo0waLIJuvvD
489
+ L8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wN
490
+ UPf6s+xCX6ndbcj0dc97wXImsQEcXCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/n
491
+ ADydb47kMgkdTXg0eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1
492
+ erfutGWaIZDgqtCYvDi1czyL+Nw=
493
+ -----END CERTIFICATE-----
494
+
495
+ Camerfirma Global Chambersign Root
496
+ ==================================
497
+ -----BEGIN CERTIFICATE-----
498
+ MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe
499
+ QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i
500
+ ZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYx
501
+ NDE4WhcNMzcwOTMwMTYxNDE4WjB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJt
502
+ YSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEg
503
+ MB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAw
504
+ ggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0Mi+ITaFgCPS3CU6gSS9J
505
+ 1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/sQJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8O
506
+ by4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpVeAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl
507
+ 6DJWk0aJqCWKZQbua795B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c
508
+ 8lCrEqWhz0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0TAQH/
509
+ BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1iZXJzaWduLm9yZy9j
510
+ aGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4wTcbOX60Qq+UDpfqpFDAOBgNVHQ8B
511
+ Af8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAHMCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBj
512
+ aGFtYmVyc2lnbi5vcmcwKgYDVR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9y
513
+ ZzBbBgNVHSAEVDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh
514
+ bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0BAQUFAAOCAQEA
515
+ PDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUMbKGKfKX0j//U2K0X1S0E0T9Y
516
+ gOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXiryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJ
517
+ PJ7oKXqJ1/6v/2j1pReQvayZzKWGVwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4
518
+ IBHNfTIzSJRUTN3cecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREes
519
+ t2d/AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A==
520
+ -----END CERTIFICATE-----
521
+
522
+ XRamp Global CA Root
523
+ ====================
524
+ -----BEGIN CERTIFICATE-----
525
+ MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE
526
+ BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj
527
+ dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB
528
+ dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx
529
+ HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg
530
+ U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
531
+ dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu
532
+ IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx
533
+ foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE
534
+ zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs
535
+ AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry
536
+ xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud
537
+ EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap
538
+ oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC
539
+ AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc
540
+ /Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt
541
+ qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n
542
+ nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz
543
+ 8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw=
544
+ -----END CERTIFICATE-----
545
+
546
+ Go Daddy Class 2 CA
547
+ ===================
548
+ -----BEGIN CERTIFICATE-----
549
+ MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY
550
+ VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp
551
+ ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG
552
+ A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g
553
+ RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD
554
+ ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv
555
+ 2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32
556
+ qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j
557
+ YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY
558
+ vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O
559
+ BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o
560
+ atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu
561
+ MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG
562
+ A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim
563
+ PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt
564
+ I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ
565
+ HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI
566
+ Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b
567
+ vZ8=
568
+ -----END CERTIFICATE-----
569
+
570
+ Starfield Class 2 CA
571
+ ====================
572
+ -----BEGIN CERTIFICATE-----
573
+ MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc
574
+ U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg
575
+ Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo
576
+ MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG
577
+ A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG
578
+ SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY
579
+ bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ
580
+ JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm
581
+ epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN
582
+ F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF
583
+ MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f
584
+ hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo
585
+ bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g
586
+ QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs
587
+ afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM
588
+ PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl
589
+ xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD
590
+ KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3
591
+ QBFGmh95DmK/D5fs4C8fF5Q=
592
+ -----END CERTIFICATE-----
593
+
594
+ StartCom Certification Authority
595
+ ================================
596
+ -----BEGIN CERTIFICATE-----
597
+ MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN
598
+ U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu
599
+ ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0
600
+ NjM2WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk
601
+ LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg
602
+ U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw
603
+ ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y
604
+ o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/
605
+ Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d
606
+ eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt
607
+ 2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z
608
+ 6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ
609
+ osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/
610
+ untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc
611
+ UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT
612
+ 37uMdBNSSwIDAQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE
613
+ FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9jZXJ0LnN0YXJ0
614
+ Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3JsLnN0YXJ0Y29tLm9yZy9zZnNj
615
+ YS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFMBgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUH
616
+ AgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRw
617
+ Oi8vY2VydC5zdGFydGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYg
618
+ U3RhcnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlhYmlsaXR5
619
+ LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2YgdGhlIFN0YXJ0Q29tIENl
620
+ cnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFpbGFibGUgYXQgaHR0cDovL2NlcnQuc3Rh
621
+ cnRjb20ub3JnL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilT
622
+ dGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOC
623
+ AgEAFmyZ9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8jhvh
624
+ 3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUWFjgKXlf2Ysd6AgXm
625
+ vB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJzewT4F+irsfMuXGRuczE6Eri8sxHk
626
+ fY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3
627
+ fsNrarnDy0RLrHiQi+fHLB5LEUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZ
628
+ EoalHmdkrQYuL6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq
629
+ yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuCO3NJo2pXh5Tl
630
+ 1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6Vum0ABj6y6koQOdjQK/W/7HW/
631
+ lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkyShNOsF/5oirpt9P/FlUQqmMGqz9IgcgA38coro
632
+ g14=
633
+ -----END CERTIFICATE-----
634
+
635
+ Taiwan GRCA
636
+ ===========
637
+ -----BEGIN CERTIFICATE-----
638
+ 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
663
+ -----END CERTIFICATE-----
664
+
665
+ DigiCert Assured ID Root CA
666
+ ===========================
667
+ -----BEGIN CERTIFICATE-----
668
+ MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG
669
+ EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw
670
+ IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx
671
+ MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL
672
+ ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew
673
+ ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO
674
+ 9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy
675
+ UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW
676
+ /lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy
677
+ oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf
678
+ GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF
679
+ 66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq
680
+ hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc
681
+ EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn
682
+ SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i
683
+ 8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe
684
+ +o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g==
685
+ -----END CERTIFICATE-----
686
+
687
+ DigiCert Global Root CA
688
+ =======================
689
+ -----BEGIN CERTIFICATE-----
690
+ MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG
691
+ EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw
692
+ HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw
693
+ MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3
694
+ dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq
695
+ hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn
696
+ TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5
697
+ BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H
698
+ 4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y
699
+ 7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB
700
+ o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm
701
+ 8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF
702
+ BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr
703
+ EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt
704
+ tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886
705
+ UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk
706
+ CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=
707
+ -----END CERTIFICATE-----
708
+
709
+ DigiCert High Assurance EV Root CA
710
+ ==================================
711
+ -----BEGIN CERTIFICATE-----
712
+ MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG
713
+ EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw
714
+ KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw
715
+ MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ
716
+ MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu
717
+ Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t
718
+ Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS
719
+ OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3
720
+ MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ
721
+ NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe
722
+ h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB
723
+ Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY
724
+ JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ
725
+ V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp
726
+ myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK
727
+ mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe
728
+ vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K
729
+ -----END CERTIFICATE-----
730
+
731
+ Certplus Class 2 Primary CA
732
+ ===========================
733
+ -----BEGIN CERTIFICATE-----
734
+ MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAwPTELMAkGA1UE
735
+ BhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFzcyAyIFByaW1hcnkgQ0EwHhcN
736
+ OTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2Vy
737
+ dHBsdXMxGzAZBgNVBAMTEkNsYXNzIDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP
738
+ ADCCAQoCggEBANxQltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR
739
+ 5aiRVhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyLkcAbmXuZ
740
+ Vg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCdEgETjdyAYveVqUSISnFO
741
+ YFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yasH7WLO7dDWWuwJKZtkIvEcupdM5i3y95e
742
+ e++U8Rs+yskhwcWYAqqi9lt3m/V+llU0HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRME
743
+ CDAGAQH/AgEKMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJ
744
+ YIZIAYb4QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMuY29t
745
+ L0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/AN9WM2K191EBkOvD
746
+ P9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8yfFC82x/xXp8HVGIutIKPidd3i1R
747
+ TtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMRFcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+
748
+ 7UCmnYR0ObncHoUW2ikbhiMAybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW
749
+ //1IMwrh3KWBkJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7
750
+ l7+ijrRU
751
+ -----END CERTIFICATE-----
752
+
753
+ DST Root CA X3
754
+ ==============
755
+ -----BEGIN CERTIFICATE-----
756
+ MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK
757
+ ExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X
758
+ DTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1
759
+ cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD
760
+ ggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT
761
+ rE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9
762
+ UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy
763
+ xXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d
764
+ utolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T
765
+ AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ
766
+ MA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug
767
+ dB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE
768
+ GB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw
769
+ RLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS
770
+ fZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ
771
+ -----END CERTIFICATE-----
772
+
773
+ DST ACES CA X6
774
+ ==============
775
+ -----BEGIN CERTIFICATE-----
776
+ MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBbMQswCQYDVQQG
777
+ EwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QxETAPBgNVBAsTCERTVCBBQ0VT
778
+ MRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0wMzExMjAyMTE5NThaFw0xNzExMjAyMTE5NTha
779
+ MFsxCzAJBgNVBAYTAlVTMSAwHgYDVQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UE
780
+ CxMIRFNUIEFDRVMxFzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOC
781
+ AQ8AMIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPuktKe1jzI
782
+ DZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7gLFViYsx+tC3dr5BPTCa
783
+ pCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZHfAjIgrrep4c9oW24MFbCswKBXy314pow
784
+ GCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4aahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPy
785
+ MjwmR/onJALJfh1biEITajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1Ud
786
+ EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rkc3Qu
787
+ Y29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnRy
788
+ dXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMtaW5kZXguaHRtbDAdBgNVHQ4EFgQU
789
+ CXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZIhvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V2
790
+ 5FYrnJmQ6AgwbN99Pe7lv7UkQIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6t
791
+ Fr8hlxCBPeP/h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq
792
+ nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpRrscL9yuwNwXs
793
+ vFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf29w4LTJxoeHtxMcfrHuBnQfO3
794
+ oKfN5XozNmr6mis=
795
+ -----END CERTIFICATE-----
796
+
797
+ SwissSign Gold CA - G2
798
+ ======================
799
+ -----BEGIN CERTIFICATE-----
800
+ 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
826
+ -----END CERTIFICATE-----
827
+
828
+ SwissSign Silver CA - G2
829
+ ========================
830
+ -----BEGIN CERTIFICATE-----
831
+ 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
857
+ -----END CERTIFICATE-----
858
+
859
+ GeoTrust Primary Certification Authority
860
+ ========================================
861
+ -----BEGIN CERTIFICATE-----
862
+ MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQG
863
+ EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBD
864
+ ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgx
865
+ CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQ
866
+ cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
867
+ CgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWN
868
+ b6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9
869
+ nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGge
870
+ RwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGt
871
+ tm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
872
+ AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZI
873
+ hvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5K
874
+ Ts4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFN
875
+ NWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHa
876
+ Floxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG
877
+ 1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk=
878
+ -----END CERTIFICATE-----
879
+
880
+ thawte Primary Root CA
881
+ ======================
882
+ -----BEGIN CERTIFICATE-----
883
+ MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UE
884
+ BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2
885
+ aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv
886
+ cml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3
887
+ MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwg
888
+ SW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv
889
+ KGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMT
890
+ FnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs
891
+ oPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ
892
+ 1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGc
893
+ q/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/K
894
+ aAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4p
895
+ afs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD
896
+ VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUF
897
+ AAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE
898
+ uzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX
899
+ xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89
900
+ jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVH
901
+ z7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA==
902
+ -----END CERTIFICATE-----
903
+
904
+ VeriSign Class 3 Public Primary Certification Authority - G5
905
+ ============================================================
906
+ -----BEGIN CERTIFICATE-----
907
+ MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE
908
+ BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO
909
+ ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk
910
+ IHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp
911
+ ZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB
912
+ yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln
913
+ biBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh
914
+ dXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt
915
+ YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
916
+ ggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz
917
+ j/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD
918
+ Y2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/
919
+ Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r
920
+ fk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/
921
+ BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv
922
+ Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy
923
+ aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG
924
+ SIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+
925
+ X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE
926
+ KQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC
927
+ Km0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE
928
+ ZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq
929
+ -----END CERTIFICATE-----
930
+
931
+ SecureTrust CA
932
+ ==============
933
+ -----BEGIN CERTIFICATE-----
934
+ MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG
935
+ EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy
936
+ dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe
937
+ BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC
938
+ ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX
939
+ OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t
940
+ DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH
941
+ GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b
942
+ 01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH
943
+ ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/
944
+ BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj
945
+ aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ
946
+ KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu
947
+ SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf
948
+ mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ
949
+ nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR
950
+ 3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE=
951
+ -----END CERTIFICATE-----
952
+
953
+ Secure Global CA
954
+ ================
955
+ -----BEGIN CERTIFICATE-----
956
+ MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG
957
+ EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH
958
+ bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg
959
+ MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg
960
+ Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx
961
+ YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ
962
+ bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g
963
+ 8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV
964
+ HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi
965
+ 0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud
966
+ EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn
967
+ oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA
968
+ MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+
969
+ OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn
970
+ CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5
971
+ 3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc
972
+ f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW
973
+ -----END CERTIFICATE-----
974
+
975
+ COMODO Certification Authority
976
+ ==============================
977
+ -----BEGIN CERTIFICATE-----
978
+ MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE
979
+ BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG
980
+ A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1
981
+ dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb
982
+ MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD
983
+ T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5
984
+ MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH
985
+ +7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww
986
+ xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV
987
+ 4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA
988
+ 1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI
989
+ rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E
990
+ BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k
991
+ b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC
992
+ AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP
993
+ OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/
994
+ RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc
995
+ IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN
996
+ +8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ==
997
+ -----END CERTIFICATE-----
998
+
999
+ Network Solutions Certificate Authority
1000
+ =======================================
1001
+ -----BEGIN CERTIFICATE-----
1002
+ MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG
1003
+ EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr
1004
+ IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx
1005
+ MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu
1006
+ MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G
1007
+ CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx
1008
+ jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT
1009
+ aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT
1010
+ crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc
1011
+ /Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB
1012
+ AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP
1013
+ BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv
1014
+ bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA
1015
+ A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q
1016
+ 4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/
1017
+ GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv
1018
+ wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD
1019
+ ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey
1020
+ -----END CERTIFICATE-----
1021
+
1022
+ COMODO ECC Certification Authority
1023
+ ==================================
1024
+ -----BEGIN CERTIFICATE-----
1025
+ MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC
1026
+ R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE
1027
+ ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB
1028
+ dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix
1029
+ GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR
1030
+ Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo
1031
+ b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X
1032
+ 4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni
1033
+ wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E
1034
+ BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG
1035
+ FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA
1036
+ U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY=
1037
+ -----END CERTIFICATE-----
1038
+
1039
+ Security Communication EV RootCA1
1040
+ =================================
1041
+ -----BEGIN CERTIFICATE-----
1042
+ MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDElMCMGA1UEChMc
1043
+ U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMhU2VjdXJpdHkgQ29tbXVuaWNh
1044
+ dGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIzMloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UE
1045
+ BhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNl
1046
+ Y3VyaXR5IENvbW11bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
1047
+ AQoCggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSERMqm4miO
1048
+ /VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gOzXppFodEtZDkBp2uoQSX
1049
+ WHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4z
1050
+ ZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDFMxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4
1051
+ bepJz11sS6/vmsJWXMY1VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK
1052
+ 9U2vP9eCOKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqG
1053
+ SIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HWtWS3irO4G8za+6xm
1054
+ iEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZq51ihPZRwSzJIxXYKLerJRO1RuGG
1055
+ Av8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDbEJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnW
1056
+ mHyojf6GPgcWkuF75x3sM3Z+Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEW
1057
+ T1MKZPlO9L9OVL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490
1058
+ -----END CERTIFICATE-----
1059
+
1060
+ OISTE WISeKey Global Root GA CA
1061
+ ===============================
1062
+ -----BEGIN CERTIFICATE-----
1063
+ MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UE
1064
+ BhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHlyaWdodCAoYykgMjAwNTEiMCAG
1065
+ A1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBH
1066
+ bG9iYWwgUm9vdCBHQSBDQTAeFw0wNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYD
1067
+ VQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIw
1068
+ IAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5
1069
+ IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0+zAJs9
1070
+ Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxRVVuuk+g3/ytr6dTqvirdqFEr12bDYVxg
1071
+ Asj1znJ7O7jyTmUIms2kahnBAbtzptf2w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbD
1072
+ d50kc3vkDIzh2TbhmYsFmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ
1073
+ /yxViJGg4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t94B3R
1074
+ LoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw
1075
+ AwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ
1076
+ KoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOxSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vIm
1077
+ MMkQyh2I+3QZH4VFvbBsUfk2ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4
1078
+ +vg1YFkCExh8vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa
1079
+ hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY
1080
+ okxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0=
1081
+ -----END CERTIFICATE-----
1082
+
1083
+ Certigna
1084
+ ========
1085
+ -----BEGIN CERTIFICATE-----
1086
+ MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw
1087
+ EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3
1088
+ MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI
1089
+ Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q
1090
+ XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH
1091
+ GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p
1092
+ ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg
1093
+ DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf
1094
+ Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ
1095
+ tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ
1096
+ BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J
1097
+ SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA
1098
+ hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+
1099
+ ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu
1100
+ PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY
1101
+ 1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw
1102
+ WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg==
1103
+ -----END CERTIFICATE-----
1104
+
1105
+ Deutsche Telekom Root CA 2
1106
+ ==========================
1107
+ -----BEGIN CERTIFICATE-----
1108
+ MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMT
1109
+ RGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEG
1110
+ A1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5
1111
+ MjM1OTAwWjBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0G
1112
+ A1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBS
1113
+ b290IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEUha88EOQ5
1114
+ bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhCQN/Po7qCWWqSG6wcmtoI
1115
+ KyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1MjwrrFDa1sPeg5TKqAyZMg4ISFZbavva4VhY
1116
+ AUlfckE8FQYBjl2tqriTtM2e66foai1SNNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aK
1117
+ Se5TBY8ZTNXeWHmb0mocQqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTV
1118
+ jlsB9WoHtxa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAPBgNV
1119
+ HRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAlGRZrTlk5ynr
1120
+ E/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756AbrsptJh6sTtU6zkXR34ajgv8HzFZMQSy
1121
+ zhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpaIzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8
1122
+ rZ7/gFnkm0W09juwzTkZmDLl6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4G
1123
+ dyd1Lx+4ivn+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU
1124
+ Cm26OWMohpLzGITY+9HPBVZkVw==
1125
+ -----END CERTIFICATE-----
1126
+
1127
+ Cybertrust Global Root
1128
+ ======================
1129
+ -----BEGIN CERTIFICATE-----
1130
+ MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3li
1131
+ ZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4
1132
+ MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQD
1133
+ ExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
1134
+ +Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW
1135
+ 0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZL
1136
+ AfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin
1137
+ 89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT
1138
+ 8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAP
1139
+ BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2
1140
+ MDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8G
1141
+ A1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFRO
1142
+ lZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi
1143
+ 5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2
1144
+ hO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+T
1145
+ X3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW
1146
+ WL1WMRJOEcgh4LMRkWXbtKaIOM5V
1147
+ -----END CERTIFICATE-----
1148
+
1149
+ ePKI Root Certification Authority
1150
+ =================================
1151
+ -----BEGIN CERTIFICATE-----
1152
+ MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG
1153
+ EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg
1154
+ Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx
1155
+ MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq
1156
+ MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B
1157
+ AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs
1158
+ IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi
1159
+ lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv
1160
+ qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX
1161
+ 12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O
1162
+ WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+
1163
+ ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao
1164
+ lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/
1165
+ vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi
1166
+ Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi
1167
+ MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH
1168
+ ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0
1169
+ 1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq
1170
+ KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV
1171
+ xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP
1172
+ NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r
1173
+ GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE
1174
+ xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx
1175
+ gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy
1176
+ sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD
1177
+ BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw=
1178
+ -----END CERTIFICATE-----
1179
+
1180
+ T\xc3\x9c\x42\xC4\xB0TAK UEKAE K\xC3\xB6k Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 - S\xC3\xBCr\xC3\xBCm 3
1181
+ =============================================================================================================================
1182
+ -----BEGIN CERTIFICATE-----
1183
+ MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRSMRgwFgYDVQQH
1184
+ DA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJpbGltc2VsIHZlIFRla25vbG9q
1185
+ aWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSwVEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ry
1186
+ b25payB2ZSBLcmlwdG9sb2ppIEFyYcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNV
1187
+ BAsMGkthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUg
1188
+ S8O2ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAeFw0wNzA4
1189
+ MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIxGDAWBgNVBAcMD0dlYnpl
1190
+ IC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmlsaW1zZWwgdmUgVGVrbm9sb2ppayBBcmHF
1191
+ n3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBUQUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZl
1192
+ IEtyaXB0b2xvamkgQXJhxZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2Ft
1193
+ dSBTZXJ0aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7ZrIFNl
1194
+ cnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIBIjANBgkqhkiG9w0B
1195
+ AQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4hgb46ezzb8R1Sf1n68yJMlaCQvEhO
1196
+ Eav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yKO7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1
1197
+ xnnRFDDtG1hba+818qEhTsXOfJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR
1198
+ 6Oqeyjh1jmKwlZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL
1199
+ hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQIDAQABo0IwQDAd
1200
+ BgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF
1201
+ MAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmPNOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4
1202
+ N5EY3ATIZJkrGG2AA1nJrvhY0D7twyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLT
1203
+ y9LQQfMmNkqblWwM7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYh
1204
+ LBOhgLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5noN+J1q2M
1205
+ dqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUsyZyQ2uypQjyttgI=
1206
+ -----END CERTIFICATE-----
1207
+
1208
+ certSIGN ROOT CA
1209
+ ================
1210
+ -----BEGIN CERTIFICATE-----
1211
+ MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD
1212
+ VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa
1213
+ Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE
1214
+ CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I
1215
+ JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH
1216
+ rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2
1217
+ ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD
1218
+ 0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943
1219
+ AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B
1220
+ Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB
1221
+ AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8
1222
+ SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0
1223
+ x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt
1224
+ vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz
1225
+ TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD
1226
+ -----END CERTIFICATE-----
1227
+
1228
+ GeoTrust Primary Certification Authority - G3
1229
+ =============================================
1230
+ -----BEGIN CERTIFICATE-----
1231
+ MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UE
1232
+ BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA4IEdlb1RydXN0
1233
+ IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFy
1234
+ eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIz
1235
+ NTk1OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAo
1236
+ YykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMT
1237
+ LUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI
1238
+ hvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5j
1239
+ K/BGvESyiaHAKAxJcCGVn2TAppMSAmUmhsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdE
1240
+ c5IiaacDiGydY8hS2pgn5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3C
1241
+ IShwiP/WJmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exALDmKu
1242
+ dlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZChuOl1UcCAwEAAaNC
1243
+ MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMR5yo6hTgMdHNxr
1244
+ 2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IBAQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9
1245
+ cr5HqQ6XErhK8WTTOd8lNNTBzU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbE
1246
+ Ap7aDHdlDkQNkv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD
1247
+ AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUHSJsMC8tJP33s
1248
+ t/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2Gspki4cErx5z481+oghLrGREt
1249
+ -----END CERTIFICATE-----
1250
+
1251
+ thawte Primary Root CA - G2
1252
+ ===========================
1253
+ -----BEGIN CERTIFICATE-----
1254
+ MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDELMAkGA1UEBhMC
1255
+ VVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMpIDIwMDcgdGhhd3RlLCBJbmMu
1256
+ IC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3Qg
1257
+ Q0EgLSBHMjAeFw0wNzExMDUwMDAwMDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEV
1258
+ MBMGA1UEChMMdGhhd3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBG
1259
+ b3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAt
1260
+ IEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/BebfowJPDQfGAFG6DAJS
1261
+ LSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6papu+7qzcMBniKI11KOasf2twu8x+qi5
1262
+ 8/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU
1263
+ mtgAMADna3+FGO6Lts6KDPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUN
1264
+ G4k8VIZ3KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41oxXZ3K
1265
+ rr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg==
1266
+ -----END CERTIFICATE-----
1267
+
1268
+ thawte Primary Root CA - G3
1269
+ ===========================
1270
+ -----BEGIN CERTIFICATE-----
1271
+ MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCBrjELMAkGA1UE
1272
+ BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2
1273
+ aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv
1274
+ cml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0w
1275
+ ODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh
1276
+ d3RlLCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMTgwNgYD
1277
+ VQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIG
1278
+ A1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
1279
+ MIIBCgKCAQEAsr8nLPvb2FvdeHsbnndmgcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2At
1280
+ P0LMqmsywCPLLEHd5N/8YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC
1281
+ +BsUa0Lfb1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS99irY
1282
+ 7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2SzhkGcuYMXDhpxwTW
1283
+ vGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUkOQIDAQABo0IwQDAPBgNVHRMBAf8E
1284
+ BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJ
1285
+ KoZIhvcNAQELBQADggEBABpA2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweK
1286
+ A3rD6z8KLFIWoCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu
1287
+ t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7cKUGRIjxpp7sC
1288
+ 8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fMm7v/OeZWYdMKp8RcTGB7BXcm
1289
+ er/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZuMdRAGmI0Nj81Aa6sY6A=
1290
+ -----END CERTIFICATE-----
1291
+
1292
+ GeoTrust Primary Certification Authority - G2
1293
+ =============================================
1294
+ -----BEGIN CERTIFICATE-----
1295
+ MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMC
1296
+ VVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IElu
1297
+ Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBD
1298
+ ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1
1299
+ OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg
1300
+ MjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdl
1301
+ b1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEG
1302
+ BSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMc
1303
+ KiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYD
1304
+ VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+
1305
+ EVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7m
1306
+ ndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2
1307
+ npaqBA+K
1308
+ -----END CERTIFICATE-----
1309
+
1310
+ VeriSign Universal Root Certification Authority
1311
+ ===============================================
1312
+ -----BEGIN CERTIFICATE-----
1313
+ MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE
1314
+ BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO
1315
+ ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk
1316
+ IHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u
1317
+ IEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV
1318
+ UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
1319
+ cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
1320
+ IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0
1321
+ aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj
1322
+ 1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP
1323
+ MiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72
1324
+ 9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I
1325
+ AfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR
1326
+ tPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G
1327
+ CCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O
1328
+ a8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud
1329
+ DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3
1330
+ Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx
1331
+ Y8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx
1332
+ P/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P
1333
+ wGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4
1334
+ mJO37M2CYfE45k+XmCpajQ==
1335
+ -----END CERTIFICATE-----
1336
+
1337
+ VeriSign Class 3 Public Primary Certification Authority - G4
1338
+ ============================================================
1339
+ -----BEGIN CERTIFICATE-----
1340
+ MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC
1341
+ VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3
1342
+ b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz
1343
+ ZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj
1344
+ YXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL
1345
+ MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU
1346
+ cnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo
1347
+ b3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5
1348
+ IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8
1349
+ Utpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz
1350
+ rl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB
1351
+ /zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw
1352
+ HzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u
1353
+ Y29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD
1354
+ A2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx
1355
+ AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA==
1356
+ -----END CERTIFICATE-----
1357
+
1358
+ NetLock Arany (Class Gold) Főtanúsítvány
1359
+ ========================================
1360
+ -----BEGIN CERTIFICATE-----
1361
+ MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G
1362
+ A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610
1363
+ dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB
1364
+ cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx
1365
+ MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO
1366
+ ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv
1367
+ biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6
1368
+ c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu
1369
+ 0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw
1370
+ /HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk
1371
+ H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw
1372
+ fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1
1373
+ neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB
1374
+ BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW
1375
+ qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta
1376
+ YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC
1377
+ bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna
1378
+ NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu
1379
+ dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E=
1380
+ -----END CERTIFICATE-----
1381
+
1382
+ Staat der Nederlanden Root CA - G2
1383
+ ==================================
1384
+ -----BEGIN CERTIFICATE-----
1385
+ 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
1411
+ 66+KAQ==
1412
+ -----END CERTIFICATE-----
1413
+
1414
+ Hongkong Post Root CA 1
1415
+ =======================
1416
+ -----BEGIN CERTIFICATE-----
1417
+ MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT
1418
+ DUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx
1419
+ NTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n
1420
+ IFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF
1421
+ AAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1
1422
+ ApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr
1423
+ auh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh
1424
+ qZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY
1425
+ V18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV
1426
+ HRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i
1427
+ h9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio
1428
+ l7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei
1429
+ IAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps
1430
+ T/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT
1431
+ c4afU9hDDl3WY4JxHYB0yvbiAmvZWg==
1432
+ -----END CERTIFICATE-----
1433
+
1434
+ SecureSign RootCA11
1435
+ ===================
1436
+ -----BEGIN CERTIFICATE-----
1437
+ MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi
1438
+ SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS
1439
+ b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw
1440
+ KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1
1441
+ cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL
1442
+ TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO
1443
+ wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq
1444
+ g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP
1445
+ O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA
1446
+ bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX
1447
+ t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh
1448
+ OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r
1449
+ bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ
1450
+ Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01
1451
+ y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061
1452
+ lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I=
1453
+ -----END CERTIFICATE-----
1454
+
1455
+ ACEDICOM Root
1456
+ =============
1457
+ -----BEGIN CERTIFICATE-----
1458
+ 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
1484
+ -----END CERTIFICATE-----
1485
+
1486
+ Microsec e-Szigno Root CA 2009
1487
+ ==============================
1488
+ -----BEGIN CERTIFICATE-----
1489
+ MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER
1490
+ MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv
1491
+ c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o
1492
+ dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE
1493
+ BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt
1494
+ U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw
1495
+ DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA
1496
+ fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG
1497
+ 0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA
1498
+ pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm
1499
+ 1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC
1500
+ AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf
1501
+ QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE
1502
+ FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o
1503
+ lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX
1504
+ I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775
1505
+ tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02
1506
+ yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi
1507
+ LXpUq3DDfSJlgnCW
1508
+ -----END CERTIFICATE-----
1509
+
1510
+ GlobalSign Root CA - R3
1511
+ =======================
1512
+ -----BEGIN CERTIFICATE-----
1513
+ MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv
1514
+ YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh
1515
+ bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT
1516
+ aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln
1517
+ bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt
1518
+ iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ
1519
+ 0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3
1520
+ rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl
1521
+ OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2
1522
+ xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE
1523
+ FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7
1524
+ lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8
1525
+ EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E
1526
+ bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18
1527
+ YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r
1528
+ kpeDMdmztcpHWD9f
1529
+ -----END CERTIFICATE-----
1530
+
1531
+ Autoridad de Certificacion Firmaprofesional CIF A62634068
1532
+ =========================================================
1533
+ -----BEGIN CERTIFICATE-----
1534
+ MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA
1535
+ BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2
1536
+ MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw
1537
+ QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB
1538
+ NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD
1539
+ Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P
1540
+ B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY
1541
+ 7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH
1542
+ ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI
1543
+ plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX
1544
+ MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX
1545
+ LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK
1546
+ bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU
1547
+ vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud
1548
+ EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH
1549
+ DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp
1550
+ cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA
1551
+ bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx
1552
+ ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx
1553
+ 51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk
1554
+ R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP
1555
+ T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f
1556
+ Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl
1557
+ osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR
1558
+ crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR
1559
+ saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD
1560
+ KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi
1561
+ 6Et8Vcad+qMUu2WFbm5PEn4KPJ2V
1562
+ -----END CERTIFICATE-----
1563
+
1564
+ Izenpe.com
1565
+ ==========
1566
+ -----BEGIN CERTIFICATE-----
1567
+ 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
1594
+ -----END CERTIFICATE-----
1595
+
1596
+ Chambers of Commerce Root - 2008
1597
+ ================================
1598
+ -----BEGIN CERTIFICATE-----
1599
+ MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYDVQQGEwJFVTFD
1600
+ MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv
1601
+ bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu
1602
+ QS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEy
1603
+ Mjk1MFoXDTM4MDczMTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNl
1604
+ ZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQF
1605
+ EwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJl
1606
+ cnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC
1607
+ AQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW928sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKA
1608
+ XuFixrYp4YFs8r/lfTJqVKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorj
1609
+ h40G072QDuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR5gN/
1610
+ ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfLZEFHcpOrUMPrCXZk
1611
+ NNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05aSd+pZgvMPMZ4fKecHePOjlO+Bd5g
1612
+ D2vlGts/4+EhySnB8esHnFIbAURRPHsl18TlUlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331
1613
+ lubKgdaX8ZSD6e2wsWsSaR6s+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ
1614
+ 0wlf2eOKNcx5Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj
1615
+ ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAxhduub+84Mxh2
1616
+ EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNVHQ4EFgQU+SSsD7K1+HnA+mCI
1617
+ G8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJ
1618
+ BgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNh
1619
+ bWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENh
1620
+ bWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDiC
1621
+ CQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUH
1622
+ AgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAJASryI1
1623
+ wqM58C7e6bXpeHxIvj99RZJe6dqxGfwWPJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH
1624
+ 3qLPaYRgM+gQDROpI9CF5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbU
1625
+ RWpGqOt1glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaHFoI6
1626
+ M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2pSB7+R5KBWIBpih1
1627
+ YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MDxvbxrN8y8NmBGuScvfaAFPDRLLmF
1628
+ 9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QGtjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcK
1629
+ zBIKinmwPQN/aUv0NCB9szTqjktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvG
1630
+ nrDQWzilm1DefhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg
1631
+ OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZd0jQ
1632
+ -----END CERTIFICATE-----
1633
+
1634
+ Global Chambersign Root - 2008
1635
+ ==============================
1636
+ -----BEGIN CERTIFICATE-----
1637
+ MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJFVTFD
1638
+ MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv
1639
+ bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu
1640
+ QS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMx
1641
+ NDBaFw0zODA3MzExMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUg
1642
+ Y3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ
1643
+ QTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD
1644
+ aGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDf
1645
+ VtPkOpt2RbQT2//BthmLN0EYlVJH6xedKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXf
1646
+ XjaOcNFccUMd2drvXNL7G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0
1647
+ ZJJ0YPP2zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4ddPB
1648
+ /gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyGHoiMvvKRhI9lNNgA
1649
+ TH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2Id3UwD2ln58fQ1DJu7xsepeY7s2M
1650
+ H/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3VyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfe
1651
+ Ox2YItaswTXbo6Al/3K1dh3ebeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSF
1652
+ HTynyQbehP9r6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh
1653
+ wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsogzCtLkykPAgMB
1654
+ AAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQWBBS5CcqcHtvTbDprru1U8VuT
1655
+ BjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDprru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UE
1656
+ BhMCRVUxQzBBBgNVBAcTOk1hZHJpZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJm
1657
+ aXJtYS5jb20vYWRkcmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJm
1658
+ aXJtYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiCCQDJzdPp
1659
+ 1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0
1660
+ dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAICIf3DekijZBZRG
1661
+ /5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6
1662
+ ReAJ3spED8IXDneRRXozX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/s
1663
+ dZ7LoR/xfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVza2Mg
1664
+ 9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yydYhz2rXzdpjEetrHH
1665
+ foUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMdSqlapskD7+3056huirRXhOukP9Du
1666
+ qqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9OAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETr
1667
+ P3iZ8ntxPjzxmKfFGBI/5rsoM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVq
1668
+ c5iJWzouE4gev8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z
1669
+ 09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B
1670
+ -----END CERTIFICATE-----
1671
+
1672
+ Go Daddy Root Certificate Authority - G2
1673
+ ========================================
1674
+ -----BEGIN CERTIFICATE-----
1675
+ MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
1676
+ B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu
1677
+ MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5
1678
+ MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6
1679
+ b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G
1680
+ A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI
1681
+ hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq
1682
+ 9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD
1683
+ +qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd
1684
+ fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl
1685
+ NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC
1686
+ MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9
1687
+ BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac
1688
+ vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r
1689
+ 5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV
1690
+ N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO
1691
+ LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1
1692
+ -----END CERTIFICATE-----
1693
+
1694
+ Starfield Root Certificate Authority - G2
1695
+ =========================================
1696
+ -----BEGIN CERTIFICATE-----
1697
+ MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
1698
+ B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s
1699
+ b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0
1700
+ eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw
1701
+ DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg
1702
+ VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB
1703
+ dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv
1704
+ W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs
1705
+ bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk
1706
+ N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf
1707
+ ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU
1708
+ JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
1709
+ AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol
1710
+ TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx
1711
+ 4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw
1712
+ F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K
1713
+ pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ
1714
+ c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0
1715
+ -----END CERTIFICATE-----
1716
+
1717
+ Starfield Services Root Certificate Authority - G2
1718
+ ==================================================
1719
+ -----BEGIN CERTIFICATE-----
1720
+ MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
1721
+ B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s
1722
+ b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl
1723
+ IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV
1724
+ BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT
1725
+ dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg
1726
+ Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
1727
+ AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2
1728
+ h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa
1729
+ hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP
1730
+ LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB
1731
+ rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw
1732
+ AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG
1733
+ SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP
1734
+ E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy
1735
+ xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd
1736
+ iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza
1737
+ YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6
1738
+ -----END CERTIFICATE-----
1739
+
1740
+ AffirmTrust Commercial
1741
+ ======================
1742
+ -----BEGIN CERTIFICATE-----
1743
+ MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS
1744
+ BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw
1745
+ MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly
1746
+ bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF
1747
+ AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb
1748
+ DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV
1749
+ C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6
1750
+ BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww
1751
+ MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV
1752
+ HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
1753
+ AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG
1754
+ hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi
1755
+ qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv
1756
+ 0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh
1757
+ sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8=
1758
+ -----END CERTIFICATE-----
1759
+
1760
+ AffirmTrust Networking
1761
+ ======================
1762
+ -----BEGIN CERTIFICATE-----
1763
+ MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS
1764
+ BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw
1765
+ MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly
1766
+ bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF
1767
+ AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE
1768
+ Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI
1769
+ dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24
1770
+ /PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb
1771
+ h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV
1772
+ HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
1773
+ AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu
1774
+ UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6
1775
+ 12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23
1776
+ WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9
1777
+ /ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s=
1778
+ -----END CERTIFICATE-----
1779
+
1780
+ AffirmTrust Premium
1781
+ ===================
1782
+ -----BEGIN CERTIFICATE-----
1783
+ MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS
1784
+ BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy
1785
+ OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy
1786
+ dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
1787
+ MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn
1788
+ BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV
1789
+ 5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs
1790
+ +7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd
1791
+ GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R
1792
+ p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI
1793
+ S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04
1794
+ 6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5
1795
+ /bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo
1796
+ +Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB
1797
+ /wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv
1798
+ MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg
1799
+ Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC
1800
+ 6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S
1801
+ L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK
1802
+ +4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV
1803
+ BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg
1804
+ IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60
1805
+ g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb
1806
+ zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw==
1807
+ -----END CERTIFICATE-----
1808
+
1809
+ AffirmTrust Premium ECC
1810
+ =======================
1811
+ -----BEGIN CERTIFICATE-----
1812
+ MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV
1813
+ BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx
1814
+ MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U
1815
+ cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA
1816
+ IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ
1817
+ N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW
1818
+ BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK
1819
+ BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X
1820
+ 57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM
1821
+ eQ==
1822
+ -----END CERTIFICATE-----
1823
+
1824
+ Certum Trusted Network CA
1825
+ =========================
1826
+ -----BEGIN CERTIFICATE-----
1827
+ MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK
1828
+ ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv
1829
+ biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy
1830
+ MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU
1831
+ ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5
1832
+ MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC
1833
+ AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC
1834
+ l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J
1835
+ J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4
1836
+ fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0
1837
+ cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB
1838
+ Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw
1839
+ DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj
1840
+ jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1
1841
+ mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj
1842
+ Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI
1843
+ 03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw=
1844
+ -----END CERTIFICATE-----
1845
+
1846
+ Certinomis - Autorité Racine
1847
+ ============================
1848
+ -----BEGIN CERTIFICATE-----
1849
+ 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
1874
+ vgt2Fl43N+bYdJeimUV5
1875
+ -----END CERTIFICATE-----
1876
+
1877
+ TWCA Root Certification Authority
1878
+ =================================
1879
+ -----BEGIN CERTIFICATE-----
1880
+ MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ
1881
+ VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh
1882
+ dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG
1883
+ EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB
1884
+ IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
1885
+ AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx
1886
+ QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC
1887
+ oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP
1888
+ 4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r
1889
+ y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB
1890
+ BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG
1891
+ 9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC
1892
+ mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW
1893
+ QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY
1894
+ T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny
1895
+ Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw==
1896
+ -----END CERTIFICATE-----
1897
+
1898
+ Security Communication RootCA2
1899
+ ==============================
1900
+ -----BEGIN CERTIFICATE-----
1901
+ MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc
1902
+ U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh
1903
+ dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC
1904
+ SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy
1905
+ aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
1906
+ ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++
1907
+ +T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R
1908
+ 3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV
1909
+ spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K
1910
+ EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8
1911
+ QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB
1912
+ CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj
1913
+ u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk
1914
+ 3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q
1915
+ tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29
1916
+ mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03
1917
+ -----END CERTIFICATE-----
1918
+
1919
+ EC-ACC
1920
+ ======
1921
+ -----BEGIN CERTIFICATE-----
1922
+ MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB8zELMAkGA1UE
1923
+ BhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2VydGlmaWNhY2lvIChOSUYgUS0w
1924
+ ODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYD
1925
+ VQQLEyxWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UE
1926
+ CxMsSmVyYXJxdWlhIEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMT
1927
+ BkVDLUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQGEwJFUzE7
1928
+ MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYt
1929
+ SSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZl
1930
+ Z2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJh
1931
+ cnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUND
1932
+ MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R85iK
1933
+ w5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm4CgPukLjbo73FCeT
1934
+ ae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaVHMf5NLWUhdWZXqBIoH7nF2W4onW4
1935
+ HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNdQlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0a
1936
+ E9jD2z3Il3rucO2n5nzbcc8tlGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw
1937
+ 0JDnJwIDAQABo4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E
1938
+ BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4opvpXY0wfwYD
1939
+ VR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBodHRwczovL3d3dy5jYXRjZXJ0
1940
+ Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5l
1941
+ dC92ZXJhcnJlbCAwDQYJKoZIhvcNAQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJ
1942
+ lF7W2u++AVtd0x7Y/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNa
1943
+ Al6kSBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhyRp/7SNVe
1944
+ l+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOSAgu+TGbrIP65y7WZf+a2
1945
+ E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xlnJ2lYJU6Un/10asIbvPuW/mIPX64b24D
1946
+ 5EI=
1947
+ -----END CERTIFICATE-----
1948
+
1949
+ Hellenic Academic and Research Institutions RootCA 2011
1950
+ =======================================================
1951
+ -----BEGIN CERTIFICATE-----
1952
+ MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1IxRDBCBgNVBAoT
1953
+ O0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9y
1954
+ aXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z
1955
+ IFJvb3RDQSAyMDExMB4XDTExMTIwNjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYT
1956
+ AkdSMUQwQgYDVQQKEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z
1957
+ IENlcnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNo
1958
+ IEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
1959
+ AKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPzdYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI
1960
+ 1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJfel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa
1961
+ 71HFK9+WXesyHgLacEnsbgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u
1962
+ 8yBRQlqD75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSPFEDH
1963
+ 3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNVHRMBAf8EBTADAQH/
1964
+ MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp5dgTBCPuQSUwRwYDVR0eBEAwPqA8
1965
+ MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQub3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQu
1966
+ b3JnMA0GCSqGSIb3DQEBBQUAA4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVt
1967
+ XdMiKahsog2p6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8
1968
+ TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7dIsXRSZMFpGD
1969
+ /md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8AcysNnq/onN694/BtZqhFLKPM58N
1970
+ 7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXIl7WdmplNsDz4SgCbZN2fOUvRJ9e4
1971
+ -----END CERTIFICATE-----
1972
+
1973
+ Actalis Authentication Root CA
1974
+ ==============================
1975
+ -----BEGIN CERTIFICATE-----
1976
+ MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UEBhMCSVQxDjAM
1977
+ BgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UE
1978
+ AwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDky
1979
+ MjExMjIwMlowazELMAkGA1UEBhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlz
1980
+ IFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290
1981
+ IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNvUTufClrJ
1982
+ wkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX4ay8IMKx4INRimlNAJZa
1983
+ by/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9KK3giq0itFZljoZUj5NDKd45RnijMCO6
1984
+ zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1f
1985
+ YVEiVRvjRuPjPdA1YprbrxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2
1986
+ oxgkg4YQ51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2Fbe8l
1987
+ EfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxeKF+w6D9Fz8+vm2/7
1988
+ hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4Fv6MGn8i1zeQf1xcGDXqVdFUNaBr8
1989
+ EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbnfpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5
1990
+ jF66CyCU3nuDuP/jVo23Eek7jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLY
1991
+ iDrIn3hm7YnzezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt
1992
+ ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQALe3KHwGCmSUyI
1993
+ WOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70jsNjLiNmsGe+b7bAEzlgqqI0
1994
+ JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDzWochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKx
1995
+ K3JCaKygvU5a2hi/a5iB0P2avl4VSM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+
1996
+ Xlff1ANATIGk0k9jpwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC
1997
+ 4yyXX04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+OkfcvHlXHo
1998
+ 2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7RK4X9p2jIugErsWx0Hbhz
1999
+ lefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btUZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXem
2000
+ OR/qnuOf0GZvBeyqdn6/axag67XH/JJULysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9
2001
+ vwGYT7JZVEc+NHt4bVaTLnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg==
2002
+ -----END CERTIFICATE-----
2003
+
2004
+ Trustis FPS Root CA
2005
+ ===================
2006
+ -----BEGIN CERTIFICATE-----
2007
+ MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQG
2008
+ EwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQLExNUcnVzdGlzIEZQUyBSb290
2009
+ IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTExMzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNV
2010
+ BAoTD1RydXN0aXMgTGltaXRlZDEcMBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJ
2011
+ KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQ
2012
+ RUN+AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihHiTHcDnlk
2013
+ H5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjjvSkCqPoc4Vu5g6hBSLwa
2014
+ cY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zt
2015
+ o3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlBOrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEA
2016
+ AaNTMFEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAd
2017
+ BgNVHQ4EFgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01GX2c
2018
+ GE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmWzaD+vkAMXBJV+JOC
2019
+ yinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP41BIy+Q7DsdwyhEQsb8tGD+pmQQ9P
2020
+ 8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZEf1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHV
2021
+ l/9D7S3B2l0pKoU/rGXuhg8FjZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYl
2022
+ iB6XzCGcKQENZetX2fNXlrtIzYE=
2023
+ -----END CERTIFICATE-----
2024
+
2025
+ StartCom Certification Authority
2026
+ ================================
2027
+ -----BEGIN CERTIFICATE-----
2028
+ MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN
2029
+ U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu
2030
+ ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0
2031
+ NjM3WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk
2032
+ LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg
2033
+ U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw
2034
+ ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y
2035
+ o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/
2036
+ Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d
2037
+ eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt
2038
+ 2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z
2039
+ 6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ
2040
+ osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/
2041
+ untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc
2042
+ UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT
2043
+ 37uMdBNSSwIDAQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD
2044
+ VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFulF2mHMMo0aEPQ
2045
+ Qa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCCATgwLgYIKwYBBQUHAgEWImh0
2046
+ dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cu
2047
+ c3RhcnRzc2wuY29tL2ludGVybWVkaWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENv
2048
+ bW1lcmNpYWwgKFN0YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0
2049
+ aGUgc2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0aWZpY2F0
2050
+ aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3RhcnRzc2wuY29t
2051
+ L3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBG
2052
+ cmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5
2053
+ fPGFf59Jb2vKXfuM/gTFwWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWm
2054
+ N3PH/UvSTa0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst0OcN
2055
+ Org+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNcpRJvkrKTlMeIFw6T
2056
+ tn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKlCcWw0bdT82AUuoVpaiF8H3VhFyAX
2057
+ e2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVFP0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA
2058
+ 2MFrLH9ZXF2RsXAiV+uKa0hK1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBs
2059
+ HvUwyKMQ5bLmKhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE
2060
+ JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ8dCAWZvLMdib
2061
+ D4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnmfyWl8kgAwKQB2j8=
2062
+ -----END CERTIFICATE-----
2063
+
2064
+ StartCom Certification Authority G2
2065
+ ===================================
2066
+ -----BEGIN CERTIFICATE-----
2067
+ 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
2091
+ obp573PYtlNXLfbQ4ddI
2092
+ -----END CERTIFICATE-----
2093
+
2094
+ Buypass Class 2 Root CA
2095
+ =======================
2096
+ -----BEGIN CERTIFICATE-----
2097
+ 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
2121
+ rJgWVqA=
2122
+ -----END CERTIFICATE-----
2123
+
2124
+ Buypass Class 3 Root CA
2125
+ =======================
2126
+ -----BEGIN CERTIFICATE-----
2127
+ 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
2151
+ Cp/HuZc=
2152
+ -----END CERTIFICATE-----
2153
+
2154
+ T-TeleSec GlobalRoot Class 3
2155
+ ============================
2156
+ -----BEGIN CERTIFICATE-----
2157
+ MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM
2158
+ IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU
2159
+ cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgx
2160
+ MDAxMTAyOTU2WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz
2161
+ dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD
2162
+ ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0GCSqGSIb3
2163
+ DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN8ELg63iIVl6bmlQdTQyK
2164
+ 9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/RLyTPWGrTs0NvvAgJ1gORH8EGoel15YU
2165
+ NpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZF
2166
+ iP0Zf3WHHx+xGwpzJFu5ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W
2167
+ 0eDrXltMEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGjQjBA
2168
+ MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1A/d2O2GCahKqGFPr
2169
+ AyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOyWL6ukK2YJ5f+AbGwUgC4TeQbIXQb
2170
+ fsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzT
2171
+ ucpH9sry9uetuUg/vBa3wW306gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7h
2172
+ P0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml
2173
+ e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw==
2174
+ -----END CERTIFICATE-----
2175
+
2176
+ EE Certification Centre Root CA
2177
+ ===============================
2178
+ -----BEGIN CERTIFICATE-----
2179
+ MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG
2180
+ EwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEoMCYGA1UEAwwfRUUgQ2Vy
2181
+ dGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIw
2182
+ MTAxMDMwMTAxMDMwWhgPMjAzMDEyMTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlB
2183
+ UyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRy
2184
+ ZSBSb290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEBAQUAA4IB
2185
+ DwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUyeuuOF0+W2Ap7kaJjbMeM
2186
+ TC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvObntl8jixwKIy72KyaOBhU8E2lf/slLo2
2187
+ rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIwWFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw
2188
+ 93X2PaRka9ZP585ArQ/dMtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtN
2189
+ P2MbRMNE1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYDVR0T
2190
+ AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/zQas8fElyalL1BSZ
2191
+ MEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEF
2192
+ BQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEFBQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+Rj
2193
+ xY6hUFaTlrg4wCQiZrxTFGGVv9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqM
2194
+ lIpPnTX/dqQGE5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u
2195
+ uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIWiAYLtqZLICjU
2196
+ 3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/vGVCJYMzpJJUPwssd8m92kMfM
2197
+ dcGWxZ0=
2198
+ -----END CERTIFICATE-----
2199
+
2200
+ TURKTRUST Certificate Services Provider Root 2007
2201
+ =================================================
2202
+ -----BEGIN CERTIFICATE-----
2203
+ MIIEPTCCAyWgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvzE/MD0GA1UEAww2VMOcUktUUlVTVCBF
2204
+ bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP
2205
+ MA0GA1UEBwwGQW5rYXJhMV4wXAYDVQQKDFVUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg
2206
+ QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgQXJhbMSxayAyMDA3MB4X
2207
+ DTA3MTIyNTE4MzcxOVoXDTE3MTIyMjE4MzcxOVowgb8xPzA9BgNVBAMMNlTDnFJLVFJVU1QgRWxl
2208
+ a3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTELMAkGA1UEBhMCVFIxDzAN
2209
+ BgNVBAcMBkFua2FyYTFeMFwGA1UECgxVVMOcUktUUlVTVCBCaWxnaSDEsGxldGnFn2ltIHZlIEJp
2210
+ bGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7Fni4gKGMpIEFyYWzEsWsgMjAwNzCCASIw
2211
+ DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKu3PgqMyKVYFeaK7yc9SrToJdPNM8Ig3BnuiD9N
2212
+ YvDdE3ePYakqtdTyuTFYKTsvP2qcb3N2Je40IIDu6rfwxArNK4aUyeNgsURSsloptJGXg9i3phQv
2213
+ KUmi8wUG+7RP2qFsmmaf8EMJyupyj+sA1zU511YXRxcw9L6/P8JorzZAwan0qafoEGsIiveGHtya
2214
+ KhUG9qPw9ODHFNRRf8+0222vR5YXm3dx2KdxnSQM9pQ/hTEST7ruToK4uT6PIzdezKKqdfcYbwnT
2215
+ rqdUKDT74eA7YH2gvnmJhsifLfkKS8RQouf9eRbHegsYz85M733WB2+Y8a+xwXrXgTW4qhe04MsC
2216
+ AwEAAaNCMEAwHQYDVR0OBBYEFCnFkKslrxHkYb+j/4hhkeYO/pyBMA4GA1UdDwEB/wQEAwIBBjAP
2217
+ BgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAQDdr4Ouwo0RSVgrESLFF6QSU2TJ/s
2218
+ Px+EnWVUXKgWAkD6bho3hO9ynYYKVZ1WKKxmLNA6VpM0ByWtCLCPyA8JWcqdmBzlVPi5RX9ql2+I
2219
+ aE1KBiY3iAIOtsbWcpnOa3faYjGkVh+uX4132l32iPwa2Z61gfAyuOOI0JzzaqC5mxRZNTZPz/OO
2220
+ Xl0XrRWV2N2y1RVuAE6zS89mlOTgzbUF2mNXi+WzqtvALhyQRNsaXRik7r4EW5nVcV9VZWRi1aKb
2221
+ BFmGyGJ353yCRWo9F7/snXUMrqNvWtMvmDb08PUZqxFdyKbjKlhqQgnDvZImZjINXQhVdP+MmNAK
2222
+ poRq0Tl9
2223
+ -----END CERTIFICATE-----
2224
+
2225
+ D-TRUST Root Class 3 CA 2 2009
2226
+ ==============================
2227
+ -----BEGIN CERTIFICATE-----
2228
+ MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQK
2229
+ DAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTAe
2230
+ Fw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NThaME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxE
2231
+ LVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIw
2232
+ DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOAD
2233
+ ER03UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42tSHKXzlA
2234
+ BF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9RySPocq60vFYJfxLLHLGv
2235
+ KZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsMlFqVlNpQmvH/pStmMaTJOKDfHR+4CS7z
2236
+ p+hnUquVH+BGPtikw8paxTGA6Eian5Rp/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUC
2237
+ AwEAAaOCARowggEWMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ
2238
+ 4PGEMA4GA1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVjdG9y
2239
+ eS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUyMENBJTIwMiUyMDIw
2240
+ MDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRlcmV2b2NhdGlvbmxpc3QwQ6BBoD+G
2241
+ PWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAw
2242
+ OS5jcmwwDQYJKoZIhvcNAQELBQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm
2243
+ 2H6NMLVwMeniacfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0
2244
+ o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4KzCUqNQT4YJEV
2245
+ dT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8PIWmawomDeCTmGCufsYkl4ph
2246
+ X5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3YJohw1+qRzT65ysCQblrGXnRl11z+o+I=
2247
+ -----END CERTIFICATE-----
2248
+
2249
+ D-TRUST Root Class 3 CA 2 EV 2009
2250
+ =================================
2251
+ -----BEGIN CERTIFICATE-----
2252
+ MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK
2253
+ DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw
2254
+ OTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUwNDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK
2255
+ DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw
2256
+ OTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfS
2257
+ egpnljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM03TP1YtHh
2258
+ zRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6ZqQTMFexgaDbtCHu39b+T
2259
+ 7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lRp75mpoo6Kr3HGrHhFPC+Oh25z1uxav60
2260
+ sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure35
2261
+ 11H3a6UCAwEAAaOCASQwggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyv
2262
+ cop9NteaHNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFwOi8v
2263
+ ZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xhc3MlMjAzJTIwQ0El
2264
+ MjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1ERT9jZXJ0aWZpY2F0ZXJldm9jYXRp
2265
+ b25saXN0MEagRKBChkBodHRwOi8vd3d3LmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xh
2266
+ c3NfM19jYV8yX2V2XzIwMDkuY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+
2267
+ PPoeUSbrh/Yp3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05
2268
+ nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNFCSuGdXzfX2lX
2269
+ ANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7naxpeG0ILD5EJt/rDiZE4OJudA
2270
+ NCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqXKVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVv
2271
+ w9y4AyHqnxbxLFS1
2272
+ -----END CERTIFICATE-----
2273
+
2274
+ PSCProcert
2275
+ ==========
2276
+ -----BEGIN CERTIFICATE-----
2277
+ MIIJhjCCB26gAwIBAgIBCzANBgkqhkiG9w0BAQsFADCCAR4xPjA8BgNVBAMTNUF1dG9yaWRhZCBk
2278
+ ZSBDZXJ0aWZpY2FjaW9uIFJhaXogZGVsIEVzdGFkbyBWZW5lem9sYW5vMQswCQYDVQQGEwJWRTEQ
2279
+ MA4GA1UEBxMHQ2FyYWNhczEZMBcGA1UECBMQRGlzdHJpdG8gQ2FwaXRhbDE2MDQGA1UEChMtU2lz
2280
+ dGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMUMwQQYDVQQLEzpTdXBl
2281
+ cmludGVuZGVuY2lhIGRlIFNlcnZpY2lvcyBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMSUw
2282
+ IwYJKoZIhvcNAQkBFhZhY3JhaXpAc3VzY2VydGUuZ29iLnZlMB4XDTEwMTIyODE2NTEwMFoXDTIw
2283
+ MTIyNTIzNTk1OVowgdExJjAkBgkqhkiG9w0BCQEWF2NvbnRhY3RvQHByb2NlcnQubmV0LnZlMQ8w
2284
+ DQYDVQQHEwZDaGFjYW8xEDAOBgNVBAgTB01pcmFuZGExKjAoBgNVBAsTIVByb3ZlZWRvciBkZSBD
2285
+ ZXJ0aWZpY2Fkb3MgUFJPQ0VSVDE2MDQGA1UEChMtU2lzdGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZp
2286
+ Y2FjaW9uIEVsZWN0cm9uaWNhMQswCQYDVQQGEwJWRTETMBEGA1UEAxMKUFNDUHJvY2VydDCCAiIw
2287
+ DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANW39KOUM6FGqVVhSQ2oh3NekS1wwQYalNo97BVC
2288
+ wfWMrmoX8Yqt/ICV6oNEolt6Vc5Pp6XVurgfoCfAUFM+jbnADrgV3NZs+J74BCXfgI8Qhd19L3uA
2289
+ 3VcAZCP4bsm+lU/hdezgfl6VzbHvvnpC2Mks0+saGiKLt38GieU89RLAu9MLmV+QfI4tL3czkkoh
2290
+ RqipCKzx9hEC2ZUWno0vluYC3XXCFCpa1sl9JcLB/KpnheLsvtF8PPqv1W7/U0HU9TI4seJfxPmO
2291
+ EO8GqQKJ/+MMbpfg353bIdD0PghpbNjU5Db4g7ayNo+c7zo3Fn2/omnXO1ty0K+qP1xmk6wKImG2
2292
+ 0qCZyFSTXai20b1dCl53lKItwIKOvMoDKjSuc/HUtQy9vmebVOvh+qBa7Dh+PsHMosdEMXXqP+UH
2293
+ 0quhJZb25uSgXTcYOWEAM11G1ADEtMo88aKjPvM6/2kwLkDd9p+cJsmWN63nOaK/6mnbVSKVUyqU
2294
+ td+tFjiBdWbjxywbk5yqjKPK2Ww8F22c3HxT4CAnQzb5EuE8XL1mv6JpIzi4mWCZDlZTOpx+FIyw
2295
+ Bm/xhnaQr/2v/pDGj59/i5IjnOcVdo/Vi5QTcmn7K2FjiO/mpF7moxdqWEfLcU8UC17IAggmosvp
2296
+ r2uKGcfLFFb14dq12fy/czja+eevbqQ34gcnAgMBAAGjggMXMIIDEzASBgNVHRMBAf8ECDAGAQH/
2297
+ AgEBMDcGA1UdEgQwMC6CD3N1c2NlcnRlLmdvYi52ZaAbBgVghl4CAqASDBBSSUYtRy0yMDAwNDAz
2298
+ Ni0wMB0GA1UdDgQWBBRBDxk4qpl/Qguk1yeYVKIXTC1RVDCCAVAGA1UdIwSCAUcwggFDgBStuyId
2299
+ xuDSAaj9dlBSk+2YwU2u06GCASakggEiMIIBHjE+MDwGA1UEAxM1QXV0b3JpZGFkIGRlIENlcnRp
2300
+ ZmljYWNpb24gUmFpeiBkZWwgRXN0YWRvIFZlbmV6b2xhbm8xCzAJBgNVBAYTAlZFMRAwDgYDVQQH
2301
+ EwdDYXJhY2FzMRkwFwYDVQQIExBEaXN0cml0byBDYXBpdGFsMTYwNAYDVQQKEy1TaXN0ZW1hIE5h
2302
+ Y2lvbmFsIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExQzBBBgNVBAsTOlN1cGVyaW50ZW5k
2303
+ ZW5jaWEgZGUgU2VydmljaW9zIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExJTAjBgkqhkiG
2304
+ 9w0BCQEWFmFjcmFpekBzdXNjZXJ0ZS5nb2IudmWCAQowDgYDVR0PAQH/BAQDAgEGME0GA1UdEQRG
2305
+ MESCDnByb2NlcnQubmV0LnZloBUGBWCGXgIBoAwMClBTQy0wMDAwMDKgGwYFYIZeAgKgEgwQUklG
2306
+ LUotMzE2MzUzNzMtNzB2BgNVHR8EbzBtMEagRKBChkBodHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52
2307
+ ZS9sY3IvQ0VSVElGSUNBRE8tUkFJWi1TSEEzODRDUkxERVIuY3JsMCOgIaAfhh1sZGFwOi8vYWNy
2308
+ YWl6LnN1c2NlcnRlLmdvYi52ZTA3BggrBgEFBQcBAQQrMCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9v
2309
+ Y3NwLnN1c2NlcnRlLmdvYi52ZTBBBgNVHSAEOjA4MDYGBmCGXgMBAjAsMCoGCCsGAQUFBwIBFh5o
2310
+ dHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52ZS9kcGMwDQYJKoZIhvcNAQELBQADggIBACtZ6yKZu4Sq
2311
+ T96QxtGGcSOeSwORR3C7wJJg7ODU523G0+1ng3dS1fLld6c2suNUvtm7CpsR72H0xpkzmfWvADmN
2312
+ g7+mvTV+LFwxNG9s2/NkAZiqlCxB3RWGymspThbASfzXg0gTB1GEMVKIu4YXx2sviiCtxQuPcD4q
2313
+ uxtxj7mkoP3YldmvWb8lK5jpY5MvYB7Eqvh39YtsL+1+LrVPQA3uvFd359m21D+VJzog1eWuq2w1
2314
+ n8GhHVnchIHuTQfiSLaeS5UtQbHh6N5+LwUeaO6/u5BlOsju6rEYNxxik6SgMexxbJHmpHmJWhSn
2315
+ FFAFTKQAVzAswbVhltw+HoSvOULP5dAssSS830DD7X9jSr3hTxJkhpXzsOfIt+FTvZLm8wyWuevo
2316
+ 5pLtp4EJFAv8lXrPj9Y0TzYS3F7RNHXGRoAvlQSMx4bEqCaJqD8Zm4G7UaRKhqsLEQ+xrmNTbSjq
2317
+ 3TNWOByyrYDT13K9mmyZY+gAu0F2BbdbmRiKw7gSXFbPVgx96OLP7bx0R/vu0xdOIk9W/1DzLuY5
2318
+ poLWccret9W6aAjtmcz9opLLabid+Qqkpj5PkygqYWwHJgD/ll9ohri4zspV4KuxPX+Y1zMOWj3Y
2319
+ eMLEYC/HYvBhkdI4sPaeVdtAgAUSM84dkpvRabP/v/GSCmE1P93+hvS84Bpxs2Km
2320
+ -----END CERTIFICATE-----
2321
+
2322
+ CA Disig Root R1
2323
+ ================
2324
+ -----BEGIN CERTIFICATE-----
2325
+ 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
2349
+ a7+h89n07eLw4+1knj0vllJPgFOL
2350
+ -----END CERTIFICATE-----
2351
+
2352
+ CA Disig Root R2
2353
+ ================
2354
+ -----BEGIN CERTIFICATE-----
2355
+ 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
2379
+ 7+ZtsH8tZ/3zbBt1RqPlShfppNcL
2380
+ -----END CERTIFICATE-----
2381
+
2382
+ ACCVRAIZ1
2383
+ =========
2384
+ -----BEGIN CERTIFICATE-----
2385
+ MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UEAwwJQUNDVlJB
2386
+ SVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQswCQYDVQQGEwJFUzAeFw0xMTA1
2387
+ MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQBgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwH
2388
+ UEtJQUNDVjENMAsGA1UECgwEQUNDVjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4IC
2389
+ DwAwggIKAoICAQCbqau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gM
2390
+ jmoYHtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWoG2ioPej0
2391
+ RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpAlHPrzg5XPAOBOp0KoVdD
2392
+ aaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhrIA8wKFSVf+DuzgpmndFALW4ir50awQUZ
2393
+ 0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDG
2394
+ WuzndN9wrqODJerWx5eHk6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs7
2395
+ 8yM2x/474KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMOm3WR
2396
+ 5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpacXpkatcnYGMN285J
2397
+ 9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPluUsXQA+xtrn13k/c4LOsOxFwYIRK
2398
+ Q26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYIKwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRw
2399
+ Oi8vd3d3LmFjY3YuZXMvZmlsZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEu
2400
+ Y3J0MB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2
2401
+ VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeTVfZW6oHlNsyM
2402
+ Hj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIGCCsGAQUFBwICMIIBFB6CARAA
2403
+ QQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUAcgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBh
2404
+ AO0AegAgAGQAZQAgAGwAYQAgAEEAQwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUA
2405
+ YwBuAG8AbABvAGcA7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBj
2406
+ AHQAcgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAAQwBQAFMA
2407
+ IABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUAczAwBggrBgEFBQcCARYk
2408
+ aHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2MuaHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0
2409
+ dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRtaW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2
2410
+ MV9kZXIuY3JsMA4GA1UdDwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZI
2411
+ hvcNAQEFBQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdpD70E
2412
+ R9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gUJyCpZET/LtZ1qmxN
2413
+ YEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+mAM/EKXMRNt6GGT6d7hmKG9Ww7Y49
2414
+ nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepDvV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJ
2415
+ TS+xJlsndQAJxGJ3KQhfnlmstn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3
2416
+ sCPdK6jT2iWH7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h
2417
+ I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szAh1xA2syVP1Xg
2418
+ Nce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xFd3+YJ5oyXSrjhO7FmGYvliAd
2419
+ 3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2HpPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3p
2420
+ EfbRD0tVNEYqi4Y7
2421
+ -----END CERTIFICATE-----
2422
+
2423
+ TWCA Global Root CA
2424
+ ===================
2425
+ -----BEGIN CERTIFICATE-----
2426
+ MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcxEjAQBgNVBAoT
2427
+ CVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMTVFdDQSBHbG9iYWwgUm9vdCBD
2428
+ QTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQK
2429
+ EwlUQUlXQU4tQ0ExEDAOBgNVBAsTB1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3Qg
2430
+ Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2C
2431
+ nJfF10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz0ALfUPZV
2432
+ r2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfChMBwqoJimFb3u/Rk28OKR
2433
+ Q4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbHzIh1HrtsBv+baz4X7GGqcXzGHaL3SekV
2434
+ tTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1W
2435
+ KKD+u4ZqyPpcC1jcxkt2yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99
2436
+ sy2sbZCilaLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYPoA/p
2437
+ yJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQABDzfuBSO6N+pjWxn
2438
+ kjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcEqYSjMq+u7msXi7Kx/mzhkIyIqJdI
2439
+ zshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMC
2440
+ AQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6g
2441
+ cFGn90xHNcgL1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn
2442
+ LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WFH6vPNOw/KP4M
2443
+ 8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNoRI2T9GRwoD2dKAXDOXC4Ynsg
2444
+ /eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlg
2445
+ lPx4mI88k1HtQJAH32RjJMtOcQWh15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryP
2446
+ A9gK8kxkRr05YuWW6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3m
2447
+ i4TWnsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5jwa19hAM8
2448
+ EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWzaGHQRiapIVJpLesux+t3
2449
+ zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmyKwbQBM0=
2450
+ -----END CERTIFICATE-----
2451
+
2452
+ TeliaSonera Root CA v1
2453
+ ======================
2454
+ -----BEGIN CERTIFICATE-----
2455
+ MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAwNzEUMBIGA1UE
2456
+ CgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJvb3QgQ0EgdjEwHhcNMDcxMDE4
2457
+ MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYDVQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwW
2458
+ VGVsaWFTb25lcmEgUm9vdCBDQSB2MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+
2459
+ 6yfwIaPzaSZVfp3FVRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA
2460
+ 3GV17CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+XZ75Ljo1k
2461
+ B1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+/jXh7VB7qTCNGdMJjmhn
2462
+ Xb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxH
2463
+ oLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkmdtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3
2464
+ F0fUTPHSiXk+TT2YqGHeOh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJ
2465
+ oWjiUIMusDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4pgd7
2466
+ gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fsslESl1MpWtTwEhDc
2467
+ TwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQarMCpgKIv7NHfirZ1fpoeDVNAgMB
2468
+ AAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qW
2469
+ DNXr+nuqF+gTEjANBgkqhkiG9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNm
2470
+ zqjMDfz1mgbldxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx
2471
+ 0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1TjTQpgcmLNkQfW
2472
+ pb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBedY2gea+zDTYa4EzAvXUYNR0PV
2473
+ G6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpc
2474
+ c41teyWRyu5FrgZLAMzTsVlQ2jqIOylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOT
2475
+ JsjrDNYmiLbAJM+7vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2
2476
+ qReWt88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcnHL/EVlP6
2477
+ Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVxSK236thZiNSQvxaz2ems
2478
+ WWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY=
2479
+ -----END CERTIFICATE-----
2480
+
2481
+ E-Tugra Certification Authority
2482
+ ===============================
2483
+ -----BEGIN CERTIFICATE-----
2484
+ MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNVBAYTAlRSMQ8w
2485
+ DQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamls
2486
+ ZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN
2487
+ ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMw
2488
+ NTEyMDk0OFoXDTIzMDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmEx
2489
+ QDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxl
2490
+ cmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQD
2491
+ DB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
2492
+ MIICCgKCAgEA4vU/kwVRHoViVF56C/UYB4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vd
2493
+ hQd2h8y/L5VMzH2nPbxHD5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5K
2494
+ CKpbknSFQ9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEoq1+g
2495
+ ElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3Dk14opz8n8Y4e0ypQ
2496
+ BaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcHfC425lAcP9tDJMW/hkd5s3kc91r0
2497
+ E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsutdEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gz
2498
+ rt48Ue7LE3wBf4QOXVGUnhMMti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAq
2499
+ jqFGOjGY5RH8zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn
2500
+ rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUXU8u3Zg5mTPj5
2501
+ dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6Jyr+zE7S6E5UMA8GA1UdEwEB
2502
+ /wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEG
2503
+ MA0GCSqGSIb3DQEBCwUAA4ICAQAFNzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAK
2504
+ kEh47U6YA5n+KGCRHTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jO
2505
+ XKqYGwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c77NCR807
2506
+ VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3+GbHeJAAFS6LrVE1Uweo
2507
+ a2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WKvJUawSg5TB9D0pH0clmKuVb8P7Sd2nCc
2508
+ dlqMQ1DujjByTd//SffGqWfZbawCEeI6FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEV
2509
+ KV0jq9BgoRJP3vQXzTLlyb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gT
2510
+ Dx4JnW2PAJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpDy4Q0
2511
+ 8ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8dNL/+I5c30jn6PQ0G
2512
+ C7TbO6Orb1wdtn7os4I07QZcJA==
2513
+ -----END CERTIFICATE-----
2514
+
2515
+ T-TeleSec GlobalRoot Class 2
2516
+ ============================
2517
+ -----BEGIN CERTIFICATE-----
2518
+ MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM
2519
+ IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU
2520
+ cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgx
2521
+ MDAxMTA0MDE0WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz
2522
+ dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD
2523
+ ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0GCSqGSIb3
2524
+ DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUdAqSzm1nzHoqvNK38DcLZ
2525
+ SBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiCFoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/F
2526
+ vudocP05l03Sx5iRUKrERLMjfTlH6VJi1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx970
2527
+ 2cu+fjOlbpSD8DT6IavqjnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGV
2528
+ WOHAD3bZwI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGjQjBA
2529
+ MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/WSA2AHmgoCJrjNXy
2530
+ YdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhyNsZt+U2e+iKo4YFWz827n+qrkRk4
2531
+ r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPACuvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNf
2532
+ vNoBYimipidx5joifsFvHZVwIEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR
2533
+ 3p1m0IvVVGb6g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN
2534
+ 9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlPBSeOE6Fuwg==
2535
+ -----END CERTIFICATE-----
2536
+
2537
+ Atos TrustedRoot 2011
2538
+ =====================
2539
+ -----BEGIN CERTIFICATE-----
2540
+ MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UEAwwVQXRvcyBU
2541
+ cnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0xMTA3MDcxNDU4
2542
+ MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMMFUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsG
2543
+ A1UECgwEQXRvczELMAkGA1UEBhMCREUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCV
2544
+ hTuXbyo7LjvPpvMpNb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr
2545
+ 54rMVD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+SZFhyBH+
2546
+ DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ4J7sVaE3IqKHBAUsR320
2547
+ HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0Lcp2AMBYHlT8oDv3FdU9T1nSatCQujgKR
2548
+ z3bFmx5VdJx4IbHwLfELn8LVlhgf8FQieowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7R
2549
+ l+lwrrw7GWzbITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZ
2550
+ bNshMBgGA1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB
2551
+ CwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8jvZfza1zv7v1Apt+h
2552
+ k6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kPDpFrdRbhIfzYJsdHt6bPWHJxfrrh
2553
+ TZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pcmaHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a9
2554
+ 61qn8FYiqTxlVMYVqL2Gns2Dlmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G
2555
+ 3mB/ufNPRJLvKrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed
2556
+ -----END CERTIFICATE-----
2557
+
2558
+ QuoVadis Root CA 1 G3
2559
+ =====================
2560
+ -----BEGIN CERTIFICATE-----
2561
+ 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
2585
+ hMJKzRwuJIczYOXD
2586
+ -----END CERTIFICATE-----
2587
+
2588
+ QuoVadis Root CA 2 G3
2589
+ =====================
2590
+ -----BEGIN CERTIFICATE-----
2591
+ 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
2615
+ O3jtZsSOeWmD3n+M
2616
+ -----END CERTIFICATE-----
2617
+
2618
+ QuoVadis Root CA 3 G3
2619
+ =====================
2620
+ -----BEGIN CERTIFICATE-----
2621
+ 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
2645
+ PpxxVJkES/1Y+Zj0
2646
+ -----END CERTIFICATE-----
2647
+
2648
+ DigiCert Assured ID Root G2
2649
+ ===========================
2650
+ -----BEGIN CERTIFICATE-----
2651
+ MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBlMQswCQYDVQQG
2652
+ EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw
2653
+ IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgw
2654
+ MTE1MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL
2655
+ ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIw
2656
+ ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSAn61UQbVH
2657
+ 35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4HteccbiJVMWWXvdMX0h5i89vq
2658
+ bFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9HpEgjAALAcKxHad3A2m67OeYfcgnDmCXRw
2659
+ VWmvo2ifv922ebPynXApVfSr/5Vh88lAbx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OP
2660
+ YLfykqGxvYmJHzDNw6YuYjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+Rn
2661
+ lTGNAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTO
2662
+ w0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPIQW5pJ6d1Ee88hjZv
2663
+ 0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I0jJmwYrA8y8678Dj1JGG0VDjA9tz
2664
+ d29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4GnilmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAW
2665
+ hsI6yLETcDbYz+70CjTVW0z9B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0M
2666
+ jomZmWzwPDCvON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo
2667
+ IhNzbM8m9Yop5w==
2668
+ -----END CERTIFICATE-----
2669
+
2670
+ DigiCert Assured ID Root G3
2671
+ ===========================
2672
+ -----BEGIN CERTIFICATE-----
2673
+ MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV
2674
+ UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYD
2675
+ VQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1
2676
+ MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
2677
+ d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQ
2678
+ BgcqhkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJfZn4f5dwb
2679
+ RXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17QRSAPWXYQ1qAk8C3eNvJs
2680
+ KTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgF
2681
+ UaFNN6KDec6NHSrkhDAKBggqhkjOPQQDAwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5Fy
2682
+ YZ5eEJJZVrmDxxDnOOlYJjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy
2683
+ 1vUhZscv6pZjamVFkpUBtA==
2684
+ -----END CERTIFICATE-----
2685
+
2686
+ DigiCert Global Root G2
2687
+ =======================
2688
+ -----BEGIN CERTIFICATE-----
2689
+ MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQG
2690
+ EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw
2691
+ HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUx
2692
+ MjAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3
2693
+ dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkq
2694
+ hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI2/Ou8jqJ
2695
+ kTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx1x7e/dfgy5SDN67sH0NO
2696
+ 3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQq2EGnI/yuum06ZIya7XzV+hdG82MHauV
2697
+ BJVJ8zUtluNJbd134/tJS7SsVQepj5WztCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyM
2698
+ UNGPHgm+F6HmIcr9g+UQvIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQAB
2699
+ o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV5uNu
2700
+ 5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY1Yl9PMWLSn/pvtsr
2701
+ F9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4NeF22d+mQrvHRAiGfzZ0JFrabA0U
2702
+ WTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NGFdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBH
2703
+ QRFXGU7Aj64GxJUTFy8bJZ918rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/
2704
+ iyK5S9kJRaTepLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl
2705
+ MrY=
2706
+ -----END CERTIFICATE-----
2707
+
2708
+ DigiCert Global Root G3
2709
+ =======================
2710
+ -----BEGIN CERTIFICATE-----
2711
+ MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQswCQYDVQQGEwJV
2712
+ UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAwHgYD
2713
+ VQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAw
2714
+ MDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5k
2715
+ aWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0C
2716
+ AQYFK4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FGfp4tn+6O
2717
+ YwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPOZ9wj/wMco+I+o0IwQDAP
2718
+ BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNp
2719
+ Yim8S8YwCgYIKoZIzj0EAwMDaAAwZQIxAK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y
2720
+ 3maTD/HMsQmP3Wyr+mt/oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34
2721
+ VOKa5Vt8sycX
2722
+ -----END CERTIFICATE-----
2723
+
2724
+ DigiCert Trusted Root G4
2725
+ ========================
2726
+ -----BEGIN CERTIFICATE-----
2727
+ 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
2752
+ 82Z+
2753
+ -----END CERTIFICATE-----
2754
+
2755
+ WoSign
2756
+ ======
2757
+ -----BEGIN CERTIFICATE-----
2758
+ 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
2783
+ -----END CERTIFICATE-----
2784
+
2785
+ WoSign China
2786
+ ============
2787
+ -----BEGIN CERTIFICATE-----
2788
+ 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
2812
+ kI26oQ==
2813
+ -----END CERTIFICATE-----
2814
+
2815
+ COMODO RSA Certification Authority
2816
+ ==================================
2817
+ -----BEGIN CERTIFICATE-----
2818
+ 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
2844
+ LaZRfyHBNVOFBkpdn627G190
2845
+ -----END CERTIFICATE-----
2846
+
2847
+ USERTrust RSA Certification Authority
2848
+ =====================================
2849
+ -----BEGIN CERTIFICATE-----
2850
+ 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
2876
+ Q+6IHdfGjjxDah2nGN59PRbxYvnKkKj9
2877
+ -----END CERTIFICATE-----
2878
+
2879
+ USERTrust ECC Certification Authority
2880
+ =====================================
2881
+ -----BEGIN CERTIFICATE-----
2882
+ MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDELMAkGA1UEBhMC
2883
+ VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU
2884
+ aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv
2885
+ biBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMC
2886
+ VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU
2887
+ aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv
2888
+ biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqfloI+d61SRvU8Za2EurxtW2
2889
+ 0eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinngo4N+LZfQYcTxmdwlkWOrfzCjtHDix6Ez
2890
+ nPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0GA1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNV
2891
+ HQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBB
2892
+ HU6+4WMBzzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbWRNZu
2893
+ 9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg=
2894
+ -----END CERTIFICATE-----
2895
+
2896
+ GlobalSign ECC Root CA - R4
2897
+ ===========================
2898
+ -----BEGIN CERTIFICATE-----
2899
+ MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEkMCIGA1UECxMb
2900
+ R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD
2901
+ EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb
2902
+ R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD
2903
+ EwpHbG9iYWxTaWduMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprl
2904
+ OQcJFspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAwDgYDVR0P
2905
+ AQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61FuOJAf/sKbvu+M8k8o4TV
2906
+ MAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGXkPoUVy0D7O48027KqGx2vKLeuwIgJ6iF
2907
+ JzWbVsaj8kfSt24bAgAXqmemFZHe+pTsewv4n4Q=
2908
+ -----END CERTIFICATE-----
2909
+
2910
+ GlobalSign ECC Root CA - R5
2911
+ ===========================
2912
+ -----BEGIN CERTIFICATE-----
2913
+ MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEkMCIGA1UECxMb
2914
+ R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD
2915
+ EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb
2916
+ R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD
2917
+ EwpHbG9iYWxTaWduMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6
2918
+ SFkc8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8kehOvRnkmS
2919
+ h5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd
2920
+ BgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYIKoZIzj0EAwMDaAAwZQIxAOVpEslu28Yx
2921
+ uglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7
2922
+ yFz9SO8NdCKoCOJuxUnOxwy8p2Fp8fc74SrL+SvzZpA3
2923
+ -----END CERTIFICATE-----
2924
+
2925
+ Staat der Nederlanden Root CA - G3
2926
+ ==================================
2927
+ -----BEGIN CERTIFICATE-----
2928
+ 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
2953
+ -----END CERTIFICATE-----
2954
+
2955
+ Staat der Nederlanden EV Root CA
2956
+ ================================
2957
+ -----BEGIN CERTIFICATE-----
2958
+ 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
2982
+ eUN51q1veieQA6TqJIc/2b3Z6fJfUEkc7uzXLg==
2983
+ -----END CERTIFICATE-----
2984
+
2985
+ IdenTrust Commercial Root CA 1
2986
+ ==============================
2987
+ -----BEGIN CERTIFICATE-----
2988
+ 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
3012
+ cGzM7vRX+Bi6hG6H
3013
+ -----END CERTIFICATE-----
3014
+
3015
+ IdenTrust Public Sector Root CA 1
3016
+ =================================
3017
+ -----BEGIN CERTIFICATE-----
3018
+ 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
3042
+ 3Wl9af0AVqW3rLatt8o+Ae+c
3043
+ -----END CERTIFICATE-----
3044
+
3045
+ Entrust Root Certification Authority - G2
3046
+ =========================================
3047
+ -----BEGIN CERTIFICATE-----
3048
+ MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMCVVMxFjAUBgNV
3049
+ BAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVy
3050
+ bXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ug
3051
+ b25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIw
3052
+ HhcNMDkwNzA3MTcyNTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoT
3053
+ DUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMx
3054
+ OTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25s
3055
+ eTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwggEi
3056
+ MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP
3057
+ /vaCeb9zYQYKpSfYs1/TRU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXz
3058
+ HHfV1IWNcCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hWwcKU
3059
+ s/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1U1+cPvQXLOZprE4y
3060
+ TGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0jaWvYkxN4FisZDQSA/i2jZRjJKRx
3061
+ AgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ6
3062
+ 0B7vfec7aVHUbI2fkBJmqzANBgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5Z
3063
+ iXMRrEPR9RP/jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ
3064
+ Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v1fN2D807iDgi
3065
+ nWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4RnAuknZoh8/CbCzB428Hch0P+
3066
+ vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmHVHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xO
3067
+ e4pIb4tF9g==
3068
+ -----END CERTIFICATE-----
3069
+
3070
+ Entrust Root Certification Authority - EC1
3071
+ ==========================================
3072
+ -----BEGIN CERTIFICATE-----
3073
+ MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkGA1UEBhMCVVMx
3074
+ FjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVn
3075
+ YWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXpl
3076
+ ZCB1c2Ugb25seTEzMDEGA1UEAxMqRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5
3077
+ IC0gRUMxMB4XDTEyMTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYw
3078
+ FAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2Fs
3079
+ LXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQg
3080
+ dXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt
3081
+ IEVDMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHy
3082
+ AsWfoPZb1YsGGYZPUxBtByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef
3083
+ 9eNi1KlHBz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE
3084
+ FLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVCR98crlOZF7ZvHH3h
3085
+ vxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nXhTcGtXsI/esni0qU+eH6p44mCOh8
3086
+ kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G
3087
+ -----END CERTIFICATE-----
3088
+
3089
+ CFCA EV ROOT
3090
+ ============
3091
+ -----BEGIN CERTIFICATE-----
3092
+ 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
3117
+ -----END CERTIFICATE-----
3118
+
3119
+ TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı H5
3120
+ ====================================================
3121
+ -----BEGIN CERTIFICATE-----
3122
+ MIIEJzCCAw+gAwIBAgIHAI4X/iQggTANBgkqhkiG9w0BAQsFADCBsTELMAkGA1UEBhMCVFIxDzAN
3123
+ BgNVBAcMBkFua2FyYTFNMEsGA1UECgxEVMOcUktUUlVTVCBCaWxnaSDEsGxldGnFn2ltIHZlIEJp
3124
+ bGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7Fni4xQjBABgNVBAMMOVTDnFJLVFJVU1Qg
3125
+ RWxla3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSBINTAeFw0xMzA0MzAw
3126
+ ODA3MDFaFw0yMzA0MjgwODA3MDFaMIGxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMU0w
3127
+ SwYDVQQKDERUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnE
3128
+ n2kgSGl6bWV0bGVyaSBBLsWeLjFCMEAGA1UEAww5VMOcUktUUlVTVCBFbGVrdHJvbmlrIFNlcnRp
3129
+ ZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIEg1MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
3130
+ CgKCAQEApCUZ4WWe60ghUEoI5RHwWrom/4NZzkQqL/7hzmAD/I0Dpe3/a6i6zDQGn1k19uwsu537
3131
+ jVJp45wnEFPzpALFp/kRGml1bsMdi9GYjZOHp3GXDSHHmflS0yxjXVW86B8BSLlg/kJK9siArs1m
3132
+ ep5Fimh34khon6La8eHBEJ/rPCmBp+EyCNSgBbGM+42WAA4+Jd9ThiI7/PS98wl+d+yG6w8z5UNP
3133
+ 9FR1bSmZLmZaQ9/LXMrI5Tjxfjs1nQ/0xVqhzPMggCTTV+wVunUlm+hkS7M0hO8EuPbJbKoCPrZV
3134
+ 4jI3X/xml1/N1p7HIL9Nxqw/dV8c7TKcfGkAaZHjIxhT6QIDAQABo0IwQDAdBgNVHQ4EFgQUVpkH
3135
+ HtOsDGlktAxQR95DLL4gwPswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZI
3136
+ hvcNAQELBQADggEBAJ5FdnsXSDLyOIspve6WSk6BGLFRRyDN0GSxDsnZAdkJzsiZ3GglE9Rc8qPo
3137
+ BP5yCccLqh0lVX6Wmle3usURehnmp349hQ71+S4pL+f5bFgWV1Al9j4uPqrtd3GqqpmWRgqujuwq
3138
+ URawXs3qZwQcWDD1YIq9pr1N5Za0/EKJAWv2cMhQOQwt1WbZyNKzMrcbGW3LM/nfpeYVhDfwwvJl
3139
+ lpKQd/Ct9JDpEXjXk4nAPQu6KfTomZ1yju2dL+6SfaHx/126M2CFYv4HAqGEVka+lgqaE9chTLd8
3140
+ B59OTj+RdPsnnRHM3eaxynFNExc5JsUpISuTKWqW+qtB4Uu2NQvAmxU=
3141
+ -----END CERTIFICATE-----
3142
+
3143
+ Certinomis - Root CA
3144
+ ====================
3145
+ -----BEGIN CERTIFICATE-----
3146
+ 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
3171
+ hkIGuUE=
3172
+ -----END CERTIFICATE-----
3173
+
3174
+ OISTE WISeKey Global Root GB CA
3175
+ ===============================
3176
+ -----BEGIN CERTIFICATE-----
3177
+ MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBtMQswCQYDVQQG
3178
+ EwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl
3179
+ ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAw
3180
+ MzJaFw0zOTEyMDExNTEwMzFaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYD
3181
+ VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEds
3182
+ b2JhbCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3HEokKtaX
3183
+ scriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGxWuR51jIjK+FTzJlFXHtP
3184
+ rby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk
3185
+ 9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNku7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4o
3186
+ Qnc/nSMbsrY9gBQHTC5P99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvg
3187
+ GUpuuy9rM2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB
3188
+ /zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZI
3189
+ hvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrghcViXfa43FK8+5/ea4n32cZiZBKpD
3190
+ dHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0
3191
+ VQreUGdNZtGn//3ZwLWoo4rOZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEui
3192
+ HZeeevJuQHHfaPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic
3193
+ Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM=
3194
+ -----END CERTIFICATE-----
3195
+
3196
+ Certification Authority of WoSign G2
3197
+ ====================================
3198
+ -----BEGIN CERTIFICATE-----
3199
+ MIIDfDCCAmSgAwIBAgIQayXaioidfLwPBbOxemFFRDANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQG
3200
+ EwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxLTArBgNVBAMTJENlcnRpZmljYXRpb24g
3201
+ QXV0aG9yaXR5IG9mIFdvU2lnbiBHMjAeFw0xNDExMDgwMDU4NThaFw00NDExMDgwMDU4NThaMFgx
3202
+ CzAJBgNVBAYTAkNOMRowGAYDVQQKExFXb1NpZ24gQ0EgTGltaXRlZDEtMCsGA1UEAxMkQ2VydGlm
3203
+ aWNhdGlvbiBBdXRob3JpdHkgb2YgV29TaWduIEcyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
3204
+ CgKCAQEAvsXEoCKASU+/2YcRxlPhuw+9YH+v9oIOH9ywjj2X4FA8jzrvZjtFB5sg+OPXJYY1kBai
3205
+ XW8wGQiHC38Gsp1ij96vkqVg1CuAmlI/9ZqD6TRay9nVYlzmDuDfBpgOgHzKtB0TiGsOqCR3A9Du
3206
+ W/PKaZE1OVbFbeP3PU9ekzgkyhjpJMuSA93MHD0JcOQg5PGurLtzaaNjOg9FD6FKmsLRY6zLEPg9
3207
+ 5k4ot+vElbGs/V6r+kHLXZ1L3PR8du9nfwB6jdKgGlxNIuG12t12s9R23164i5jIFFTMaxeSt+BK
3208
+ v0mUYQs4kI9dJGwlezt52eJ+na2fmKEG/HgUYFf47oB3sQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMC
3209
+ AQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU+mCp62XF3RYUCE4MD42b4Pdkr2cwDQYJKoZI
3210
+ hvcNAQELBQADggEBAFfDejaCnI2Y4qtAqkePx6db7XznPWZaOzG73/MWM5H8fHulwqZm46qwtyeY
3211
+ P0nXYGdnPzZPSsvxFPpahygc7Y9BMsaV+X3avXtbwrAh449G3CE4Q3RM+zD4F3LBMvzIkRfEzFg3
3212
+ TgvMWvchNSiDbGAtROtSjFA9tWwS1/oJu2yySrHFieT801LYYRf+epSEj3m2M1m6D8QL4nCgS3gu
3213
+ +sif/a+RZQp4OBXllxcU3fngLDT4ONCEIgDAFFEYKwLcMFrw6AF8NTojrwjkr6qOKEJJLvD1mTS+
3214
+ 7Q9LGOHSJDy7XUe3IfKN0QqZjuNuPq1w4I+5ysxugTH2e5x6eeRncRg=
3215
+ -----END CERTIFICATE-----
3216
+
3217
+ CA WoSign ECC Root
3218
+ ==================
3219
+ -----BEGIN CERTIFICATE-----
3220
+ MIICCTCCAY+gAwIBAgIQaEpYcIBr8I8C+vbe6LCQkDAKBggqhkjOPQQDAzBGMQswCQYDVQQGEwJD
3221
+ TjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxGzAZBgNVBAMTEkNBIFdvU2lnbiBFQ0MgUm9v
3222
+ dDAeFw0xNDExMDgwMDU4NThaFw00NDExMDgwMDU4NThaMEYxCzAJBgNVBAYTAkNOMRowGAYDVQQK
3223
+ ExFXb1NpZ24gQ0EgTGltaXRlZDEbMBkGA1UEAxMSQ0EgV29TaWduIEVDQyBSb290MHYwEAYHKoZI
3224
+ zj0CAQYFK4EEACIDYgAE4f2OuEMkq5Z7hcK6C62N4DrjJLnSsb6IOsq/Srj57ywvr1FQPEd1bPiU
3225
+ t5v8KB7FVMxjnRZLU8HnIKvNrCXSf4/CwVqCXjCLelTOA7WRf6qU0NGKSMyCBSah1VES1ns2o0Iw
3226
+ QDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUqv3VWqP2h4syhf3R
3227
+ MluARZPzA7gwCgYIKoZIzj0EAwMDaAAwZQIxAOSkhLCB1T2wdKyUpOgOPQB0TKGXa/kNUTyh2Tv0
3228
+ Daupn75OcsqF1NnstTJFGG+rrQIwfcf3aWMvoeGY7xMQ0Xk/0f7qO3/eVvSQsRUR2LIiFdAvwyYu
3229
+ a/GRspBl9JrmkO5K
3230
+ -----END CERTIFICATE-----
3231
+
3232
+ SZAFIR ROOT CA2
3233
+ ===============
3234
+ -----BEGIN CERTIFICATE-----
3235
+ MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQELBQAwUTELMAkG
3236
+ A1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6ZW5pb3dhIFMuQS4xGDAWBgNV
3237
+ BAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkwNzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJ
3238
+ BgNVBAYTAlBMMSgwJgYDVQQKDB9LcmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYD
3239
+ VQQDDA9TWkFGSVIgUk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5Q
3240
+ qEvNQLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT3PSQ1hNK
3241
+ DJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw3gAeqDRHu5rr/gsUvTaE
3242
+ 2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr63fE9biCloBK0TXC5ztdyO4mTp4CEHCdJ
3243
+ ckm1/zuVnsHMyAHs6A6KCpbns6aH5db5BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwi
3244
+ ieDhZNRnvDF5YTy7ykHNXGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P
3245
+ AQH/BAQDAgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsFAAOC
3246
+ AQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw8PRBEew/R40/cof5
3247
+ O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOGnXkZ7/e7DDWQw4rtTw/1zBLZpD67
3248
+ oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCPoky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul
3249
+ 4+vJhaAlIDf7js4MNIThPIGyd05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6
3250
+ +/NNIxuZMzSgLvWpCz/UXeHPhJ/iGcJfitYgHuNztw==
3251
+ -----END CERTIFICATE-----
3252
+
3253
+ Certum Trusted Network CA 2
3254
+ ===========================
3255
+ -----BEGIN CERTIFICATE-----
3256
+ MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCBgDELMAkGA1UE
3257
+ BhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMuQS4xJzAlBgNVBAsTHkNlcnR1
3258
+ bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIGA1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29y
3259
+ ayBDQSAyMCIYDzIwMTExMDA2MDgzOTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQ
3260
+ TDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENl
3261
+ cnRpZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENB
3262
+ IDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWADGSdhhuWZGc/IjoedQF9
3263
+ 7/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+o
3264
+ CgCXhVqqndwpyeI1B+twTUrWwbNWuKFBOJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40b
3265
+ Rr5HMNUuctHFY9rnY3lEfktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2p
3266
+ uTRZCr+ESv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1mo130
3267
+ GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02isx7QBlrd9pPPV3WZ
3268
+ 9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOWOZV7bIBaTxNyxtd9KXpEulKkKtVB
3269
+ Rgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgezTv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pye
3270
+ hizKV/Ma5ciSixqClnrDvFASadgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vM
3271
+ BhBgu4M1t15n3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
3272
+ AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZI
3273
+ hvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQF/xlhMcQSZDe28cmk4gmb3DW
3274
+ Al45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTfCVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuA
3275
+ L55MYIR4PSFk1vtBHxgP58l1cb29XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMo
3276
+ clm2q8KMZiYcdywmdjWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tM
3277
+ pkT/WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jbAoJnwTnb
3278
+ w3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksqP/ujmv5zMnHCnsZy4Ypo
3279
+ J/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Kob7a6bINDd82Kkhehnlt4Fj1F4jNy3eFm
3280
+ ypnTycUm/Q1oBEauttmbjL4ZvrHG8hnjXALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLX
3281
+ is7VmFxWlgPF7ncGNf/P5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7
3282
+ zAYspsbiDrW5viSP
3283
+ -----END CERTIFICATE-----
3284
+
3285
+ Hellenic Academic and Research Institutions RootCA 2015
3286
+ =======================================================
3287
+ -----BEGIN CERTIFICATE-----
3288
+ MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcT
3289
+ BkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0
3290
+ aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNl
3291
+ YXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAx
3292
+ MTIxWjCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMg
3293
+ QWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNV
3294
+ BAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIw
3295
+ MTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDC+Kk/G4n8PDwEXT2QNrCROnk8Zlrv
3296
+ bTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+eh
3297
+ iGsxr/CL0BgzuNtFajT0AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+
3298
+ 6PAQZe104S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06CojXd
3299
+ FPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV9Cz82XBST3i4vTwr
3300
+ i5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrDgfgXy5I2XdGj2HUb4Ysn6npIQf1F
3301
+ GQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2
3302
+ fu/Z8VFRfS0myGlZYeCsargqNhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9mu
3303
+ iNX6hME6wGkoLfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc
3304
+ Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
3305
+ AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVdctA4GGqd83EkVAswDQYJKoZI
3306
+ hvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0IXtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+
3307
+ D1hYc2Ryx+hFjtyp8iY/xnmMsVMIM4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrM
3308
+ d/K4kPFox/la/vot9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+y
3309
+ d+2VZ5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/eaj8GsGsVn
3310
+ 82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnhX9izjFk0WaSrT2y7Hxjb
3311
+ davYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQl033DlZdwJVqwjbDG2jJ9SrcR5q+ss7F
3312
+ Jej6A7na+RZukYT1HCjI/CbM1xyQVqdfbzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVt
3313
+ J94Cj8rDtSvK6evIIVM4pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGa
3314
+ JI7ZjnHKe7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0vm9q
3315
+ p/UsQu0yrbYhnr68
3316
+ -----END CERTIFICATE-----
3317
+
3318
+ Hellenic Academic and Research Institutions ECC RootCA 2015
3319
+ ===========================================================
3320
+ -----BEGIN CERTIFICATE-----
3321
+ MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0
3322
+ aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9u
3323
+ cyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJj
3324
+ aCBJbnN0aXR1dGlvbnMgRUNDIFJvb3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEw
3325
+ MzcxMlowgaoxCzAJBgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmlj
3326
+ IEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUQwQgYD
3327
+ VQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIEVDQyBSb290
3328
+ Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKgQehLgoRc4vgxEZmGZE4JJS+dQS8KrjVP
3329
+ dJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJajq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoK
3330
+ Vlp8aQuqgAkkbH7BRqNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O
3331
+ BBYEFLQiC4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaeplSTA
3332
+ GiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7SofTUwJCA3sS61kFyjn
3333
+ dc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR
3334
+ -----END CERTIFICATE-----
3335
+
3336
+ Certplus Root CA G1
3337
+ ===================
3338
+ -----BEGIN CERTIFICATE-----
3339
+ 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
3363
+ qsOR0C5CB8AMTVPNJLFMWx5R9N/pkvo=
3364
+ -----END CERTIFICATE-----
3365
+
3366
+ Certplus Root CA G2
3367
+ ===================
3368
+ -----BEGIN CERTIFICATE-----
3369
+ MIICHDCCAaKgAwIBAgISESDZkc6uo+jF5//pAq/Pc7xVMAoGCCqGSM49BAMDMD4xCzAJBgNVBAYT
3370
+ AkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBsdXMgUm9vdCBDQSBHMjAeFw0x
3371
+ NDA1MjYwMDAwMDBaFw0zODAxMTUwMDAwMDBaMD4xCzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0
3372
+ cGx1czEcMBoGA1UEAwwTQ2VydHBsdXMgUm9vdCBDQSBHMjB2MBAGByqGSM49AgEGBSuBBAAiA2IA
3373
+ BM0PW1aC3/BFGtat93nwHcmsltaeTpwftEIRyoa/bfuFo8XlGVzX7qY/aWfYeOKmycTbLXku54uN
3374
+ Am8xIk0G42ByRZ0OQneezs/lf4WbGOT8zC5y0xaTTsqZY1yhBSpsBqNjMGEwDgYDVR0PAQH/BAQD
3375
+ AgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNqDYwJ5jtpMxjwjFNiPwyCrKGBZMB8GA1Ud
3376
+ IwQYMBaAFNqDYwJ5jtpMxjwjFNiPwyCrKGBZMAoGCCqGSM49BAMDA2gAMGUCMHD+sAvZ94OX7PNV
3377
+ HdTcswYO/jOYnYs5kGuUIe22113WTNchp+e/IQ8rzfcq3IUHnQIxAIYUFuXcsGXCwI4Un78kFmjl
3378
+ vPl5adytRSv3tjFzzAalU5ORGpOucGpnutee5WEaXw==
3379
+ -----END CERTIFICATE-----
3380
+
3381
+ OpenTrust Root CA G1
3382
+ ====================
3383
+ -----BEGIN CERTIFICATE-----
3384
+ MIIFbzCCA1egAwIBAgISESCzkFU5fX82bWTCp59rY45nMA0GCSqGSIb3DQEBCwUAMEAxCzAJBgNV
3385
+ BAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9wZW5UcnVzdCBSb290IENBIEcx
3386
+ MB4XDTE0MDUyNjA4NDU1MFoXDTM4MDExNTAwMDAwMFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoM
3387
+ CU9wZW5UcnVzdDEdMBsGA1UEAwwUT3BlblRydXN0IFJvb3QgQ0EgRzEwggIiMA0GCSqGSIb3DQEB
3388
+ AQUAA4ICDwAwggIKAoICAQD4eUbalsUwXopxAy1wpLuwxQjczeY1wICkES3d5oeuXT2R0odsN7fa
3389
+ Yp6bwiTXj/HbpqbfRm9RpnHLPhsxZ2L3EVs0J9V5ToybWL0iEA1cJwzdMOWo010hOHQX/uMftk87
3390
+ ay3bfWAfjH1MBcLrARYVmBSO0ZB3Ij/swjm4eTrwSSTilZHcYTSSjFR077F9jAHiOH3BX2pfJLKO
3391
+ YheteSCtqx234LSWSE9mQxAGFiQD4eCcjsZGT44ameGPuY4zbGneWK2gDqdkVBFpRGZPTBKnjix9
3392
+ xNRbxQA0MMHZmf4yzgeEtE7NCv82TWLxp2NX5Ntqp66/K7nJ5rInieV+mhxNaMbBGN4zK1FGSxyO
3393
+ 9z0M+Yo0FMT7MzUj8czxKselu7Cizv5Ta01BG2Yospb6p64KTrk5M0ScdMGTHPjgniQlQ/GbI4Kq
3394
+ 3ywgsNw2TgOzfALU5nsaqocTvz6hdLubDuHAk5/XpGbKuxs74zD0M1mKB3IDVedzagMxbm+WG+Oi
3395
+ n6+Sx+31QrclTDsTBM8clq8cIqPQqwWyTBIjUtz9GVsnnB47ev1CI9sjgBPwvFEVVJSmdz7QdFG9
3396
+ URQIOTfLHzSpMJ1ShC5VkLG631UAC9hWLbFJSXKAqWLXwPYYEQRVzXR7z2FwefR7LFxckvzluFqr
3397
+ TJOVoSfupb7PcSNCupt2LQIDAQABo2MwYTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
3398
+ /zAdBgNVHQ4EFgQUl0YhVyE12jZVx/PxN3DlCPaTKbYwHwYDVR0jBBgwFoAUl0YhVyE12jZVx/Px
3399
+ N3DlCPaTKbYwDQYJKoZIhvcNAQELBQADggIBAB3dAmB84DWn5ph76kTOZ0BP8pNuZtQ5iSas000E
3400
+ PLuHIT839HEl2ku6q5aCgZG27dmxpGWX4m9kWaSW7mDKHyP7Rbr/jyTwyqkxf3kfgLMtMrpkZ2Cv
3401
+ uVnN35pJ06iCsfmYlIrM4LvgBBuZYLFGZdwIorJGnkSI6pN+VxbSFXJfLkur1J1juONI5f6ELlgK
3402
+ n0Md/rcYkoZDSw6cMoYsYPXpSOqV7XAp8dUv/TW0V8/bhUiZucJvbI/NeJWsZCj9VrDDb8O+WVLh
3403
+ X4SPgPL0DTatdrOjteFkdjpY3H1PXlZs5VVZV6Xf8YpmMIzUUmI4d7S+KNfKNsSbBfD4Fdvb8e80
3404
+ nR14SohWZ25g/4/Ii+GOvUKpMwpZQhISKvqxnUOOBZuZ2mKtVzazHbYNeS2WuOvyDEsMpZTGMKcm
3405
+ GS3tTAZQMPH9WD25SxdfGbRqhFS0OE85og2WaMMolP3tLR9Ka0OWLpABEPs4poEL0L9109S5zvE/
3406
+ bw4cHjdx5RiHdRk/ULlepEU0rbDK5uUTdg8xFKmOLZTW1YVNcxVPS/KyPu1svf0OnWZzsD2097+o
3407
+ 4BGkxK51CUpjAEggpsadCwmKtODmzj7HPiY46SvepghJAwSQiumPv+i2tCqjI40cHLI5kqiPAlxA
3408
+ OXXUc0ECd97N4EOH1uS6SsNsEn/+KuYj1oxx
3409
+ -----END CERTIFICATE-----
3410
+
3411
+ OpenTrust Root CA G2
3412
+ ====================
3413
+ -----BEGIN CERTIFICATE-----
3414
+ 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
3438
+ u7JwqkwR3v98KzfUetF3NI/n+UL3PIEMS1IK
3439
+ -----END CERTIFICATE-----
3440
+
3441
+ OpenTrust Root CA G3
3442
+ ====================
3443
+ -----BEGIN CERTIFICATE-----
3444
+ MIICITCCAaagAwIBAgISESDm+Ez8JLC+BUCs2oMbNGA/MAoGCCqGSM49BAMDMEAxCzAJBgNVBAYT
3445
+ AkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9wZW5UcnVzdCBSb290IENBIEczMB4X
3446
+ DTE0MDUyNjAwMDAwMFoXDTM4MDExNTAwMDAwMFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9w
3447
+ ZW5UcnVzdDEdMBsGA1UEAwwUT3BlblRydXN0IFJvb3QgQ0EgRzMwdjAQBgcqhkjOPQIBBgUrgQQA
3448
+ IgNiAARK7liuTcpm3gY6oxH84Bjwbhy6LTAMidnW7ptzg6kjFYwvWYpa3RTqnVkrQ7cG7DK2uu5B
3449
+ ta1doYXM6h0UZqNnfkbilPPntlahFVmhTzeXuSIevRHr9LIfXsMUmuXZl5mjYzBhMA4GA1UdDwEB
3450
+ /wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRHd8MUi2I5DMlv4VBN0BBY3JWIbTAf
3451
+ BgNVHSMEGDAWgBRHd8MUi2I5DMlv4VBN0BBY3JWIbTAKBggqhkjOPQQDAwNpADBmAjEAj6jcnboM
3452
+ BBf6Fek9LykBl7+BFjNAk2z8+e2AcG+qj9uEwov1NcoG3GRvaBbhj5G5AjEA2Euly8LQCGzpGPta
3453
+ 3U1fJAuwACEl74+nBCZx4nxp5V2a+EEfOzmTk51V6s2N8fvB
3454
+ -----END CERTIFICATE-----
3455
+
3456
+ ISRG Root X1
3457
+ ============
3458
+ -----BEGIN CERTIFICATE-----
3459
+ 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
3483
+ m+kXQ99b21/+jh5Xos1AnX5iItreGCc=
3484
+ -----END CERTIFICATE-----
3485
+
3486
+ AC RAIZ FNMT-RCM
3487
+ ================
3488
+ -----BEGIN CERTIFICATE-----
3489
+ MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsxCzAJBgNVBAYT
3490
+ AkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTAeFw0wODEw
3491
+ MjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJD
3492
+ TTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC
3493
+ ggIBALpxgHpMhm5/yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcf
3494
+ qQgfBBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAzWHFctPVr
3495
+ btQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxFtBDXaEAUwED653cXeuYL
3496
+ j2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z374jNUUeAlz+taibmSXaXvMiwzn15Cou
3497
+ 08YfxGyqxRxqAQVKL9LFwag0Jl1mpdICIfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mw
3498
+ WsXmo8RZZUc1g16p6DULmbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnT
3499
+ tOmlcYF7wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peSMKGJ
3500
+ 47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2ZSysV4999AeU14EC
3501
+ ll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMetUqIJ5G+GR4of6ygnXYMgrwTJbFaa
3502
+ i0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE
3503
+ FPd9xf3E6Jobd2Sn9R2gzL+HYJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1o
3504
+ dHRwOi8vd3d3LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD
3505
+ nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1RXxlDPiyN8+s
3506
+ D8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYMLVN0V2Ue1bLdI4E7pWYjJ2cJ
3507
+ j+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrT
3508
+ Qfv6MooqtyuGC2mDOL7Nii4LcK2NJpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW
3509
+ +YJF1DngoABd15jmfZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7
3510
+ Ixjp6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp1txyM/1d
3511
+ 8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B9kiABdcPUXmsEKvU7ANm
3512
+ 5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wokRqEIr9baRRmW1FMdW4R58MD3R++Lj8UG
3513
+ rp1MYp3/RgT408m2ECVAdf4WqslKYIYvuu8wd+RU4riEmViAqhOLUTpPSPaLtrM=
3514
+ -----END CERTIFICATE-----
3515
+
3516
+ Amazon Root CA 1
3517
+ ================
3518
+ -----BEGIN CERTIFICATE-----
3519
+ MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsFADA5MQswCQYD
3520
+ VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAxMB4XDTE1
3521
+ MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv
3522
+ bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
3523
+ ggEBALJ4gHHKeNXjca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgH
3524
+ FzZM9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qwIFAGbHrQ
3525
+ gLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6VOujw5H5SNz/0egwLX0t
3526
+ dHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L93FcXmn/6pUCyziKrlA4b9v7LWIbxcce
3527
+ VOF34GfID5yHI9Y/QCB/IIDEgEw+OyQmjgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB
3528
+ /zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3
3529
+ DQEBCwUAA4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDIU5PM
3530
+ CCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUsN+gDS63pYaACbvXy
3531
+ 8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vvo/ufQJVtMVT8QtPHRh8jrdkPSHCa
3532
+ 2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2
3533
+ xJNDd2ZhwLnoQdeXeGADbkpyrqXRfboQnoZsG4q5WTP468SQvvG5
3534
+ -----END CERTIFICATE-----
3535
+
3536
+ Amazon Root CA 2
3537
+ ================
3538
+ -----BEGIN CERTIFICATE-----
3539
+ MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwFADA5MQswCQYD
3540
+ VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAyMB4XDTE1
3541
+ MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv
3542
+ bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC
3543
+ ggIBAK2Wny2cSkxKgXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4
3544
+ kHbZW0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg1dKmSYXp
3545
+ N+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K8nu+NQWpEjTj82R0Yiw9
3546
+ AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvd
3547
+ fLC6HM783k81ds8P+HgfajZRRidhW+mez/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAEx
3548
+ kv8LV/SasrlX6avvDXbR8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSS
3549
+ btqDT6ZjmUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz7Mt0
3550
+ Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6+XUyo05f7O0oYtlN
3551
+ c/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI0u1ufm8/0i2BWSlmy5A5lREedCf+
3552
+ 3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSw
3553
+ DPBMMPQFWAJI/TPlUq9LhONmUjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oA
3554
+ A7CXDpO8Wqj2LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY
3555
+ +gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kSk5Nrp+gvU5LE
3556
+ YFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl7uxMMne0nxrpS10gxdr9HIcW
3557
+ xkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygmbtmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQ
3558
+ gj9sAq+uEjonljYE1x2igGOpm/HlurR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbW
3559
+ aQbLU8uz/mtBzUF+fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoV
3560
+ Yh63n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE76KlXIx3
3561
+ KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H9jVlpNMKVv/1F2Rs76gi
3562
+ JUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT4PsJYGw=
3563
+ -----END CERTIFICATE-----
3564
+
3565
+ Amazon Root CA 3
3566
+ ================
3567
+ -----BEGIN CERTIFICATE-----
3568
+ MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5MQswCQYDVQQG
3569
+ EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAzMB4XDTE1MDUy
3570
+ NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ
3571
+ MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZB
3572
+ f8ANm+gBG1bG8lKlui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjr
3573
+ Zt6jQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSrttvXBp43
3574
+ rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkrBqWTrBqYaGFy+uGh0Psc
3575
+ eGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteMYyRIHN8wfdVoOw==
3576
+ -----END CERTIFICATE-----
3577
+
3578
+ Amazon Root CA 4
3579
+ ================
3580
+ -----BEGIN CERTIFICATE-----
3581
+ MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5MQswCQYDVQQG
3582
+ EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSA0MB4XDTE1MDUy
3583
+ NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ
3584
+ MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN
3585
+ /sGKe0uoe0ZLY7Bi9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri
3586
+ 83BkM6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV
3587
+ HQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WBMAoGCCqGSM49BAMDA2gA
3588
+ MGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlwCkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1
3589
+ AE47xDqUEpHJWEadIRNyp4iciuRMStuW1KyLa2tJElMzrdfkviT8tQp21KW8EA==
3590
+ -----END CERTIFICATE-----
3591
+
3592
+ LuxTrust Global Root 2
3593
+ ======================
3594
+ -----BEGIN CERTIFICATE-----
3595
+ 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
3621
+ -----END CERTIFICATE-----
3622
+
3623
+ TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1
3624
+ =============================================
3625
+ -----BEGIN CERTIFICATE-----
3626
+ MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIxGDAWBgNVBAcT
3627
+ D0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxpbXNlbCB2ZSBUZWtub2xvamlr
3628
+ IEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0wKwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24g
3629
+ TWVya2V6aSAtIEthbXUgU00xNjA0BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRp
3630
+ ZmlrYXNpIC0gU3VydW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYD
3631
+ VQQGEwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXllIEJpbGlt
3632
+ c2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklUQUsxLTArBgNVBAsTJEth
3633
+ bXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBTTTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11
3634
+ IFNNIFNTTCBLb2sgU2VydGlmaWthc2kgLSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
3635
+ MIIBCgKCAQEAr3UwM6q7a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y8
3636
+ 6Ij5iySrLqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INrN3wc
3637
+ wv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2XYacQuFWQfw4tJzh0
3638
+ 3+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/iSIzL+aFCr2lqBs23tPcLG07xxO9
3639
+ WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4fAJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQU
3640
+ ZT/HiobGPN08VFw1+DrtUgxHV8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJ
3641
+ KoZIhvcNAQELBQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh
3642
+ AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPfIPP54+M638yc
3643
+ lNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4lzwDGrpDxpa5RXI4s6ehlj2R
3644
+ e37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0j
3645
+ q5Rm+K37DwhuJi1/FwcJsoz7UMCflo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM=
3646
+ -----END CERTIFICATE-----
vendor/composer/ca-bundle/res/index.php ADDED
File without changes
vendor/composer/ca-bundle/src/CaBundle.php ADDED
@@ -0,0 +1,308 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of composer/ca-bundle.
5
+ *
6
+ * (c) Composer <https://github.com/composer>
7
+ *
8
+ * For the full copyright and license information, please view
9
+ * the LICENSE file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Composer\CaBundle;
13
+
14
+ use Psr\Log\LoggerInterface;
15
+ use Symfony\Component\Process\PhpProcess;
16
+
17
+ /**
18
+ * @author Chris Smith <chris@cs278.org>
19
+ * @author Jordi Boggiano <j.boggiano@seld.be>
20
+ */
21
+ class CaBundle
22
+ {
23
+ private static $caPath;
24
+ private static $caFileValidity = array();
25
+ private static $useOpensslParse;
26
+
27
+ /**
28
+ * Returns the system CA bundle path, or a path to the bundled one
29
+ *
30
+ * This method was adapted from Sslurp.
31
+ * https://github.com/EvanDotPro/Sslurp
32
+ *
33
+ * (c) Evan Coury <me@evancoury.com>
34
+ *
35
+ * For the full copyright and license information, please see below:
36
+ *
37
+ * Copyright (c) 2013, Evan Coury
38
+ * All rights reserved.
39
+ *
40
+ * Redistribution and use in source and binary forms, with or without modification,
41
+ * are permitted provided that the following conditions are met:
42
+ *
43
+ * * Redistributions of source code must retain the above copyright notice,
44
+ * this list of conditions and the following disclaimer.
45
+ *
46
+ * * Redistributions in binary form must reproduce the above copyright notice,
47
+ * this list of conditions and the following disclaimer in the documentation
48
+ * and/or other materials provided with the distribution.
49
+ *
50
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
51
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
52
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
53
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
54
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
55
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
56
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
57
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
58
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
59
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
60
+ *
61
+ * @param LoggerInterface $logger optional logger for information about which CA files were loaded
62
+ * @return string path to a CA bundle file or directory
63
+ */
64
+ public static function getSystemCaRootBundlePath(LoggerInterface $logger = null)
65
+ {
66
+ if (self::$caPath !== null) {
67
+ return self::$caPath;
68
+ }
69
+
70
+ // If SSL_CERT_FILE env variable points to a valid certificate/bundle, use that.
71
+ // This mimics how OpenSSL uses the SSL_CERT_FILE env variable.
72
+ $envCertFile = getenv('SSL_CERT_FILE');
73
+ if ($envCertFile && is_readable($envCertFile) && static::validateCaFile($envCertFile, $logger)) {
74
+ return self::$caPath = $envCertFile;
75
+ }
76
+
77
+ // If SSL_CERT_DIR env variable points to a valid certificate/bundle, use that.
78
+ // This mimics how OpenSSL uses the SSL_CERT_FILE env variable.
79
+ $envCertDir = getenv('SSL_CERT_DIR');
80
+ if ($envCertDir && is_dir($envCertDir) && is_readable($envCertDir)) {
81
+ return self::$caPath = $envCertDir;
82
+ }
83
+
84
+ $configured = ini_get('openssl.cafile');
85
+ if ($configured && strlen($configured) > 0 && is_readable($configured) && static::validateCaFile($configured, $logger)) {
86
+ return self::$caPath = $configured;
87
+ }
88
+
89
+ $configured = ini_get('openssl.capath');
90
+ if ($configured && is_dir($configured) && is_readable($configured)) {
91
+ return self::$caPath = $configured;
92
+ }
93
+
94
+ $caBundlePaths = array(
95
+ '/etc/pki/tls/certs/ca-bundle.crt', // Fedora, RHEL, CentOS (ca-certificates package)
96
+ '/etc/ssl/certs/ca-certificates.crt', // Debian, Ubuntu, Gentoo, Arch Linux (ca-certificates package)
97
+ '/etc/ssl/ca-bundle.pem', // SUSE, openSUSE (ca-certificates package)
98
+ '/usr/local/share/certs/ca-root-nss.crt', // FreeBSD (ca_root_nss_package)
99
+ '/usr/ssl/certs/ca-bundle.crt', // Cygwin
100
+ '/opt/local/share/curl/curl-ca-bundle.crt', // OS X macports, curl-ca-bundle package
101
+ '/usr/local/share/curl/curl-ca-bundle.crt', // Default cURL CA bunde path (without --with-ca-bundle option)
102
+ '/usr/share/ssl/certs/ca-bundle.crt', // Really old RedHat?
103
+ '/etc/ssl/cert.pem', // OpenBSD
104
+ '/usr/local/etc/ssl/cert.pem', // FreeBSD 10.x
105
+ '/usr/local/etc/openssl/cert.pem', // OS X homebrew, openssl package
106
+ );
107
+
108
+ foreach ($caBundlePaths as $caBundle) {
109
+ if (@is_readable($caBundle) && static::validateCaFile($caBundle, $logger)) {
110
+ return self::$caPath = $caBundle;
111
+ }
112
+ }
113
+
114
+ foreach ($caBundlePaths as $caBundle) {
115
+ $caBundle = dirname($caBundle);
116
+ if (@is_dir($caBundle) && glob($caBundle.'/*')) {
117
+ return self::$caPath = $caBundle;
118
+ }
119
+ }
120
+
121
+ return self::$caPath = static::getBundledCaBundlePath(); // Bundled CA file, last resort
122
+ }
123
+
124
+ /**
125
+ * Returns the path to the bundled CA file
126
+ *
127
+ * In case you don't want to trust the user or the system, you can use this directly
128
+ *
129
+ * @return string path to a CA bundle file
130
+ */
131
+ public static function getBundledCaBundlePath()
132
+ {
133
+ $caBundleFile = __DIR__.'/../res/cacert.pem';
134
+
135
+ // cURL does not understand 'phar://' paths
136
+ // see https://github.com/composer/ca-bundle/issues/10
137
+ if (0 === strpos($caBundleFile, 'phar://')) {
138
+ file_put_contents(
139
+ $tempCaBundleFile = tempnam(sys_get_temp_dir(), 'openssl-ca-bundle-'),
140
+ file_get_contents($caBundleFile)
141
+ );
142
+
143
+ register_shutdown_function(function() use ($tempCaBundleFile) {
144
+ @unlink($tempCaBundleFile);
145
+ });
146
+
147
+ $caBundleFile = $tempCaBundleFile;
148
+ }
149
+
150
+ return $caBundleFile;
151
+ }
152
+
153
+ /**
154
+ * Validates a CA file using opensl_x509_parse only if it is safe to use
155
+ *
156
+ * @param string $filename
157
+ * @param LoggerInterface $logger optional logger for information about which CA files were loaded
158
+ *
159
+ * @return bool
160
+ */
161
+ public static function validateCaFile($filename, LoggerInterface $logger = null)
162
+ {
163
+ static $warned = false;
164
+
165
+ if (isset(self::$caFileValidity[$filename])) {
166
+ return self::$caFileValidity[$filename];
167
+ }
168
+
169
+ $contents = file_get_contents($filename);
170
+
171
+ // assume the CA is valid if php is vulnerable to
172
+ // https://www.sektioneins.de/advisories/advisory-012013-php-openssl_x509_parse-memory-corruption-vulnerability.html
173
+ if (!static::isOpensslParseSafe()) {
174
+ if (!$warned && $logger) {
175
+ $logger->warning(sprintf(
176
+ 'Your version of PHP, %s, is affected by CVE-2013-6420 and cannot safely perform certificate validation, we strongly suggest you upgrade.',
177
+ PHP_VERSION
178
+ ));
179
+ $warned = true;
180
+ }
181
+
182
+ $isValid = !empty($contents);
183
+ } else {
184
+ $isValid = (bool) openssl_x509_parse($contents);
185
+ }
186
+
187
+ if ($logger) {
188
+ $logger->debug('Checked CA file '.realpath($filename).': '.($isValid ? 'valid' : 'invalid'));
189
+ }
190
+
191
+ return self::$caFileValidity[$filename] = $isValid;
192
+ }
193
+
194
+ /**
195
+ * Test if it is safe to use the PHP function openssl_x509_parse().
196
+ *
197
+ * This checks if OpenSSL extensions is vulnerable to remote code execution
198
+ * via the exploit documented as CVE-2013-6420.
199
+ *
200
+ * @return bool
201
+ */
202
+ public static function isOpensslParseSafe()
203
+ {
204
+ if (null !== self::$useOpensslParse) {
205
+ return self::$useOpensslParse;
206
+ }
207
+
208
+ if (PHP_VERSION_ID >= 50600) {
209
+ return self::$useOpensslParse = true;
210
+ }
211
+
212
+ // Vulnerable:
213
+ // PHP 5.3.0 - PHP 5.3.27
214
+ // PHP 5.4.0 - PHP 5.4.22
215
+ // PHP 5.5.0 - PHP 5.5.6
216
+ if (
217
+ (PHP_VERSION_ID < 50400 && PHP_VERSION_ID >= 50328)
218
+ || (PHP_VERSION_ID < 50500 && PHP_VERSION_ID >= 50423)
219
+ || (PHP_VERSION_ID < 50600 && PHP_VERSION_ID >= 50507)
220
+ ) {
221
+ // This version of PHP has the fix for CVE-2013-6420 applied.
222
+ return self::$useOpensslParse = true;
223
+ }
224
+
225
+ if (defined('PHP_WINDOWS_VERSION_BUILD')) {
226
+ // Windows is probably insecure in this case.
227
+ return self::$useOpensslParse = false;
228
+ }
229
+
230
+ $compareDistroVersionPrefix = function ($prefix, $fixedVersion) {
231
+ $regex = '{^'.preg_quote($prefix).'([0-9]+)$}';
232
+
233
+ if (preg_match($regex, PHP_VERSION, $m)) {
234
+ return ((int) $m[1]) >= $fixedVersion;
235
+ }
236
+
237
+ return false;
238
+ };
239
+
240
+ // Hard coded list of PHP distributions with the fix backported.
241
+ if (
242
+ $compareDistroVersionPrefix('5.3.3-7+squeeze', 18) // Debian 6 (Squeeze)
243
+ || $compareDistroVersionPrefix('5.4.4-14+deb7u', 7) // Debian 7 (Wheezy)
244
+ || $compareDistroVersionPrefix('5.3.10-1ubuntu3.', 9) // Ubuntu 12.04 (Precise)
245
+ ) {
246
+ return self::$useOpensslParse = true;
247
+ }
248
+
249
+ // Symfony Process component is missing so we assume it is unsafe at this point
250
+ if (!class_exists('Symfony\Component\Process\PhpProcess')) {
251
+ return self::$useOpensslParse = false;
252
+ }
253
+
254
+ // This is where things get crazy, because distros backport security
255
+ // fixes the chances are on NIX systems the fix has been applied but
256
+ // it's not possible to verify that from the PHP version.
257
+ //
258
+ // To verify exec a new PHP process and run the issue testcase with
259
+ // known safe input that replicates the bug.
260
+
261
+ // Based on testcase in https://github.com/php/php-src/commit/c1224573c773b6845e83505f717fbf820fc18415
262
+ // changes in https://github.com/php/php-src/commit/76a7fd893b7d6101300cc656058704a73254d593
263
+ $cert = 'LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVwRENDQTR5Z0F3SUJBZ0lKQUp6dThyNnU2ZUJjTUEwR0NTcUdTSWIzRFFFQkJRVUFNSUhETVFzd0NRWUQKVlFRR0V3SkVSVEVjTUJvR0ExVUVDQXdUVG05eVpISm9aV2x1TFZkbGMzUm1ZV3hsYmpFUU1BNEdBMVVFQnd3SApTOE9Ed3Jac2JqRVVNQklHQTFVRUNnd0xVMlZyZEdsdmJrVnBibk14SHpBZEJnTlZCQXNNRmsxaGJHbGphVzkxCmN5QkRaWEowSUZObFkzUnBiMjR4SVRBZkJnTlZCQU1NR0cxaGJHbGphVzkxY3k1elpXdDBhVzl1WldsdWN5NWsKWlRFcU1DZ0dDU3FHU0liM0RRRUpBUlliYzNSbFptRnVMbVZ6YzJWeVFITmxhM1JwYjI1bGFXNXpMbVJsTUhVWQpaREU1TnpBd01UQXhNREF3TURBd1dnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBCkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEKQUFBQUFBQVhEVEUwTVRFeU9ERXhNemt6TlZvd2djTXhDekFKQmdOVkJBWVRBa1JGTVJ3d0dnWURWUVFJREJOTwpiM0prY21obGFXNHRWMlZ6ZEdaaGJHVnVNUkF3RGdZRFZRUUhEQWRMdzRQQ3RteHVNUlF3RWdZRFZRUUtEQXRUClpXdDBhVzl1UldsdWN6RWZNQjBHQTFVRUN3d1dUV0ZzYVdOcGIzVnpJRU5sY25RZ1UyVmpkR2x2YmpFaE1COEcKQTFVRUF3d1liV0ZzYVdOcGIzVnpMbk5sYTNScGIyNWxhVzV6TG1SbE1Tb3dLQVlKS29aSWh2Y05BUWtCRmh0egpkR1ZtWVc0dVpYTnpaWEpBYzJWcmRHbHZibVZwYm5NdVpHVXdnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCCkR3QXdnZ0VLQW9JQkFRRERBZjNobDdKWTBYY0ZuaXlFSnBTU0RxbjBPcUJyNlFQNjV1c0pQUnQvOFBhRG9xQnUKd0VZVC9OYSs2ZnNnUGpDMHVLOURaZ1dnMnRIV1dvYW5TYmxBTW96NVBINlorUzRTSFJaN2UyZERJalBqZGhqaAowbUxnMlVNTzV5cDBWNzk3R2dzOWxOdDZKUmZIODFNTjJvYlhXczROdHp0TE11RDZlZ3FwcjhkRGJyMzRhT3M4CnBrZHVpNVVhd1Raa3N5NXBMUEhxNWNNaEZHbTA2djY1Q0xvMFYyUGQ5K0tBb2tQclBjTjVLTEtlYno3bUxwazYKU01lRVhPS1A0aWRFcXh5UTdPN2ZCdUhNZWRzUWh1K3ByWTNzaTNCVXlLZlF0UDVDWm5YMmJwMHdLSHhYMTJEWAoxbmZGSXQ5RGJHdkhUY3lPdU4rblpMUEJtM3ZXeG50eUlJdlZBZ01CQUFHalFqQkFNQWtHQTFVZEV3UUNNQUF3CkVRWUpZSVpJQVliNFFnRUJCQVFEQWdlQU1Bc0dBMVVkRHdRRUF3SUZvREFUQmdOVkhTVUVEREFLQmdnckJnRUYKQlFjREFqQU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUFHMGZaWVlDVGJkajFYWWMrMVNub2FQUit2SThDOENhRAo4KzBVWWhkbnlVNGdnYTBCQWNEclk5ZTk0ZUVBdTZacXljRjZGakxxWFhkQWJvcHBXb2NyNlQ2R0QxeDMzQ2tsClZBcnpHL0t4UW9oR0QySmVxa2hJTWxEb214SE83a2EzOStPYThpMnZXTFZ5alU4QVp2V01BcnVIYTRFRU55RzcKbFcyQWFnYUZLRkNyOVRuWFRmcmR4R1ZFYnY3S1ZRNmJkaGc1cDVTanBXSDErTXEwM3VSM1pYUEJZZHlWODMxOQpvMGxWajFLRkkyRENML2xpV2lzSlJvb2YrMWNSMzVDdGQwd1lCY3BCNlRac2xNY09QbDc2ZHdLd0pnZUpvMlFnClpzZm1jMnZDMS9xT2xOdU5xLzBUenprVkd2OEVUVDNDZ2FVK1VYZTRYT1Z2a2NjZWJKbjJkZz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K';
264
+ $script = <<<'EOT'
265
+
266
+ error_reporting(-1);
267
+ $info = openssl_x509_parse(base64_decode('%s'));
268
+ var_dump(PHP_VERSION, $info['issuer']['emailAddress'], $info['validFrom_time_t']);
269
+
270
+ EOT;
271
+ $script = '<'."?php\n".sprintf($script, $cert);
272
+
273
+ try {
274
+ $process = new PhpProcess($script);
275
+ $process->mustRun();
276
+ } catch (\Exception $e) {
277
+ // In the case of any exceptions just accept it is not possible to
278
+ // determine the safety of openssl_x509_parse and bail out.
279
+ return self::$useOpensslParse = false;
280
+ }
281
+
282
+ $output = preg_split('{\r?\n}', trim($process->getOutput()));
283
+ $errorOutput = trim($process->getErrorOutput());
284
+
285
+ if (
286
+ count($output) === 3
287
+ && $output[0] === sprintf('string(%d) "%s"', strlen(PHP_VERSION), PHP_VERSION)
288
+ && $output[1] === 'string(27) "stefan.esser@sektioneins.de"'
289
+ && $output[2] === 'int(-1)'
290
+ && preg_match('{openssl_x509_parse\(\): illegal (?:ASN1 data type for|length in) timestamp in - on line \d+}', $errorOutput)
291
+ ) {
292
+ // This PHP has the fix backported probably by a distro security team.
293
+ return self::$useOpensslParse = true;
294
+ }
295
+
296
+ return self::$useOpensslParse = false;
297
+ }
298
+
299
+ /**
300
+ * Resets the static caches
301
+ */
302
+ public static function reset()
303
+ {
304
+ self::$caFileValidity = array();
305
+ self::$caPath = null;
306
+ self::$useOpensslParse = null;
307
+ }
308
+ }
vendor/composer/ca-bundle/src/index.php ADDED
File without changes
vendor/composer/installed.json CHANGED
@@ -433,6 +433,288 @@
433
  "stylesheet"
434
  ]
435
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
436
  {
437
  "name": "soundasleep/html2text",
438
  "version": "0.3.4",
433
  "stylesheet"
434
  ]
435
  },
436
+ {
437
+ "name": "psr/log",
438
+ "version": "1.0.2",
439
+ "version_normalized": "1.0.2.0",
440
+ "source": {
441
+ "type": "git",
442
+ "url": "https://github.com/php-fig/log.git",
443
+ "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d"
444
+ },
445
+ "dist": {
446
+ "type": "zip",
447
+ "url": "https://api.github.com/repos/php-fig/log/zipball/4ebe3a8bf773a19edfe0a84b6585ba3d401b724d",
448
+ "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d",
449
+ "shasum": ""
450
+ },
451
+ "require": {
452
+ "php": ">=5.3.0"
453
+ },
454
+ "time": "2016-10-10T12:19:37+00:00",
455
+ "type": "library",
456
+ "extra": {
457
+ "branch-alias": {
458
+ "dev-master": "1.0.x-dev"
459
+ }
460
+ },
461
+ "installation-source": "dist",
462
+ "autoload": {
463
+ "psr-4": {
464
+ "Psr\\Log\\": "Psr/Log/"
465
+ }
466
+ },
467
+ "notification-url": "https://packagist.org/downloads/",
468
+ "license": [
469
+ "MIT"
470
+ ],
471
+ "authors": [
472
+ {
473
+ "name": "PHP-FIG",
474
+ "homepage": "http://www.php-fig.org/"
475
+ }
476
+ ],
477
+ "description": "Common interface for logging libraries",
478
+ "homepage": "https://github.com/php-fig/log",
479
+ "keywords": [
480
+ "log",
481
+ "psr",
482
+ "psr-3"
483
+ ]
484
+ },
485
+ {
486
+ "name": "symfony/debug",
487
+ "version": "v3.4.1",
488
+ "version_normalized": "3.4.1.0",
489
+ "source": {
490
+ "type": "git",
491
+ "url": "https://github.com/symfony/debug.git",
492
+ "reference": "fb2001e5d85f95d8b6ab94ae3be5d2672df128fd"
493
+ },
494
+ "dist": {
495
+ "type": "zip",
496
+ "url": "https://api.github.com/repos/symfony/debug/zipball/fb2001e5d85f95d8b6ab94ae3be5d2672df128fd",
497
+ "reference": "fb2001e5d85f95d8b6ab94ae3be5d2672df128fd",
498
+ "shasum": ""
499
+ },
500
+ "require": {
501
+ "php": "^5.5.9|>=7.0.8",
502
+ "psr/log": "~1.0"
503
+ },
504
+ "conflict": {
505
+ "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2"
506
+ },
507
+ "require-dev": {
508
+ "symfony/http-kernel": "~2.8|~3.0|~4.0"
509
+ },
510
+ "time": "2017-11-21T09:01:46+00:00",
511
+ "type": "library",
512
+ "extra": {
513
+ "branch-alias": {
514
+ "dev-master": "3.4-dev"
515
+ }
516
+ },
517
+ "installation-source": "dist",
518
+ "autoload": {
519
+ "psr-4": {
520
+ "Symfony\\Component\\Debug\\": ""
521
+ },
522
+ "exclude-from-classmap": [
523
+ "/Tests/"
524
+ ]
525
+ },
526
+ "notification-url": "https://packagist.org/downloads/",
527
+ "license": [
528
+ "MIT"
529
+ ],
530
+ "authors": [
531
+ {
532
+ "name": "Fabien Potencier",
533
+ "email": "fabien@symfony.com"
534
+ },
535
+ {
536
+ "name": "Symfony Community",
537
+ "homepage": "https://symfony.com/contributors"
538
+ }
539
+ ],
540
+ "description": "Symfony Debug Component",
541
+ "homepage": "https://symfony.com"
542
+ },
543
+ {
544
+ "name": "symfony/console",
545
+ "version": "v3.3.14",
546
+ "version_normalized": "3.3.14.0",
547
+ "source": {
548
+ "type": "git",
549
+ "url": "https://github.com/symfony/console.git",
550
+ "reference": "55497618e68845b6f92a66d13187138ac3d7750e"
551
+ },
552
+ "dist": {
553
+ "type": "zip",
554
+ "url": "https://api.github.com/repos/symfony/console/zipball/55497618e68845b6f92a66d13187138ac3d7750e",
555
+ "reference": "55497618e68845b6f92a66d13187138ac3d7750e",
556
+ "shasum": ""
557
+ },
558
+ "require": {
559
+ "php": "^5.5.9|>=7.0.8",
560
+ "symfony/debug": "~2.8|~3.0",
561
+ "symfony/polyfill-mbstring": "~1.0"
562
+ },
563
+ "conflict": {
564
+ "symfony/dependency-injection": "<3.3"
565
+ },
566
+ "require-dev": {
567
+ "psr/log": "~1.0",
568
+ "symfony/config": "~3.3",
569
+ "symfony/dependency-injection": "~3.3",
570
+ "symfony/event-dispatcher": "~2.8|~3.0",
571
+ "symfony/filesystem": "~2.8|~3.0",
572
+ "symfony/process": "~2.8|~3.0"
573
+ },
574
+ "suggest": {
575
+ "psr/log": "For using the console logger",
576
+ "symfony/event-dispatcher": "",
577
+ "symfony/filesystem": "",
578
+ "symfony/process": ""
579
+ },
580
+ "time": "2017-11-29T12:25:49+00:00",
581
+ "type": "library",
582
+ "extra": {
583
+ "branch-alias": {
584
+ "dev-master": "3.3-dev"
585
+ }
586
+ },
587
+ "installation-source": "dist",
588
+ "autoload": {
589
+ "psr-4": {
590
+ "Symfony\\Component\\Console\\": ""
591
+ },
592
+ "exclude-from-classmap": [
593
+ "/Tests/"
594
+ ]
595
+ },
596
+ "notification-url": "https://packagist.org/downloads/",
597
+ "license": [
598
+ "MIT"
599
+ ],
600
+ "authors": [
601
+ {
602
+ "name": "Fabien Potencier",
603
+ "email": "fabien@symfony.com"
604
+ },
605
+ {
606
+ "name": "Symfony Community",
607
+ "homepage": "https://symfony.com/contributors"
608
+ }
609
+ ],
610
+ "description": "Symfony Console Component",
611
+ "homepage": "https://symfony.com"
612
+ },
613
+ {
614
+ "name": "composer/ca-bundle",
615
+ "version": "1.1.0",
616
+ "version_normalized": "1.1.0.0",
617
+ "source": {
618
+ "type": "git",
619
+ "url": "https://github.com/composer/ca-bundle.git",
620
+ "reference": "943b2c4fcad1ef178d16a713c2468bf7e579c288"
621
+ },
622
+ "dist": {
623
+ "type": "zip",
624
+ "url": "https://api.github.com/repos/composer/ca-bundle/zipball/943b2c4fcad1ef178d16a713c2468bf7e579c288",
625
+ "reference": "943b2c4fcad1ef178d16a713c2468bf7e579c288",
626
+ "shasum": ""
627
+ },
628
+ "require": {
629
+ "ext-openssl": "*",
630
+ "ext-pcre": "*",
631
+ "php": "^5.3.2 || ^7.0"
632
+ },
633
+ "require-dev": {
634
+ "phpunit/phpunit": "^4.8.35",
635
+ "psr/log": "^1.0",
636
+ "symfony/process": "^2.5 || ^3.0 || ^4.0"
637
+ },
638
+ "time": "2017-11-29T09:37:33+00:00",
639
+ "type": "library",
640
+ "extra": {
641
+ "branch-alias": {
642
+ "dev-master": "1.x-dev"
643
+ }
644
+ },
645
+ "installation-source": "dist",
646
+ "autoload": {
647
+ "psr-4": {
648
+ "Composer\\CaBundle\\": "src"
649
+ }
650
+ },
651
+ "notification-url": "https://packagist.org/downloads/",
652
+ "license": [
653
+ "MIT"
654
+ ],
655
+ "authors": [
656
+ {
657
+ "name": "Jordi Boggiano",
658
+ "email": "j.boggiano@seld.be",
659
+ "homepage": "http://seld.be"
660
+ }
661
+ ],
662
+ "description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.",
663
+ "keywords": [
664
+ "cabundle",
665
+ "cacert",
666
+ "certificate",
667
+ "ssl",
668
+ "tls"
669
+ ]
670
+ },
671
+ {
672
+ "name": "sensiolabs/security-checker",
673
+ "version": "v4.1.6",
674
+ "version_normalized": "4.1.6.0",
675
+ "source": {
676
+ "type": "git",
677
+ "url": "https://github.com/sensiolabs/security-checker.git",
678
+ "reference": "387b6a3b723ba35588b33d5f8d14e28ed608bd30"
679
+ },
680
+ "dist": {
681
+ "type": "zip",
682
+ "url": "https://api.github.com/repos/sensiolabs/security-checker/zipball/387b6a3b723ba35588b33d5f8d14e28ed608bd30",
683
+ "reference": "387b6a3b723ba35588b33d5f8d14e28ed608bd30",
684
+ "shasum": ""
685
+ },
686
+ "require": {
687
+ "composer/ca-bundle": "^1.0",
688
+ "symfony/console": "~2.7|~3.0|~4.0"
689
+ },
690
+ "time": "2017-10-29T18:48:08+00:00",
691
+ "bin": [
692
+ "security-checker"
693
+ ],
694
+ "type": "library",
695
+ "extra": {
696
+ "branch-alias": {
697
+ "dev-master": "4.1-dev"
698
+ }
699
+ },
700
+ "installation-source": "dist",
701
+ "autoload": {
702
+ "psr-0": {
703
+ "SensioLabs\\Security": ""
704
+ }
705
+ },
706
+ "notification-url": "https://packagist.org/downloads/",
707
+ "license": [
708
+ "MIT"
709
+ ],
710
+ "authors": [
711
+ {
712
+ "name": "Fabien Potencier",
713
+ "email": "fabien.potencier@gmail.com"
714
+ }
715
+ ],
716
+ "description": "A security checker for your composer.lock"
717
+ },
718
  {
719
  "name": "soundasleep/html2text",
720
  "version": "0.3.4",
vendor/psr/index.php ADDED
File without changes
vendor/psr/log/.gitignore ADDED
@@ -0,0 +1 @@
 
1
+ vendor
vendor/psr/log/Psr/Log/AbstractLogger.php ADDED
@@ -0,0 +1,128 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Psr\Log;
4
+
5
+ /**
6
+ * This is a simple Logger implementation that other Loggers can inherit from.
7
+ *
8
+ * It simply delegates all log-level-specific methods to the `log` method to
9
+ * reduce boilerplate code that a simple Logger that does the same thing with
10
+ * messages regardless of the error level has to implement.
11
+ */
12
+ abstract class AbstractLogger implements LoggerInterface
13
+ {
14
+ /**
15
+ * System is unusable.
16
+ *
17
+ * @param string $message
18
+ * @param array $context
19
+ *
20
+ * @return void
21
+ */
22
+ public function emergency($message, array $context = array())
23
+ {
24
+ $this->log(LogLevel::EMERGENCY, $message, $context);
25
+ }
26
+
27
+ /**
28
+ * Action must be taken immediately.
29
+ *
30
+ * Example: Entire website down, database unavailable, etc. This should
31
+ * trigger the SMS alerts and wake you up.
32
+ *
33
+ * @param string $message
34
+ * @param array $context
35
+ *
36
+ * @return void
37
+ */
38
+ public function alert($message, array $context = array())
39
+ {
40
+ $this->log(LogLevel::ALERT, $message, $context);
41
+ }
42
+
43
+ /**
44
+ * Critical conditions.
45
+ *
46
+ * Example: Application component unavailable, unexpected exception.
47
+ *
48
+ * @param string $message
49
+ * @param array $context
50
+ *
51
+ * @return void
52
+ */
53
+ public function critical($message, array $context = array())
54
+ {
55
+ $this->log(LogLevel::CRITICAL, $message, $context);
56
+ }
57
+
58
+ /**
59
+ * Runtime errors that do not require immediate action but should typically
60
+ * be logged and monitored.
61
+ *
62
+ * @param string $message
63
+ * @param array $context
64
+ *
65
+ * @return void
66
+ */
67
+ public function error($message, array $context = array())
68
+ {
69
+ $this->log(LogLevel::ERROR, $message, $context);
70
+ }
71
+
72
+ /**
73
+ * Exceptional occurrences that are not errors.
74
+ *
75
+ * Example: Use of deprecated APIs, poor use of an API, undesirable things
76
+ * that are not necessarily wrong.
77
+ *
78
+ * @param string $message
79
+ * @param array $context
80
+ *
81
+ * @return void
82
+ */
83
+ public function warning($message, array $context = array())
84
+ {
85
+ $this->log(LogLevel::WARNING, $message, $context);
86
+ }
87
+
88
+ /**
89
+ * Normal but significant events.
90
+ *
91
+ * @param string $message
92
+ * @param array $context
93
+ *
94
+ * @return void
95
+ */
96
+ public function notice($message, array $context = array())
97
+ {
98
+ $this->log(LogLevel::NOTICE, $message, $context);
99
+ }
100
+
101
+ /**
102
+ * Interesting events.
103
+ *
104
+ * Example: User logs in, SQL logs.
105
+ *
106
+ * @param string $message
107
+ * @param array $context
108
+ *
109
+ * @return void
110
+ */
111
+ public function info($message, array $context = array())
112
+ {
113
+ $this->log(LogLevel::INFO, $message, $context);
114
+ }
115
+
116
+ /**
117
+ * Detailed debug information.
118
+ *
119
+ * @param string $message
120
+ * @param array $context
121
+ *
122
+ * @return void
123
+ */
124
+ public function debug($message, array $context = array())
125
+ {
126
+ $this->log(LogLevel::DEBUG, $message, $context);
127
+ }
128
+ }
vendor/psr/log/Psr/Log/InvalidArgumentException.php ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Psr\Log;
4
+
5
+ class InvalidArgumentException extends \InvalidArgumentException
6
+ {
7
+ }
vendor/psr/log/Psr/Log/LogLevel.php ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Psr\Log;
4
+
5
+ /**
6
+ * Describes log levels.
7
+ */
8
+ class LogLevel
9
+ {
10
+ const EMERGENCY = 'emergency';
11
+ const ALERT = 'alert';
12
+ const CRITICAL = 'critical';
13
+ const ERROR = 'error';
14
+ const WARNING = 'warning';
15
+ const NOTICE = 'notice';
16
+ const INFO = 'info';
17
+ const DEBUG = 'debug';
18
+ }
vendor/psr/log/Psr/Log/LoggerAwareInterface.php ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Psr\Log;
4
+
5
+ /**
6
+ * Describes a logger-aware instance.
7
+ */
8
+ interface LoggerAwareInterface
9
+ {
10
+ /**
11
+ * Sets a logger instance on the object.
12
+ *
13
+ * @param LoggerInterface $logger
14
+ *
15
+ * @return void
16
+ */
17
+ public function setLogger(LoggerInterface $logger);
18
+ }
vendor/psr/log/Psr/Log/LoggerAwareTrait.php ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Psr\Log;
4
+
5
+ /**
6
+ * Basic Implementation of LoggerAwareInterface.
7
+ */
8
+ trait LoggerAwareTrait
9
+ {
10
+ /**
11
+ * The logger instance.
12
+ *
13
+ * @var LoggerInterface
14
+ */
15
+ protected $logger;
16
+
17
+ /**
18
+ * Sets a logger.
19
+ *
20
+ * @param LoggerInterface $logger
21
+ */
22
+ public function setLogger(LoggerInterface $logger)
23
+ {
24
+ $this->logger = $logger;
25
+ }
26
+ }
vendor/psr/log/Psr/Log/LoggerInterface.php ADDED
@@ -0,0 +1,123 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Psr\Log;
4
+
5
+ /**
6
+ * Describes a logger instance.
7
+ *
8
+ * The message MUST be a string or object implementing __toString().
9
+ *
10
+ * The message MAY contain placeholders in the form: {foo} where foo
11
+ * will be replaced by the context data in key "foo".
12
+ *
13
+ * The context array can contain arbitrary data. The only assumption that
14
+ * can be made by implementors is that if an Exception instance is given
15
+ * to produce a stack trace, it MUST be in a key named "exception".
16
+ *
17
+ * See https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md
18
+ * for the full interface specification.
19
+ */
20
+ interface LoggerInterface
21
+ {
22
+ /**
23
+ * System is unusable.
24
+ *
25
+ * @param string $message
26
+ * @param array $context
27
+ *
28
+ * @return void
29
+ */
30
+ public function emergency($message, array $context = array());
31
+
32
+ /**
33
+ * Action must be taken immediately.
34
+ *
35
+ * Example: Entire website down, database unavailable, etc. This should
36
+ * trigger the SMS alerts and wake you up.
37
+ *
38
+ * @param string $message
39
+ * @param array $context
40
+ *
41
+ * @return void
42
+ */
43
+ public function alert($message, array $context = array());
44
+
45
+ /**
46
+ * Critical conditions.
47
+ *
48
+ * Example: Application component unavailable, unexpected exception.
49
+ *
50
+ * @param string $message
51
+ * @param array $context
52
+ *
53
+ * @return void
54
+ */
55
+ public function critical($message, array $context = array());
56
+
57
+ /**
58
+ * Runtime errors that do not require immediate action but should typically
59
+ * be logged and monitored.
60
+ *
61
+ * @param string $message
62
+ * @param array $context
63
+ *
64
+ * @return void
65
+ */
66
+ public function error($message, array $context = array());
67
+
68
+ /**
69
+ * Exceptional occurrences that are not errors.
70
+ *
71
+ * Example: Use of deprecated APIs, poor use of an API, undesirable things
72
+ * that are not necessarily wrong.
73
+ *
74
+ * @param string $message
75
+ * @param array $context
76
+ *
77
+ * @return void
78
+ */
79
+ public function warning($message, array $context = array());
80
+
81
+ /**
82
+ * Normal but significant events.
83
+ *
84
+ * @param string $message
85
+ * @param array $context
86
+ *
87
+ * @return void
88
+ */
89
+ public function notice($message, array $context = array());
90
+
91
+ /**
92
+ * Interesting events.
93
+ *
94
+ * Example: User logs in, SQL logs.
95
+ *
96
+ * @param string $message
97
+ * @param array $context
98
+ *
99
+ * @return void
100
+ */
101
+ public function info($message, array $context = array());
102
+
103
+ /**
104
+ * Detailed debug information.
105
+ *
106
+ * @param string $message
107
+ * @param array $context
108
+ *
109
+ * @return void
110
+ */
111
+ public function debug($message, array $context = array());
112
+
113
+ /**
114
+ * Logs with an arbitrary level.
115
+ *
116
+ * @param mixed $level
117
+ * @param string $message
118
+ * @param array $context
119
+ *
120
+ * @return void
121
+ */
122
+ public function log($level, $message, array $context = array());
123
+ }
vendor/psr/log/Psr/Log/LoggerTrait.php ADDED
@@ -0,0 +1,140 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Psr\Log;
4
+
5
+ /**
6
+ * This is a simple Logger trait that classes unable to extend AbstractLogger
7
+ * (because they extend another class, etc) can include.
8
+ *
9
+ * It simply delegates all log-level-specific methods to the `log` method to
10
+ * reduce boilerplate code that a simple Logger that does the same thing with
11
+ * messages regardless of the error level has to implement.
12
+ */
13
+ trait LoggerTrait
14
+ {
15
+ /**
16
+ * System is unusable.
17
+ *
18
+ * @param string $message
19
+ * @param array $context
20
+ *
21
+ * @return void
22
+ */
23
+ public function emergency($message, array $context = array())
24
+ {
25
+ $this->log(LogLevel::EMERGENCY, $message, $context);
26
+ }
27
+
28
+ /**
29
+ * Action must be taken immediately.
30
+ *
31
+ * Example: Entire website down, database unavailable, etc. This should
32
+ * trigger the SMS alerts and wake you up.
33
+ *
34
+ * @param string $message
35
+ * @param array $context
36
+ *
37
+ * @return void
38
+ */
39
+ public function alert($message, array $context = array())
40
+ {
41
+ $this->log(LogLevel::ALERT, $message, $context);
42
+ }
43
+
44
+ /**
45
+ * Critical conditions.
46
+ *
47
+ * Example: Application component unavailable, unexpected exception.
48
+ *
49
+ * @param string $message
50
+ * @param array $context
51
+ *
52
+ * @return void
53
+ */
54
+ public function critical($message, array $context = array())
55
+ {
56
+ $this->log(LogLevel::CRITICAL, $message, $context);
57
+ }
58
+
59
+ /**
60
+ * Runtime errors that do not require immediate action but should typically
61
+ * be logged and monitored.
62
+ *
63
+ * @param string $message
64
+ * @param array $context
65
+ *
66
+ * @return void
67
+ */
68
+ public function error($message, array $context = array())
69
+ {
70
+ $this->log(LogLevel::ERROR, $message, $context);
71
+ }
72
+
73
+ /**
74
+ * Exceptional occurrences that are not errors.
75
+ *
76
+ * Example: Use of deprecated APIs, poor use of an API, undesirable things
77
+ * that are not necessarily wrong.
78
+ *
79
+ * @param string $message
80
+ * @param array $context
81
+ *
82
+ * @return void
83
+ */
84
+ public function warning($message, array $context = array())
85
+ {
86
+ $this->log(LogLevel::WARNING, $message, $context);
87
+ }
88
+
89
+ /**
90
+ * Normal but significant events.
91
+ *
92
+ * @param string $message
93
+ * @param array $context
94
+ *
95
+ * @return void
96
+ */
97
+ public function notice($message, array $context = array())
98
+ {
99
+ $this->log(LogLevel::NOTICE, $message, $context);
100
+ }
101
+
102
+ /**
103
+ * Interesting events.
104
+ *
105
+ * Example: User logs in, SQL logs.
106
+ *
107
+ * @param string $message
108
+ * @param array $context
109
+ *
110
+ * @return void
111
+ */
112
+ public function info($message, array $context = array())
113
+ {
114
+ $this->log(LogLevel::INFO, $message, $context);
115
+ }
116
+
117
+ /**
118
+ * Detailed debug information.
119
+ *
120
+ * @param string $message
121
+ * @param array $context
122
+ *
123
+ * @return void
124
+ */
125
+ public function debug($message, array $context = array())
126
+ {
127
+ $this->log(LogLevel::DEBUG, $message, $context);
128
+ }
129
+
130
+ /**
131
+ * Logs with an arbitrary level.
132
+ *
133
+ * @param mixed $level
134
+ * @param string $message
135
+ * @param array $context
136
+ *
137
+ * @return void
138
+ */
139
+ abstract public function log($level, $message, array $context = array());
140
+ }
vendor/psr/log/Psr/Log/NullLogger.php ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Psr\Log;
4
+
5
+ /**
6
+ * This Logger can be used to avoid conditional log calls.
7
+ *
8
+ * Logging should always be optional, and if no logger is provided to your
9
+ * library creating a NullLogger instance to have something to throw logs at
10
+ * is a good way to avoid littering your code with `if ($this->logger) { }`
11
+ * blocks.
12
+ */
13
+ class NullLogger extends AbstractLogger
14
+ {
15
+ /**
16
+ * Logs with an arbitrary level.
17
+ *
18
+ * @param mixed $level
19
+ * @param string $message
20
+ * @param array $context
21
+ *
22
+ * @return void
23
+ */
24
+ public function log($level, $message, array $context = array())
25
+ {
26
+ // noop
27
+ }
28
+ }
vendor/psr/log/Psr/Log/Test/LoggerInterfaceTest.php ADDED
@@ -0,0 +1,140 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Psr\Log\Test;
4
+
5
+ use Psr\Log\LoggerInterface;
6
+ use Psr\Log\LogLevel;
7
+
8
+ /**
9
+ * Provides a base test class for ensuring compliance with the LoggerInterface.
10
+ *
11
+ * Implementors can extend the class and implement abstract methods to run this
12
+ * as part of their test suite.
13
+ */
14
+ abstract class LoggerInterfaceTest extends \PHPUnit_Framework_TestCase
15
+ {
16
+ /**
17
+ * @return LoggerInterface
18
+ */
19
+ abstract public function getLogger();
20
+
21
+ /**
22
+ * This must return the log messages in order.
23
+ *
24
+ * The simple formatting of the messages is: "<LOG LEVEL> <MESSAGE>".
25
+ *
26
+ * Example ->error('Foo') would yield "error Foo".
27
+ *
28
+ * @return string[]
29
+ */
30
+ abstract public function getLogs();
31
+
32
+ public function testImplements()
33
+ {
34
+ $this->assertInstanceOf('Psr\Log\LoggerInterface', $this->getLogger());
35
+ }
36
+
37
+ /**
38
+ * @dataProvider provideLevelsAndMessages
39
+ */
40
+ public function testLogsAtAllLevels($level, $message)
41
+ {
42
+ $logger = $this->getLogger();
43
+ $logger->{$level}($message, array('user' => 'Bob'));
44
+ $logger->log($level, $message, array('user' => 'Bob'));
45
+
46
+ $expected = array(
47
+ $level.' message of level '.$level.' with context: Bob',
48
+ $level.' message of level '.$level.' with context: Bob',
49
+ );
50
+ $this->assertEquals($expected, $this->getLogs());
51
+ }
52
+
53
+ public function provideLevelsAndMessages()
54
+ {
55
+ return array(
56
+ LogLevel::EMERGENCY => array(LogLevel::EMERGENCY, 'message of level emergency with context: {user}'),
57
+ LogLevel::ALERT => array(LogLevel::ALERT, 'message of level alert with context: {user}'),
58
+ LogLevel::CRITICAL => array(LogLevel::CRITICAL, 'message of level critical with context: {user}'),
59
+ LogLevel::ERROR => array(LogLevel::ERROR, 'message of level error with context: {user}'),
60
+ LogLevel::WARNING => array(LogLevel::WARNING, 'message of level warning with context: {user}'),
61
+ LogLevel::NOTICE => array(LogLevel::NOTICE, 'message of level notice with context: {user}'),
62
+ LogLevel::INFO => array(LogLevel::INFO, 'message of level info with context: {user}'),
63
+ LogLevel::DEBUG => array(LogLevel::DEBUG, 'message of level debug with context: {user}'),
64
+ );
65
+ }
66
+
67
+ /**
68
+ * @expectedException \Psr\Log\InvalidArgumentException
69
+ */
70
+ public function testThrowsOnInvalidLevel()
71
+ {
72
+ $logger = $this->getLogger();
73
+ $logger->log('invalid level', 'Foo');
74
+ }
75
+
76
+ public function testContextReplacement()
77
+ {
78
+ $logger = $this->getLogger();
79
+ $logger->info('{Message {nothing} {user} {foo.bar} a}', array('user' => 'Bob', 'foo.bar' => 'Bar'));
80
+
81
+ $expected = array('info {Message {nothing} Bob Bar a}');
82
+ $this->assertEquals($expected, $this->getLogs());
83
+ }
84
+
85
+ public function testObjectCastToString()
86
+ {
87
+ if (method_exists($this, 'createPartialMock')) {
88
+ $dummy = $this->createPartialMock('Psr\Log\Test\DummyTest', array('__toString'));
89
+ } else {
90
+ $dummy = $this->getMock('Psr\Log\Test\DummyTest', array('__toString'));
91
+ }
92
+ $dummy->expects($this->once())
93
+ ->method('__toString')
94
+ ->will($this->returnValue('DUMMY'));
95
+
96
+ $this->getLogger()->warning($dummy);
97
+
98
+ $expected = array('warning DUMMY');
99
+ $this->assertEquals($expected, $this->getLogs());
100
+ }
101
+
102
+ public function testContextCanContainAnything()
103
+ {
104
+ $context = array(
105
+ 'bool' => true,
106
+ 'null' => null,
107
+ 'string' => 'Foo',
108
+ 'int' => 0,
109
+ 'float' => 0.5,
110
+ 'nested' => array('with object' => new DummyTest),
111
+ 'object' => new \DateTime,
112
+ 'resource' => fopen('php://memory', 'r'),
113
+ );
114
+
115
+ $this->getLogger()->warning('Crazy context data', $context);
116
+
117
+ $expected = array('warning Crazy context data');
118
+ $this->assertEquals($expected, $this->getLogs());
119
+ }
120
+
121
+ public function testContextExceptionKeyCanBeExceptionOrOtherValues()
122
+ {
123
+ $logger = $this->getLogger();
124
+ $logger->warning('Random message', array('exception' => 'oops'));
125
+ $logger->critical('Uncaught Exception!', array('exception' => new \LogicException('Fail')));
126
+
127
+ $expected = array(
128
+ 'warning Random message',
129
+ 'critical Uncaught Exception!'
130
+ );
131
+ $this->assertEquals($expected, $this->getLogs());
132
+ }
133
+ }
134
+
135
+ class DummyTest
136
+ {
137
+ public function __toString()
138
+ {
139
+ }
140
+ }
vendor/psr/log/Psr/Log/Test/index.php ADDED
File without changes
vendor/psr/log/Psr/Log/index.php ADDED
File without changes
vendor/psr/log/Psr/index.php ADDED
File without changes
vendor/psr/log/composer.json ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "psr/log",
3
+ "description": "Common interface for logging libraries",
4
+ "keywords": ["psr", "psr-3", "log"],
5
+ "homepage": "https://github.com/php-fig/log",
6
+ "license": "MIT",
7
+ "authors": [
8
+ {
9
+ "name": "PHP-FIG",
10
+ "homepage": "http://www.php-fig.org/"
11
+ }
12
+ ],
13
+ "require": {
14
+ "php": ">=5.3.0"
15
+ },
16
+ "autoload": {
17
+ "psr-4": {
18
+ "Psr\\Log\\": "Psr/Log/"
19
+ }
20
+ },
21
+ "extra": {
22
+ "branch-alias": {
23
+ "dev-master": "1.0.x-dev"
24
+ }
25
+ }
26
+ }
vendor/psr/log/index.php ADDED
File without changes
vendor/sensiolabs/index.php ADDED
File without changes
vendor/sensiolabs/security-checker/.gitignore ADDED
@@ -0,0 +1,2 @@
 
 
1
+ composer.lock
2
+ /vendor/
vendor/sensiolabs/security-checker/SensioLabs/Security/Command/SecurityCheckerCommand.php ADDED
@@ -0,0 +1,114 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the SensioLabs Security Checker.
5
+ *
6
+ * (c) Fabien Potencier
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace SensioLabs\Security\Command;
13
+
14
+ use SensioLabs\Security\SecurityChecker;
15
+ use Symfony\Component\Console\Command\Command;
16
+ use Symfony\Component\Console\Input\InputInterface;
17
+ use Symfony\Component\Console\Output\OutputInterface;
18
+ use Symfony\Component\Console\Input\InputArgument;
19
+ use Symfony\Component\Console\Input\InputOption;
20
+ use SensioLabs\Security\Exception\ExceptionInterface;
21
+ use SensioLabs\Security\Formatters\JsonFormatter;
22
+ use SensioLabs\Security\Formatters\SimpleFormatter;
23
+ use SensioLabs\Security\Formatters\TextFormatter;
24
+
25
+ class SecurityCheckerCommand extends Command
26
+ {
27
+ private $checker;
28
+
29
+ public function __construct(SecurityChecker $checker)
30
+ {
31
+ $this->checker = $checker;
32
+
33
+ parent::__construct();
34
+ }
35
+
36
+ /**
37
+ * @see Command
38
+ */
39
+ protected function configure()
40
+ {
41
+ $this
42
+ ->setName('security:check')
43
+ ->setDefinition(array(
44
+ new InputArgument('lockfile', InputArgument::OPTIONAL, 'The path to the composer.lock file', 'composer.lock'),
45
+ new InputOption('format', '', InputOption::VALUE_REQUIRED, 'The output format', 'text'),
46
+ new InputOption('end-point', '', InputOption::VALUE_REQUIRED, 'The security checker server URL'),
47
+ new InputOption('timeout', '', InputOption::VALUE_REQUIRED, 'The HTTP timeout in seconds'),
48
+ ))
49
+ ->setDescription('Checks security issues in your project dependencies')
50
+ ->setHelp(<<<EOF
51
+ The <info>%command.name%</info> command looks for security issues in the
52
+ project dependencies:
53
+
54
+ <info>php %command.full_name%</info>
55
+
56
+ You can also pass the path to a <info>composer.lock</info> file as an argument:
57
+
58
+ <info>php %command.full_name% /path/to/composer.lock</info>
59
+
60
+ By default, the command displays the result in plain text, but you can also
61
+ configure it to output JSON instead by using the <info>--format</info> option:
62
+
63
+ <info>php %command.full_name% /path/to/composer.lock --format=json</info>
64
+ EOF
65
+ );
66
+ }
67
+
68
+ /**
69
+ * @see Command
70
+ * @see SecurityChecker
71
+ */
72
+ protected function execute(InputInterface $input, OutputInterface $output)
73
+ {
74
+ if ($endPoint = $input->getOption('end-point')) {
75
+ $this->checker->getCrawler()->setEndPoint($endPoint);
76
+ }
77
+
78
+ if ($timeout = $input->getOption('timeout')) {
79
+ $this->checker->getCrawler()->setTimeout($timeout);
80
+ }
81
+
82
+ try {
83
+ $vulnerabilities = $this->checker->check($input->getArgument('lockfile'));
84
+ } catch (ExceptionInterface $e) {
85
+ $output->writeln($this->getHelperSet()->get('formatter')->formatBlock($e->getMessage(), 'error', true));
86
+
87
+ return 1;
88
+ }
89
+
90
+ switch ($input->getOption('format')) {
91
+ case 'json':
92
+ $formatter = new JsonFormatter();
93
+ break;
94
+ case 'simple':
95
+ $formatter = new SimpleFormatter($this->getHelperSet()->get('formatter'));
96
+ break;
97
+ case 'text':
98
+ default:
99
+ $formatter = new TextFormatter($this->getHelperSet()->get('formatter'));
100
+ }
101
+
102
+ if (!is_array($vulnerabilities)) {
103
+ $output->writeln($this->getHelperSet()->get('formatter')->formatBlock('Security Checker Server returned garbage.', 'error', true));
104
+
105
+ return 127;
106
+ }
107
+
108
+ $formatter->displayResults($output, $input->getArgument('lockfile'), $vulnerabilities);
109
+
110
+ if ($this->checker->getLastVulnerabilityCount() > 0) {
111
+ return 1;
112
+ }
113
+ }
114
+ }
vendor/sensiolabs/security-checker/SensioLabs/Security/Command/index.php ADDED
File without changes
vendor/sensiolabs/security-checker/SensioLabs/Security/Crawler/BaseCrawler.php ADDED
@@ -0,0 +1,106 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the SensioLabs Security Checker.
5
+ *
6
+ * (c) Fabien Potencier
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace SensioLabs\Security\Crawler;
13
+
14
+ use SensioLabs\Security\Exception\RuntimeException;
15
+
16
+ /**
17
+ * @internal
18
+ */
19
+ abstract class BaseCrawler implements CrawlerInterface
20
+ {
21
+ protected $endPoint = 'https://security.sensiolabs.org/check_lock';
22
+ protected $timeout = 20;
23
+
24
+ /**
25
+ * {@inheritdoc}
26
+ */
27
+ public function setTimeout($timeout)
28
+ {
29
+ $this->timeout = $timeout;
30
+ }
31
+
32
+ /**
33
+ * {@inheritdoc}
34
+ */
35
+ public function setEndPoint($endPoint)
36
+ {
37
+ $this->endPoint = $endPoint;
38
+ }
39
+
40
+ /**
41
+ * {@inheritdoc}
42
+ */
43
+ public function check($lock)
44
+ {
45
+ $certFile = $this->getCertFile();
46
+
47
+ try {
48
+ list($headers, $body) = $this->doCheck($lock, $certFile);
49
+ } catch (\Exception $e) {
50
+ if (__DIR__.'/../Resources/security.sensiolabs.org.crt' !== $certFile) {
51
+ unlink($certFile);
52
+ }
53
+
54
+ throw $e;
55
+ }
56
+
57
+ if (!(preg_match('/X-Alerts: (\d+)/', $headers, $matches) || 2 == count($matches))) {
58
+ throw new RuntimeException('The web service did not return alerts count.');
59
+ }
60
+
61
+ return array((int) $matches[1], json_decode($body, true));
62
+ }
63
+
64
+ /**
65
+ * @return array An array where the first element is a headers string and second one the response body
66
+ */
67
+ abstract protected function doCheck($lock, $certFile);
68
+
69
+ protected function getLockContents($lock)
70
+ {
71
+ $contents = json_decode(file_get_contents($lock), true);
72
+ $packages = array('packages' => array(), 'packages-dev' => array());
73
+ foreach (array('packages', 'packages-dev') as $key) {
74
+ if (!is_array($contents[$key])) {
75
+ continue;
76
+ }
77
+ foreach ($contents[$key] as $package) {
78
+ $data = array(
79
+ 'name' => $package['name'],
80
+ 'version' => $package['version'],
81
+ );
82
+ if (isset($package['time']) && false !== strpos($package['version'], 'dev')) {
83
+ $data['time'] = $package['time'];
84
+ }
85
+ $packages[$key][] = $data;
86
+ }
87
+ }
88
+
89
+ return json_encode($packages);
90
+ }
91
+
92
+ private function getCertFile()
93
+ {
94
+ $certFile = __DIR__.'/../Resources/security.sensiolabs.org.crt';
95
+ if ('phar://' !== substr(__FILE__, 0, 7)) {
96
+ return $certFile;
97
+ }
98
+
99
+ $tmpFile = tempnam(sys_get_temp_dir(), 'sls');
100
+ if (false === @copy($certFile, $tmpFile)) {
101
+ throw new RuntimeException(sprintf('Unable to copy the certificate in "%s".', $tmpFile));
102
+ }
103
+
104
+ return $tmpFile;
105
+ }
106
+ }
vendor/sensiolabs/security-checker/SensioLabs/Security/Crawler/CrawlerInterface.php ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the SensioLabs Security Checker.
5
+ *
6
+ * (c) Fabien Potencier
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace SensioLabs\Security\Crawler;
13
+
14
+ /**
15
+ * @internal
16
+ */
17
+ interface CrawlerInterface
18
+ {
19
+ /**
20
+ * Checks a Composer lock file.
21
+ *
22
+ * @param string $lock The path to the composer.lock file
23
+ *
24
+ * @return An array of two items: the number of vulnerabilities and an array of vulnerabilities
25
+ */
26
+ public function check($lock);
27
+
28
+ public function setTimeout($timeout);
29
+
30
+ public function setEndPoint($endPoint);
31
+ }
vendor/sensiolabs/security-checker/SensioLabs/Security/Crawler/CurlCrawler.php ADDED
@@ -0,0 +1,98 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the SensioLabs Security Checker.
5
+ *
6
+ * (c) Fabien Potencier
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace SensioLabs\Security\Crawler;
13
+
14
+ use Composer\CaBundle\CaBundle;
15
+ use SensioLabs\Security\Exception\HttpException;
16
+ use SensioLabs\Security\Exception\RuntimeException;
17
+ use SensioLabs\Security\SecurityChecker;
18
+
19
+ /**
20
+ * @internal
21
+ */
22
+ class CurlCrawler extends BaseCrawler
23
+ {
24
+ public function __construct()
25
+ {
26
+ if (!function_exists('curl_init')) {
27
+ throw new RuntimeException('cURL is required to use the cURL crawler.');
28
+ }
29
+ }
30
+
31
+ /**
32
+ * {@inheritdoc}
33
+ */
34
+ protected function doCheck($lock, $certFile)
35
+ {
36
+ if (false === $curl = curl_init()) {
37
+ throw new RuntimeException('Unable to create a cURL handle.');
38
+ }
39
+ $tmplock = tempnam(sys_get_temp_dir(), 'sensiolabs_security');
40
+ $handle = fopen($tmplock, 'w');
41
+ fwrite($handle, $this->getLockContents($lock));
42
+ fclose($handle);
43
+
44
+ $postFields = array('lock' => PHP_VERSION_ID >= 50500 ? new \CurlFile($tmplock) : '@'.$tmplock);
45
+
46
+ curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
47
+ curl_setopt($curl, CURLOPT_HEADER, true);
48
+ curl_setopt($curl, CURLOPT_URL, $this->endPoint);
49
+ curl_setopt($curl, CURLOPT_HTTPHEADER, array('Accept: application/json'));
50
+ curl_setopt($curl, CURLOPT_POSTFIELDS, $postFields);
51
+ curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, $this->timeout);
52
+ curl_setopt($curl, CURLOPT_TIMEOUT, 10);
53
+ curl_setopt($curl, CURLOPT_FOLLOWLOCATION, ini_get('open_basedir') ? 0 : 1);
54
+ curl_setopt($curl, CURLOPT_MAXREDIRS, 3);
55
+ curl_setopt($curl, CURLOPT_FAILONERROR, false);
56
+ curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 1);
57
+ curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);
58
+ curl_setopt($curl, CURLOPT_USERAGENT, sprintf('SecurityChecker-CLI/%s CURL PHP', SecurityChecker::VERSION));
59
+
60
+ $caPathOrFile = CaBundle::getSystemCaRootBundlePath();
61
+ if (is_dir($caPathOrFile) || (is_link($caPathOrFile) && is_dir(readlink($caPathOrFile)))) {
62
+ curl_setopt($curl, CURLOPT_CAPATH, $caPathOrFile);
63
+ } else {
64
+ curl_setopt($curl, CURLOPT_CAINFO, $caPathOrFile);
65
+ }
66
+
67
+ $response = curl_exec($curl);
68
+
69
+ unlink($tmplock);
70
+
71
+ if (false === $response) {
72
+ $error = curl_error($curl);
73
+ curl_close($curl);
74
+
75
+ throw new RuntimeException(sprintf('An error occurred: %s.', $error));
76
+ }
77
+
78
+ $headersSize = curl_getinfo($curl, CURLINFO_HEADER_SIZE);
79
+ $headers = substr($response, 0, $headersSize);
80
+ $body = substr($response, $headersSize);
81
+
82
+ $statusCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
83
+ curl_close($curl);
84
+
85
+ if (400 == $statusCode) {
86
+ $data = json_decode($body, true);
87
+ $error = $data['error'];
88
+
89
+ throw new RuntimeException($error);
90
+ }
91
+
92
+ if (200 != $statusCode) {
93
+ throw new HttpException(sprintf('The web service failed for an unknown reason (HTTP %s).', $statusCode), $statusCode);
94
+ }
95
+
96
+ return array($headers, $body);
97
+ }
98
+ }
vendor/sensiolabs/security-checker/SensioLabs/Security/Crawler/DefaultCrawler.php ADDED
@@ -0,0 +1,49 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the SensioLabs Security Checker.
5
+ *
6
+ * (c) Fabien Potencier
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace SensioLabs\Security\Crawler;
13
+
14
+ /**
15
+ * @internal
16
+ */
17
+ class DefaultCrawler implements CrawlerInterface
18
+ {
19
+ private $crawler;
20
+
21
+ public function __construct()
22
+ {
23
+ $this->crawler = function_exists('curl_init') ? new CurlCrawler() : new FileGetContentsCrawler();
24
+ }
25
+
26
+ /**
27
+ * {@inheritdoc}
28
+ */
29
+ public function check($lock)
30
+ {
31
+ return $this->crawler->check($lock);
32
+ }
33
+
34
+ /**
35
+ * {@inheritdoc}
36
+ */
37
+ public function setTimeout($timeout)
38
+ {
39
+ $this->crawler->setTimeout($timeout);
40
+ }
41
+
42
+ /**
43
+ * {@inheritdoc}
44
+ */
45
+ public function setEndPoint($endPoint)
46
+ {
47
+ $this->crawler->setEndPoint($endPoint);
48
+ }
49
+ }
vendor/sensiolabs/security-checker/SensioLabs/Security/Crawler/FileGetContentsCrawler.php ADDED
@@ -0,0 +1,89 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the SensioLabs Security Checker.
5
+ *
6
+ * (c) Fabien Potencier
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace SensioLabs\Security\Crawler;
13
+
14
+ use Composer\CaBundle\CaBundle;
15
+ use SensioLabs\Security\Exception\HttpException;
16
+ use SensioLabs\Security\Exception\RuntimeException;
17
+ use SensioLabs\Security\SecurityChecker;
18
+
19
+ /**
20
+ * @internal
21
+ */
22
+ class FileGetContentsCrawler extends BaseCrawler
23
+ {
24
+ /**
25
+ * {@inheritdoc}
26
+ */
27
+ protected function doCheck($lock, $certFile)
28
+ {
29
+ $boundary = '------------------------'.md5(microtime(true));
30
+ $opts = array(
31
+ 'http' => array(
32
+ 'method' => 'POST',
33
+ 'header' => "Content-Type: multipart/form-data; boundary=$boundary\r\nAccept: application/json",
34
+ 'content' => "--$boundary\r\nContent-Disposition: form-data; name=\"lock\"; filename=\"$lock\"\r\nContent-Type: application/octet-stream\r\n\r\n".$this->getLockContents($lock)."\r\n--$boundary--\r\n",
35
+ 'ignore_errors' => true,
36
+ 'follow_location' => true,
37
+ 'max_redirects' => 3,
38
+ 'timeout' => $this->timeout,
39
+ 'user_agent' => sprintf('SecurityChecker-CLI/%s FGC PHP', SecurityChecker::VERSION),
40
+ ),
41
+ 'ssl' => array(
42
+ 'verify_peer' => 1,
43
+ 'verify_host' => 2,
44
+ ),
45
+ );
46
+
47
+ $caPathOrFile = CaBundle::getSystemCaRootBundlePath();
48
+ if (is_dir($caPathOrFile) || (is_link($caPathOrFile) && is_dir(readlink($caPathOrFile)))) {
49
+ $opts['ssl']['capath'] = $caPathOrFile;
50
+ } else {
51
+ $opts['ssl']['cafile'] = $caPathOrFile;
52
+ }
53
+
54
+ $context = stream_context_create($opts);
55
+ $level = error_reporting(0);
56
+ $body = file_get_contents($this->endPoint, 0, $context);
57
+ error_reporting($level);
58
+ if (false === $body) {
59
+ $error = error_get_last();
60
+
61
+ throw new RuntimeException(sprintf('An error occurred: %s.', $error['message']));
62
+ }
63
+
64
+ // status code
65
+ if (!preg_match('{HTTP/\d\.\d (\d+) }i', $http_response_header[0], $match)) {
66
+ throw new RuntimeException('An unknown error occurred.');
67
+ }
68
+
69
+ $statusCode = $match[1];
70
+ if (400 == $statusCode) {
71
+ $data = json_decode($body, true);
72
+
73
+ throw new RuntimeException($data['error']);
74
+ }
75
+
76
+ if (200 != $statusCode) {
77
+ throw new HttpException(sprintf('The web service failed for an unknown reason (HTTP %s).', $statusCode), $statusCode);
78
+ }
79
+
80
+ $headers = '';
81
+ foreach ($http_response_header as $header) {
82
+ if (false !== strpos($header, 'X-Alerts: ')) {
83
+ $headers = $header;
84
+ }
85
+ }
86
+
87
+ return array($headers, $body);
88
+ }
89
+ }
vendor/sensiolabs/security-checker/SensioLabs/Security/Crawler/index.php ADDED
File without changes
vendor/sensiolabs/security-checker/SensioLabs/Security/Exception/ExceptionInterface.php ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the SensioLabs Security Checker.
5
+ *
6
+ * (c) Fabien Potencier
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace SensioLabs\Security\Exception;
13
+
14
+ interface ExceptionInterface
15
+ {
16
+ }
vendor/sensiolabs/security-checker/SensioLabs/Security/Exception/HttpException.php ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the SensioLabs Security Checker.
5
+ *
6
+ * (c) Fabien Potencier
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace SensioLabs\Security\Exception;
13
+
14
+ class HttpException extends RuntimeException
15
+ {
16
+ }
vendor/sensiolabs/security-checker/SensioLabs/Security/Exception/RuntimeException.php ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the SensioLabs Security Checker.
5
+ *
6
+ * (c) Fabien Potencier
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace SensioLabs\Security\Exception;
13
+
14
+ class RuntimeException extends \RuntimeException implements ExceptionInterface
15
+ {
16
+ }
vendor/sensiolabs/security-checker/SensioLabs/Security/Exception/index.php ADDED
File without changes
vendor/sensiolabs/security-checker/SensioLabs/Security/Formatters/FormatterInterface.php ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the SensioLabs Security Checker.
5
+ *
6
+ * (c) Fabien Potencier
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace SensioLabs\Security\Formatters;
13
+
14
+ use Symfony\Component\Console\Output\OutputInterface;
15
+
16
+ interface FormatterInterface
17
+ {
18
+ /**
19
+ * Displays a security report as json.
20
+ *
21
+ * @param OutputInterface $output
22
+ * @param string $lockFilePath The file path to the checked lock file
23
+ * @param array $vulnerabilities An array of vulnerabilities
24
+ */
25
+ public function displayResults(OutputInterface $output, $lockFilePath, array $vulnerabilities);
26
+ }
vendor/sensiolabs/security-checker/SensioLabs/Security/Formatters/JsonFormatter.php ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the SensioLabs Security Checker.
5
+ *
6
+ * (c) Fabien Potencier
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace SensioLabs\Security\Formatters;
13
+
14
+ use Symfony\Component\Console\Output\OutputInterface;
15
+
16
+ class JsonFormatter implements FormatterInterface
17
+ {
18
+ /**
19
+ * Displays a security report as json.
20
+ *
21
+ * @param OutputInterface $output
22
+ * @param string $lockFilePath The file path to the checked lock file
23
+ * @param array $vulnerabilities An array of vulnerabilities
24
+ */
25
+ public function displayResults(OutputInterface $output, $lockFilePath, array $vulnerabilities)
26
+ {
27
+ if (defined('JSON_PRETTY_PRINT')) {
28
+ $output->write(json_encode($vulnerabilities, JSON_PRETTY_PRINT));
29
+ } else {
30
+ $output->write(json_encode($vulnerabilities));
31
+ }
32
+ }
33
+ }
vendor/sensiolabs/security-checker/SensioLabs/Security/Formatters/SimpleFormatter.php ADDED
@@ -0,0 +1,68 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the SensioLabs Security Checker.
5
+ *
6
+ * (c) Fabien Potencier
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace SensioLabs\Security\Formatters;
13
+
14
+ use Symfony\Component\Console\Output\OutputInterface;
15
+ use Symfony\Component\Console\Helper\FormatterHelper;
16
+
17
+ class SimpleFormatter implements FormatterInterface
18
+ {
19
+ public function __construct(FormatterHelper $formatter)
20
+ {
21
+ $this->formatter = $formatter;
22
+ }
23
+
24
+ /**
25
+ * Displays a security report as simple plain text.
26
+ *
27
+ * @param OutputInterface $output
28
+ * @param string $lockFilePath The file path to the checked lock file
29
+ * @param array $vulnerabilities An array of vulnerabilities
30
+ */
31
+ public function displayResults(OutputInterface $output, $lockFilePath, array $vulnerabilities)
32
+ {
33
+ $output->writeln(sprintf('Security Check Report: <comment>%s</>', realpath($lockFilePath)));
34
+
35
+ if ($count = count($vulnerabilities)) {
36
+ $status = 'CRITICAL';
37
+ $style = 'error';
38
+ } else {
39
+ $status = 'OK';
40
+ $style = 'info';
41
+ }
42
+
43
+ $output->writeln(sprintf('<%s>[%s] %d %s known vulnerabilities</>', $style, $status, $count, 1 === $count ? 'package has' : 'packages have'));
44
+
45
+ if (0 !== $count) {
46
+ $output->write("\n");
47
+
48
+ foreach ($vulnerabilities as $dependency => $issues) {
49
+ $dependencyFullName = $dependency.' ('.$issues['version'].')';
50
+ $output->writeln('<info>'.$dependencyFullName."\n".str_repeat('-', strlen($dependencyFullName))."</>\n");
51
+
52
+ foreach ($issues['advisories'] as $issue => $details) {
53
+ $output->write(' * ');
54
+ if ($details['cve']) {
55
+ $output->write('<comment>'.$details['cve'].': </comment>');
56
+ }
57
+ $output->writeln($details['title']);
58
+
59
+ if ('' !== $details['link']) {
60
+ $output->writeln(' '.$details['link']);
61
+ }
62
+
63
+ $output->writeln('');
64
+ }
65
+ }
66
+ }
67
+ }
68
+ }
vendor/sensiolabs/security-checker/SensioLabs/Security/Formatters/TextFormatter.php ADDED
@@ -0,0 +1,60 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the SensioLabs Security Checker.
5
+ *
6
+ * (c) Fabien Potencier
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace SensioLabs\Security\Formatters;
13
+
14
+ use Symfony\Component\Console\Output\OutputInterface;
15
+ use Symfony\Component\Console\Helper\FormatterHelper;
16
+ use Symfony\Component\Console\Input\ArrayInput;
17
+ use Symfony\Component\Console\Style\SymfonyStyle;
18
+
19
+ class TextFormatter implements FormatterInterface
20
+ {
21
+ public function __construct(FormatterHelper $formatter)
22
+ {
23
+ $this->formatter = $formatter;
24
+ }
25
+
26
+ /**
27
+ * Displays a security report as plain text.
28
+ *
29
+ * @param OutputInterface $output
30
+ * @param string $lockFilePath The file path to the checked lock file
31
+ * @param array $vulnerabilities An array of vulnerabilities
32
+ */
33
+ public function displayResults(OutputInterface $output, $lockFilePath, array $vulnerabilities)
34
+ {
35
+ $output = new SymfonyStyle(new ArrayInput(array()), $output);
36
+ $output->title('Symfony Security Check Report');
37
+ // use ->comment when bumping console to 2.8+
38
+ $output->writeln(sprintf('<fg=default;bg=default> // </>Checked file: <comment>%s</>', realpath($lockFilePath)));
39
+
40
+ if ($count = count($vulnerabilities)) {
41
+ $output->error(sprintf('%d packages have known vulnerabilities.', $count));
42
+ } else {
43
+ $output->success('No packages have known vulnerabilities.');
44
+ }
45
+
46
+ if (0 !== $count) {
47
+ foreach ($vulnerabilities as $dependency => $issues) {
48
+ $output->section(sprintf('%s (%s)', $dependency, $issues['version']));
49
+
50
+ $details = array_map(function ($value) {
51
+ return sprintf("<info>%s</>: %s\n %s", $value['cve'] ?: '(no CVE ID)', $value['title'], $value['link']);
52
+ }, $issues['advisories']);
53
+
54
+ $output->listing($details);
55
+ }
56
+ }
57
+
58
+ $output->note('This checker can only detect vulnerabilities that are referenced in the SensioLabs security advisories database. Execute this command regularly to check the newly discovered vulnerabilities.');
59
+ }
60
+ }
vendor/sensiolabs/security-checker/SensioLabs/Security/Formatters/index.php ADDED
File without changes
vendor/sensiolabs/security-checker/SensioLabs/Security/Resources/index.php ADDED
File without changes
vendor/sensiolabs/security-checker/SensioLabs/Security/Resources/security.sensiolabs.org.crt ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU
3
+ MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs
4
+ IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290
5
+ MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux
6
+ FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h
7
+ bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v
8
+ dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt
9
+ H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9
10
+ uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX
11
+ mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX
12
+ a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN
13
+ E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0
14
+ WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD
15
+ VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0
16
+ Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU
17
+ cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx
18
+ IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN
19
+ AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH
20
+ YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5
21
+ 6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC
22
+ Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX
23
+ c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a
24
+ mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ=
25
+ -----END CERTIFICATE-----
vendor/sensiolabs/security-checker/SensioLabs/Security/SecurityChecker.php ADDED
@@ -0,0 +1,69 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the SensioLabs Security Checker.
5
+ *
6
+ * (c) Fabien Potencier
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace SensioLabs\Security;
13
+
14
+ use SensioLabs\Security\Exception\RuntimeException;
15
+ use SensioLabs\Security\Crawler\CrawlerInterface;
16
+ use SensioLabs\Security\Crawler\DefaultCrawler;
17
+
18
+ class SecurityChecker
19
+ {
20
+ const VERSION = '4';
21
+
22
+ private $vulnerabilityCount;
23
+ private $crawler;
24
+
25
+ public function __construct(CrawlerInterface $crawler = null)
26
+ {
27
+ $this->crawler = null === $crawler ? new DefaultCrawler() : $crawler;
28
+ }
29
+
30
+ /**
31
+ * Checks a composer.lock file.
32
+ *
33
+ * @param string $lock The path to the composer.lock file
34
+ *
35
+ * @return array An array of vulnerabilities
36
+ *
37
+ * @throws RuntimeException When the lock file does not exist
38
+ * @throws RuntimeException When the certificate can not be copied
39
+ */
40
+ public function check($lock)
41
+ {
42
+ if (is_dir($lock) && file_exists($lock.'/composer.lock')) {
43
+ $lock = $lock.'/composer.lock';
44
+ } elseif (preg_match('/composer\.json$/', $lock)) {
45
+ $lock = str_replace('composer.json', 'composer.lock', $lock);
46
+ }
47
+
48
+ if (!is_file($lock)) {
49
+ throw new RuntimeException('Lock file does not exist.');
50
+ }
51
+
52
+ list($this->vulnerabilityCount, $vulnerabilities) = $this->crawler->check($lock);
53
+
54
+ return $vulnerabilities;
55
+ }
56
+
57
+ public function getLastVulnerabilityCount()
58
+ {
59
+ return $this->vulnerabilityCount;
60
+ }
61
+
62
+ /**
63
+ * @return CrawlerInterface
64
+ */
65
+ public function getCrawler()
66
+ {
67
+ return $this->crawler;
68
+ }
69
+ }
vendor/sensiolabs/security-checker/SensioLabs/Security/index.php ADDED
File without changes
vendor/sensiolabs/security-checker/SensioLabs/index.php ADDED
File without changes
vendor/sensiolabs/security-checker/box.json ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "output": "security-checker.phar",
3
+ "chmod": "0755",
4
+ "compactors": [
5
+ "Herrera\\Box\\Compactor\\Php"
6
+ ],
7
+ "extract": false,
8
+ "main": "security-checker",
9
+ "files": [
10
+ "LICENSE"
11
+ ],
12
+ "finder": [
13
+ {
14
+ "name": "*.*",
15
+ "exclude": ["Tests"],
16
+ "in": "vendor"
17
+ },
18
+ {
19
+ "name": ["*.*", "*.crt"],
20
+ "in": "SensioLabs"
21
+ }
22
+ ],
23
+ "stub": true,
24
+ "web": false
25
+ }
vendor/sensiolabs/security-checker/composer.json ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "sensiolabs/security-checker",
3
+ "description": "A security checker for your composer.lock",
4
+ "license": "MIT",
5
+ "authors": [
6
+ {
7
+ "name": "Fabien Potencier",
8
+ "email": "fabien.potencier@gmail.com"
9
+ }
10
+ ],
11
+ "require": {
12
+ "symfony/console": "~2.7|~3.0|~4.0",
13
+ "composer/ca-bundle": "^1.0"
14
+ },
15
+ "bin": ["security-checker"],
16
+ "autoload": {
17
+ "psr-0": { "SensioLabs\\Security": "" }
18
+ },
19
+ "extra": {
20
+ "branch-alias": {
21
+ "dev-master": "4.1-dev"
22
+ }
23
+ }
24
+ }
vendor/sensiolabs/security-checker/index.php ADDED
File without changes
vendor/sensiolabs/security-checker/security-checker ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env php
2
+ <?php
3
+
4
+ /*
5
+ * This file is part of the SensioLabs Security Checker.
6
+ *
7
+ * (c) Fabien Potencier
8
+ *
9
+ * For the full copyright and license information, please view the LICENSE
10
+ * file that was distributed with this source code.
11
+ */
12
+
13
+ function includeIfExists($file)
14
+ {
15
+ if (file_exists($file)) {
16
+ return include $file;
17
+ }
18
+ }
19
+
20
+ if ((!$loader = includeIfExists(__DIR__.'/vendor/autoload.php')) && (!$loader = includeIfExists(__DIR__.'/../../autoload.php'))) {
21
+ die('You must set up the project dependencies, run the following commands:'.PHP_EOL.
22
+ 'curl -sS https://getcomposer.org/installer | php'.PHP_EOL.
23
+ 'php composer.phar install'.PHP_EOL);
24
+ }
25
+
26
+ use Symfony\Component\Console\Application;
27
+ use SensioLabs\Security\Command\SecurityCheckerCommand;
28
+ use SensioLabs\Security\SecurityChecker;
29
+
30
+ $console = new Application('SensioLabs Security Checker', SecurityChecker::VERSION);
31
+ $console->add(new SecurityCheckerCommand(new SecurityChecker()));
32
+ $console->run();
vendor/symfony/console/.gitignore ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ vendor/
2
+ composer.lock
3
+ phpunit.xml
vendor/symfony/console/Application.php ADDED
@@ -0,0 +1,1134 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console;
13
+
14
+ use Symfony\Component\Console\Exception\ExceptionInterface;
15
+ use Symfony\Component\Console\Formatter\OutputFormatter;
16
+ use Symfony\Component\Console\Helper\DebugFormatterHelper;
17
+ use Symfony\Component\Console\Helper\Helper;
18
+ use Symfony\Component\Console\Helper\ProcessHelper;
19
+ use Symfony\Component\Console\Helper\QuestionHelper;
20
+ use Symfony\Component\Console\Input\InputInterface;
21
+ use Symfony\Component\Console\Input\StreamableInputInterface;
22
+ use Symfony\Component\Console\Input\ArgvInput;
23
+ use Symfony\Component\Console\Input\ArrayInput;
24
+ use Symfony\Component\Console\Input\InputDefinition;
25
+ use Symfony\Component\Console\Input\InputOption;
26
+ use Symfony\Component\Console\Input\InputArgument;
27
+ use Symfony\Component\Console\Input\InputAwareInterface;
28
+ use Symfony\Component\Console\Output\OutputInterface;
29
+ use Symfony\Component\Console\Output\ConsoleOutput;
30
+ use Symfony\Component\Console\Output\ConsoleOutputInterface;
31
+ use Symfony\Component\Console\Command\Command;
32
+ use Symfony\Component\Console\Command\HelpCommand;
33
+ use Symfony\Component\Console\Command\ListCommand;
34
+ use Symfony\Component\Console\Helper\HelperSet;
35
+ use Symfony\Component\Console\Helper\FormatterHelper;
36
+ use Symfony\Component\Console\Event\ConsoleCommandEvent;
37
+ use Symfony\Component\Console\Event\ConsoleErrorEvent;
38
+ use Symfony\Component\Console\Event\ConsoleExceptionEvent;
39
+ use Symfony\Component\Console\Event\ConsoleTerminateEvent;
40
+ use Symfony\Component\Console\Exception\CommandNotFoundException;
41
+ use Symfony\Component\Console\Exception\LogicException;
42
+ use Symfony\Component\Debug\Exception\FatalThrowableError;
43
+ use Symfony\Component\EventDispatcher\EventDispatcherInterface;
44
+
45
+ /**
46
+ * An Application is the container for a collection of commands.
47
+ *
48
+ * It is the main entry point of a Console application.
49
+ *
50
+ * This class is optimized for a standard CLI environment.
51
+ *
52
+ * Usage:
53
+ *
54
+ * $app = new Application('myapp', '1.0 (stable)');
55
+ * $app->add(new SimpleCommand());
56
+ * $app->run();
57
+ *
58
+ * @author Fabien Potencier <fabien@symfony.com>
59
+ */
60
+ class Application
61
+ {
62
+ private $commands = array();
63
+ private $wantHelps = false;
64
+ private $runningCommand;
65
+ private $name;
66
+ private $version;
67
+ private $catchExceptions = true;
68
+ private $autoExit = true;
69
+ private $definition;
70
+ private $helperSet;
71
+ private $dispatcher;
72
+ private $terminal;
73
+ private $defaultCommand;
74
+ private $singleCommand;
75
+ private $initialized;
76
+
77
+ /**
78
+ * @param string $name The name of the application
79
+ * @param string $version The version of the application
80
+ */
81
+ public function __construct($name = 'UNKNOWN', $version = 'UNKNOWN')
82
+ {
83
+ $this->name = $name;
84
+ $this->version = $version;
85
+ $this->terminal = new Terminal();
86
+ $this->defaultCommand = 'list';
87
+ }
88
+
89
+ public function setDispatcher(EventDispatcherInterface $dispatcher)
90
+ {
91
+ $this->dispatcher = $dispatcher;
92
+ }
93
+
94
+ /**
95
+ * Runs the current application.
96
+ *
97
+ * @return int 0 if everything went fine, or an error code
98
+ *
99
+ * @throws \Exception When running fails. Bypass this when {@link setCatchExceptions()}.
100
+ */
101
+ public function run(InputInterface $input = null, OutputInterface $output = null)
102
+ {
103
+ putenv('LINES='.$this->terminal->getHeight());
104
+ putenv('COLUMNS='.$this->terminal->getWidth());
105
+
106
+ if (null === $input) {
107
+ $input = new ArgvInput();
108
+ }
109
+
110
+ if (null === $output) {
111
+ $output = new ConsoleOutput();
112
+ }
113
+
114
+ if (null !== $this->dispatcher && $this->dispatcher->hasListeners(ConsoleEvents::EXCEPTION)) {
115
+ @trigger_error(sprintf('The "ConsoleEvents::EXCEPTION" event is deprecated since Symfony 3.3 and will be removed in 4.0. Listen to the "ConsoleEvents::ERROR" event instead.'), E_USER_DEPRECATED);
116
+ }
117
+
118
+ $this->configureIO($input, $output);
119
+
120
+ try {
121
+ $e = null;
122
+ $exitCode = $this->doRun($input, $output);
123
+ } catch (\Exception $e) {
124
+ }
125
+
126
+ if (null !== $e) {
127
+ if (!$this->catchExceptions) {
128
+ throw $e;
129
+ }
130
+
131
+ if ($output instanceof ConsoleOutputInterface) {
132
+ $this->renderException($e, $output->getErrorOutput());
133
+ } else {
134
+ $this->renderException($e, $output);
135
+ }
136
+
137
+ $exitCode = $e->getCode();
138
+ if (is_numeric($exitCode)) {
139
+ $exitCode = (int) $exitCode;
140
+ if (0 === $exitCode) {
141
+ $exitCode = 1;
142
+ }
143
+ } else {
144
+ $exitCode = 1;
145
+ }
146
+ }
147
+
148
+ if ($this->autoExit) {
149
+ if ($exitCode > 255) {
150
+ $exitCode = 255;
151
+ }
152
+
153
+ exit($exitCode);
154
+ }
155
+
156
+ return $exitCode;
157
+ }
158
+
159
+ /**
160
+ * Runs the current application.
161
+ *
162
+ * @return int 0 if everything went fine, or an error code
163
+ */
164
+ public function doRun(InputInterface $input, OutputInterface $output)
165
+ {
166
+ if (true === $input->hasParameterOption(array('--version', '-V'), true)) {
167
+ $output->writeln($this->getLongVersion());
168
+
169
+ return 0;
170
+ }
171
+
172
+ $name = $this->getCommandName($input);
173
+ if (true === $input->hasParameterOption(array('--help', '-h'), true)) {
174
+ if (!$name) {
175
+ $name = 'help';
176
+ $input = new ArrayInput(array('command_name' => $this->defaultCommand));
177
+ } else {
178
+ $this->wantHelps = true;
179
+ }
180
+ }
181
+
182
+ if (!$name) {
183
+ $name = $this->defaultCommand;
184
+ $definition = $this->getDefinition();
185
+ $definition->setArguments(array_merge(
186
+ $definition->getArguments(),
187
+ array(
188
+ 'command' => new InputArgument('command', InputArgument::OPTIONAL, $definition->getArgument('command')->getDescription(), $name),
189
+ )
190
+ ));
191
+ }
192
+
193
+ try {
194
+ $e = $this->runningCommand = null;
195
+ // the command name MUST be the first element of the input
196
+ $command = $this->find($name);
197
+ } catch (\Exception $e) {
198
+ } catch (\Throwable $e) {
199
+ }
200
+ if (null !== $e) {
201
+ if (null !== $this->dispatcher) {
202
+ $event = new ConsoleErrorEvent($input, $output, $e);
203
+ $this->dispatcher->dispatch(ConsoleEvents::ERROR, $event);
204
+ $e = $event->getError();
205
+
206
+ if (0 === $event->getExitCode()) {
207
+ return 0;
208
+ }
209
+ }
210
+
211
+ throw $e;
212
+ }
213
+
214
+ $this->runningCommand = $command;
215
+ $exitCode = $this->doRunCommand($command, $input, $output);
216
+ $this->runningCommand = null;
217
+
218
+ return $exitCode;
219
+ }
220
+
221
+ public function setHelperSet(HelperSet $helperSet)
222
+ {
223
+ $this->helperSet = $helperSet;
224
+ }
225
+
226
+ /**
227
+ * Get the helper set associated with the command.
228
+ *
229
+ * @return HelperSet The HelperSet instance associated with this command
230
+ */
231
+ public function getHelperSet()
232
+ {
233
+ if (!$this->helperSet) {
234
+ $this->helperSet = $this->getDefaultHelperSet();
235
+ }
236
+
237
+ return $this->helperSet;
238
+ }
239
+
240
+ public function setDefinition(InputDefinition $definition)
241
+ {
242
+ $this->definition = $definition;
243
+ }
244
+
245
+ /**
246
+ * Gets the InputDefinition related to this Application.
247
+ *
248
+ * @return InputDefinition The InputDefinition instance
249
+ */
250
+ public function getDefinition()
251
+ {
252
+ if (!$this->definition) {
253
+ $this->definition = $this->getDefaultInputDefinition();
254
+ }
255
+
256
+ if ($this->singleCommand) {
257
+ $inputDefinition = $this->definition;
258
+ $inputDefinition->setArguments();
259
+
260
+ return $inputDefinition;
261
+ }
262
+
263
+ return $this->definition;
264
+ }
265
+
266
+ /**
267
+ * Gets the help message.
268
+ *
269
+ * @return string A help message
270
+ */
271
+ public function getHelp()
272
+ {
273
+ return $this->getLongVersion();
274
+ }
275
+
276
+ /**
277
+ * Gets whether to catch exceptions or not during commands execution.
278
+ *
279
+ * @return bool Whether to catch exceptions or not during commands execution
280
+ */
281
+ public function areExceptionsCaught()
282
+ {
283
+ return $this->catchExceptions;
284
+ }
285
+
286
+ /**
287
+ * Sets whether to catch exceptions or not during commands execution.
288
+ *
289
+ * @param bool $boolean Whether to catch exceptions or not during commands execution
290
+ */
291
+ public function setCatchExceptions($boolean)
292
+ {
293
+ $this->catchExceptions = (bool) $boolean;
294
+ }
295
+
296
+ /**
297
+ * Gets whether to automatically exit after a command execution or not.
298
+ *
299
+ * @return bool Whether to automatically exit after a command execution or not
300
+ */
301
+ public function isAutoExitEnabled()
302
+ {
303
+ return $this->autoExit;
304
+ }
305
+
306
+ /**
307
+ * Sets whether to automatically exit after a command execution or not.
308
+ *
309
+ * @param bool $boolean Whether to automatically exit after a command execution or not
310
+ */
311
+ public function setAutoExit($boolean)
312
+ {
313
+ $this->autoExit = (bool) $boolean;
314
+ }
315
+
316
+ /**
317
+ * Gets the name of the application.
318
+ *
319
+ * @return string The application name
320
+ */
321
+ public function getName()
322
+ {
323
+ return $this->name;
324
+ }
325
+
326
+ /**
327
+ * Sets the application name.
328
+ *
329
+ * @param string $name The application name
330
+ */
331
+ public function setName($name)
332
+ {
333
+ $this->name = $name;
334
+ }
335
+
336
+ /**
337
+ * Gets the application version.
338
+ *
339
+ * @return string The application version
340
+ */
341
+ public function getVersion()
342
+ {
343
+ return $this->version;
344
+ }
345
+
346
+ /**
347
+ * Sets the application version.
348
+ *
349
+ * @param string $version The application version
350
+ */
351
+ public function setVersion($version)
352
+ {
353
+ $this->version = $version;
354
+ }
355
+
356
+ /**
357
+ * Returns the long version of the application.
358
+ *
359
+ * @return string The long application version
360
+ */
361
+ public function getLongVersion()
362
+ {
363
+ if ('UNKNOWN' !== $this->getName()) {
364
+ if ('UNKNOWN' !== $this->getVersion()) {
365
+ return sprintf('%s <info>%s</info>', $this->getName(), $this->getVersion());
366
+ }
367
+
368
+ return $this->getName();
369
+ }
370
+
371
+ return 'Console Tool';
372
+ }
373
+
374
+ /**
375
+ * Registers a new command.
376
+ *
377
+ * @param string $name The command name
378
+ *
379
+ * @return Command The newly created command
380
+ */
381
+ public function register($name)
382
+ {
383
+ return $this->add(new Command($name));
384
+ }
385
+
386
+ /**
387
+ * Adds an array of command objects.
388
+ *
389
+ * If a Command is not enabled it will not be added.
390
+ *
391
+ * @param Command[] $commands An array of commands
392
+ */
393
+ public function addCommands(array $commands)
394
+ {
395
+ foreach ($commands as $command) {
396
+ $this->add($command);
397
+ }
398
+ }
399
+
400
+ /**
401
+ * Adds a command object.
402
+ *
403
+ * If a command with the same name already exists, it will be overridden.
404
+ * If the command is not enabled it will not be added.
405
+ *
406
+ * @return Command|null The registered command if enabled or null
407
+ */
408
+ public function add(Command $command)
409
+ {
410
+ $this->init();
411
+
412
+ $command->setApplication($this);
413
+
414
+ if (!$command->isEnabled()) {
415
+ $command->setApplication(null);
416
+
417
+ return;
418
+ }
419
+
420
+ if (null === $command->getDefinition()) {
421
+ throw new LogicException(sprintf('Command class "%s" is not correctly initialized. You probably forgot to call the parent constructor.', get_class($command)));
422
+ }
423
+
424
+ $this->commands[$command->getName()] = $command;
425
+
426
+ foreach ($command->getAliases() as $alias) {
427
+ $this->commands[$alias] = $command;
428
+ }
429
+
430
+ return $command;
431
+ }
432
+
433
+ /**
434
+ * Returns a registered command by name or alias.
435
+ *
436
+ * @param string $name The command name or alias
437
+ *
438
+ * @return Command A Command object
439
+ *
440
+ * @throws CommandNotFoundException When given command name does not exist
441
+ */
442
+ public function get($name)
443
+ {
444
+ $this->init();
445
+
446
+ if (!isset($this->commands[$name])) {
447
+ throw new CommandNotFoundException(sprintf('The command "%s" does not exist.', $name));
448
+ }
449
+
450
+ $command = $this->commands[$name];
451
+
452
+ if ($this->wantHelps) {
453
+ $this->wantHelps = false;
454
+
455
+ $helpCommand = $this->get('help');
456
+ $helpCommand->setCommand($command);
457
+
458
+ return $helpCommand;
459
+ }
460
+
461
+ return $command;
462
+ }
463
+
464
+ /**
465
+ * Returns true if the command exists, false otherwise.
466
+ *
467
+ * @param string $name The command name or alias
468
+ *
469
+ * @return bool true if the command exists, false otherwise
470
+ */
471
+ public function has($name)
472
+ {
473
+ $this->init();
474
+
475
+ return isset($this->commands[$name]);
476
+ }
477
+
478
+ /**
479
+ * Returns an array of all unique namespaces used by currently registered commands.
480
+ *
481
+ * It does not return the global namespace which always exists.
482
+ *
483
+ * @return string[] An array of namespaces
484
+ */
485
+ public function getNamespaces()
486
+ {
487
+ $namespaces = array();
488
+ foreach ($this->all() as $command) {
489
+ $namespaces = array_merge($namespaces, $this->extractAllNamespaces($command->getName()));
490
+
491
+ foreach ($command->getAliases() as $alias) {
492
+ $namespaces = array_merge($namespaces, $this->extractAllNamespaces($alias));
493
+ }
494
+ }
495
+
496
+ return array_values(array_unique(array_filter($namespaces)));
497
+ }
498
+
499
+ /**
500
+ * Finds a registered namespace by a name or an abbreviation.
501
+ *
502
+ * @param string $namespace A namespace or abbreviation to search for
503
+ *
504
+ * @return string A registered namespace
505
+ *
506
+ * @throws CommandNotFoundException When namespace is incorrect or ambiguous
507
+ */
508
+ public function findNamespace($namespace)
509
+ {
510
+ $allNamespaces = $this->getNamespaces();
511
+ $expr = preg_replace_callback('{([^:]+|)}', function ($matches) { return preg_quote($matches[1]).'[^:]*'; }, $namespace);
512
+ $namespaces = preg_grep('{^'.$expr.'}', $allNamespaces);
513
+
514
+ if (empty($namespaces)) {
515
+ $message = sprintf('There are no commands defined in the "%s" namespace.', $namespace);
516
+
517
+ if ($alternatives = $this->findAlternatives($namespace, $allNamespaces)) {
518
+ if (1 == count($alternatives)) {
519
+ $message .= "\n\nDid you mean this?\n ";
520
+ } else {
521
+ $message .= "\n\nDid you mean one of these?\n ";
522
+ }
523
+
524
+ $message .= implode("\n ", $alternatives);
525
+ }
526
+
527
+ throw new CommandNotFoundException($message, $alternatives);
528
+ }
529
+
530
+ $exact = in_array($namespace, $namespaces, true);
531
+ if (count($namespaces) > 1 && !$exact) {
532
+ throw new CommandNotFoundException(sprintf("The namespace \"%s\" is ambiguous.\nDid you mean one of these?\n%s", $namespace, $this->getAbbreviationSuggestions(array_values($namespaces))), array_values($namespaces));
533
+ }
534
+
535
+ return $exact ? $namespace : reset($namespaces);
536
+ }
537
+
538
+ /**
539
+ * Finds a command by name or alias.
540
+ *
541
+ * Contrary to get, this command tries to find the best
542
+ * match if you give it an abbreviation of a name or alias.
543
+ *
544
+ * @param string $name A command name or a command alias
545
+ *
546
+ * @return Command A Command instance
547
+ *
548
+ * @throws CommandNotFoundException When command name is incorrect or ambiguous
549
+ */
550
+ public function find($name)
551
+ {
552
+ $this->init();
553
+
554
+ $allCommands = array_keys($this->commands);
555
+ $expr = preg_replace_callback('{([^:]+|)}', function ($matches) { return preg_quote($matches[1]).'[^:]*'; }, $name);
556
+ $commands = preg_grep('{^'.$expr.'}', $allCommands);
557
+
558
+ if (empty($commands) || count(preg_grep('{^'.$expr.'$}', $commands)) < 1) {
559
+ if (false !== $pos = strrpos($name, ':')) {
560
+ // check if a namespace exists and contains commands
561
+ $this->findNamespace(substr($name, 0, $pos));
562
+ }
563
+
564
+ $message = sprintf('Command "%s" is not defined.', $name);
565
+
566
+ if ($alternatives = $this->findAlternatives($name, $allCommands)) {
567
+ if (1 == count($alternatives)) {
568
+ $message .= "\n\nDid you mean this?\n ";
569
+ } else {
570
+ $message .= "\n\nDid you mean one of these?\n ";
571
+ }
572
+ $message .= implode("\n ", $alternatives);
573
+ }
574
+
575
+ throw new CommandNotFoundException($message, $alternatives);
576
+ }
577
+
578
+ // filter out aliases for commands which are already on the list
579
+ if (count($commands) > 1) {
580
+ $commandList = $this->commands;
581
+ $commands = array_filter($commands, function ($nameOrAlias) use ($commandList, $commands) {
582
+ $commandName = $commandList[$nameOrAlias]->getName();
583
+
584
+ return $commandName === $nameOrAlias || !in_array($commandName, $commands);
585
+ });
586
+ }
587
+
588
+ $exact = in_array($name, $commands, true);
589
+ if (count($commands) > 1 && !$exact) {
590
+ $usableWidth = $this->terminal->getWidth() - 10;
591
+ $abbrevs = array_values($commands);
592
+ $maxLen = 0;
593
+ foreach ($abbrevs as $abbrev) {
594
+ $maxLen = max(Helper::strlen($abbrev), $maxLen);
595
+ }
596
+ $abbrevs = array_map(function ($cmd) use ($commandList, $usableWidth, $maxLen) {
597
+ $abbrev = str_pad($cmd, $maxLen, ' ').' '.$commandList[$cmd]->getDescription();
598
+
599
+ return Helper::strlen($abbrev) > $usableWidth ? Helper::substr($abbrev, 0, $usableWidth - 3).'...' : $abbrev;
600
+ }, array_values($commands));
601
+ $suggestions = $this->getAbbreviationSuggestions($abbrevs);
602
+
603
+ throw new CommandNotFoundException(sprintf("Command \"%s\" is ambiguous.\nDid you mean one of these?\n%s", $name, $suggestions), array_values($commands));
604
+ }
605
+
606
+ return $this->get($exact ? $name : reset($commands));
607
+ }
608
+
609
+ /**
610
+ * Gets the commands (registered in the given namespace if provided).
611
+ *
612
+ * The array keys are the full names and the values the command instances.
613
+ *
614
+ * @param string $namespace A namespace name
615
+ *
616
+ * @return Command[] An array of Command instances
617
+ */
618
+ public function all($namespace = null)
619
+ {
620
+ $this->init();
621
+
622
+ if (null === $namespace) {
623
+ return $this->commands;
624
+ }
625
+
626
+ $commands = array();
627
+ foreach ($this->commands as $name => $command) {
628
+ if ($namespace === $this->extractNamespace($name, substr_count($namespace, ':') + 1)) {
629
+ $commands[$name] = $command;
630
+ }
631
+ }
632
+
633
+ return $commands;
634
+ }
635
+
636
+ /**
637
+ * Returns an array of possible abbreviations given a set of names.
638
+ *
639
+ * @param array $names An array of names
640
+ *
641
+ * @return array An array of abbreviations
642
+ */
643
+ public static function getAbbreviations($names)
644
+ {
645
+ $abbrevs = array();
646
+ foreach ($names as $name) {
647
+ for ($len = strlen($name); $len > 0; --$len) {
648
+ $abbrev = substr($name, 0, $len);
649
+ $abbrevs[$abbrev][] = $name;
650
+ }
651
+ }
652
+
653
+ return $abbrevs;
654
+ }
655
+
656
+ /**
657
+ * Renders a caught exception.
658
+ */
659
+ public function renderException(\Exception $e, OutputInterface $output)
660
+ {
661
+ $output->writeln('', OutputInterface::VERBOSITY_QUIET);
662
+
663
+ do {
664
+ $title = sprintf(
665
+ ' [%s%s] ',
666
+ get_class($e),
667
+ $output->isVerbose() && 0 !== ($code = $e->getCode()) ? ' ('.$code.')' : ''
668
+ );
669
+
670
+ $len = Helper::strlen($title);
671
+
672
+ $width = $this->terminal->getWidth() ? $this->terminal->getWidth() - 1 : PHP_INT_MAX;
673
+ // HHVM only accepts 32 bits integer in str_split, even when PHP_INT_MAX is a 64 bit integer: https://github.com/facebook/hhvm/issues/1327
674
+ if (defined('HHVM_VERSION') && $width > 1 << 31) {
675
+ $width = 1 << 31;
676
+ }
677
+ $lines = array();
678
+ foreach (preg_split('/\r?\n/', trim($e->getMessage())) as $line) {
679
+ foreach ($this->splitStringByWidth($line, $width - 4) as $line) {
680
+ // pre-format lines to get the right string length
681
+ $lineLength = Helper::strlen($line) + 4;
682
+ $lines[] = array($line, $lineLength);
683
+
684
+ $len = max($lineLength, $len);
685
+ }
686
+ }
687
+
688
+ $messages = array();
689
+ $messages[] = $emptyLine = sprintf('<error>%s</error>', str_repeat(' ', $len));
690
+ $messages[] = sprintf('<error>%s%s</error>', $title, str_repeat(' ', max(0, $len - Helper::strlen($title))));
691
+ foreach ($lines as $line) {
692
+ $messages[] = sprintf('<error> %s %s</error>', OutputFormatter::escape($line[0]), str_repeat(' ', $len - $line[1]));
693
+ }
694
+ $messages[] = $emptyLine;
695
+ $messages[] = '';
696
+
697
+ $output->writeln($messages, OutputInterface::VERBOSITY_QUIET);
698
+
699
+ if (OutputInterface::VERBOSITY_VERBOSE <= $output->getVerbosity()) {
700
+ $output->writeln('<comment>Exception trace:</comment>', OutputInterface::VERBOSITY_QUIET);
701
+
702
+ // exception related properties
703
+ $trace = $e->getTrace();
704
+ array_unshift($trace, array(
705
+ 'function' => '',
706
+ 'file' => null !== $e->getFile() ? $e->getFile() : 'n/a',
707
+ 'line' => null !== $e->getLine() ? $e->getLine() : 'n/a',
708
+ 'args' => array(),
709
+ ));
710
+
711
+ for ($i = 0, $count = count($trace); $i < $count; ++$i) {
712
+ $class = isset($trace[$i]['class']) ? $trace[$i]['class'] : '';
713
+ $type = isset($trace[$i]['type']) ? $trace[$i]['type'] : '';
714
+ $function = $trace[$i]['function'];
715
+ $file = isset($trace[$i]['file']) ? $trace[$i]['file'] : 'n/a';
716
+ $line = isset($trace[$i]['line']) ? $trace[$i]['line'] : 'n/a';
717
+
718
+ $output->writeln(sprintf(' %s%s%s() at <info>%s:%s</info>', $class, $type, $function, $file, $line), OutputInterface::VERBOSITY_QUIET);
719
+ }
720
+
721
+ $output->writeln('', OutputInterface::VERBOSITY_QUIET);
722
+ }
723
+ } while ($e = $e->getPrevious());
724
+
725
+ if (null !== $this->runningCommand) {
726
+ $output->writeln(sprintf('<info>%s</info>', sprintf($this->runningCommand->getSynopsis(), $this->getName())), OutputInterface::VERBOSITY_QUIET);
727
+ $output->writeln('', OutputInterface::VERBOSITY_QUIET);
728
+ }
729
+ }
730
+
731
+ /**
732
+ * Tries to figure out the terminal width in which this application runs.
733
+ *
734
+ * @return int|null
735
+ *
736
+ * @deprecated since version 3.2, to be removed in 4.0. Create a Terminal instance instead.
737
+ */
738
+ protected function getTerminalWidth()
739
+ {
740
+ @trigger_error(sprintf('%s is deprecated as of 3.2 and will be removed in 4.0. Create a Terminal instance instead.', __METHOD__), E_USER_DEPRECATED);
741
+
742
+ return $this->terminal->getWidth();
743
+ }
744
+
745
+ /**
746
+ * Tries to figure out the terminal height in which this application runs.
747
+ *
748
+ * @return int|null
749
+ *
750
+ * @deprecated since version 3.2, to be removed in 4.0. Create a Terminal instance instead.
751
+ */
752
+ protected function getTerminalHeight()
753
+ {
754
+ @trigger_error(sprintf('%s is deprecated as of 3.2 and will be removed in 4.0. Create a Terminal instance instead.', __METHOD__), E_USER_DEPRECATED);
755
+
756
+ return $this->terminal->getHeight();
757
+ }
758
+
759
+ /**
760
+ * Tries to figure out the terminal dimensions based on the current environment.
761
+ *
762
+ * @return array Array containing width and height
763
+ *
764
+ * @deprecated since version 3.2, to be removed in 4.0. Create a Terminal instance instead.
765
+ */
766
+ public function getTerminalDimensions()
767
+ {
768
+ @trigger_error(sprintf('%s is deprecated as of 3.2 and will be removed in 4.0. Create a Terminal instance instead.', __METHOD__), E_USER_DEPRECATED);
769
+
770
+ return array($this->terminal->getWidth(), $this->terminal->getHeight());
771
+ }
772
+
773
+ /**
774
+ * Sets terminal dimensions.
775
+ *
776
+ * Can be useful to force terminal dimensions for functional tests.
777
+ *
778
+ * @param int $width The width
779
+ * @param int $height The height
780
+ *
781
+ * @return $this
782
+ *
783
+ * @deprecated since version 3.2, to be removed in 4.0. Set the COLUMNS and LINES env vars instead.
784
+ */
785
+ public function setTerminalDimensions($width, $height)
786
+ {
787
+ @trigger_error(sprintf('%s is deprecated as of 3.2 and will be removed in 4.0. Set the COLUMNS and LINES env vars instead.', __METHOD__), E_USER_DEPRECATED);
788
+
789
+ putenv('COLUMNS='.$width);
790
+ putenv('LINES='.$height);
791
+
792
+ return $this;
793
+ }
794
+
795
+ /**
796
+ * Configures the input and output instances based on the user arguments and options.
797
+ */
798
+ protected function configureIO(InputInterface $input, OutputInterface $output)
799
+ {
800
+ if (true === $input->hasParameterOption(array('--ansi'), true)) {
801
+ $output->setDecorated(true);
802
+ } elseif (true === $input->hasParameterOption(array('--no-ansi'), true)) {
803
+ $output->setDecorated(false);
804
+ }
805
+
806
+ if (true === $input->hasParameterOption(array('--no-interaction', '-n'), true)) {
807
+ $input->setInteractive(false);
808
+ } elseif (function_exists('posix_isatty')) {
809
+ $inputStream = null;
810
+
811
+ if ($input instanceof StreamableInputInterface) {
812
+ $inputStream = $input->getStream();
813
+ }
814
+
815
+ // This check ensures that calling QuestionHelper::setInputStream() works
816
+ // To be removed in 4.0 (in the same time as QuestionHelper::setInputStream)
817
+ if (!$inputStream && $this->getHelperSet()->has('question')) {
818
+ $inputStream = $this->getHelperSet()->get('question')->getInputStream(false);
819
+ }
820
+
821
+ if (!@posix_isatty($inputStream) && false === getenv('SHELL_INTERACTIVE')) {
822
+ $input->setInteractive(false);
823
+ }
824
+ }
825
+
826
+ if (true === $input->hasParameterOption(array('--quiet', '-q'), true)) {
827
+ $output->setVerbosity(OutputInterface::VERBOSITY_QUIET);
828
+ $input->setInteractive(false);
829
+ } else {
830
+ if ($input->hasParameterOption('-vvv', true) || $input->hasParameterOption('--verbose=3', true) || 3 === $input->getParameterOption('--verbose', false, true)) {
831
+ $output->setVerbosity(OutputInterface::VERBOSITY_DEBUG);
832
+ } elseif ($input->hasParameterOption('-vv', true) || $input->hasParameterOption('--verbose=2', true) || 2 === $input->getParameterOption('--verbose', false, true)) {
833
+ $output->setVerbosity(OutputInterface::VERBOSITY_VERY_VERBOSE);
834
+ } elseif ($input->hasParameterOption('-v', true) || $input->hasParameterOption('--verbose=1', true) || $input->hasParameterOption('--verbose', true) || $input->getParameterOption('--verbose', false, true)) {
835
+ $output->setVerbosity(OutputInterface::VERBOSITY_VERBOSE);
836
+ }
837
+ }
838
+ }
839
+
840
+ /**
841
+ * Runs the current command.
842
+ *
843
+ * If an event dispatcher has been attached to the application,
844
+ * events are also dispatched during the life-cycle of the command.
845
+ *
846
+ * @return int 0 if everything went fine, or an error code
847
+ */
848
+ protected function doRunCommand(Command $command, InputInterface $input, OutputInterface $output)
849
+ {
850
+ foreach ($command->getHelperSet() as $helper) {
851
+ if ($helper instanceof InputAwareInterface) {
852
+ $helper->setInput($input);
853
+ }
854
+ }
855
+
856
+ if (null === $this->dispatcher) {
857
+ return $command->run($input, $output);
858
+ }
859
+
860
+ // bind before the console.command event, so the listeners have access to input options/arguments
861
+ try {
862
+ $command->mergeApplicationDefinition();
863
+ $input->bind($command->getDefinition());
864
+ } catch (ExceptionInterface $e) {
865
+ // ignore invalid options/arguments for now, to allow the event listeners to customize the InputDefinition
866
+ }
867
+
868
+ $event = new ConsoleCommandEvent($command, $input, $output);
869
+ $e = null;
870
+
871
+ try {
872
+ $this->dispatcher->dispatch(ConsoleEvents::COMMAND, $event);
873
+
874
+ if ($event->commandShouldRun()) {
875
+ $exitCode = $command->run($input, $output);
876
+ } else {
877
+ $exitCode = ConsoleCommandEvent::RETURN_CODE_DISABLED;
878
+ }
879
+ } catch (\Exception $e) {
880
+ } catch (\Throwable $e) {
881
+ }
882
+ if (null !== $e) {
883
+ if ($this->dispatcher->hasListeners(ConsoleEvents::EXCEPTION)) {
884
+ $x = $e instanceof \Exception ? $e : new FatalThrowableError($e);
885
+ $event = new ConsoleExceptionEvent($command, $input, $output, $x, $x->getCode());
886
+ $this->dispatcher->dispatch(ConsoleEvents::EXCEPTION, $event);
887
+
888
+ if ($x !== $event->getException()) {
889
+ $e = $event->getException();
890
+ }
891
+ }
892
+ $event = new ConsoleErrorEvent($input, $output, $e, $command);
893
+ $this->dispatcher->dispatch(ConsoleEvents::ERROR, $event);
894
+ $e = $event->getError();
895
+
896
+ if (0 === $exitCode = $event->getExitCode()) {
897
+ $e = null;
898
+ }
899
+ }
900
+
901
+ $event = new ConsoleTerminateEvent($command, $input, $output, $exitCode);
902
+ $this->dispatcher->dispatch(ConsoleEvents::TERMINATE, $event);
903
+
904
+ if (null !== $e) {
905
+ throw $e;
906
+ }
907
+
908
+ return $event->getExitCode();
909
+ }
910
+
911
+ /**
912
+ * Gets the name of the command based on input.
913
+ *
914
+ * @return string The command name
915
+ */
916
+ protected function getCommandName(InputInterface $input)
917
+ {
918
+ return $this->singleCommand ? $this->defaultCommand : $input->getFirstArgument();
919
+ }
920
+
921
+ /**
922
+ * Gets the default input definition.
923
+ *
924
+ * @return InputDefinition An InputDefinition instance
925
+ */
926
+ protected function getDefaultInputDefinition()
927
+ {
928
+ return new InputDefinition(array(
929
+ new InputArgument('command', InputArgument::REQUIRED, 'The command to execute'),
930
+
931
+ new InputOption('--help', '-h', InputOption::VALUE_NONE, 'Display this help message'),
932
+ new InputOption('--quiet', '-q', InputOption::VALUE_NONE, 'Do not output any message'),
933
+ new InputOption('--verbose', '-v|vv|vvv', InputOption::VALUE_NONE, 'Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug'),
934
+ new InputOption('--version', '-V', InputOption::VALUE_NONE, 'Display this application version'),
935
+ new InputOption('--ansi', '', InputOption::VALUE_NONE, 'Force ANSI output'),
936
+ new InputOption('--no-ansi', '', InputOption::VALUE_NONE, 'Disable ANSI output'),
937
+ new InputOption('--no-interaction', '-n', InputOption::VALUE_NONE, 'Do not ask any interactive question'),
938
+ ));
939
+ }
940
+
941
+ /**
942
+ * Gets the default commands that should always be available.
943
+ *
944
+ * @return Command[] An array of default Command instances
945
+ */
946
+ protected function getDefaultCommands()
947
+ {
948
+ return array(new HelpCommand(), new ListCommand());
949
+ }
950
+
951
+ /**
952
+ * Gets the default helper set with the helpers that should always be available.
953
+ *
954
+ * @return HelperSet A HelperSet instance
955
+ */
956
+ protected function getDefaultHelperSet()
957
+ {
958
+ return new HelperSet(array(
959
+ new FormatterHelper(),
960
+ new DebugFormatterHelper(),
961
+ new ProcessHelper(),
962
+ new QuestionHelper(),
963
+ ));
964
+ }
965
+
966
+ /**
967
+ * Returns abbreviated suggestions in string format.
968
+ *
969
+ * @param array $abbrevs Abbreviated suggestions to convert
970
+ *
971
+ * @return string A formatted string of abbreviated suggestions
972
+ */
973
+ private function getAbbreviationSuggestions($abbrevs)
974
+ {
975
+ return ' '.implode("\n ", $abbrevs);
976
+ }
977
+
978
+ /**
979
+ * Returns the namespace part of the command name.
980
+ *
981
+ * This method is not part of public API and should not be used directly.
982
+ *
983
+ * @param string $name The full name of the command
984
+ * @param string $limit The maximum number of parts of the namespace
985
+ *
986
+ * @return string The namespace of the command
987
+ */
988
+ public function extractNamespace($name, $limit = null)
989
+ {
990
+ $parts = explode(':', $name);
991
+ array_pop($parts);
992
+
993
+ return implode(':', null === $limit ? $parts : array_slice($parts, 0, $limit));
994
+ }
995
+
996
+ /**
997
+ * Finds alternative of $name among $collection,
998
+ * if nothing is found in $collection, try in $abbrevs.
999
+ *
1000
+ * @param string $name The string
1001
+ * @param iterable $collection The collection
1002
+ *
1003
+ * @return string[] A sorted array of similar string
1004
+ */
1005
+ private function findAlternatives($name, $collection)
1006
+ {
1007
+ $threshold = 1e3;
1008
+ $alternatives = array();
1009
+
1010
+ $collectionParts = array();
1011
+ foreach ($collection as $item) {
1012
+ $collectionParts[$item] = explode(':', $item);
1013
+ }
1014
+
1015
+ foreach (explode(':', $name) as $i => $subname) {
1016
+ foreach ($collectionParts as $collectionName => $parts) {
1017
+ $exists = isset($alternatives[$collectionName]);
1018
+ if (!isset($parts[$i]) && $exists) {
1019
+ $alternatives[$collectionName] += $threshold;
1020
+ continue;
1021
+ } elseif (!isset($parts[$i])) {
1022
+ continue;
1023
+ }
1024
+
1025
+ $lev = levenshtein($subname, $parts[$i]);
1026
+ if ($lev <= strlen($subname) / 3 || '' !== $subname && false !== strpos($parts[$i], $subname)) {
1027
+ $alternatives[$collectionName] = $exists ? $alternatives[$collectionName] + $lev : $lev;
1028
+ } elseif ($exists) {
1029
+ $alternatives[$collectionName] += $threshold;
1030
+ }
1031
+ }
1032
+ }
1033
+
1034
+ foreach ($collection as $item) {
1035
+ $lev = levenshtein($name, $item);
1036
+ if ($lev <= strlen($name) / 3 || false !== strpos($item, $name)) {
1037
+ $alternatives[$item] = isset($alternatives[$item]) ? $alternatives[$item] - $lev : $lev;
1038
+ }
1039
+ }
1040
+
1041
+ $alternatives = array_filter($alternatives, function ($lev) use ($threshold) { return $lev < 2 * $threshold; });
1042
+ ksort($alternatives, SORT_NATURAL | SORT_FLAG_CASE);
1043
+
1044
+ return array_keys($alternatives);
1045
+ }
1046
+
1047
+ /**
1048
+ * Sets the default Command name.
1049
+ *
1050
+ * @param string $commandName The Command name
1051
+ * @param bool $isSingleCommand Set to true if there is only one command in this application
1052
+ *
1053
+ * @return self
1054
+ */
1055
+ public function setDefaultCommand($commandName, $isSingleCommand = false)
1056
+ {
1057
+ $this->defaultCommand = $commandName;
1058
+
1059
+ if ($isSingleCommand) {
1060
+ // Ensure the command exist
1061
+ $this->find($commandName);
1062
+
1063
+ $this->singleCommand = true;
1064
+ }
1065
+
1066
+ return $this;
1067
+ }
1068
+
1069
+ private function splitStringByWidth($string, $width)
1070
+ {
1071
+ // str_split is not suitable for multi-byte characters, we should use preg_split to get char array properly.
1072
+ // additionally, array_slice() is not enough as some character has doubled width.
1073
+ // we need a function to split string not by character count but by string width
1074
+ if (false === $encoding = mb_detect_encoding($string, null, true)) {
1075
+ return str_split($string, $width);
1076
+ }
1077
+
1078
+ $utf8String = mb_convert_encoding($string, 'utf8', $encoding);
1079
+ $lines = array();
1080
+ $line = '';
1081
+ foreach (preg_split('//u', $utf8String) as $char) {
1082
+ // test if $char could be appended to current line
1083
+ if (mb_strwidth($line.$char, 'utf8') <= $width) {
1084
+ $line .= $char;
1085
+ continue;
1086
+ }
1087
+ // if not, push current line to array and make new line
1088
+ $lines[] = str_pad($line, $width);
1089
+ $line = $char;
1090
+ }
1091
+
1092
+ $lines[] = count($lines) ? str_pad($line, $width) : $line;
1093
+
1094
+ mb_convert_variables($encoding, 'utf8', $lines);
1095
+
1096
+ return $lines;
1097
+ }
1098
+
1099
+ /**
1100
+ * Returns all namespaces of the command name.
1101
+ *
1102
+ * @param string $name The full name of the command
1103
+ *
1104
+ * @return string[] The namespaces of the command
1105
+ */
1106
+ private function extractAllNamespaces($name)
1107
+ {
1108
+ // -1 as third argument is needed to skip the command short name when exploding
1109
+ $parts = explode(':', $name, -1);
1110
+ $namespaces = array();
1111
+
1112
+ foreach ($parts as $part) {
1113
+ if (count($namespaces)) {
1114
+ $namespaces[] = end($namespaces).':'.$part;
1115
+ } else {
1116
+ $namespaces[] = $part;
1117
+ }
1118
+ }
1119
+
1120
+ return $namespaces;
1121
+ }
1122
+
1123
+ private function init()
1124
+ {
1125
+ if ($this->initialized) {
1126
+ return;
1127
+ }
1128
+ $this->initialized = true;
1129
+
1130
+ foreach ($this->getDefaultCommands() as $command) {
1131
+ $this->add($command);
1132
+ }
1133
+ }
1134
+ }
vendor/symfony/console/Command/Command.php ADDED
@@ -0,0 +1,645 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Command;
13
+
14
+ use Symfony\Component\Console\Exception\ExceptionInterface;
15
+ use Symfony\Component\Console\Input\InputDefinition;
16
+ use Symfony\Component\Console\Input\InputOption;
17
+ use Symfony\Component\Console\Input\InputArgument;
18
+ use Symfony\Component\Console\Input\InputInterface;
19
+ use Symfony\Component\Console\Output\OutputInterface;
20
+ use Symfony\Component\Console\Application;
21
+ use Symfony\Component\Console\Helper\HelperSet;
22
+ use Symfony\Component\Console\Exception\InvalidArgumentException;
23
+ use Symfony\Component\Console\Exception\LogicException;
24
+
25
+ /**
26
+ * Base class for all commands.
27
+ *
28
+ * @author Fabien Potencier <fabien@symfony.com>
29
+ */
30
+ class Command
31
+ {
32
+ private $application;
33
+ private $name;
34
+ private $processTitle;
35
+ private $aliases = array();
36
+ private $definition;
37
+ private $hidden = false;
38
+ private $help;
39
+ private $description;
40
+ private $ignoreValidationErrors = false;
41
+ private $applicationDefinitionMerged = false;
42
+ private $applicationDefinitionMergedWithArgs = false;
43
+ private $code;
44
+ private $synopsis = array();
45
+ private $usages = array();
46
+ private $helperSet;
47
+
48
+ /**
49
+ * @param string|null $name The name of the command; passing null means it must be set in configure()
50
+ *
51
+ * @throws LogicException When the command name is empty
52
+ */
53
+ public function __construct($name = null)
54
+ {
55
+ $this->definition = new InputDefinition();
56
+
57
+ if (null !== $name) {
58
+ $this->setName($name);
59
+ }
60
+
61
+ $this->configure();
62
+
63
+ if (!$this->name) {
64
+ throw new LogicException(sprintf('The command defined in "%s" cannot have an empty name.', get_class($this)));
65
+ }
66
+ }
67
+
68
+ /**
69
+ * Ignores validation errors.
70
+ *
71
+ * This is mainly useful for the help command.
72
+ */
73
+ public function ignoreValidationErrors()
74
+ {
75
+ $this->ignoreValidationErrors = true;
76
+ }
77
+
78
+ public function setApplication(Application $application = null)
79
+ {
80
+ $this->application = $application;
81
+ if ($application) {
82
+ $this->setHelperSet($application->getHelperSet());
83
+ } else {
84
+ $this->helperSet = null;
85
+ }
86
+ }
87
+
88
+ public function setHelperSet(HelperSet $helperSet)
89
+ {
90
+ $this->helperSet = $helperSet;
91
+ }
92
+
93
+ /**
94
+ * Gets the helper set.
95
+ *
96
+ * @return HelperSet A HelperSet instance
97
+ */
98
+ public function getHelperSet()
99
+ {
100
+ return $this->helperSet;
101
+ }
102
+
103
+ /**
104
+ * Gets the application instance for this command.
105
+ *
106
+ * @return Application An Application instance
107
+ */
108
+ public function getApplication()
109
+ {
110
+ return $this->application;
111
+ }
112
+
113
+ /**
114
+ * Checks whether the command is enabled or not in the current environment.
115
+ *
116
+ * Override this to check for x or y and return false if the command can not
117
+ * run properly under the current conditions.
118
+ *
119
+ * @return bool
120
+ */
121
+ public function isEnabled()
122
+ {
123
+ return true;
124
+ }
125
+
126
+ /**
127
+ * Configures the current command.
128
+ */
129
+ protected function configure()
130
+ {
131
+ }
132
+
133
+ /**
134
+ * Executes the current command.
135
+ *
136
+ * This method is not abstract because you can use this class
137
+ * as a concrete class. In this case, instead of defining the
138
+ * execute() method, you set the code to execute by passing
139
+ * a Closure to the setCode() method.
140
+ *
141
+ * @return null|int null or 0 if everything went fine, or an error code
142
+ *
143
+ * @throws LogicException When this abstract method is not implemented
144
+ *
145
+ * @see setCode()
146
+ */
147
+ protected function execute(InputInterface $input, OutputInterface $output)
148
+ {
149
+ throw new LogicException('You must override the execute() method in the concrete command class.');
150
+ }
151
+
152
+ /**
153
+ * Interacts with the user.
154
+ *
155
+ * This method is executed before the InputDefinition is validated.
156
+ * This means that this is the only place where the command can
157
+ * interactively ask for values of missing required arguments.
158
+ */
159
+ protected function interact(InputInterface $input, OutputInterface $output)
160
+ {
161
+ }
162
+
163
+ /**
164
+ * Initializes the command just after the input has been validated.
165
+ *
166
+ * This is mainly useful when a lot of commands extends one main command
167
+ * where some things need to be initialized based on the input arguments and options.
168
+ */
169
+ protected function initialize(InputInterface $input, OutputInterface $output)
170
+ {
171
+ }
172
+
173
+ /**
174
+ * Runs the command.
175
+ *
176
+ * The code to execute is either defined directly with the
177
+ * setCode() method or by overriding the execute() method
178
+ * in a sub-class.
179
+ *
180
+ * @return int The command exit code
181
+ *
182
+ * @throws \Exception When binding input fails. Bypass this by calling {@link ignoreValidationErrors()}.
183
+ *
184
+ * @see setCode()
185
+ * @see execute()
186
+ */
187
+ public function run(InputInterface $input, OutputInterface $output)
188
+ {
189
+ // force the creation of the synopsis before the merge with the app definition
190
+ $this->getSynopsis(true);
191
+ $this->getSynopsis(false);
192
+
193
+ // add the application arguments and options
194
+ $this->mergeApplicationDefinition();
195
+
196
+ // bind the input against the command specific arguments/options
197
+ try {
198
+ $input->bind($this->definition);
199
+ } catch (ExceptionInterface $e) {
200
+ if (!$this->ignoreValidationErrors) {
201
+ throw $e;
202
+ }
203
+ }
204
+
205
+ $this->initialize($input, $output);
206
+
207
+ if (null !== $this->processTitle) {
208
+ if (function_exists('cli_set_process_title')) {
209
+ if (false === @cli_set_process_title($this->processTitle)) {
210
+ if ('Darwin' === PHP_OS) {
211
+ $output->writeln('<comment>Running "cli_get_process_title" as an unprivileged user is not supported on MacOS.</comment>');
212
+ } else {
213
+ $error = error_get_last();
214
+ trigger_error($error['message'], E_USER_WARNING);
215
+ }
216
+ }
217
+ } elseif (function_exists('setproctitle')) {
218
+ setproctitle($this->processTitle);
219
+ } elseif (OutputInterface::VERBOSITY_VERY_VERBOSE === $output->getVerbosity()) {
220
+ $output->writeln('<comment>Install the proctitle PECL to be able to change the process title.</comment>');
221
+ }
222
+ }
223
+
224
+ if ($input->isInteractive()) {
225
+ $this->interact($input, $output);
226
+ }
227
+
228
+ // The command name argument is often omitted when a command is executed directly with its run() method.
229
+ // It would fail the validation if we didn't make sure the command argument is present,
230
+ // since it's required by the application.
231
+ if ($input->hasArgument('command') && null === $input->getArgument('command')) {
232
+ $input->setArgument('command', $this->getName());
233
+ }
234
+
235
+ $input->validate();
236
+
237
+ if ($this->code) {
238
+ $statusCode = call_user_func($this->code, $input, $output);
239
+ } else {
240
+ $statusCode = $this->execute($input, $output);
241
+ }
242
+
243
+ return is_numeric($statusCode) ? (int) $statusCode : 0;
244
+ }
245
+
246
+ /**
247
+ * Sets the code to execute when running this command.
248
+ *
249
+ * If this method is used, it overrides the code defined
250
+ * in the execute() method.
251
+ *
252
+ * @param callable $code A callable(InputInterface $input, OutputInterface $output)
253
+ *
254
+ * @return $this
255
+ *
256
+ * @throws InvalidArgumentException
257
+ *
258
+ * @see execute()
259
+ */
260
+ public function setCode(callable $code)
261
+ {
262
+ if ($code instanceof \Closure) {
263
+ $r = new \ReflectionFunction($code);
264
+ if (null === $r->getClosureThis()) {
265
+ if (\PHP_VERSION_ID < 70000) {
266
+ // Bug in PHP5: https://bugs.php.net/bug.php?id=64761
267
+ // This means that we cannot bind static closures and therefore we must
268
+ // ignore any errors here. There is no way to test if the closure is
269
+ // bindable.
270
+ $code = @\Closure::bind($code, $this);
271
+ } else {
272
+ $code = \Closure::bind($code, $this);
273
+ }
274
+ }
275
+ }
276
+
277
+ $this->code = $code;
278
+
279
+ return $this;
280
+ }
281
+
282
+ /**
283
+ * Merges the application definition with the command definition.
284
+ *
285
+ * This method is not part of public API and should not be used directly.
286
+ *
287
+ * @param bool $mergeArgs Whether to merge or not the Application definition arguments to Command definition arguments
288
+ */
289
+ public function mergeApplicationDefinition($mergeArgs = true)
290
+ {
291
+ if (null === $this->application || (true === $this->applicationDefinitionMerged && ($this->applicationDefinitionMergedWithArgs || !$mergeArgs))) {
292
+ return;
293
+ }
294
+
295
+ $this->definition->addOptions($this->application->getDefinition()->getOptions());
296
+
297
+ if ($mergeArgs) {
298
+ $currentArguments = $this->definition->getArguments();
299
+ $this->definition->setArguments($this->application->getDefinition()->getArguments());
300
+ $this->definition->addArguments($currentArguments);
301
+ }
302
+
303
+ $this->applicationDefinitionMerged = true;
304
+ if ($mergeArgs) {
305
+ $this->applicationDefinitionMergedWithArgs = true;
306
+ }
307
+ }
308
+
309
+ /**
310
+ * Sets an array of argument and option instances.
311
+ *
312
+ * @param array|InputDefinition $definition An array of argument and option instances or a definition instance
313
+ *
314
+ * @return $this
315
+ */
316
+ public function setDefinition($definition)
317
+ {
318
+ if ($definition instanceof InputDefinition) {
319
+ $this->definition = $definition;
320
+ } else {
321
+ $this->definition->setDefinition($definition);
322
+ }
323
+
324
+ $this->applicationDefinitionMerged = false;
325
+
326
+ return $this;
327
+ }
328
+
329
+ /**
330
+ * Gets the InputDefinition attached to this Command.
331
+ *
332
+ * @return InputDefinition An InputDefinition instance
333
+ */
334
+ public function getDefinition()
335
+ {
336
+ return $this->definition;
337
+ }
338
+
339
+ /**
340
+ * Gets the InputDefinition to be used to create representations of this Command.
341
+ *
342
+ * Can be overridden to provide the original command representation when it would otherwise
343
+ * be changed by merging with the application InputDefinition.
344
+ *
345
+ * This method is not part of public API and should not be used directly.
346
+ *
347
+ * @return InputDefinition An InputDefinition instance
348
+ */
349
+ public function getNativeDefinition()
350
+ {
351
+ return $this->getDefinition();
352
+ }
353
+
354
+ /**
355
+ * Adds an argument.
356
+ *
357
+ * @param string $name The argument name
358
+ * @param int $mode The argument mode: InputArgument::REQUIRED or InputArgument::OPTIONAL
359
+ * @param string $description A description text
360
+ * @param mixed $default The default value (for InputArgument::OPTIONAL mode only)
361
+ *
362
+ * @return $this
363
+ */
364
+ public function addArgument($name, $mode = null, $description = '', $default = null)
365
+ {
366
+ $this->definition->addArgument(new InputArgument($name, $mode, $description, $default));
367
+
368
+ return $this;
369
+ }
370
+
371
+ /**
372
+ * Adds an option.
373
+ *
374
+ * @param string $name The option name
375
+ * @param string $shortcut The shortcut (can be null)
376
+ * @param int $mode The option mode: One of the InputOption::VALUE_* constants
377
+ * @param string $description A description text
378
+ * @param mixed $default The default value (must be null for InputOption::VALUE_NONE)
379
+ *
380
+ * @return $this
381
+ */
382
+ public function addOption($name, $shortcut = null, $mode = null, $description = '', $default = null)
383
+ {
384
+ $this->definition->addOption(new InputOption($name, $shortcut, $mode, $description, $default));
385
+
386
+ return $this;
387
+ }
388
+
389
+ /**
390
+ * Sets the name of the command.
391
+ *
392
+ * This method can set both the namespace and the name if
393
+ * you separate them by a colon (:)
394
+ *
395
+ * $command->setName('foo:bar');
396
+ *
397
+ * @param string $name The command name
398
+ *
399
+ * @return $this
400
+ *
401
+ * @throws InvalidArgumentException When the name is invalid
402
+ */
403
+ public function setName($name)
404
+ {
405
+ $this->validateName($name);
406
+
407
+ $this->name = $name;
408
+
409
+ return $this;
410
+ }
411
+
412
+ /**
413
+ * Sets the process title of the command.
414
+ *
415
+ * This feature should be used only when creating a long process command,
416
+ * like a daemon.
417
+ *
418
+ * PHP 5.5+ or the proctitle PECL library is required
419
+ *
420
+ * @param string $title The process title
421
+ *
422
+ * @return $this
423
+ */
424
+ public function setProcessTitle($title)
425
+ {
426
+ $this->processTitle = $title;
427
+
428
+ return $this;
429
+ }
430
+
431
+ /**
432
+ * Returns the command name.
433
+ *
434
+ * @return string The command name
435
+ */
436
+ public function getName()
437
+ {
438
+ return $this->name;
439
+ }
440
+
441
+ /**
442
+ * @param bool $hidden Whether or not the command should be hidden from the list of commands
443
+ *
444
+ * @return Command The current instance
445
+ */
446
+ public function setHidden($hidden)
447
+ {
448
+ $this->hidden = (bool) $hidden;
449
+
450
+ return $this;
451
+ }
452
+
453
+ /**
454
+ * @return bool whether the command should be publicly shown or not
455
+ */
456
+ public function isHidden()
457
+ {
458
+ return $this->hidden;
459
+ }
460
+
461
+ /**
462
+ * Sets the description for the command.
463
+ *
464
+ * @param string $description The description for the command
465
+ *
466
+ * @return $this
467
+ */
468
+ public function setDescription($description)
469
+ {
470
+ $this->description = $description;
471
+
472
+ return $this;
473
+ }
474
+
475
+ /**
476
+ * Returns the description for the command.
477
+ *
478
+ * @return string The description for the command
479
+ */
480
+ public function getDescription()
481
+ {
482
+ return $this->description;
483
+ }
484
+
485
+ /**
486
+ * Sets the help for the command.
487
+ *
488
+ * @param string $help The help for the command
489
+ *
490
+ * @return $this
491
+ */
492
+ public function setHelp($help)
493
+ {
494
+ $this->help = $help;
495
+
496
+ return $this;
497
+ }
498
+
499
+ /**
500
+ * Returns the help for the command.
501
+ *
502
+ * @return string The help for the command
503
+ */
504
+ public function getHelp()
505
+ {
506
+ return $this->help;
507
+ }
508
+
509
+ /**
510
+ * Returns the processed help for the command replacing the %command.name% and
511
+ * %command.full_name% patterns with the real values dynamically.
512
+ *
513
+ * @return string The processed help for the command
514
+ */
515
+ public function getProcessedHelp()
516
+ {
517
+ $name = $this->name;
518
+
519
+ $placeholders = array(
520
+ '%command.name%',
521
+ '%command.full_name%',
522
+ );
523
+ $replacements = array(
524
+ $name,
525
+ $_SERVER['PHP_SELF'].' '.$name,
526
+ );
527
+
528
+ return str_replace($placeholders, $replacements, $this->getHelp() ?: $this->getDescription());
529
+ }
530
+
531
+ /**
532
+ * Sets the aliases for the command.
533
+ *
534
+ * @param string[] $aliases An array of aliases for the command
535
+ *
536
+ * @return $this
537
+ *
538
+ * @throws InvalidArgumentException When an alias is invalid
539
+ */
540
+ public function setAliases($aliases)
541
+ {
542
+ if (!is_array($aliases) && !$aliases instanceof \Traversable) {
543
+ throw new InvalidArgumentException('$aliases must be an array or an instance of \Traversable');
544
+ }
545
+
546
+ foreach ($aliases as $alias) {
547
+ $this->validateName($alias);
548
+ }
549
+
550
+ $this->aliases = $aliases;
551
+
552
+ return $this;
553
+ }
554
+
555
+ /**
556
+ * Returns the aliases for the command.
557
+ *
558
+ * @return array An array of aliases for the command
559
+ */
560
+ public function getAliases()
561
+ {
562
+ return $this->aliases;
563
+ }
564
+
565
+ /**
566
+ * Returns the synopsis for the command.
567
+ *
568
+ * @param bool $short Whether to show the short version of the synopsis (with options folded) or not
569
+ *
570
+ * @return string The synopsis
571
+ */
572
+ public function getSynopsis($short = false)
573
+ {
574
+ $key = $short ? 'short' : 'long';
575
+
576
+ if (!isset($this->synopsis[$key])) {
577
+ $this->synopsis[$key] = trim(sprintf('%s %s', $this->name, $this->definition->getSynopsis($short)));
578
+ }
579
+
580
+ return $this->synopsis[$key];
581
+ }
582
+
583
+ /**
584
+ * Add a command usage example.
585
+ *
586
+ * @param string $usage The usage, it'll be prefixed with the command name
587
+ *
588
+ * @return $this
589
+ */
590
+ public function addUsage($usage)
591
+ {
592
+ if (0 !== strpos($usage, $this->name)) {
593
+ $usage = sprintf('%s %s', $this->name, $usage);
594
+ }
595
+
596
+ $this->usages[] = $usage;
597
+
598
+ return $this;
599
+ }
600
+
601
+ /**
602
+ * Returns alternative usages of the command.
603
+ *
604
+ * @return array
605
+ */
606
+ public function getUsages()
607
+ {
608
+ return $this->usages;
609
+ }
610
+
611
+ /**
612
+ * Gets a helper instance by name.
613
+ *
614
+ * @param string $name The helper name
615
+ *
616
+ * @return mixed The helper value
617
+ *
618
+ * @throws LogicException if no HelperSet is defined
619
+ * @throws InvalidArgumentException if the helper is not defined
620
+ */
621
+ public function getHelper($name)
622
+ {
623
+ if (null === $this->helperSet) {
624
+ throw new LogicException(sprintf('Cannot retrieve helper "%s" because there is no HelperSet defined. Did you forget to add your command to the application or to set the application on the command using the setApplication() method? You can also set the HelperSet directly using the setHelperSet() method.', $name));
625
+ }
626
+
627
+ return $this->helperSet->get($name);
628
+ }
629
+
630
+ /**
631
+ * Validates a command name.
632
+ *
633
+ * It must be non-empty and parts can optionally be separated by ":".
634
+ *
635
+ * @param string $name
636
+ *
637
+ * @throws InvalidArgumentException When the name is invalid
638
+ */
639
+ private function validateName($name)
640
+ {
641
+ if (!preg_match('/^[^\:]++(\:[^\:]++)*$/', $name)) {
642
+ throw new InvalidArgumentException(sprintf('Command name "%s" is invalid.', $name));
643
+ }
644
+ }
645
+ }
vendor/symfony/console/Command/HelpCommand.php ADDED
@@ -0,0 +1,81 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Command;
13
+
14
+ use Symfony\Component\Console\Helper\DescriptorHelper;
15
+ use Symfony\Component\Console\Input\InputArgument;
16
+ use Symfony\Component\Console\Input\InputOption;
17
+ use Symfony\Component\Console\Input\InputInterface;
18
+ use Symfony\Component\Console\Output\OutputInterface;
19
+
20
+ /**
21
+ * HelpCommand displays the help for a given command.
22
+ *
23
+ * @author Fabien Potencier <fabien@symfony.com>
24
+ */
25
+ class HelpCommand extends Command
26
+ {
27
+ private $command;
28
+
29
+ /**
30
+ * {@inheritdoc}
31
+ */
32
+ protected function configure()
33
+ {
34
+ $this->ignoreValidationErrors();
35
+
36
+ $this
37
+ ->setName('help')
38
+ ->setDefinition(array(
39
+ new InputArgument('command_name', InputArgument::OPTIONAL, 'The command name', 'help'),
40
+ new InputOption('format', null, InputOption::VALUE_REQUIRED, 'The output format (txt, xml, json, or md)', 'txt'),
41
+ new InputOption('raw', null, InputOption::VALUE_NONE, 'To output raw command help'),
42
+ ))
43
+ ->setDescription('Displays help for a command')
44
+ ->setHelp(<<<'EOF'
45
+ The <info>%command.name%</info> command displays help for a given command:
46
+
47
+ <info>php %command.full_name% list</info>
48
+
49
+ You can also output the help in other formats by using the <comment>--format</comment> option:
50
+
51
+ <info>php %command.full_name% --format=xml list</info>
52
+
53
+ To display the list of available commands, please use the <info>list</info> command.
54
+ EOF
55
+ )
56
+ ;
57
+ }
58
+
59
+ public function setCommand(Command $command)
60
+ {
61
+ $this->command = $command;
62
+ }
63
+
64
+ /**
65
+ * {@inheritdoc}
66
+ */
67
+ protected function execute(InputInterface $input, OutputInterface $output)
68
+ {
69
+ if (null === $this->command) {
70
+ $this->command = $this->getApplication()->find($input->getArgument('command_name'));
71
+ }
72
+
73
+ $helper = new DescriptorHelper();
74
+ $helper->describe($output, $this->command, array(
75
+ 'format' => $input->getOption('format'),
76
+ 'raw_text' => $input->getOption('raw'),
77
+ ));
78
+
79
+ $this->command = null;
80
+ }
81
+ }
vendor/symfony/console/Command/ListCommand.php ADDED
@@ -0,0 +1,90 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Command;
13
+
14
+ use Symfony\Component\Console\Helper\DescriptorHelper;
15
+ use Symfony\Component\Console\Input\InputArgument;
16
+ use Symfony\Component\Console\Input\InputOption;
17
+ use Symfony\Component\Console\Input\InputInterface;
18
+ use Symfony\Component\Console\Output\OutputInterface;
19
+ use Symfony\Component\Console\Input\InputDefinition;
20
+
21
+ /**
22
+ * ListCommand displays the list of all available commands for the application.
23
+ *
24
+ * @author Fabien Potencier <fabien@symfony.com>
25
+ */
26
+ class ListCommand extends Command
27
+ {
28
+ /**
29
+ * {@inheritdoc}
30
+ */
31
+ protected function configure()
32
+ {
33
+ $this
34
+ ->setName('list')
35
+ ->setDefinition($this->createDefinition())
36
+ ->setDescription('Lists commands')
37
+ ->setHelp(<<<'EOF'
38
+ The <info>%command.name%</info> command lists all commands:
39
+
40
+ <info>php %command.full_name%</info>
41
+
42
+ You can also display the commands for a specific namespace:
43
+
44
+ <info>php %command.full_name% test</info>
45
+
46
+ You can also output the information in other formats by using the <comment>--format</comment> option:
47
+
48
+ <info>php %command.full_name% --format=xml</info>
49
+
50
+ It's also possible to get raw list of commands (useful for embedding command runner):
51
+
52
+ <info>php %command.full_name% --raw</info>
53
+ EOF
54
+ )
55
+ ;
56
+ }
57
+
58
+ /**
59
+ * {@inheritdoc}
60
+ */
61
+ public function getNativeDefinition()
62
+ {
63
+ return $this->createDefinition();
64
+ }
65
+
66
+ /**
67
+ * {@inheritdoc}
68
+ */
69
+ protected function execute(InputInterface $input, OutputInterface $output)
70
+ {
71
+ $helper = new DescriptorHelper();
72
+ $helper->describe($output, $this->getApplication(), array(
73
+ 'format' => $input->getOption('format'),
74
+ 'raw_text' => $input->getOption('raw'),
75
+ 'namespace' => $input->getArgument('namespace'),
76
+ ));
77
+ }
78
+
79
+ /**
80
+ * {@inheritdoc}
81
+ */
82
+ private function createDefinition()
83
+ {
84
+ return new InputDefinition(array(
85
+ new InputArgument('namespace', InputArgument::OPTIONAL, 'The namespace name'),
86
+ new InputOption('raw', null, InputOption::VALUE_NONE, 'To output raw command list'),
87
+ new InputOption('format', null, InputOption::VALUE_REQUIRED, 'The output format (txt, xml, json, or md)', 'txt'),
88
+ ));
89
+ }
90
+ }
vendor/symfony/console/Command/LockableTrait.php ADDED
@@ -0,0 +1,63 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Command;
13
+
14
+ use Symfony\Component\Console\Exception\LogicException;
15
+ use Symfony\Component\Console\Exception\RuntimeException;
16
+ use Symfony\Component\Filesystem\LockHandler;
17
+
18
+ /**
19
+ * Basic lock feature for commands.
20
+ *
21
+ * @author Geoffrey Brier <geoffrey.brier@gmail.com>
22
+ */
23
+ trait LockableTrait
24
+ {
25
+ private $lockHandler;
26
+
27
+ /**
28
+ * Locks a command.
29
+ *
30
+ * @return bool
31
+ */
32
+ private function lock($name = null, $blocking = false)
33
+ {
34
+ if (!class_exists(LockHandler::class)) {
35
+ throw new RuntimeException('To enable the locking feature you must install the symfony/filesystem component.');
36
+ }
37
+
38
+ if (null !== $this->lockHandler) {
39
+ throw new LogicException('A lock is already in place.');
40
+ }
41
+
42
+ $this->lockHandler = new LockHandler($name ?: $this->getName());
43
+
44
+ if (!$this->lockHandler->lock($blocking)) {
45
+ $this->lockHandler = null;
46
+
47
+ return false;
48
+ }
49
+
50
+ return true;
51
+ }
52
+
53
+ /**
54
+ * Releases the command lock if there is one.
55
+ */
56
+ private function release()
57
+ {
58
+ if ($this->lockHandler) {
59
+ $this->lockHandler->release();
60
+ $this->lockHandler = null;
61
+ }
62
+ }
63
+ }
vendor/symfony/console/Command/index.php ADDED
File without changes
vendor/symfony/console/ConsoleEvents.php ADDED
@@ -0,0 +1,60 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console;
13
+
14
+ /**
15
+ * Contains all events dispatched by an Application.
16
+ *
17
+ * @author Francesco Levorato <git@flevour.net>
18
+ */
19
+ final class ConsoleEvents
20
+ {
21
+ /**
22
+ * The COMMAND event allows you to attach listeners before any command is
23
+ * executed by the console. It also allows you to modify the command, input and output
24
+ * before they are handled to the command.
25
+ *
26
+ * @Event("Symfony\Component\Console\Event\ConsoleCommandEvent")
27
+ */
28
+ const COMMAND = 'console.command';
29
+
30
+ /**
31
+ * The TERMINATE event allows you to attach listeners after a command is
32
+ * executed by the console.
33
+ *
34
+ * @Event("Symfony\Component\Console\Event\ConsoleTerminateEvent")
35
+ */
36
+ const TERMINATE = 'console.terminate';
37
+
38
+ /**
39
+ * The EXCEPTION event occurs when an uncaught exception appears
40
+ * while executing Command#run().
41
+ *
42
+ * This event allows you to deal with the exception or
43
+ * to modify the thrown exception.
44
+ *
45
+ * @Event("Symfony\Component\Console\Event\ConsoleExceptionEvent")
46
+ *
47
+ * @deprecated The console.exception event is deprecated since version 3.3 and will be removed in 4.0. Use the console.error event instead.
48
+ */
49
+ const EXCEPTION = 'console.exception';
50
+
51
+ /**
52
+ * The ERROR event occurs when an uncaught exception or error appears.
53
+ *
54
+ * This event allows you to deal with the exception/error or
55
+ * to modify the thrown exception.
56
+ *
57
+ * @Event("Symfony\Component\Console\Event\ConsoleErrorEvent")
58
+ */
59
+ const ERROR = 'console.error';
60
+ }
vendor/symfony/console/DependencyInjection/AddConsoleCommandPass.php ADDED
@@ -0,0 +1,56 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\DependencyInjection;
13
+
14
+ use Symfony\Component\Console\Command\Command;
15
+ use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
16
+ use Symfony\Component\DependencyInjection\ContainerBuilder;
17
+ use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
18
+
19
+ /**
20
+ * Registers console commands.
21
+ *
22
+ * @author Grégoire Pineau <lyrixx@lyrixx.info>
23
+ */
24
+ class AddConsoleCommandPass implements CompilerPassInterface
25
+ {
26
+ public function process(ContainerBuilder $container)
27
+ {
28
+ $commandServices = $container->findTaggedServiceIds('console.command', true);
29
+ $serviceIds = array();
30
+
31
+ foreach ($commandServices as $id => $tags) {
32
+ $definition = $container->getDefinition($id);
33
+ $class = $container->getParameterBag()->resolveValue($definition->getClass());
34
+
35
+ if (!$r = $container->getReflectionClass($class)) {
36
+ throw new InvalidArgumentException(sprintf('Class "%s" used for service "%s" cannot be found.', $class, $id));
37
+ }
38
+ if (!$r->isSubclassOf(Command::class)) {
39
+ throw new InvalidArgumentException(sprintf('The service "%s" tagged "console.command" must be a subclass of "%s".', $id, Command::class));
40
+ }
41
+
42
+ $commandId = 'console.command.'.strtolower(str_replace('\\', '_', $class));
43
+ if ($container->hasAlias($commandId) || isset($serviceIds[$commandId])) {
44
+ $commandId = $commandId.'_'.$id;
45
+ }
46
+ if (!$definition->isPublic()) {
47
+ $container->setAlias($commandId, $id);
48
+ $id = $commandId;
49
+ }
50
+
51
+ $serviceIds[$commandId] = $id;
52
+ }
53
+
54
+ $container->setParameter('console.command.ids', $serviceIds);
55
+ }
56
+ }
vendor/symfony/console/DependencyInjection/index.php ADDED
File without changes
vendor/symfony/console/Descriptor/ApplicationDescription.php ADDED
@@ -0,0 +1,152 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Descriptor;
13
+
14
+ use Symfony\Component\Console\Application;
15
+ use Symfony\Component\Console\Command\Command;
16
+ use Symfony\Component\Console\Exception\CommandNotFoundException;
17
+
18
+ /**
19
+ * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
20
+ *
21
+ * @internal
22
+ */
23
+ class ApplicationDescription
24
+ {
25
+ const GLOBAL_NAMESPACE = '_global';
26
+
27
+ private $application;
28
+ private $namespace;
29
+ private $showHidden;
30
+
31
+ /**
32
+ * @var array
33
+ */
34
+ private $namespaces;
35
+
36
+ /**
37
+ * @var Command[]
38
+ */
39
+ private $commands;
40
+
41
+ /**
42
+ * @var Command[]
43
+ */
44
+ private $aliases;
45
+
46
+ /**
47
+ * @param Application $application
48
+ * @param string|null $namespace
49
+ * @param bool $showHidden
50
+ */
51
+ public function __construct(Application $application, $namespace = null, $showHidden = false)
52
+ {
53
+ $this->application = $application;
54
+ $this->namespace = $namespace;
55
+ $this->showHidden = $showHidden;
56
+ }
57
+
58
+ /**
59
+ * @return array
60
+ */
61
+ public function getNamespaces()
62
+ {
63
+ if (null === $this->namespaces) {
64
+ $this->inspectApplication();
65
+ }
66
+
67
+ return $this->namespaces;
68
+ }
69
+
70
+ /**
71
+ * @return Command[]
72
+ */
73
+ public function getCommands()
74
+ {
75
+ if (null === $this->commands) {
76
+ $this->inspectApplication();
77
+ }
78
+
79
+ return $this->commands;
80
+ }
81
+
82
+ /**
83
+ * @param string $name
84
+ *
85
+ * @return Command
86
+ *
87
+ * @throws CommandNotFoundException
88
+ */
89
+ public function getCommand($name)
90
+ {
91
+ if (!isset($this->commands[$name]) && !isset($this->aliases[$name])) {
92
+ throw new CommandNotFoundException(sprintf('Command %s does not exist.', $name));
93
+ }
94
+
95
+ return isset($this->commands[$name]) ? $this->commands[$name] : $this->aliases[$name];
96
+ }
97
+
98
+ private function inspectApplication()
99
+ {
100
+ $this->commands = array();
101
+ $this->namespaces = array();
102
+
103
+ $all = $this->application->all($this->namespace ? $this->application->findNamespace($this->namespace) : null);
104
+ foreach ($this->sortCommands($all) as $namespace => $commands) {
105
+ $names = array();
106
+
107
+ /** @var Command $command */
108
+ foreach ($commands as $name => $command) {
109
+ if (!$command->getName() || (!$this->showHidden && $command->isHidden())) {
110
+ continue;
111
+ }
112
+
113
+ if ($command->getName() === $name) {
114
+ $this->commands[$name] = $command;
115
+ } else {
116
+ $this->aliases[$name] = $command;
117
+ }
118
+
119
+ $names[] = $name;
120
+ }
121
+
122
+ $this->namespaces[$namespace] = array('id' => $namespace, 'commands' => $names);
123
+ }
124
+ }
125
+
126
+ /**
127
+ * @return array
128
+ */
129
+ private function sortCommands(array $commands)
130
+ {
131
+ $namespacedCommands = array();
132
+ $globalCommands = array();
133
+ foreach ($commands as $name => $command) {
134
+ $key = $this->application->extractNamespace($name, 1);
135
+ if (!$key) {
136
+ $globalCommands['_global'][$name] = $command;
137
+ } else {
138
+ $namespacedCommands[$key][$name] = $command;
139
+ }
140
+ }
141
+ ksort($namespacedCommands);
142
+ $namespacedCommands = array_merge($globalCommands, $namespacedCommands);
143
+
144
+ foreach ($namespacedCommands as &$commandsSet) {
145
+ ksort($commandsSet);
146
+ }
147
+ // unset reference to keep scope clear
148
+ unset($commandsSet);
149
+
150
+ return $namespacedCommands;
151
+ }
152
+ }
vendor/symfony/console/Descriptor/Descriptor.php ADDED
@@ -0,0 +1,107 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Descriptor;
13
+
14
+ use Symfony\Component\Console\Application;
15
+ use Symfony\Component\Console\Command\Command;
16
+ use Symfony\Component\Console\Input\InputArgument;
17
+ use Symfony\Component\Console\Input\InputDefinition;
18
+ use Symfony\Component\Console\Input\InputOption;
19
+ use Symfony\Component\Console\Output\OutputInterface;
20
+ use Symfony\Component\Console\Exception\InvalidArgumentException;
21
+
22
+ /**
23
+ * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
24
+ *
25
+ * @internal
26
+ */
27
+ abstract class Descriptor implements DescriptorInterface
28
+ {
29
+ /**
30
+ * @var OutputInterface
31
+ */
32
+ protected $output;
33
+
34
+ /**
35
+ * {@inheritdoc}
36
+ */
37
+ public function describe(OutputInterface $output, $object, array $options = array())
38
+ {
39
+ $this->output = $output;
40
+
41
+ switch (true) {
42
+ case $object instanceof InputArgument:
43
+ $this->describeInputArgument($object, $options);
44
+ break;
45
+ case $object instanceof InputOption:
46
+ $this->describeInputOption($object, $options);
47
+ break;
48
+ case $object instanceof InputDefinition:
49
+ $this->describeInputDefinition($object, $options);
50
+ break;
51
+ case $object instanceof Command:
52
+ $this->describeCommand($object, $options);
53
+ break;
54
+ case $object instanceof Application:
55
+ $this->describeApplication($object, $options);
56
+ break;
57
+ default:
58
+ throw new InvalidArgumentException(sprintf('Object of type "%s" is not describable.', get_class($object)));
59
+ }
60
+ }
61
+
62
+ /**
63
+ * Writes content to output.
64
+ *
65
+ * @param string $content
66
+ * @param bool $decorated
67
+ */
68
+ protected function write($content, $decorated = false)
69
+ {
70
+ $this->output->write($content, false, $decorated ? OutputInterface::OUTPUT_NORMAL : OutputInterface::OUTPUT_RAW);
71
+ }
72
+
73
+ /**
74
+ * Describes an InputArgument instance.
75
+ *
76
+ * @return string|mixed
77
+ */
78
+ abstract protected function describeInputArgument(InputArgument $argument, array $options = array());
79
+
80
+ /**
81
+ * Describes an InputOption instance.
82
+ *
83
+ * @return string|mixed
84
+ */
85
+ abstract protected function describeInputOption(InputOption $option, array $options = array());
86
+
87
+ /**
88
+ * Describes an InputDefinition instance.
89
+ *
90
+ * @return string|mixed
91
+ */
92
+ abstract protected function describeInputDefinition(InputDefinition $definition, array $options = array());
93
+
94
+ /**
95
+ * Describes a Command instance.
96
+ *
97
+ * @return string|mixed
98
+ */
99
+ abstract protected function describeCommand(Command $command, array $options = array());
100
+
101
+ /**
102
+ * Describes an Application instance.
103
+ *
104
+ * @return string|mixed
105
+ */
106
+ abstract protected function describeApplication(Application $application, array $options = array());
107
+ }
vendor/symfony/console/Descriptor/DescriptorInterface.php ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Descriptor;
13
+
14
+ use Symfony\Component\Console\Output\OutputInterface;
15
+
16
+ /**
17
+ * Descriptor interface.
18
+ *
19
+ * @author Jean-François Simon <contact@jfsimon.fr>
20
+ */
21
+ interface DescriptorInterface
22
+ {
23
+ /**
24
+ * Describes an InputArgument instance.
25
+ *
26
+ * @param OutputInterface $output
27
+ * @param object $object
28
+ * @param array $options
29
+ */
30
+ public function describe(OutputInterface $output, $object, array $options = array());
31
+ }
vendor/symfony/console/Descriptor/JsonDescriptor.php ADDED
@@ -0,0 +1,168 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Descriptor;
13
+
14
+ use Symfony\Component\Console\Application;
15
+ use Symfony\Component\Console\Command\Command;
16
+ use Symfony\Component\Console\Input\InputArgument;
17
+ use Symfony\Component\Console\Input\InputDefinition;
18
+ use Symfony\Component\Console\Input\InputOption;
19
+
20
+ /**
21
+ * JSON descriptor.
22
+ *
23
+ * @author Jean-François Simon <contact@jfsimon.fr>
24
+ *
25
+ * @internal
26
+ */
27
+ class JsonDescriptor extends Descriptor
28
+ {
29
+ /**
30
+ * {@inheritdoc}
31
+ */
32
+ protected function describeInputArgument(InputArgument $argument, array $options = array())
33
+ {
34
+ $this->writeData($this->getInputArgumentData($argument), $options);
35
+ }
36
+
37
+ /**
38
+ * {@inheritdoc}
39
+ */
40
+ protected function describeInputOption(InputOption $option, array $options = array())
41
+ {
42
+ $this->writeData($this->getInputOptionData($option), $options);
43
+ }
44
+
45
+ /**
46
+ * {@inheritdoc}
47
+ */
48
+ protected function describeInputDefinition(InputDefinition $definition, array $options = array())
49
+ {
50
+ $this->writeData($this->getInputDefinitionData($definition), $options);
51
+ }
52
+
53
+ /**
54
+ * {@inheritdoc}
55
+ */
56
+ protected function describeCommand(Command $command, array $options = array())
57
+ {
58
+ $this->writeData($this->getCommandData($command), $options);
59
+ }
60
+
61
+ /**
62
+ * {@inheritdoc}
63
+ */
64
+ protected function describeApplication(Application $application, array $options = array())
65
+ {
66
+ $describedNamespace = isset($options['namespace']) ? $options['namespace'] : null;
67
+ $description = new ApplicationDescription($application, $describedNamespace, true);
68
+ $commands = array();
69
+
70
+ foreach ($description->getCommands() as $command) {
71
+ $commands[] = $this->getCommandData($command);
72
+ }
73
+
74
+ $data = array();
75
+ if ('UNKNOWN' !== $application->getName()) {
76
+ $data['application']['name'] = $application->getName();
77
+ if ('UNKNOWN' !== $application->getVersion()) {
78
+ $data['application']['version'] = $application->getVersion();
79
+ }
80
+ }
81
+
82
+ $data['commands'] = $commands;
83
+
84
+ if ($describedNamespace) {
85
+ $data['namespace'] = $describedNamespace;
86
+ } else {
87
+ $data['namespaces'] = array_values($description->getNamespaces());
88
+ }
89
+
90
+ $this->writeData($data, $options);
91
+ }
92
+
93
+ /**
94
+ * Writes data as json.
95
+ *
96
+ * @return array|string
97
+ */
98
+ private function writeData(array $data, array $options)
99
+ {
100
+ $this->write(json_encode($data, isset($options['json_encoding']) ? $options['json_encoding'] : 0));
101
+ }
102
+
103
+ /**
104
+ * @return array
105
+ */
106
+ private function getInputArgumentData(InputArgument $argument)
107
+ {
108
+ return array(
109
+ 'name' => $argument->getName(),
110
+ 'is_required' => $argument->isRequired(),
111
+ 'is_array' => $argument->isArray(),
112
+ 'description' => preg_replace('/\s*[\r\n]\s*/', ' ', $argument->getDescription()),
113
+ 'default' => INF === $argument->getDefault() ? 'INF' : $argument->getDefault(),
114
+ );
115
+ }
116
+
117
+ /**
118
+ * @return array
119
+ */
120
+ private function getInputOptionData(InputOption $option)
121
+ {
122
+ return array(
123
+ 'name' => '--'.$option->getName(),
124
+ 'shortcut' => $option->getShortcut() ? '-'.implode('|-', explode('|', $option->getShortcut())) : '',
125
+ 'accept_value' => $option->acceptValue(),
126
+ 'is_value_required' => $option->isValueRequired(),
127
+ 'is_multiple' => $option->isArray(),
128
+ 'description' => preg_replace('/\s*[\r\n]\s*/', ' ', $option->getDescription()),
129
+ 'default' => INF === $option->getDefault() ? 'INF' : $option->getDefault(),
130
+ );
131
+ }
132
+
133
+ /**
134
+ * @return array
135
+ */
136
+ private function getInputDefinitionData(InputDefinition $definition)
137
+ {
138
+ $inputArguments = array();
139
+ foreach ($definition->getArguments() as $name => $argument) {
140
+ $inputArguments[$name] = $this->getInputArgumentData($argument);
141
+ }
142
+
143
+ $inputOptions = array();
144
+ foreach ($definition->getOptions() as $name => $option) {
145
+ $inputOptions[$name] = $this->getInputOptionData($option);
146
+ }
147
+
148
+ return array('arguments' => $inputArguments, 'options' => $inputOptions);
149
+ }
150
+
151
+ /**
152
+ * @return array
153
+ */
154
+ private function getCommandData(Command $command)
155
+ {
156
+ $command->getSynopsis();
157
+ $command->mergeApplicationDefinition(false);
158
+
159
+ return array(
160
+ 'name' => $command->getName(),
161
+ 'usage' => array_merge(array($command->getSynopsis()), $command->getUsages(), $command->getAliases()),
162
+ 'description' => $command->getDescription(),
163
+ 'help' => $command->getProcessedHelp(),
164
+ 'definition' => $this->getInputDefinitionData($command->getNativeDefinition()),
165
+ 'hidden' => $command->isHidden(),
166
+ );
167
+ }
168
+ }
vendor/symfony/console/Descriptor/MarkdownDescriptor.php ADDED
@@ -0,0 +1,182 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Descriptor;
13
+
14
+ use Symfony\Component\Console\Application;
15
+ use Symfony\Component\Console\Command\Command;
16
+ use Symfony\Component\Console\Helper\Helper;
17
+ use Symfony\Component\Console\Input\InputArgument;
18
+ use Symfony\Component\Console\Input\InputDefinition;
19
+ use Symfony\Component\Console\Input\InputOption;
20
+ use Symfony\Component\Console\Output\OutputInterface;
21
+
22
+ /**
23
+ * Markdown descriptor.
24
+ *
25
+ * @author Jean-François Simon <contact@jfsimon.fr>
26
+ *
27
+ * @internal
28
+ */
29
+ class MarkdownDescriptor extends Descriptor
30
+ {
31
+ /**
32
+ * {@inheritdoc}
33
+ */
34
+ public function describe(OutputInterface $output, $object, array $options = array())
35
+ {
36
+ $decorated = $output->isDecorated();
37
+ $output->setDecorated(false);
38
+
39
+ parent::describe($output, $object, $options);
40
+
41
+ $output->setDecorated($decorated);
42
+ }
43
+
44
+ /**
45
+ * {@inheritdoc}
46
+ */
47
+ protected function write($content, $decorated = true)
48
+ {
49
+ parent::write($content, $decorated);
50
+ }
51
+
52
+ /**
53
+ * {@inheritdoc}
54
+ */
55
+ protected function describeInputArgument(InputArgument $argument, array $options = array())
56
+ {
57
+ $this->write(
58
+ '#### `'.($argument->getName() ?: '<none>')."`\n\n"
59
+ .($argument->getDescription() ? preg_replace('/\s*[\r\n]\s*/', "\n", $argument->getDescription())."\n\n" : '')
60
+ .'* Is required: '.($argument->isRequired() ? 'yes' : 'no')."\n"
61
+ .'* Is array: '.($argument->isArray() ? 'yes' : 'no')."\n"
62
+ .'* Default: `'.str_replace("\n", '', var_export($argument->getDefault(), true)).'`'
63
+ );
64
+ }
65
+
66
+ /**
67
+ * {@inheritdoc}
68
+ */
69
+ protected function describeInputOption(InputOption $option, array $options = array())
70
+ {
71
+ $name = '--'.$option->getName();
72
+ if ($option->getShortcut()) {
73
+ $name .= '|-'.implode('|-', explode('|', $option->getShortcut())).'';
74
+ }
75
+
76
+ $this->write(
77
+ '#### `'.$name.'`'."\n\n"
78
+ .($option->getDescription() ? preg_replace('/\s*[\r\n]\s*/', "\n", $option->getDescription())."\n\n" : '')
79
+ .'* Accept value: '.($option->acceptValue() ? 'yes' : 'no')."\n"
80
+ .'* Is value required: '.($option->isValueRequired() ? 'yes' : 'no')."\n"
81
+ .'* Is multiple: '.($option->isArray() ? 'yes' : 'no')."\n"
82
+ .'* Default: `'.str_replace("\n", '', var_export($option->getDefault(), true)).'`'
83
+ );
84
+ }
85
+
86
+ /**
87
+ * {@inheritdoc}
88
+ */
89
+ protected function describeInputDefinition(InputDefinition $definition, array $options = array())
90
+ {
91
+ if ($showArguments = count($definition->getArguments()) > 0) {
92
+ $this->write('### Arguments');
93
+ foreach ($definition->getArguments() as $argument) {
94
+ $this->write("\n\n");
95
+ $this->write($this->describeInputArgument($argument));
96
+ }
97
+ }
98
+
99
+ if (count($definition->getOptions()) > 0) {
100
+ if ($showArguments) {
101
+ $this->write("\n\n");
102
+ }
103
+
104
+ $this->write('### Options');
105
+ foreach ($definition->getOptions() as $option) {
106
+ $this->write("\n\n");
107
+ $this->write($this->describeInputOption($option));
108
+ }
109
+ }
110
+ }
111
+
112
+ /**
113
+ * {@inheritdoc}
114
+ */
115
+ protected function describeCommand(Command $command, array $options = array())
116
+ {
117
+ $command->getSynopsis();
118
+ $command->mergeApplicationDefinition(false);
119
+
120
+ $this->write(
121
+ '`'.$command->getName()."`\n"
122
+ .str_repeat('-', Helper::strlen($command->getName()) + 2)."\n\n"
123
+ .($command->getDescription() ? $command->getDescription()."\n\n" : '')
124
+ .'### Usage'."\n\n"
125
+ .array_reduce(array_merge(array($command->getSynopsis()), $command->getAliases(), $command->getUsages()), function ($carry, $usage) {
126
+ return $carry.'* `'.$usage.'`'."\n";
127
+ })
128
+ );
129
+
130
+ if ($help = $command->getProcessedHelp()) {
131
+ $this->write("\n");
132
+ $this->write($help);
133
+ }
134
+
135
+ if ($command->getNativeDefinition()) {
136
+ $this->write("\n\n");
137
+ $this->describeInputDefinition($command->getNativeDefinition());
138
+ }
139
+ }
140
+
141
+ /**
142
+ * {@inheritdoc}
143
+ */
144
+ protected function describeApplication(Application $application, array $options = array())
145
+ {
146
+ $describedNamespace = isset($options['namespace']) ? $options['namespace'] : null;
147
+ $description = new ApplicationDescription($application, $describedNamespace);
148
+ $title = $this->getApplicationTitle($application);
149
+
150
+ $this->write($title."\n".str_repeat('=', Helper::strlen($title)));
151
+
152
+ foreach ($description->getNamespaces() as $namespace) {
153
+ if (ApplicationDescription::GLOBAL_NAMESPACE !== $namespace['id']) {
154
+ $this->write("\n\n");
155
+ $this->write('**'.$namespace['id'].':**');
156
+ }
157
+
158
+ $this->write("\n\n");
159
+ $this->write(implode("\n", array_map(function ($commandName) use ($description) {
160
+ return sprintf('* [`%s`](#%s)', $commandName, str_replace(':', '', $description->getCommand($commandName)->getName()));
161
+ }, $namespace['commands'])));
162
+ }
163
+
164
+ foreach ($description->getCommands() as $command) {
165
+ $this->write("\n\n");
166
+ $this->write($this->describeCommand($command));
167
+ }
168
+ }
169
+
170
+ private function getApplicationTitle(Application $application)
171
+ {
172
+ if ('UNKNOWN' !== $application->getName()) {
173
+ if ('UNKNOWN' !== $application->getVersion()) {
174
+ return sprintf('%s %s', $application->getName(), $application->getVersion());
175
+ }
176
+
177
+ return $application->getName();
178
+ }
179
+
180
+ return 'Console Tool';
181
+ }
182
+ }
vendor/symfony/console/Descriptor/TextDescriptor.php ADDED
@@ -0,0 +1,342 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Descriptor;
13
+
14
+ use Symfony\Component\Console\Application;
15
+ use Symfony\Component\Console\Command\Command;
16
+ use Symfony\Component\Console\Formatter\OutputFormatter;
17
+ use Symfony\Component\Console\Helper\Helper;
18
+ use Symfony\Component\Console\Input\InputArgument;
19
+ use Symfony\Component\Console\Input\InputDefinition;
20
+ use Symfony\Component\Console\Input\InputOption;
21
+
22
+ /**
23
+ * Text descriptor.
24
+ *
25
+ * @author Jean-François Simon <contact@jfsimon.fr>
26
+ *
27
+ * @internal
28
+ */
29
+ class TextDescriptor extends Descriptor
30
+ {
31
+ /**
32
+ * {@inheritdoc}
33
+ */
34
+ protected function describeInputArgument(InputArgument $argument, array $options = array())
35
+ {
36
+ if (null !== $argument->getDefault() && (!is_array($argument->getDefault()) || count($argument->getDefault()))) {
37
+ $default = sprintf('<comment> [default: %s]</comment>', $this->formatDefaultValue($argument->getDefault()));
38
+ } else {
39
+ $default = '';
40
+ }
41
+
42
+ $totalWidth = isset($options['total_width']) ? $options['total_width'] : Helper::strlen($argument->getName());
43
+ $spacingWidth = $totalWidth - strlen($argument->getName());
44
+
45
+ $this->writeText(sprintf(' <info>%s</info> %s%s%s',
46
+ $argument->getName(),
47
+ str_repeat(' ', $spacingWidth),
48
+ // + 4 = 2 spaces before <info>, 2 spaces after </info>
49
+ preg_replace('/\s*[\r\n]\s*/', "\n".str_repeat(' ', $totalWidth + 4), $argument->getDescription()),
50
+ $default
51
+ ), $options);
52
+ }
53
+
54
+ /**
55
+ * {@inheritdoc}
56
+ */
57
+ protected function describeInputOption(InputOption $option, array $options = array())
58
+ {
59
+ if ($option->acceptValue() && null !== $option->getDefault() && (!is_array($option->getDefault()) || count($option->getDefault()))) {
60
+ $default = sprintf('<comment> [default: %s]</comment>', $this->formatDefaultValue($option->getDefault()));
61
+ } else {
62
+ $default = '';
63
+ }
64
+
65
+ $value = '';
66
+ if ($option->acceptValue()) {
67
+ $value = '='.strtoupper($option->getName());
68
+
69
+ if ($option->isValueOptional()) {
70
+ $value = '['.$value.']';
71
+ }
72
+ }
73
+
74
+ $totalWidth = isset($options['total_width']) ? $options['total_width'] : $this->calculateTotalWidthForOptions(array($option));
75
+ $synopsis = sprintf('%s%s',
76
+ $option->getShortcut() ? sprintf('-%s, ', $option->getShortcut()) : ' ',
77
+ sprintf('--%s%s', $option->getName(), $value)
78
+ );
79
+
80
+ $spacingWidth = $totalWidth - Helper::strlen($synopsis);
81
+
82
+ $this->writeText(sprintf(' <info>%s</info> %s%s%s%s',
83
+ $synopsis,
84
+ str_repeat(' ', $spacingWidth),
85
+ // + 4 = 2 spaces before <info>, 2 spaces after </info>
86
+ preg_replace('/\s*[\r\n]\s*/', "\n".str_repeat(' ', $totalWidth + 4), $option->getDescription()),
87
+ $default,
88
+ $option->isArray() ? '<comment> (multiple values allowed)</comment>' : ''
89
+ ), $options);
90
+ }
91
+
92
+ /**
93
+ * {@inheritdoc}
94
+ */
95
+ protected function describeInputDefinition(InputDefinition $definition, array $options = array())
96
+ {
97
+ $totalWidth = $this->calculateTotalWidthForOptions($definition->getOptions());
98
+ foreach ($definition->getArguments() as $argument) {
99
+ $totalWidth = max($totalWidth, Helper::strlen($argument->getName()));
100
+ }
101
+
102
+ if ($definition->getArguments()) {
103
+ $this->writeText('<comment>Arguments:</comment>', $options);
104
+ $this->writeText("\n");
105
+ foreach ($definition->getArguments() as $argument) {
106
+ $this->describeInputArgument($argument, array_merge($options, array('total_width' => $totalWidth)));
107
+ $this->writeText("\n");
108
+ }
109
+ }
110
+
111
+ if ($definition->getArguments() && $definition->getOptions()) {
112
+ $this->writeText("\n");
113
+ }
114
+
115
+ if ($definition->getOptions()) {
116
+ $laterOptions = array();
117
+
118
+ $this->writeText('<comment>Options:</comment>', $options);
119
+ foreach ($definition->getOptions() as $option) {
120
+ if (strlen($option->getShortcut()) > 1) {
121
+ $laterOptions[] = $option;
122
+ continue;
123
+ }
124
+ $this->writeText("\n");
125
+ $this->describeInputOption($option, array_merge($options, array('total_width' => $totalWidth)));
126
+ }
127
+ foreach ($laterOptions as $option) {
128
+ $this->writeText("\n");
129
+ $this->describeInputOption($option, array_merge($options, array('total_width' => $totalWidth)));
130
+ }
131
+ }
132
+ }
133
+
134
+ /**
135
+ * {@inheritdoc}
136
+ */
137
+ protected function describeCommand(Command $command, array $options = array())
138
+ {
139
+ $command->getSynopsis(true);
140
+ $command->getSynopsis(false);
141
+ $command->mergeApplicationDefinition(false);
142
+
143
+ $this->writeText('<comment>Usage:</comment>', $options);
144
+ foreach (array_merge(array($command->getSynopsis(true)), $command->getAliases(), $command->getUsages()) as $usage) {
145
+ $this->writeText("\n");
146
+ $this->writeText(' '.OutputFormatter::escape($usage), $options);
147
+ }
148
+ $this->writeText("\n");
149
+
150
+ $definition = $command->getNativeDefinition();
151
+ if ($definition->getOptions() || $definition->getArguments()) {
152
+ $this->writeText("\n");
153
+ $this->describeInputDefinition($definition, $options);
154
+ $this->writeText("\n");
155
+ }
156
+
157
+ if ($help = $command->getProcessedHelp()) {
158
+ $this->writeText("\n");
159
+ $this->writeText('<comment>Help:</comment>', $options);
160
+ $this->writeText("\n");
161
+ $this->writeText(' '.str_replace("\n", "\n ", $help), $options);
162
+ $this->writeText("\n");
163
+ }
164
+ }
165
+
166
+ /**
167
+ * {@inheritdoc}
168
+ */
169
+ protected function describeApplication(Application $application, array $options = array())
170
+ {
171
+ $describedNamespace = isset($options['namespace']) ? $options['namespace'] : null;
172
+ $description = new ApplicationDescription($application, $describedNamespace);
173
+
174
+ if (isset($options['raw_text']) && $options['raw_text']) {
175
+ $width = $this->getColumnWidth($description->getCommands());
176
+
177
+ foreach ($description->getCommands() as $command) {
178
+ $this->writeText(sprintf("%-{$width}s %s", $command->getName(), $command->getDescription()), $options);
179
+ $this->writeText("\n");
180
+ }
181
+ } else {
182
+ if ('' != $help = $application->getHelp()) {
183
+ $this->writeText("$help\n\n", $options);
184
+ }
185
+
186
+ $this->writeText("<comment>Usage:</comment>\n", $options);
187
+ $this->writeText(" command [options] [arguments]\n\n", $options);
188
+
189
+ $this->describeInputDefinition(new InputDefinition($application->getDefinition()->getOptions()), $options);
190
+
191
+ $this->writeText("\n");
192
+ $this->writeText("\n");
193
+
194
+ $commands = $description->getCommands();
195
+ $namespaces = $description->getNamespaces();
196
+ if ($describedNamespace && $namespaces) {
197
+ // make sure all alias commands are included when describing a specific namespace
198
+ $describedNamespaceInfo = reset($namespaces);
199
+ foreach ($describedNamespaceInfo['commands'] as $name) {
200
+ $commands[$name] = $description->getCommand($name);
201
+ }
202
+ }
203
+
204
+ // calculate max. width based on available commands per namespace
205
+ $width = $this->getColumnWidth(call_user_func_array('array_merge', array_map(function ($namespace) use ($commands) {
206
+ return array_intersect($namespace['commands'], array_keys($commands));
207
+ }, $namespaces)));
208
+
209
+ if ($describedNamespace) {
210
+ $this->writeText(sprintf('<comment>Available commands for the "%s" namespace:</comment>', $describedNamespace), $options);
211
+ } else {
212
+ $this->writeText('<comment>Available commands:</comment>', $options);
213
+ }
214
+
215
+ foreach ($namespaces as $namespace) {
216
+ $namespace['commands'] = array_filter($namespace['commands'], function ($name) use ($commands) {
217
+ return isset($commands[$name]);
218
+ });
219
+
220
+ if (!$namespace['commands']) {
221
+ continue;
222
+ }
223
+
224
+ if (!$describedNamespace && ApplicationDescription::GLOBAL_NAMESPACE !== $namespace['id']) {
225
+ $this->writeText("\n");
226
+ $this->writeText(' <comment>'.$namespace['id'].'</comment>', $options);
227
+ }
228
+
229
+ foreach ($namespace['commands'] as $name) {
230
+ $this->writeText("\n");
231
+ $spacingWidth = $width - Helper::strlen($name);
232
+ $command = $commands[$name];
233
+ $commandAliases = $name === $command->getName() ? $this->getCommandAliasesText($command) : '';
234
+ $this->writeText(sprintf(' <info>%s</info>%s%s', $name, str_repeat(' ', $spacingWidth), $commandAliases.$command->getDescription()), $options);
235
+ }
236
+ }
237
+
238
+ $this->writeText("\n");
239
+ }
240
+ }
241
+
242
+ /**
243
+ * {@inheritdoc}
244
+ */
245
+ private function writeText($content, array $options = array())
246
+ {
247
+ $this->write(
248
+ isset($options['raw_text']) && $options['raw_text'] ? strip_tags($content) : $content,
249
+ isset($options['raw_output']) ? !$options['raw_output'] : true
250
+ );
251
+ }
252
+
253
+ /**
254
+ * Formats command aliases to show them in the command description.
255
+ *
256
+ * @return string
257
+ */
258
+ private function getCommandAliasesText(Command $command)
259
+ {
260
+ $text = '';
261
+ $aliases = $command->getAliases();
262
+
263
+ if ($aliases) {
264
+ $text = '['.implode('|', $aliases).'] ';
265
+ }
266
+
267
+ return $text;
268
+ }
269
+
270
+ /**
271
+ * Formats input option/argument default value.
272
+ *
273
+ * @param mixed $default
274
+ *
275
+ * @return string
276
+ */
277
+ private function formatDefaultValue($default)
278
+ {
279
+ if (INF === $default) {
280
+ return 'INF';
281
+ }
282
+
283
+ if (is_string($default)) {
284
+ $default = OutputFormatter::escape($default);
285
+ } elseif (is_array($default)) {
286
+ foreach ($default as $key => $value) {
287
+ if (is_string($value)) {
288
+ $default[$key] = OutputFormatter::escape($value);
289
+ }
290
+ }
291
+ }
292
+
293
+ return str_replace('\\\\', '\\', json_encode($default, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE));
294
+ }
295
+
296
+ /**
297
+ * @param (Command|string)[] $commands
298
+ *
299
+ * @return int
300
+ */
301
+ private function getColumnWidth(array $commands)
302
+ {
303
+ $widths = array();
304
+
305
+ foreach ($commands as $command) {
306
+ if ($command instanceof Command) {
307
+ $widths[] = Helper::strlen($command->getName());
308
+ foreach ($command->getAliases() as $alias) {
309
+ $widths[] = Helper::strlen($alias);
310
+ }
311
+ } else {
312
+ $widths[] = Helper::strlen($command);
313
+ }
314
+ }
315
+
316
+ return $widths ? max($widths) + 2 : 0;
317
+ }
318
+
319
+ /**
320
+ * @param InputOption[] $options
321
+ *
322
+ * @return int
323
+ */
324
+ private function calculateTotalWidthForOptions(array $options)
325
+ {
326
+ $totalWidth = 0;
327
+ foreach ($options as $option) {
328
+ // "-" + shortcut + ", --" + name
329
+ $nameLength = 1 + max(Helper::strlen($option->getShortcut()), 1) + 4 + Helper::strlen($option->getName());
330
+
331
+ if ($option->acceptValue()) {
332
+ $valueLength = 1 + Helper::strlen($option->getName()); // = + value
333
+ $valueLength += $option->isValueOptional() ? 2 : 0; // [ + ]
334
+
335
+ $nameLength += $valueLength;
336
+ }
337
+ $totalWidth = max($totalWidth, $nameLength);
338
+ }
339
+
340
+ return $totalWidth;
341
+ }
342
+ }
vendor/symfony/console/Descriptor/XmlDescriptor.php ADDED
@@ -0,0 +1,251 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Descriptor;
13
+
14
+ use Symfony\Component\Console\Application;
15
+ use Symfony\Component\Console\Command\Command;
16
+ use Symfony\Component\Console\Input\InputArgument;
17
+ use Symfony\Component\Console\Input\InputDefinition;
18
+ use Symfony\Component\Console\Input\InputOption;
19
+
20
+ /**
21
+ * XML descriptor.
22
+ *
23
+ * @author Jean-François Simon <contact@jfsimon.fr>
24
+ *
25
+ * @internal
26
+ */
27
+ class XmlDescriptor extends Descriptor
28
+ {
29
+ /**
30
+ * @return \DOMDocument
31
+ */
32
+ public function getInputDefinitionDocument(InputDefinition $definition)
33
+ {
34
+ $dom = new \DOMDocument('1.0', 'UTF-8');
35
+ $dom->appendChild($definitionXML = $dom->createElement('definition'));
36
+
37
+ $definitionXML->appendChild($argumentsXML = $dom->createElement('arguments'));
38
+ foreach ($definition->getArguments() as $argument) {
39
+ $this->appendDocument($argumentsXML, $this->getInputArgumentDocument($argument));
40
+ }
41
+
42
+ $definitionXML->appendChild($optionsXML = $dom->createElement('options'));
43
+ foreach ($definition->getOptions() as $option) {
44
+ $this->appendDocument($optionsXML, $this->getInputOptionDocument($option));
45
+ }
46
+
47
+ return $dom;
48
+ }
49
+
50
+ /**
51
+ * @return \DOMDocument
52
+ */
53
+ public function getCommandDocument(Command $command)
54
+ {
55
+ $dom = new \DOMDocument('1.0', 'UTF-8');
56
+ $dom->appendChild($commandXML = $dom->createElement('command'));
57
+
58
+ $command->getSynopsis();
59
+ $command->mergeApplicationDefinition(false);
60
+
61
+ $commandXML->setAttribute('id', $command->getName());
62
+ $commandXML->setAttribute('name', $command->getName());
63
+ $commandXML->setAttribute('hidden', $command->isHidden() ? 1 : 0);
64
+
65
+ $commandXML->appendChild($usagesXML = $dom->createElement('usages'));
66
+
67
+ foreach (array_merge(array($command->getSynopsis()), $command->getAliases(), $command->getUsages()) as $usage) {
68
+ $usagesXML->appendChild($dom->createElement('usage', $usage));
69
+ }
70
+
71
+ $commandXML->appendChild($descriptionXML = $dom->createElement('description'));
72
+ $descriptionXML->appendChild($dom->createTextNode(str_replace("\n", "\n ", $command->getDescription())));
73
+
74
+ $commandXML->appendChild($helpXML = $dom->createElement('help'));
75
+ $helpXML->appendChild($dom->createTextNode(str_replace("\n", "\n ", $command->getProcessedHelp())));
76
+
77
+ $definitionXML = $this->getInputDefinitionDocument($command->getNativeDefinition());
78
+ $this->appendDocument($commandXML, $definitionXML->getElementsByTagName('definition')->item(0));
79
+
80
+ return $dom;
81
+ }
82
+
83
+ /**
84
+ * @param Application $application
85
+ * @param string|null $namespace
86
+ *
87
+ * @return \DOMDocument
88
+ */
89
+ public function getApplicationDocument(Application $application, $namespace = null)
90
+ {
91
+ $dom = new \DOMDocument('1.0', 'UTF-8');
92
+ $dom->appendChild($rootXml = $dom->createElement('symfony'));
93
+
94
+ if ('UNKNOWN' !== $application->getName()) {
95
+ $rootXml->setAttribute('name', $application->getName());
96
+ if ('UNKNOWN' !== $application->getVersion()) {
97
+ $rootXml->setAttribute('version', $application->getVersion());
98
+ }
99
+ }
100
+
101
+ $rootXml->appendChild($commandsXML = $dom->createElement('commands'));
102
+
103
+ $description = new ApplicationDescription($application, $namespace, true);
104
+
105
+ if ($namespace) {
106
+ $commandsXML->setAttribute('namespace', $namespace);
107
+ }
108
+
109
+ foreach ($description->getCommands() as $command) {
110
+ $this->appendDocument($commandsXML, $this->getCommandDocument($command));
111
+ }
112
+
113
+ if (!$namespace) {
114
+ $rootXml->appendChild($namespacesXML = $dom->createElement('namespaces'));
115
+
116
+ foreach ($description->getNamespaces() as $namespaceDescription) {
117
+ $namespacesXML->appendChild($namespaceArrayXML = $dom->createElement('namespace'));
118
+ $namespaceArrayXML->setAttribute('id', $namespaceDescription['id']);
119
+
120
+ foreach ($namespaceDescription['commands'] as $name) {
121
+ $namespaceArrayXML->appendChild($commandXML = $dom->createElement('command'));
122
+ $commandXML->appendChild($dom->createTextNode($name));
123
+ }
124
+ }
125
+ }
126
+
127
+ return $dom;
128
+ }
129
+
130
+ /**
131
+ * {@inheritdoc}
132
+ */
133
+ protected function describeInputArgument(InputArgument $argument, array $options = array())
134
+ {
135
+ $this->writeDocument($this->getInputArgumentDocument($argument));
136
+ }
137
+
138
+ /**
139
+ * {@inheritdoc}
140
+ */
141
+ protected function describeInputOption(InputOption $option, array $options = array())
142
+ {
143
+ $this->writeDocument($this->getInputOptionDocument($option));
144
+ }
145
+
146
+ /**
147
+ * {@inheritdoc}
148
+ */
149
+ protected function describeInputDefinition(InputDefinition $definition, array $options = array())
150
+ {
151
+ $this->writeDocument($this->getInputDefinitionDocument($definition));
152
+ }
153
+
154
+ /**
155
+ * {@inheritdoc}
156
+ */
157
+ protected function describeCommand(Command $command, array $options = array())
158
+ {
159
+ $this->writeDocument($this->getCommandDocument($command));
160
+ }
161
+
162
+ /**
163
+ * {@inheritdoc}
164
+ */
165
+ protected function describeApplication(Application $application, array $options = array())
166
+ {
167
+ $this->writeDocument($this->getApplicationDocument($application, isset($options['namespace']) ? $options['namespace'] : null));
168
+ }
169
+
170
+ /**
171
+ * Appends document children to parent node.
172
+ */
173
+ private function appendDocument(\DOMNode $parentNode, \DOMNode $importedParent)
174
+ {
175
+ foreach ($importedParent->childNodes as $childNode) {
176
+ $parentNode->appendChild($parentNode->ownerDocument->importNode($childNode, true));
177
+ }
178
+ }
179
+
180
+ /**
181
+ * Writes DOM document.
182
+ *
183
+ * @return \DOMDocument|string
184
+ */
185
+ private function writeDocument(\DOMDocument $dom)
186
+ {
187
+ $dom->formatOutput = true;
188
+ $this->write($dom->saveXML());
189
+ }
190
+
191
+ /**
192
+ * @return \DOMDocument
193
+ */
194
+ private function getInputArgumentDocument(InputArgument $argument)
195
+ {
196
+ $dom = new \DOMDocument('1.0', 'UTF-8');
197
+
198
+ $dom->appendChild($objectXML = $dom->createElement('argument'));
199
+ $objectXML->setAttribute('name', $argument->getName());
200
+ $objectXML->setAttribute('is_required', $argument->isRequired() ? 1 : 0);
201
+ $objectXML->setAttribute('is_array', $argument->isArray() ? 1 : 0);
202
+ $objectXML->appendChild($descriptionXML = $dom->createElement('description'));
203
+ $descriptionXML->appendChild($dom->createTextNode($argument->getDescription()));
204
+
205
+ $objectXML->appendChild($defaultsXML = $dom->createElement('defaults'));
206
+ $defaults = is_array($argument->getDefault()) ? $argument->getDefault() : (is_bool($argument->getDefault()) ? array(var_export($argument->getDefault(), true)) : ($argument->getDefault() ? array($argument->getDefault()) : array()));
207
+ foreach ($defaults as $default) {
208
+ $defaultsXML->appendChild($defaultXML = $dom->createElement('default'));
209
+ $defaultXML->appendChild($dom->createTextNode($default));
210
+ }
211
+
212
+ return $dom;
213
+ }
214
+
215
+ /**
216
+ * @return \DOMDocument
217
+ */
218
+ private function getInputOptionDocument(InputOption $option)
219
+ {
220
+ $dom = new \DOMDocument('1.0', 'UTF-8');
221
+
222
+ $dom->appendChild($objectXML = $dom->createElement('option'));
223
+ $objectXML->setAttribute('name', '--'.$option->getName());
224
+ $pos = strpos($option->getShortcut(), '|');
225
+ if (false !== $pos) {
226
+ $objectXML->setAttribute('shortcut', '-'.substr($option->getShortcut(), 0, $pos));
227
+ $objectXML->setAttribute('shortcuts', '-'.implode('|-', explode('|', $option->getShortcut())));
228
+ } else {
229
+ $objectXML->setAttribute('shortcut', $option->getShortcut() ? '-'.$option->getShortcut() : '');
230
+ }
231
+ $objectXML->setAttribute('accept_value', $option->acceptValue() ? 1 : 0);
232
+ $objectXML->setAttribute('is_value_required', $option->isValueRequired() ? 1 : 0);
233
+ $objectXML->setAttribute('is_multiple', $option->isArray() ? 1 : 0);
234
+ $objectXML->appendChild($descriptionXML = $dom->createElement('description'));
235
+ $descriptionXML->appendChild($dom->createTextNode($option->getDescription()));
236
+
237
+ if ($option->acceptValue()) {
238
+ $defaults = is_array($option->getDefault()) ? $option->getDefault() : (is_bool($option->getDefault()) ? array(var_export($option->getDefault(), true)) : ($option->getDefault() ? array($option->getDefault()) : array()));
239
+ $objectXML->appendChild($defaultsXML = $dom->createElement('defaults'));
240
+
241
+ if (!empty($defaults)) {
242
+ foreach ($defaults as $default) {
243
+ $defaultsXML->appendChild($defaultXML = $dom->createElement('default'));
244
+ $defaultXML->appendChild($dom->createTextNode($default));
245
+ }
246
+ }
247
+ }
248
+
249
+ return $dom;
250
+ }
251
+ }
vendor/symfony/console/Descriptor/index.php ADDED
File without changes
vendor/symfony/console/Event/ConsoleCommandEvent.php ADDED
@@ -0,0 +1,60 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Event;
13
+
14
+ /**
15
+ * Allows to do things before the command is executed, like skipping the command or changing the input.
16
+ *
17
+ * @author Fabien Potencier <fabien@symfony.com>
18
+ */
19
+ class ConsoleCommandEvent extends ConsoleEvent
20
+ {
21
+ /**
22
+ * The return code for skipped commands, this will also be passed into the terminate event.
23
+ */
24
+ const RETURN_CODE_DISABLED = 113;
25
+
26
+ /**
27
+ * Indicates if the command should be run or skipped.
28
+ */
29
+ private $commandShouldRun = true;
30
+
31
+ /**
32
+ * Disables the command, so it won't be run.
33
+ *
34
+ * @return bool
35
+ */
36
+ public function disableCommand()
37
+ {
38
+ return $this->commandShouldRun = false;
39
+ }
40
+
41
+ /**
42
+ * Enables the command.
43
+ *
44
+ * @return bool
45
+ */
46
+ public function enableCommand()
47
+ {
48
+ return $this->commandShouldRun = true;
49
+ }
50
+
51
+ /**
52
+ * Returns true if the command is runnable, false otherwise.
53
+ *
54
+ * @return bool
55
+ */
56
+ public function commandShouldRun()
57
+ {
58
+ return $this->commandShouldRun;
59
+ }
60
+ }
vendor/symfony/console/Event/ConsoleErrorEvent.php ADDED
@@ -0,0 +1,83 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Event;
13
+
14
+ use Symfony\Component\Console\Command\Command;
15
+ use Symfony\Component\Console\Exception\InvalidArgumentException;
16
+ use Symfony\Component\Console\Input\InputInterface;
17
+ use Symfony\Component\Console\Output\OutputInterface;
18
+
19
+ /**
20
+ * Allows to handle throwables thrown while running a command.
21
+ *
22
+ * @author Wouter de Jong <wouter@wouterj.nl>
23
+ */
24
+ final class ConsoleErrorEvent extends ConsoleEvent
25
+ {
26
+ private $error;
27
+ private $exitCode;
28
+
29
+ public function __construct(InputInterface $input, OutputInterface $output, $error, Command $command = null)
30
+ {
31
+ parent::__construct($command, $input, $output);
32
+
33
+ $this->setError($error);
34
+ }
35
+
36
+ /**
37
+ * Returns the thrown error/exception.
38
+ *
39
+ * @return \Throwable
40
+ */
41
+ public function getError()
42
+ {
43
+ return $this->error;
44
+ }
45
+
46
+ /**
47
+ * Replaces the thrown error/exception.
48
+ *
49
+ * @param \Throwable $error
50
+ */
51
+ public function setError($error)
52
+ {
53
+ if (!$error instanceof \Throwable && !$error instanceof \Exception) {
54
+ throw new InvalidArgumentException(sprintf('The error passed to ConsoleErrorEvent must be an instance of \Throwable or \Exception, "%s" was passed instead.', is_object($error) ? get_class($error) : gettype($error)));
55
+ }
56
+
57
+ $this->error = $error;
58
+ }
59
+
60
+ /**
61
+ * Sets the exit code.
62
+ *
63
+ * @param int $exitCode The command exit code
64
+ */
65
+ public function setExitCode($exitCode)
66
+ {
67
+ $this->exitCode = (int) $exitCode;
68
+
69
+ $r = new \ReflectionProperty($this->error, 'code');
70
+ $r->setAccessible(true);
71
+ $r->setValue($this->error, $this->exitCode);
72
+ }
73
+
74
+ /**
75
+ * Gets the exit code.
76
+ *
77
+ * @return int The command exit code
78
+ */
79
+ public function getExitCode()
80
+ {
81
+ return null !== $this->exitCode ? $this->exitCode : ($this->error->getCode() ?: 1);
82
+ }
83
+ }
vendor/symfony/console/Event/ConsoleEvent.php ADDED
@@ -0,0 +1,67 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Event;
13
+
14
+ use Symfony\Component\Console\Command\Command;
15
+ use Symfony\Component\Console\Input\InputInterface;
16
+ use Symfony\Component\Console\Output\OutputInterface;
17
+ use Symfony\Component\EventDispatcher\Event;
18
+
19
+ /**
20
+ * Allows to inspect input and output of a command.
21
+ *
22
+ * @author Francesco Levorato <git@flevour.net>
23
+ */
24
+ class ConsoleEvent extends Event
25
+ {
26
+ protected $command;
27
+
28
+ private $input;
29
+ private $output;
30
+
31
+ public function __construct(Command $command = null, InputInterface $input, OutputInterface $output)
32
+ {
33
+ $this->command = $command;
34
+ $this->input = $input;
35
+ $this->output = $output;
36
+ }
37
+
38
+ /**
39
+ * Gets the command that is executed.
40
+ *
41
+ * @return Command|null A Command instance
42
+ */
43
+ public function getCommand()
44
+ {
45
+ return $this->command;
46
+ }
47
+
48
+ /**
49
+ * Gets the input instance.
50
+ *
51
+ * @return InputInterface An InputInterface instance
52
+ */
53
+ public function getInput()
54
+ {
55
+ return $this->input;
56
+ }
57
+
58
+ /**
59
+ * Gets the output instance.
60
+ *
61
+ * @return OutputInterface An OutputInterface instance
62
+ */
63
+ public function getOutput()
64
+ {
65
+ return $this->output;
66
+ }
67
+ }
vendor/symfony/console/Event/ConsoleExceptionEvent.php ADDED
@@ -0,0 +1,71 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Event;
13
+
14
+ @trigger_error(sprintf('The "%s" class is deprecated since version 3.3 and will be removed in 4.0. Use the ConsoleErrorEvent instead.', ConsoleExceptionEvent::class), E_USER_DEPRECATED);
15
+
16
+ use Symfony\Component\Console\Command\Command;
17
+ use Symfony\Component\Console\Input\InputInterface;
18
+ use Symfony\Component\Console\Output\OutputInterface;
19
+
20
+ /**
21
+ * Allows to handle exception thrown in a command.
22
+ *
23
+ * @author Fabien Potencier <fabien@symfony.com>
24
+ *
25
+ * @deprecated since version 3.3, to be removed in 4.0. Use ConsoleErrorEvent instead.
26
+ */
27
+ class ConsoleExceptionEvent extends ConsoleEvent
28
+ {
29
+ private $exception;
30
+ private $exitCode;
31
+
32
+ public function __construct(Command $command, InputInterface $input, OutputInterface $output, \Exception $exception, $exitCode)
33
+ {
34
+ parent::__construct($command, $input, $output);
35
+
36
+ $this->setException($exception);
37
+ $this->exitCode = (int) $exitCode;
38
+ }
39
+
40
+ /**
41
+ * Returns the thrown exception.
42
+ *
43
+ * @return \Exception The thrown exception
44
+ */
45
+ public function getException()
46
+ {
47
+ return $this->exception;
48
+ }
49
+
50
+ /**
51
+ * Replaces the thrown exception.
52
+ *
53
+ * This exception will be thrown if no response is set in the event.
54
+ *
55
+ * @param \Exception $exception The thrown exception
56
+ */
57
+ public function setException(\Exception $exception)
58
+ {
59
+ $this->exception = $exception;
60
+ }
61
+
62
+ /**
63
+ * Gets the exit code.
64
+ *
65
+ * @return int The command exit code
66
+ */
67
+ public function getExitCode()
68
+ {
69
+ return $this->exitCode;
70
+ }
71
+ }
vendor/symfony/console/Event/ConsoleTerminateEvent.php ADDED
@@ -0,0 +1,58 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Event;
13
+
14
+ use Symfony\Component\Console\Command\Command;
15
+ use Symfony\Component\Console\Input\InputInterface;
16
+ use Symfony\Component\Console\Output\OutputInterface;
17
+
18
+ /**
19
+ * Allows to manipulate the exit code of a command after its execution.
20
+ *
21
+ * @author Francesco Levorato <git@flevour.net>
22
+ */
23
+ class ConsoleTerminateEvent extends ConsoleEvent
24
+ {
25
+ /**
26
+ * The exit code of the command.
27
+ *
28
+ * @var int
29
+ */
30
+ private $exitCode;
31
+
32
+ public function __construct(Command $command, InputInterface $input, OutputInterface $output, $exitCode)
33
+ {
34
+ parent::__construct($command, $input, $output);
35
+
36
+ $this->setExitCode($exitCode);
37
+ }
38
+
39
+ /**
40
+ * Sets the exit code.
41
+ *
42
+ * @param int $exitCode The command exit code
43
+ */
44
+ public function setExitCode($exitCode)
45
+ {
46
+ $this->exitCode = (int) $exitCode;
47
+ }
48
+
49
+ /**
50
+ * Gets the exit code.
51
+ *
52
+ * @return int The command exit code
53
+ */
54
+ public function getExitCode()
55
+ {
56
+ return $this->exitCode;
57
+ }
58
+ }
vendor/symfony/console/Event/index.php ADDED
File without changes
vendor/symfony/console/EventListener/ErrorListener.php ADDED
@@ -0,0 +1,91 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\EventListener;
13
+
14
+ use Psr\Log\LoggerInterface;
15
+ use Symfony\Component\Console\ConsoleEvents;
16
+ use Symfony\Component\Console\Event\ConsoleErrorEvent;
17
+ use Symfony\Component\Console\Event\ConsoleEvent;
18
+ use Symfony\Component\Console\Event\ConsoleTerminateEvent;
19
+ use Symfony\Component\EventDispatcher\EventSubscriberInterface;
20
+
21
+ /**
22
+ * @author James Halsall <james.t.halsall@googlemail.com>
23
+ * @author Robin Chalas <robin.chalas@gmail.com>
24
+ */
25
+ class ErrorListener implements EventSubscriberInterface
26
+ {
27
+ private $logger;
28
+
29
+ public function __construct(LoggerInterface $logger = null)
30
+ {
31
+ $this->logger = $logger;
32
+ }
33
+
34
+ public function onConsoleError(ConsoleErrorEvent $event)
35
+ {
36
+ if (null === $this->logger) {
37
+ return;
38
+ }
39
+
40
+ $error = $event->getError();
41
+
42
+ if (!$inputString = $this->getInputString($event)) {
43
+ return $this->logger->error('An error occurred while using the console. Message: "{message}"', array('error' => $error, 'message' => $error->getMessage()));
44
+ }
45
+
46
+ $this->logger->error('Error thrown while running command "{command}". Message: "{message}"', array('error' => $error, 'command' => $inputString, 'message' => $error->getMessage()));
47
+ }
48
+
49
+ public function onConsoleTerminate(ConsoleTerminateEvent $event)
50
+ {
51
+ if (null === $this->logger) {
52
+ return;
53
+ }
54
+
55
+ $exitCode = $event->getExitCode();
56
+
57
+ if (0 === $exitCode) {
58
+ return;
59
+ }
60
+
61
+ if (!$inputString = $this->getInputString($event)) {
62
+ return $this->logger->debug('The console exited with code "{code}"', array('code' => $exitCode));
63
+ }
64
+
65
+ $this->logger->debug('Command "{command}" exited with code "{code}"', array('command' => $inputString, 'code' => $exitCode));
66
+ }
67
+
68
+ public static function getSubscribedEvents()
69
+ {
70
+ return array(
71
+ ConsoleEvents::ERROR => array('onConsoleError', -128),
72
+ ConsoleEvents::TERMINATE => array('onConsoleTerminate', -128),
73
+ );
74
+ }
75
+
76
+ private static function getInputString(ConsoleEvent $event)
77
+ {
78
+ $commandName = $event->getCommand() ? $event->getCommand()->getName() : null;
79
+ $input = $event->getInput();
80
+
81
+ if (method_exists($input, '__toString')) {
82
+ if ($commandName) {
83
+ return str_replace(array("'$commandName'", "\"$commandName\""), $commandName, (string) $input);
84
+ }
85
+
86
+ return (string) $input;
87
+ }
88
+
89
+ return $commandName;
90
+ }
91
+ }
vendor/symfony/console/EventListener/index.php ADDED
File without changes
vendor/symfony/console/Exception/CommandNotFoundException.php ADDED
@@ -0,0 +1,43 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Exception;
13
+
14
+ /**
15
+ * Represents an incorrect command name typed in the console.
16
+ *
17
+ * @author Jérôme Tamarelle <jerome@tamarelle.net>
18
+ */
19
+ class CommandNotFoundException extends \InvalidArgumentException implements ExceptionInterface
20
+ {
21
+ private $alternatives;
22
+
23
+ /**
24
+ * @param string $message Exception message to throw
25
+ * @param array $alternatives List of similar defined names
26
+ * @param int $code Exception code
27
+ * @param \Exception $previous Previous exception used for the exception chaining
28
+ */
29
+ public function __construct($message, array $alternatives = array(), $code = 0, \Exception $previous = null)
30
+ {
31
+ parent::__construct($message, $code, $previous);
32
+
33
+ $this->alternatives = $alternatives;
34
+ }
35
+
36
+ /**
37
+ * @return array A list of similar defined names
38
+ */
39
+ public function getAlternatives()
40
+ {
41
+ return $this->alternatives;
42
+ }
43
+ }
vendor/symfony/console/Exception/ExceptionInterface.php ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Exception;
13
+
14
+ /**
15
+ * ExceptionInterface.
16
+ *
17
+ * @author Jérôme Tamarelle <jerome@tamarelle.net>
18
+ */
19
+ interface ExceptionInterface
20
+ {
21
+ }
vendor/symfony/console/Exception/InvalidArgumentException.php ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Exception;
13
+
14
+ /**
15
+ * @author Jérôme Tamarelle <jerome@tamarelle.net>
16
+ */
17
+ class InvalidArgumentException extends \InvalidArgumentException implements ExceptionInterface
18
+ {
19
+ }
vendor/symfony/console/Exception/InvalidOptionException.php ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Exception;
13
+
14
+ /**
15
+ * Represents an incorrect option name typed in the console.
16
+ *
17
+ * @author Jérôme Tamarelle <jerome@tamarelle.net>
18
+ */
19
+ class InvalidOptionException extends \InvalidArgumentException implements ExceptionInterface
20
+ {
21
+ }
vendor/symfony/console/Exception/LogicException.php ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Exception;
13
+
14
+ /**
15
+ * @author Jérôme Tamarelle <jerome@tamarelle.net>
16
+ */
17
+ class LogicException extends \LogicException implements ExceptionInterface
18
+ {
19
+ }
vendor/symfony/console/Exception/RuntimeException.php ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Exception;
13
+
14
+ /**
15
+ * @author Jérôme Tamarelle <jerome@tamarelle.net>
16
+ */
17
+ class RuntimeException extends \RuntimeException implements ExceptionInterface
18
+ {
19
+ }
vendor/symfony/console/Exception/index.php ADDED
File without changes
vendor/symfony/console/Formatter/OutputFormatter.php ADDED
@@ -0,0 +1,242 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Formatter;
13
+
14
+ use Symfony\Component\Console\Exception\InvalidArgumentException;
15
+
16
+ /**
17
+ * Formatter class for console output.
18
+ *
19
+ * @author Konstantin Kudryashov <ever.zet@gmail.com>
20
+ */
21
+ class OutputFormatter implements OutputFormatterInterface
22
+ {
23
+ private $decorated;
24
+ private $styles = array();
25
+ private $styleStack;
26
+
27
+ /**
28
+ * Escapes "<" special char in given text.
29
+ *
30
+ * @param string $text Text to escape
31
+ *
32
+ * @return string Escaped text
33
+ */
34
+ public static function escape($text)
35
+ {
36
+ $text = preg_replace('/([^\\\\]?)</', '$1\\<', $text);
37
+
38
+ return self::escapeTrailingBackslash($text);
39
+ }
40
+
41
+ /**
42
+ * Escapes trailing "\" in given text.
43
+ *
44
+ * @param string $text Text to escape
45
+ *
46
+ * @return string Escaped text
47
+ *
48
+ * @internal
49
+ */
50
+ public static function escapeTrailingBackslash($text)
51
+ {
52
+ if ('\\' === substr($text, -1)) {
53
+ $len = strlen($text);
54
+ $text = rtrim($text, '\\');
55
+ $text = str_replace("\0", '', $text);
56
+ $text .= str_repeat("\0", $len - strlen($text));
57
+ }
58
+
59
+ return $text;
60
+ }
61
+
62
+ /**
63
+ * Initializes console output formatter.
64
+ *
65
+ * @param bool $decorated Whether this formatter should actually decorate strings
66
+ * @param OutputFormatterStyleInterface[] $styles Array of "name => FormatterStyle" instances
67
+ */
68
+ public function __construct($decorated = false, array $styles = array())
69
+ {
70
+ $this->decorated = (bool) $decorated;
71
+
72
+ $this->setStyle('error', new OutputFormatterStyle('white', 'red'));
73
+ $this->setStyle('info', new OutputFormatterStyle('green'));
74
+ $this->setStyle('comment', new OutputFormatterStyle('yellow'));
75
+ $this->setStyle('question', new OutputFormatterStyle('black', 'cyan'));
76
+
77
+ foreach ($styles as $name => $style) {
78
+ $this->setStyle($name, $style);
79
+ }
80
+
81
+ $this->styleStack = new OutputFormatterStyleStack();
82
+ }
83
+
84
+ /**
85
+ * {@inheritdoc}
86
+ */
87
+ public function setDecorated($decorated)
88
+ {
89
+ $this->decorated = (bool) $decorated;
90
+ }
91
+
92
+ /**
93
+ * {@inheritdoc}
94
+ */
95
+ public function isDecorated()
96
+ {
97
+ return $this->decorated;
98
+ }
99
+
100
+ /**
101
+ * {@inheritdoc}
102
+ */
103
+ public function setStyle($name, OutputFormatterStyleInterface $style)
104
+ {
105
+ $this->styles[strtolower($name)] = $style;
106
+ }
107
+
108
+ /**
109
+ * {@inheritdoc}
110
+ */
111
+ public function hasStyle($name)
112
+ {
113
+ return isset($this->styles[strtolower($name)]);
114
+ }
115
+
116
+ /**
117
+ * {@inheritdoc}
118
+ */
119
+ public function getStyle($name)
120
+ {
121
+ if (!$this->hasStyle($name)) {
122
+ throw new InvalidArgumentException(sprintf('Undefined style: %s', $name));
123
+ }
124
+
125
+ return $this->styles[strtolower($name)];
126
+ }
127
+
128
+ /**
129
+ * {@inheritdoc}
130
+ */
131
+ public function format($message)
132
+ {
133
+ $message = (string) $message;
134
+ $offset = 0;
135
+ $output = '';
136
+ $tagRegex = '[a-z][a-z0-9,_=;-]*+';
137
+ preg_match_all("#<(($tagRegex) | /($tagRegex)?)>#ix", $message, $matches, PREG_OFFSET_CAPTURE);
138
+ foreach ($matches[0] as $i => $match) {
139
+ $pos = $match[1];
140
+ $text = $match[0];
141
+
142
+ if (0 != $pos && '\\' == $message[$pos - 1]) {
143
+ continue;
144
+ }
145
+
146
+ // add the text up to the next tag
147
+ $output .= $this->applyCurrentStyle(substr($message, $offset, $pos - $offset));
148
+ $offset = $pos + strlen($text);
149
+
150
+ // opening tag?
151
+ if ($open = '/' != $text[1]) {
152
+ $tag = $matches[1][$i][0];
153
+ } else {
154
+ $tag = isset($matches[3][$i][0]) ? $matches[3][$i][0] : '';
155
+ }
156
+
157
+ if (!$open && !$tag) {
158
+ // </>
159
+ $this->styleStack->pop();
160
+ } elseif (false === $style = $this->createStyleFromString(strtolower($tag))) {
161
+ $output .= $this->applyCurrentStyle($text);
162
+ } elseif ($open) {
163
+ $this->styleStack->push($style);
164
+ } else {
165
+ $this->styleStack->pop($style);
166
+ }
167
+ }
168
+
169
+ $output .= $this->applyCurrentStyle(substr($message, $offset));
170
+
171
+ if (false !== strpos($output, "\0")) {
172
+ return strtr($output, array("\0" => '\\', '\\<' => '<'));
173
+ }
174
+
175
+ return str_replace('\\<', '<', $output);
176
+ }
177
+
178
+ /**
179
+ * @return OutputFormatterStyleStack
180
+ */
181
+ public function getStyleStack()
182
+ {
183
+ return $this->styleStack;
184
+ }
185
+
186
+ /**
187
+ * Tries to create new style instance from string.
188
+ *
189
+ * @param string $string
190
+ *
191
+ * @return OutputFormatterStyle|false false if string is not format string
192
+ */
193
+ private function createStyleFromString($string)
194
+ {
195
+ if (isset($this->styles[$string])) {
196
+ return $this->styles[$string];
197
+ }
198
+
199
+ if (!preg_match_all('/([^=]+)=([^;]+)(;|$)/', $string, $matches, PREG_SET_ORDER)) {
200
+ return false;
201
+ }
202
+
203
+ $style = new OutputFormatterStyle();
204
+ foreach ($matches as $match) {
205
+ array_shift($match);
206
+
207
+ if ('fg' == $match[0]) {
208
+ $style->setForeground($match[1]);
209
+ } elseif ('bg' == $match[0]) {
210
+ $style->setBackground($match[1]);
211
+ } elseif ('options' === $match[0]) {
212
+ preg_match_all('([^,;]+)', $match[1], $options);
213
+ $options = array_shift($options);
214
+ foreach ($options as $option) {
215
+ try {
216
+ $style->setOption($option);
217
+ } catch (\InvalidArgumentException $e) {
218
+ @trigger_error(sprintf('Unknown style options are deprecated since version 3.2 and will be removed in 4.0. Exception "%s".', $e->getMessage()), E_USER_DEPRECATED);
219
+
220
+ return false;
221
+ }
222
+ }
223
+ } else {
224
+ return false;
225
+ }
226
+ }
227
+
228
+ return $style;
229
+ }
230
+
231
+ /**
232
+ * Applies current style from stack to text, if must be applied.
233
+ *
234
+ * @param string $text Input text
235
+ *
236
+ * @return string Styled text
237
+ */
238
+ private function applyCurrentStyle($text)
239
+ {
240
+ return $this->isDecorated() && strlen($text) > 0 ? $this->styleStack->getCurrent()->apply($text) : $text;
241
+ }
242
+ }
vendor/symfony/console/Formatter/OutputFormatterInterface.php ADDED
@@ -0,0 +1,71 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Formatter;
13
+
14
+ /**
15
+ * Formatter interface for console output.
16
+ *
17
+ * @author Konstantin Kudryashov <ever.zet@gmail.com>
18
+ */
19
+ interface OutputFormatterInterface
20
+ {
21
+ /**
22
+ * Sets the decorated flag.
23
+ *
24
+ * @param bool $decorated Whether to decorate the messages or not
25
+ */
26
+ public function setDecorated($decorated);
27
+
28
+ /**
29
+ * Gets the decorated flag.
30
+ *
31
+ * @return bool true if the output will decorate messages, false otherwise
32
+ */
33
+ public function isDecorated();
34
+
35
+ /**
36
+ * Sets a new style.
37
+ *
38
+ * @param string $name The style name
39
+ * @param OutputFormatterStyleInterface $style The style instance
40
+ */
41
+ public function setStyle($name, OutputFormatterStyleInterface $style);
42
+
43
+ /**
44
+ * Checks if output formatter has style with specified name.
45
+ *
46
+ * @param string $name
47
+ *
48
+ * @return bool
49
+ */
50
+ public function hasStyle($name);
51
+
52
+ /**
53
+ * Gets style options from style with specified name.
54
+ *
55
+ * @param string $name
56
+ *
57
+ * @return OutputFormatterStyleInterface
58
+ *
59
+ * @throws \InvalidArgumentException When style isn't defined
60
+ */
61
+ public function getStyle($name);
62
+
63
+ /**
64
+ * Formats a message according to the given styles.
65
+ *
66
+ * @param string $message The message to style
67
+ *
68
+ * @return string The styled message
69
+ */
70
+ public function format($message);
71
+ }
vendor/symfony/console/Formatter/OutputFormatterStyle.php ADDED
@@ -0,0 +1,219 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Formatter;
13
+
14
+ use Symfony\Component\Console\Exception\InvalidArgumentException;
15
+
16
+ /**
17
+ * Formatter style class for defining styles.
18
+ *
19
+ * @author Konstantin Kudryashov <ever.zet@gmail.com>
20
+ */
21
+ class OutputFormatterStyle implements OutputFormatterStyleInterface
22
+ {
23
+ private static $availableForegroundColors = array(
24
+ 'black' => array('set' => 30, 'unset' => 39),
25
+ 'red' => array('set' => 31, 'unset' => 39),
26
+ 'green' => array('set' => 32, 'unset' => 39),
27
+ 'yellow' => array('set' => 33, 'unset' => 39),
28
+ 'blue' => array('set' => 34, 'unset' => 39),
29
+ 'magenta' => array('set' => 35, 'unset' => 39),
30
+ 'cyan' => array('set' => 36, 'unset' => 39),
31
+ 'white' => array('set' => 37, 'unset' => 39),
32
+ 'default' => array('set' => 39, 'unset' => 39),
33
+ );
34
+ private static $availableBackgroundColors = array(
35
+ 'black' => array('set' => 40, 'unset' => 49),
36
+ 'red' => array('set' => 41, 'unset' => 49),
37
+ 'green' => array('set' => 42, 'unset' => 49),
38
+ 'yellow' => array('set' => 43, 'unset' => 49),
39
+ 'blue' => array('set' => 44, 'unset' => 49),
40
+ 'magenta' => array('set' => 45, 'unset' => 49),
41
+ 'cyan' => array('set' => 46, 'unset' => 49),
42
+ 'white' => array('set' => 47, 'unset' => 49),
43
+ 'default' => array('set' => 49, 'unset' => 49),
44
+ );
45
+ private static $availableOptions = array(
46
+ 'bold' => array('set' => 1, 'unset' => 22),
47
+ 'underscore' => array('set' => 4, 'unset' => 24),
48
+ 'blink' => array('set' => 5, 'unset' => 25),
49
+ 'reverse' => array('set' => 7, 'unset' => 27),
50
+ 'conceal' => array('set' => 8, 'unset' => 28),
51
+ );
52
+
53
+ private $foreground;
54
+ private $background;
55
+ private $options = array();
56
+
57
+ /**
58
+ * Initializes output formatter style.
59
+ *
60
+ * @param string|null $foreground The style foreground color name
61
+ * @param string|null $background The style background color name
62
+ * @param array $options The style options
63
+ */
64
+ public function __construct($foreground = null, $background = null, array $options = array())
65
+ {
66
+ if (null !== $foreground) {
67
+ $this->setForeground($foreground);
68
+ }
69
+ if (null !== $background) {
70
+ $this->setBackground($background);
71
+ }
72
+ if (count($options)) {
73
+ $this->setOptions($options);
74
+ }
75
+ }
76
+
77
+ /**
78
+ * Sets style foreground color.
79
+ *
80
+ * @param string|null $color The color name
81
+ *
82
+ * @throws InvalidArgumentException When the color name isn't defined
83
+ */
84
+ public function setForeground($color = null)
85
+ {
86
+ if (null === $color) {
87
+ $this->foreground = null;
88
+
89
+ return;
90
+ }
91
+
92
+ if (!isset(static::$availableForegroundColors[$color])) {
93
+ throw new InvalidArgumentException(sprintf(
94
+ 'Invalid foreground color specified: "%s". Expected one of (%s)',
95
+ $color,
96
+ implode(', ', array_keys(static::$availableForegroundColors))
97
+ ));
98
+ }
99
+
100
+ $this->foreground = static::$availableForegroundColors[$color];
101
+ }
102
+
103
+ /**
104
+ * Sets style background color.
105
+ *
106
+ * @param string|null $color The color name
107
+ *
108
+ * @throws InvalidArgumentException When the color name isn't defined
109
+ */
110
+ public function setBackground($color = null)
111
+ {
112
+ if (null === $color) {
113
+ $this->background = null;
114
+
115
+ return;
116
+ }
117
+
118
+ if (!isset(static::$availableBackgroundColors[$color])) {
119
+ throw new InvalidArgumentException(sprintf(
120
+ 'Invalid background color specified: "%s". Expected one of (%s)',
121
+ $color,
122
+ implode(', ', array_keys(static::$availableBackgroundColors))
123
+ ));
124
+ }
125
+
126
+ $this->background = static::$availableBackgroundColors[$color];
127
+ }
128
+
129
+ /**
130
+ * Sets some specific style option.
131
+ *
132
+ * @param string $option The option name
133
+ *
134
+ * @throws InvalidArgumentException When the option name isn't defined
135
+ */
136
+ public function setOption($option)
137
+ {
138
+ if (!isset(static::$availableOptions[$option])) {
139
+ throw new InvalidArgumentException(sprintf(
140
+ 'Invalid option specified: "%s". Expected one of (%s)',
141
+ $option,
142
+ implode(', ', array_keys(static::$availableOptions))
143
+ ));
144
+ }
145
+
146
+ if (!in_array(static::$availableOptions[$option], $this->options)) {
147
+ $this->options[] = static::$availableOptions[$option];
148
+ }
149
+ }
150
+
151
+ /**
152
+ * Unsets some specific style option.
153
+ *
154
+ * @param string $option The option name
155
+ *
156
+ * @throws InvalidArgumentException When the option name isn't defined
157
+ */
158
+ public function unsetOption($option)
159
+ {
160
+ if (!isset(static::$availableOptions[$option])) {
161
+ throw new InvalidArgumentException(sprintf(
162
+ 'Invalid option specified: "%s". Expected one of (%s)',
163
+ $option,
164
+ implode(', ', array_keys(static::$availableOptions))
165
+ ));
166
+ }
167
+
168
+ $pos = array_search(static::$availableOptions[$option], $this->options);
169
+ if (false !== $pos) {
170
+ unset($this->options[$pos]);
171
+ }
172
+ }
173
+
174
+ /**
175
+ * {@inheritdoc}
176
+ */
177
+ public function setOptions(array $options)
178
+ {
179
+ $this->options = array();
180
+
181
+ foreach ($options as $option) {
182
+ $this->setOption($option);
183
+ }
184
+ }
185
+
186
+ /**
187
+ * Applies the style to a given text.
188
+ *
189
+ * @param string $text The text to style
190
+ *
191
+ * @return string
192
+ */
193
+ public function apply($text)
194
+ {
195
+ $setCodes = array();
196
+ $unsetCodes = array();
197
+
198
+ if (null !== $this->foreground) {
199
+ $setCodes[] = $this->foreground['set'];
200
+ $unsetCodes[] = $this->foreground['unset'];
201
+ }
202
+ if (null !== $this->background) {
203
+ $setCodes[] = $this->background['set'];
204
+ $unsetCodes[] = $this->background['unset'];
205
+ }
206
+ if (count($this->options)) {
207
+ foreach ($this->options as $option) {
208
+ $setCodes[] = $option['set'];
209
+ $unsetCodes[] = $option['unset'];
210
+ }
211
+ }
212
+
213
+ if (0 === count($setCodes)) {
214
+ return $text;
215
+ }
216
+
217
+ return sprintf("\033[%sm%s\033[%sm", implode(';', $setCodes), $text, implode(';', $unsetCodes));
218
+ }
219
+ }
vendor/symfony/console/Formatter/OutputFormatterStyleInterface.php ADDED
@@ -0,0 +1,62 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Formatter;
13
+
14
+ /**
15
+ * Formatter style interface for defining styles.
16
+ *
17
+ * @author Konstantin Kudryashov <ever.zet@gmail.com>
18
+ */
19
+ interface OutputFormatterStyleInterface
20
+ {
21
+ /**
22
+ * Sets style foreground color.
23
+ *
24
+ * @param string $color The color name
25
+ */
26
+ public function setForeground($color = null);
27
+
28
+ /**
29
+ * Sets style background color.
30
+ *
31
+ * @param string $color The color name
32
+ */
33
+ public function setBackground($color = null);
34
+
35
+ /**
36
+ * Sets some specific style option.
37
+ *
38
+ * @param string $option The option name
39
+ */
40
+ public function setOption($option);
41
+
42
+ /**
43
+ * Unsets some specific style option.
44
+ *
45
+ * @param string $option The option name
46
+ */
47
+ public function unsetOption($option);
48
+
49
+ /**
50
+ * Sets multiple style options at once.
51
+ */
52
+ public function setOptions(array $options);
53
+
54
+ /**
55
+ * Applies the style to a given text.
56
+ *
57
+ * @param string $text The text to style
58
+ *
59
+ * @return string
60
+ */
61
+ public function apply($text);
62
+ }
vendor/symfony/console/Formatter/OutputFormatterStyleStack.php ADDED
@@ -0,0 +1,109 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Formatter;
13
+
14
+ use Symfony\Component\Console\Exception\InvalidArgumentException;
15
+
16
+ /**
17
+ * @author Jean-François Simon <contact@jfsimon.fr>
18
+ */
19
+ class OutputFormatterStyleStack
20
+ {
21
+ /**
22
+ * @var OutputFormatterStyleInterface[]
23
+ */
24
+ private $styles;
25
+
26
+ private $emptyStyle;
27
+
28
+ public function __construct(OutputFormatterStyleInterface $emptyStyle = null)
29
+ {
30
+ $this->emptyStyle = $emptyStyle ?: new OutputFormatterStyle();
31
+ $this->reset();
32
+ }
33
+
34
+ /**
35
+ * Resets stack (ie. empty internal arrays).
36
+ */
37
+ public function reset()
38
+ {
39
+ $this->styles = array();
40
+ }
41
+
42
+ /**
43
+ * Pushes a style in the stack.
44
+ */
45
+ public function push(OutputFormatterStyleInterface $style)
46
+ {
47
+ $this->styles[] = $style;
48
+ }
49
+
50
+ /**
51
+ * Pops a style from the stack.
52
+ *
53
+ * @return OutputFormatterStyleInterface
54
+ *
55
+ * @throws InvalidArgumentException When style tags incorrectly nested
56
+ */
57
+ public function pop(OutputFormatterStyleInterface $style = null)
58
+ {
59
+ if (empty($this->styles)) {
60
+ return $this->emptyStyle;
61
+ }
62
+
63
+ if (null === $style) {
64
+ return array_pop($this->styles);
65
+ }
66
+
67
+ foreach (array_reverse($this->styles, true) as $index => $stackedStyle) {
68
+ if ($style->apply('') === $stackedStyle->apply('')) {
69
+ $this->styles = array_slice($this->styles, 0, $index);
70
+
71
+ return $stackedStyle;
72
+ }
73
+ }
74
+
75
+ throw new InvalidArgumentException('Incorrectly nested style tag found.');
76
+ }
77
+
78
+ /**
79
+ * Computes current style with stacks top codes.
80
+ *
81
+ * @return OutputFormatterStyle
82
+ */
83
+ public function getCurrent()
84
+ {
85
+ if (empty($this->styles)) {
86
+ return $this->emptyStyle;
87
+ }
88
+
89
+ return $this->styles[count($this->styles) - 1];
90
+ }
91
+
92
+ /**
93
+ * @return $this
94
+ */
95
+ public function setEmptyStyle(OutputFormatterStyleInterface $emptyStyle)
96
+ {
97
+ $this->emptyStyle = $emptyStyle;
98
+
99
+ return $this;
100
+ }
101
+
102
+ /**
103
+ * @return OutputFormatterStyleInterface
104
+ */
105
+ public function getEmptyStyle()
106
+ {
107
+ return $this->emptyStyle;
108
+ }
109
+ }
vendor/symfony/console/Formatter/index.php ADDED
File without changes
vendor/symfony/console/Helper/DebugFormatterHelper.php ADDED
@@ -0,0 +1,127 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Helper;
13
+
14
+ /**
15
+ * Helps outputting debug information when running an external program from a command.
16
+ *
17
+ * An external program can be a Process, an HTTP request, or anything else.
18
+ *
19
+ * @author Fabien Potencier <fabien@symfony.com>
20
+ */
21
+ class DebugFormatterHelper extends Helper
22
+ {
23
+ private $colors = array('black', 'red', 'green', 'yellow', 'blue', 'magenta', 'cyan', 'white', 'default');
24
+ private $started = array();
25
+ private $count = -1;
26
+
27
+ /**
28
+ * Starts a debug formatting session.
29
+ *
30
+ * @param string $id The id of the formatting session
31
+ * @param string $message The message to display
32
+ * @param string $prefix The prefix to use
33
+ *
34
+ * @return string
35
+ */
36
+ public function start($id, $message, $prefix = 'RUN')
37
+ {
38
+ $this->started[$id] = array('border' => ++$this->count % count($this->colors));
39
+
40
+ return sprintf("%s<bg=blue;fg=white> %s </> <fg=blue>%s</>\n", $this->getBorder($id), $prefix, $message);
41
+ }
42
+
43
+ /**
44
+ * Adds progress to a formatting session.
45
+ *
46
+ * @param string $id The id of the formatting session
47
+ * @param string $buffer The message to display
48
+ * @param bool $error Whether to consider the buffer as error
49
+ * @param string $prefix The prefix for output
50
+ * @param string $errorPrefix The prefix for error output
51
+ *
52
+ * @return string
53
+ */
54
+ public function progress($id, $buffer, $error = false, $prefix = 'OUT', $errorPrefix = 'ERR')
55
+ {
56
+ $message = '';
57
+
58
+ if ($error) {
59
+ if (isset($this->started[$id]['out'])) {
60
+ $message .= "\n";
61
+ unset($this->started[$id]['out']);
62
+ }
63
+ if (!isset($this->started[$id]['err'])) {
64
+ $message .= sprintf('%s<bg=red;fg=white> %s </> ', $this->getBorder($id), $errorPrefix);
65
+ $this->started[$id]['err'] = true;
66
+ }
67
+
68
+ $message .= str_replace("\n", sprintf("\n%s<bg=red;fg=white> %s </> ", $this->getBorder($id), $errorPrefix), $buffer);
69
+ } else {
70
+ if (isset($this->started[$id]['err'])) {
71
+ $message .= "\n";
72
+ unset($this->started[$id]['err']);
73
+ }
74
+ if (!isset($this->started[$id]['out'])) {
75
+ $message .= sprintf('%s<bg=green;fg=white> %s </> ', $this->getBorder($id), $prefix);
76
+ $this->started[$id]['out'] = true;
77
+ }
78
+
79
+ $message .= str_replace("\n", sprintf("\n%s<bg=green;fg=white> %s </> ", $this->getBorder($id), $prefix), $buffer);
80
+ }
81
+
82
+ return $message;
83
+ }
84
+
85
+ /**
86
+ * Stops a formatting session.
87
+ *
88
+ * @param string $id The id of the formatting session
89
+ * @param string $message The message to display
90
+ * @param bool $successful Whether to consider the result as success
91
+ * @param string $prefix The prefix for the end output
92
+ *
93
+ * @return string
94
+ */
95
+ public function stop($id, $message, $successful, $prefix = 'RES')
96
+ {
97
+ $trailingEOL = isset($this->started[$id]['out']) || isset($this->started[$id]['err']) ? "\n" : '';
98
+
99
+ if ($successful) {
100
+ return sprintf("%s%s<bg=green;fg=white> %s </> <fg=green>%s</>\n", $trailingEOL, $this->getBorder($id), $prefix, $message);
101
+ }
102
+
103
+ $message = sprintf("%s%s<bg=red;fg=white> %s </> <fg=red>%s</>\n", $trailingEOL, $this->getBorder($id), $prefix, $message);
104
+
105
+ unset($this->started[$id]['out'], $this->started[$id]['err']);
106
+
107
+ return $message;
108
+ }
109
+
110
+ /**
111
+ * @param string $id The id of the formatting session
112
+ *
113
+ * @return string
114
+ */
115
+ private function getBorder($id)
116
+ {
117
+ return sprintf('<bg=%s> </>', $this->colors[$this->started[$id]['border']]);
118
+ }
119
+
120
+ /**
121
+ * {@inheritdoc}
122
+ */
123
+ public function getName()
124
+ {
125
+ return 'debug_formatter';
126
+ }
127
+ }
vendor/symfony/console/Helper/DescriptorHelper.php ADDED
@@ -0,0 +1,94 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Helper;
13
+
14
+ use Symfony\Component\Console\Descriptor\DescriptorInterface;
15
+ use Symfony\Component\Console\Descriptor\JsonDescriptor;
16
+ use Symfony\Component\Console\Descriptor\MarkdownDescriptor;
17
+ use Symfony\Component\Console\Descriptor\TextDescriptor;
18
+ use Symfony\Component\Console\Descriptor\XmlDescriptor;
19
+ use Symfony\Component\Console\Output\OutputInterface;
20
+ use Symfony\Component\Console\Exception\InvalidArgumentException;
21
+
22
+ /**
23
+ * This class adds helper method to describe objects in various formats.
24
+ *
25
+ * @author Jean-François Simon <contact@jfsimon.fr>
26
+ */
27
+ class DescriptorHelper extends Helper
28
+ {
29
+ /**
30
+ * @var DescriptorInterface[]
31
+ */
32
+ private $descriptors = array();
33
+
34
+ public function __construct()
35
+ {
36
+ $this
37
+ ->register('txt', new TextDescriptor())
38
+ ->register('xml', new XmlDescriptor())
39
+ ->register('json', new JsonDescriptor())
40
+ ->register('md', new MarkdownDescriptor())
41
+ ;
42
+ }
43
+
44
+ /**
45
+ * Describes an object if supported.
46
+ *
47
+ * Available options are:
48
+ * * format: string, the output format name
49
+ * * raw_text: boolean, sets output type as raw
50
+ *
51
+ * @param OutputInterface $output
52
+ * @param object $object
53
+ * @param array $options
54
+ *
55
+ * @throws InvalidArgumentException when the given format is not supported
56
+ */
57
+ public function describe(OutputInterface $output, $object, array $options = array())
58
+ {
59
+ $options = array_merge(array(
60
+ 'raw_text' => false,
61
+ 'format' => 'txt',
62
+ ), $options);
63
+
64
+ if (!isset($this->descriptors[$options['format']])) {
65
+ throw new InvalidArgumentException(sprintf('Unsupported format "%s".', $options['format']));
66
+ }
67
+
68
+ $descriptor = $this->descriptors[$options['format']];
69
+ $descriptor->describe($output, $object, $options);
70
+ }
71
+
72
+ /**
73
+ * Registers a descriptor.
74
+ *
75
+ * @param string $format
76
+ * @param DescriptorInterface $descriptor
77
+ *
78
+ * @return $this
79
+ */
80
+ public function register($format, DescriptorInterface $descriptor)
81
+ {
82
+ $this->descriptors[$format] = $descriptor;
83
+
84
+ return $this;
85
+ }
86
+
87
+ /**
88
+ * {@inheritdoc}
89
+ */
90
+ public function getName()
91
+ {
92
+ return 'descriptor';
93
+ }
94
+ }
vendor/symfony/console/Helper/FormatterHelper.php ADDED
@@ -0,0 +1,106 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Helper;
13
+
14
+ use Symfony\Component\Console\Formatter\OutputFormatter;
15
+
16
+ /**
17
+ * The Formatter class provides helpers to format messages.
18
+ *
19
+ * @author Fabien Potencier <fabien@symfony.com>
20
+ */
21
+ class FormatterHelper extends Helper
22
+ {
23
+ /**
24
+ * Formats a message within a section.
25
+ *
26
+ * @param string $section The section name
27
+ * @param string $message The message
28
+ * @param string $style The style to apply to the section
29
+ *
30
+ * @return string The format section
31
+ */
32
+ public function formatSection($section, $message, $style = 'info')
33
+ {
34
+ return sprintf('<%s>[%s]</%s> %s', $style, $section, $style, $message);
35
+ }
36
+
37
+ /**
38
+ * Formats a message as a block of text.
39
+ *
40
+ * @param string|array $messages The message to write in the block
41
+ * @param string $style The style to apply to the whole block
42
+ * @param bool $large Whether to return a large block
43
+ *
44
+ * @return string The formatter message
45
+ */
46
+ public function formatBlock($messages, $style, $large = false)
47
+ {
48
+ if (!is_array($messages)) {
49
+ $messages = array($messages);
50
+ }
51
+
52
+ $len = 0;
53
+ $lines = array();
54
+ foreach ($messages as $message) {
55
+ $message = OutputFormatter::escape($message);
56
+ $lines[] = sprintf($large ? ' %s ' : ' %s ', $message);
57
+ $len = max($this->strlen($message) + ($large ? 4 : 2), $len);
58
+ }
59
+
60
+ $messages = $large ? array(str_repeat(' ', $len)) : array();
61
+ for ($i = 0; isset($lines[$i]); ++$i) {
62
+ $messages[] = $lines[$i].str_repeat(' ', $len - $this->strlen($lines[$i]));
63
+ }
64
+ if ($large) {
65
+ $messages[] = str_repeat(' ', $len);
66
+ }
67
+
68
+ for ($i = 0; isset($messages[$i]); ++$i) {
69
+ $messages[$i] = sprintf('<%s>%s</%s>', $style, $messages[$i], $style);
70
+ }
71
+
72
+ return implode("\n", $messages);
73
+ }
74
+
75
+ /**
76
+ * Truncates a message to the given length.
77
+ *
78
+ * @param string $message
79
+ * @param int $length
80
+ * @param string $suffix
81
+ *
82
+ * @return string
83
+ */
84
+ public function truncate($message, $length, $suffix = '...')
85
+ {
86
+ $computedLength = $length - $this->strlen($suffix);
87
+
88
+ if ($computedLength > $this->strlen($message)) {
89
+ return $message;
90
+ }
91
+
92
+ if (false === $encoding = mb_detect_encoding($message, null, true)) {
93
+ return substr($message, 0, $length).$suffix;
94
+ }
95
+
96
+ return mb_substr($message, 0, $length, $encoding).$suffix;
97
+ }
98
+
99
+ /**
100
+ * {@inheritdoc}
101
+ */
102
+ public function getName()
103
+ {
104
+ return 'formatter';
105
+ }
106
+ }
vendor/symfony/console/Helper/Helper.php ADDED
@@ -0,0 +1,138 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Helper;
13
+
14
+ use Symfony\Component\Console\Formatter\OutputFormatterInterface;
15
+
16
+ /**
17
+ * Helper is the base class for all helper classes.
18
+ *
19
+ * @author Fabien Potencier <fabien@symfony.com>
20
+ */
21
+ abstract class Helper implements HelperInterface
22
+ {
23
+ protected $helperSet = null;
24
+
25
+ /**
26
+ * {@inheritdoc}
27
+ */
28
+ public function setHelperSet(HelperSet $helperSet = null)
29
+ {
30
+ $this->helperSet = $helperSet;
31
+ }
32
+
33
+ /**
34
+ * {@inheritdoc}
35
+ */
36
+ public function getHelperSet()
37
+ {
38
+ return $this->helperSet;
39
+ }
40
+
41
+ /**
42
+ * Returns the length of a string, using mb_strwidth if it is available.
43
+ *
44
+ * @param string $string The string to check its length
45
+ *
46
+ * @return int The length of the string
47
+ */
48
+ public static function strlen($string)
49
+ {
50
+ if (false === $encoding = mb_detect_encoding($string, null, true)) {
51
+ return strlen($string);
52
+ }
53
+
54
+ return mb_strwidth($string, $encoding);
55
+ }
56
+
57
+ /**
58
+ * Returns the subset of a string, using mb_substr if it is available.
59
+ *
60
+ * @param string $string String to subset
61
+ * @param int $from Start offset
62
+ * @param int|null $length Length to read
63
+ *
64
+ * @return string The string subset
65
+ */
66
+ public static function substr($string, $from, $length = null)
67
+ {
68
+ if (false === $encoding = mb_detect_encoding($string, null, true)) {
69
+ return substr($string, $from, $length);
70
+ }
71
+
72
+ return mb_substr($string, $from, $length, $encoding);
73
+ }
74
+
75
+ public static function formatTime($secs)
76
+ {
77
+ static $timeFormats = array(
78
+ array(0, '< 1 sec'),
79
+ array(1, '1 sec'),
80
+ array(2, 'secs', 1),
81
+ array(60, '1 min'),
82
+ array(120, 'mins', 60),
83
+ array(3600, '1 hr'),
84
+ array(7200, 'hrs', 3600),
85
+ array(86400, '1 day'),
86
+ array(172800, 'days', 86400),
87
+ );
88
+
89
+ foreach ($timeFormats as $index => $format) {
90
+ if ($secs >= $format[0]) {
91
+ if ((isset($timeFormats[$index + 1]) && $secs < $timeFormats[$index + 1][0])
92
+ || $index == count($timeFormats) - 1
93
+ ) {
94
+ if (2 == count($format)) {
95
+ return $format[1];
96
+ }
97
+
98
+ return floor($secs / $format[2]).' '.$format[1];
99
+ }
100
+ }
101
+ }
102
+ }
103
+
104
+ public static function formatMemory($memory)
105
+ {
106
+ if ($memory >= 1024 * 1024 * 1024) {
107
+ return sprintf('%.1f GiB', $memory / 1024 / 1024 / 1024);
108
+ }
109
+
110
+ if ($memory >= 1024 * 1024) {
111
+ return sprintf('%.1f MiB', $memory / 1024 / 1024);
112
+ }
113
+
114
+ if ($memory >= 1024) {
115
+ return sprintf('%d KiB', $memory / 1024);
116
+ }
117
+
118
+ return sprintf('%d B', $memory);
119
+ }
120
+
121
+ public static function strlenWithoutDecoration(OutputFormatterInterface $formatter, $string)
122
+ {
123
+ return self::strlen(self::removeDecoration($formatter, $string));
124
+ }
125
+
126
+ public static function removeDecoration(OutputFormatterInterface $formatter, $string)
127
+ {
128
+ $isDecorated = $formatter->isDecorated();
129
+ $formatter->setDecorated(false);
130
+ // remove <...> formatting
131
+ $string = $formatter->format($string);
132
+ // remove already formatted characters
133
+ $string = preg_replace("/\033\[[^m]*m/", '', $string);
134
+ $formatter->setDecorated($isDecorated);
135
+
136
+ return $string;
137
+ }
138
+ }
vendor/symfony/console/Helper/HelperInterface.php ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Helper;
13
+
14
+ /**
15
+ * HelperInterface is the interface all helpers must implement.
16
+ *
17
+ * @author Fabien Potencier <fabien@symfony.com>
18
+ */
19
+ interface HelperInterface
20
+ {
21
+ /**
22
+ * Sets the helper set associated with this helper.
23
+ */
24
+ public function setHelperSet(HelperSet $helperSet = null);
25
+
26
+ /**
27
+ * Gets the helper set associated with this helper.
28
+ *
29
+ * @return HelperSet A HelperSet instance
30
+ */
31
+ public function getHelperSet();
32
+
33
+ /**
34
+ * Returns the canonical name of this helper.
35
+ *
36
+ * @return string The canonical name
37
+ */
38
+ public function getName();
39
+ }
vendor/symfony/console/Helper/HelperSet.php ADDED
@@ -0,0 +1,108 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Helper;
13
+
14
+ use Symfony\Component\Console\Command\Command;
15
+ use Symfony\Component\Console\Exception\InvalidArgumentException;
16
+
17
+ /**
18
+ * HelperSet represents a set of helpers to be used with a command.
19
+ *
20
+ * @author Fabien Potencier <fabien@symfony.com>
21
+ */
22
+ class HelperSet implements \IteratorAggregate
23
+ {
24
+ /**
25
+ * @var Helper[]
26
+ */
27
+ private $helpers = array();
28
+ private $command;
29
+
30
+ /**
31
+ * @param Helper[] $helpers An array of helper
32
+ */
33
+ public function __construct(array $helpers = array())
34
+ {
35
+ foreach ($helpers as $alias => $helper) {
36
+ $this->set($helper, is_int($alias) ? null : $alias);
37
+ }
38
+ }
39
+
40
+ /**
41
+ * Sets a helper.
42
+ *
43
+ * @param HelperInterface $helper The helper instance
44
+ * @param string $alias An alias
45
+ */
46
+ public function set(HelperInterface $helper, $alias = null)
47
+ {
48
+ $this->helpers[$helper->getName()] = $helper;
49
+ if (null !== $alias) {
50
+ $this->helpers[$alias] = $helper;
51
+ }
52
+
53
+ $helper->setHelperSet($this);
54
+ }
55
+
56
+ /**
57
+ * Returns true if the helper if defined.
58
+ *
59
+ * @param string $name The helper name
60
+ *
61
+ * @return bool true if the helper is defined, false otherwise
62
+ */
63
+ public function has($name)
64
+ {
65
+ return isset($this->helpers[$name]);
66
+ }
67
+
68
+ /**
69
+ * Gets a helper value.
70
+ *
71
+ * @param string $name The helper name
72
+ *
73
+ * @return HelperInterface The helper instance
74
+ *
75
+ * @throws InvalidArgumentException if the helper is not defined
76
+ */
77
+ public function get($name)
78
+ {
79
+ if (!$this->has($name)) {
80
+ throw new InvalidArgumentException(sprintf('The helper "%s" is not defined.', $name));
81
+ }
82
+
83
+ return $this->helpers[$name];
84
+ }
85
+
86
+ public function setCommand(Command $command = null)
87
+ {
88
+ $this->command = $command;
89
+ }
90
+
91
+ /**
92
+ * Gets the command associated with this helper set.
93
+ *
94
+ * @return Command A Command instance
95
+ */
96
+ public function getCommand()
97
+ {
98
+ return $this->command;
99
+ }
100
+
101
+ /**
102
+ * @return Helper[]
103
+ */
104
+ public function getIterator()
105
+ {
106
+ return new \ArrayIterator($this->helpers);
107
+ }
108
+ }
vendor/symfony/console/Helper/InputAwareHelper.php ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Helper;
13
+
14
+ use Symfony\Component\Console\Input\InputInterface;
15
+ use Symfony\Component\Console\Input\InputAwareInterface;
16
+
17
+ /**
18
+ * An implementation of InputAwareInterface for Helpers.
19
+ *
20
+ * @author Wouter J <waldio.webdesign@gmail.com>
21
+ */
22
+ abstract class InputAwareHelper extends Helper implements InputAwareInterface
23
+ {
24
+ protected $input;
25
+
26
+ /**
27
+ * {@inheritdoc}
28
+ */
29
+ public function setInput(InputInterface $input)
30
+ {
31
+ $this->input = $input;
32
+ }
33
+ }
vendor/symfony/console/Helper/ProcessHelper.php ADDED
@@ -0,0 +1,144 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Helper;
13
+
14
+ use Symfony\Component\Console\Output\ConsoleOutputInterface;
15
+ use Symfony\Component\Console\Output\OutputInterface;
16
+ use Symfony\Component\Process\Exception\ProcessFailedException;
17
+ use Symfony\Component\Process\Process;
18
+ use Symfony\Component\Process\ProcessBuilder;
19
+
20
+ /**
21
+ * The ProcessHelper class provides helpers to run external processes.
22
+ *
23
+ * @author Fabien Potencier <fabien@symfony.com>
24
+ */
25
+ class ProcessHelper extends Helper
26
+ {
27
+ /**
28
+ * Runs an external process.
29
+ *
30
+ * @param OutputInterface $output An OutputInterface instance
31
+ * @param string|array|Process $cmd An instance of Process or an array of arguments to escape and run or a command to run
32
+ * @param string|null $error An error message that must be displayed if something went wrong
33
+ * @param callable|null $callback A PHP callback to run whenever there is some
34
+ * output available on STDOUT or STDERR
35
+ * @param int $verbosity The threshold for verbosity
36
+ *
37
+ * @return Process The process that ran
38
+ */
39
+ public function run(OutputInterface $output, $cmd, $error = null, callable $callback = null, $verbosity = OutputInterface::VERBOSITY_VERY_VERBOSE)
40
+ {
41
+ if ($output instanceof ConsoleOutputInterface) {
42
+ $output = $output->getErrorOutput();
43
+ }
44
+
45
+ $formatter = $this->getHelperSet()->get('debug_formatter');
46
+
47
+ if (is_array($cmd)) {
48
+ $process = ProcessBuilder::create($cmd)->getProcess();
49
+ } elseif ($cmd instanceof Process) {
50
+ $process = $cmd;
51
+ } else {
52
+ $process = new Process($cmd);
53
+ }
54
+
55
+ if ($verbosity <= $output->getVerbosity()) {
56
+ $output->write($formatter->start(spl_object_hash($process), $this->escapeString($process->getCommandLine())));
57
+ }
58
+
59
+ if ($output->isDebug()) {
60
+ $callback = $this->wrapCallback($output, $process, $callback);
61
+ }
62
+
63
+ $process->run($callback);
64
+
65
+ if ($verbosity <= $output->getVerbosity()) {
66
+ $message = $process->isSuccessful() ? 'Command ran successfully' : sprintf('%s Command did not run successfully', $process->getExitCode());
67
+ $output->write($formatter->stop(spl_object_hash($process), $message, $process->isSuccessful()));
68
+ }
69
+
70
+ if (!$process->isSuccessful() && null !== $error) {
71
+ $output->writeln(sprintf('<error>%s</error>', $this->escapeString($error)));
72
+ }
73
+
74
+ return $process;
75
+ }
76
+
77
+ /**
78
+ * Runs the process.
79
+ *
80
+ * This is identical to run() except that an exception is thrown if the process
81
+ * exits with a non-zero exit code.
82
+ *
83
+ * @param OutputInterface $output An OutputInterface instance
84
+ * @param string|Process $cmd An instance of Process or a command to run
85
+ * @param string|null $error An error message that must be displayed if something went wrong
86
+ * @param callable|null $callback A PHP callback to run whenever there is some
87
+ * output available on STDOUT or STDERR
88
+ *
89
+ * @return Process The process that ran
90
+ *
91
+ * @throws ProcessFailedException
92
+ *
93
+ * @see run()
94
+ */
95
+ public function mustRun(OutputInterface $output, $cmd, $error = null, callable $callback = null)
96
+ {
97
+ $process = $this->run($output, $cmd, $error, $callback);
98
+
99
+ if (!$process->isSuccessful()) {
100
+ throw new ProcessFailedException($process);
101
+ }
102
+
103
+ return $process;
104
+ }
105
+
106
+ /**
107
+ * Wraps a Process callback to add debugging output.
108
+ *
109
+ * @param OutputInterface $output An OutputInterface interface
110
+ * @param Process $process The Process
111
+ * @param callable|null $callback A PHP callable
112
+ *
113
+ * @return callable
114
+ */
115
+ public function wrapCallback(OutputInterface $output, Process $process, callable $callback = null)
116
+ {
117
+ if ($output instanceof ConsoleOutputInterface) {
118
+ $output = $output->getErrorOutput();
119
+ }
120
+
121
+ $formatter = $this->getHelperSet()->get('debug_formatter');
122
+
123
+ return function ($type, $buffer) use ($output, $process, $callback, $formatter) {
124
+ $output->write($formatter->progress(spl_object_hash($process), $this->escapeString($buffer), Process::ERR === $type));
125
+
126
+ if (null !== $callback) {
127
+ call_user_func($callback, $type, $buffer);
128
+ }
129
+ };
130
+ }
131
+
132
+ private function escapeString($str)
133
+ {
134
+ return str_replace('<', '\\<', $str);
135
+ }
136
+
137
+ /**
138
+ * {@inheritdoc}
139
+ */
140
+ public function getName()
141
+ {
142
+ return 'process';
143
+ }
144
+ }
vendor/symfony/console/Helper/ProgressBar.php ADDED
@@ -0,0 +1,617 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Helper;
13
+
14
+ use Symfony\Component\Console\Output\ConsoleOutputInterface;
15
+ use Symfony\Component\Console\Output\OutputInterface;
16
+ use Symfony\Component\Console\Exception\LogicException;
17
+ use Symfony\Component\Console\Terminal;
18
+
19
+ /**
20
+ * The ProgressBar provides helpers to display progress output.
21
+ *
22
+ * @author Fabien Potencier <fabien@symfony.com>
23
+ * @author Chris Jones <leeked@gmail.com>
24
+ */
25
+ final class ProgressBar
26
+ {
27
+ private $barWidth = 28;
28
+ private $barChar;
29
+ private $emptyBarChar = '-';
30
+ private $progressChar = '>';
31
+ private $format;
32
+ private $internalFormat;
33
+ private $redrawFreq = 1;
34
+ private $output;
35
+ private $step = 0;
36
+ private $max;
37
+ private $startTime;
38
+ private $stepWidth;
39
+ private $percent = 0.0;
40
+ private $formatLineCount;
41
+ private $messages = array();
42
+ private $overwrite = true;
43
+ private $terminal;
44
+ private $firstRun = true;
45
+
46
+ private static $formatters;
47
+ private static $formats;
48
+
49
+ /**
50
+ * @param OutputInterface $output An OutputInterface instance
51
+ * @param int $max Maximum steps (0 if unknown)
52
+ */
53
+ public function __construct(OutputInterface $output, $max = 0)
54
+ {
55
+ if ($output instanceof ConsoleOutputInterface) {
56
+ $output = $output->getErrorOutput();
57
+ }
58
+
59
+ $this->output = $output;
60
+ $this->setMaxSteps($max);
61
+ $this->terminal = new Terminal();
62
+
63
+ if (!$this->output->isDecorated()) {
64
+ // disable overwrite when output does not support ANSI codes.
65
+ $this->overwrite = false;
66
+
67
+ // set a reasonable redraw frequency so output isn't flooded
68
+ $this->setRedrawFrequency($max / 10);
69
+ }
70
+
71
+ $this->startTime = time();
72
+ }
73
+
74
+ /**
75
+ * Sets a placeholder formatter for a given name.
76
+ *
77
+ * This method also allow you to override an existing placeholder.
78
+ *
79
+ * @param string $name The placeholder name (including the delimiter char like %)
80
+ * @param callable $callable A PHP callable
81
+ */
82
+ public static function setPlaceholderFormatterDefinition($name, callable $callable)
83
+ {
84
+ if (!self::$formatters) {
85
+ self::$formatters = self::initPlaceholderFormatters();
86
+ }
87
+
88
+ self::$formatters[$name] = $callable;
89
+ }
90
+
91
+ /**
92
+ * Gets the placeholder formatter for a given name.
93
+ *
94
+ * @param string $name The placeholder name (including the delimiter char like %)
95
+ *
96
+ * @return callable|null A PHP callable
97
+ */
98
+ public static function getPlaceholderFormatterDefinition($name)
99
+ {
100
+ if (!self::$formatters) {
101
+ self::$formatters = self::initPlaceholderFormatters();
102
+ }
103
+
104
+ return isset(self::$formatters[$name]) ? self::$formatters[$name] : null;
105
+ }
106
+
107
+ /**
108
+ * Sets a format for a given name.
109
+ *
110
+ * This method also allow you to override an existing format.
111
+ *
112
+ * @param string $name The format name
113
+ * @param string $format A format string
114
+ */
115
+ public static function setFormatDefinition($name, $format)
116
+ {
117
+ if (!self::$formats) {
118
+ self::$formats = self::initFormats();
119
+ }
120
+
121
+ self::$formats[$name] = $format;
122
+ }
123
+
124
+ /**
125
+ * Gets the format for a given name.
126
+ *
127
+ * @param string $name The format name
128
+ *
129
+ * @return string|null A format string
130
+ */
131
+ public static function getFormatDefinition($name)
132
+ {
133
+ if (!self::$formats) {
134
+ self::$formats = self::initFormats();
135
+ }
136
+
137
+ return isset(self::$formats[$name]) ? self::$formats[$name] : null;
138
+ }
139
+
140
+ /**
141
+ * Associates a text with a named placeholder.
142
+ *
143
+ * The text is displayed when the progress bar is rendered but only
144
+ * when the corresponding placeholder is part of the custom format line
145
+ * (by wrapping the name with %).
146
+ *
147
+ * @param string $message The text to associate with the placeholder
148
+ * @param string $name The name of the placeholder
149
+ */
150
+ public function setMessage($message, $name = 'message')
151
+ {
152
+ $this->messages[$name] = $message;
153
+ }
154
+
155
+ public function getMessage($name = 'message')
156
+ {
157
+ return $this->messages[$name];
158
+ }
159
+
160
+ /**
161
+ * Gets the progress bar start time.
162
+ *
163
+ * @return int The progress bar start time
164
+ */
165
+ public function getStartTime()
166
+ {
167
+ return $this->startTime;
168
+ }
169
+
170
+ /**
171
+ * Gets the progress bar maximal steps.
172
+ *
173
+ * @return int The progress bar max steps
174
+ */
175
+ public function getMaxSteps()
176
+ {
177
+ return $this->max;
178
+ }
179
+
180
+ /**
181
+ * Gets the current step position.
182
+ *
183
+ * @return int The progress bar step
184
+ */
185
+ public function getProgress()
186
+ {
187
+ return $this->step;
188
+ }
189
+
190
+ /**
191
+ * Gets the progress bar step width.
192
+ *
193
+ * @return int The progress bar step width
194
+ */
195
+ private function getStepWidth()
196
+ {
197
+ return $this->stepWidth;
198
+ }
199
+
200
+ /**
201
+ * Gets the current progress bar percent.
202
+ *
203
+ * @return float The current progress bar percent
204
+ */
205
+ public function getProgressPercent()
206
+ {
207
+ return $this->percent;
208
+ }
209
+
210
+ /**
211
+ * Sets the progress bar width.
212
+ *
213
+ * @param int $size The progress bar size
214
+ */
215
+ public function setBarWidth($size)
216
+ {
217
+ $this->barWidth = max(1, (int) $size);
218
+ }
219
+
220
+ /**
221
+ * Gets the progress bar width.
222
+ *
223
+ * @return int The progress bar size
224
+ */
225
+ public function getBarWidth()
226
+ {
227
+ return $this->barWidth;
228
+ }
229
+
230
+ /**
231
+ * Sets the bar character.
232
+ *
233
+ * @param string $char A character
234
+ */
235
+ public function setBarCharacter($char)
236
+ {
237
+ $this->barChar = $char;
238
+ }
239
+
240
+ /**
241
+ * Gets the bar character.
242
+ *
243
+ * @return string A character
244
+ */
245
+ public function getBarCharacter()
246
+ {
247
+ if (null === $this->barChar) {
248
+ return $this->max ? '=' : $this->emptyBarChar;
249
+ }
250
+
251
+ return $this->barChar;
252
+ }
253
+
254
+ /**
255
+ * Sets the empty bar character.
256
+ *
257
+ * @param string $char A character
258
+ */
259
+ public function setEmptyBarCharacter($char)
260
+ {
261
+ $this->emptyBarChar = $char;
262
+ }
263
+
264
+ /**
265
+ * Gets the empty bar character.
266
+ *
267
+ * @return string A character
268
+ */
269
+ public function getEmptyBarCharacter()
270
+ {
271
+ return $this->emptyBarChar;
272
+ }
273
+
274
+ /**
275
+ * Sets the progress bar character.
276
+ *
277
+ * @param string $char A character
278
+ */
279
+ public function setProgressCharacter($char)
280
+ {
281
+ $this->progressChar = $char;
282
+ }
283
+
284
+ /**
285
+ * Gets the progress bar character.
286
+ *
287
+ * @return string A character
288
+ */
289
+ public function getProgressCharacter()
290
+ {
291
+ return $this->progressChar;
292
+ }
293
+
294
+ /**
295
+ * Sets the progress bar format.
296
+ *
297
+ * @param string $format The format
298
+ */
299
+ public function setFormat($format)
300
+ {
301
+ $this->format = null;
302
+ $this->internalFormat = $format;
303
+ }
304
+
305
+ /**
306
+ * Sets the redraw frequency.
307
+ *
308
+ * @param int|float $freq The frequency in steps
309
+ */
310
+ public function setRedrawFrequency($freq)
311
+ {
312
+ $this->redrawFreq = max((int) $freq, 1);
313
+ }
314
+
315
+ /**
316
+ * Starts the progress output.
317
+ *
318
+ * @param int|null $max Number of steps to complete the bar (0 if indeterminate), null to leave unchanged
319
+ */
320
+ public function start($max = null)
321
+ {
322
+ $this->startTime = time();
323
+ $this->step = 0;
324
+ $this->percent = 0.0;
325
+
326
+ if (null !== $max) {
327
+ $this->setMaxSteps($max);
328
+ }
329
+
330
+ $this->display();
331
+ }
332
+
333
+ /**
334
+ * Advances the progress output X steps.
335
+ *
336
+ * @param int $step Number of steps to advance
337
+ */
338
+ public function advance($step = 1)
339
+ {
340
+ $this->setProgress($this->step + $step);
341
+ }
342
+
343
+ /**
344
+ * Sets whether to overwrite the progressbar, false for new line.
345
+ *
346
+ * @param bool $overwrite
347
+ */
348
+ public function setOverwrite($overwrite)
349
+ {
350
+ $this->overwrite = (bool) $overwrite;
351
+ }
352
+
353
+ /**
354
+ * Sets the current progress.
355
+ *
356
+ * @param int $step The current progress
357
+ */
358
+ public function setProgress($step)
359
+ {
360
+ $step = (int) $step;
361
+
362
+ if ($this->max && $step > $this->max) {
363
+ $this->max = $step;
364
+ } elseif ($step < 0) {
365
+ $step = 0;
366
+ }
367
+
368
+ $prevPeriod = (int) ($this->step / $this->redrawFreq);
369
+ $currPeriod = (int) ($step / $this->redrawFreq);
370
+ $this->step = $step;
371
+ $this->percent = $this->max ? (float) $this->step / $this->max : 0;
372
+ if ($prevPeriod !== $currPeriod || $this->max === $step) {
373
+ $this->display();
374
+ }
375
+ }
376
+
377
+ /**
378
+ * Finishes the progress output.
379
+ */
380
+ public function finish()
381
+ {
382
+ if (!$this->max) {
383
+ $this->max = $this->step;
384
+ }
385
+
386
+ if ($this->step === $this->max && !$this->overwrite) {
387
+ // prevent double 100% output
388
+ return;
389
+ }
390
+
391
+ $this->setProgress($this->max);
392
+ }
393
+
394
+ /**
395
+ * Outputs the current progress string.
396
+ */
397
+ public function display()
398
+ {
399
+ if (OutputInterface::VERBOSITY_QUIET === $this->output->getVerbosity()) {
400
+ return;
401
+ }
402
+
403
+ if (null === $this->format) {
404
+ $this->setRealFormat($this->internalFormat ?: $this->determineBestFormat());
405
+ }
406
+
407
+ $this->overwrite($this->buildLine());
408
+ }
409
+
410
+ /**
411
+ * Removes the progress bar from the current line.
412
+ *
413
+ * This is useful if you wish to write some output
414
+ * while a progress bar is running.
415
+ * Call display() to show the progress bar again.
416
+ */
417
+ public function clear()
418
+ {
419
+ if (!$this->overwrite) {
420
+ return;
421
+ }
422
+
423
+ if (null === $this->format) {
424
+ $this->setRealFormat($this->internalFormat ?: $this->determineBestFormat());
425
+ }
426
+
427
+ $this->overwrite('');
428
+ }
429
+
430
+ /**
431
+ * Sets the progress bar format.
432
+ *
433
+ * @param string $format The format
434
+ */
435
+ private function setRealFormat($format)
436
+ {
437
+ // try to use the _nomax variant if available
438
+ if (!$this->max && null !== self::getFormatDefinition($format.'_nomax')) {
439
+ $this->format = self::getFormatDefinition($format.'_nomax');
440
+ } elseif (null !== self::getFormatDefinition($format)) {
441
+ $this->format = self::getFormatDefinition($format);
442
+ } else {
443
+ $this->format = $format;
444
+ }
445
+
446
+ $this->formatLineCount = substr_count($this->format, "\n");
447
+ }
448
+
449
+ /**
450
+ * Sets the progress bar maximal steps.
451
+ *
452
+ * @param int $max The progress bar max steps
453
+ */
454
+ private function setMaxSteps($max)
455
+ {
456
+ $this->max = max(0, (int) $max);
457
+ $this->stepWidth = $this->max ? Helper::strlen($this->max) : 4;
458
+ }
459
+
460
+ /**
461
+ * Overwrites a previous message to the output.
462
+ *
463
+ * @param string $message The message
464
+ */
465
+ private function overwrite($message)
466
+ {
467
+ if ($this->overwrite) {
468
+ if (!$this->firstRun) {
469
+ // Move the cursor to the beginning of the line
470
+ $this->output->write("\x0D");
471
+
472
+ // Erase the line
473
+ $this->output->write("\x1B[2K");
474
+
475
+ // Erase previous lines
476
+ if ($this->formatLineCount > 0) {
477
+ $this->output->write(str_repeat("\x1B[1A\x1B[2K", $this->formatLineCount));
478
+ }
479
+ }
480
+ } elseif ($this->step > 0) {
481
+ $this->output->writeln('');
482
+ }
483
+
484
+ $this->firstRun = false;
485
+
486
+ $this->output->write($message);
487
+ }
488
+
489
+ private function determineBestFormat()
490
+ {
491
+ switch ($this->output->getVerbosity()) {
492
+ // OutputInterface::VERBOSITY_QUIET: display is disabled anyway
493
+ case OutputInterface::VERBOSITY_VERBOSE:
494
+ return $this->max ? 'verbose' : 'verbose_nomax';
495
+ case OutputInterface::VERBOSITY_VERY_VERBOSE:
496
+ return $this->max ? 'very_verbose' : 'very_verbose_nomax';
497
+ case OutputInterface::VERBOSITY_DEBUG:
498
+ return $this->max ? 'debug' : 'debug_nomax';
499
+ default:
500
+ return $this->max ? 'normal' : 'normal_nomax';
501
+ }
502
+ }
503
+
504
+ private static function initPlaceholderFormatters()
505
+ {
506
+ return array(
507
+ 'bar' => function (ProgressBar $bar, OutputInterface $output) {
508
+ $completeBars = floor($bar->getMaxSteps() > 0 ? $bar->getProgressPercent() * $bar->getBarWidth() : $bar->getProgress() % $bar->getBarWidth());
509
+ $display = str_repeat($bar->getBarCharacter(), $completeBars);
510
+ if ($completeBars < $bar->getBarWidth()) {
511
+ $emptyBars = $bar->getBarWidth() - $completeBars - Helper::strlenWithoutDecoration($output->getFormatter(), $bar->getProgressCharacter());
512
+ $display .= $bar->getProgressCharacter().str_repeat($bar->getEmptyBarCharacter(), $emptyBars);
513
+ }
514
+
515
+ return $display;
516
+ },
517
+ 'elapsed' => function (ProgressBar $bar) {
518
+ return Helper::formatTime(time() - $bar->getStartTime());
519
+ },
520
+ 'remaining' => function (ProgressBar $bar) {
521
+ if (!$bar->getMaxSteps()) {
522
+ throw new LogicException('Unable to display the remaining time if the maximum number of steps is not set.');
523
+ }
524
+
525
+ if (!$bar->getProgress()) {
526
+ $remaining = 0;
527
+ } else {
528
+ $remaining = round((time() - $bar->getStartTime()) / $bar->getProgress() * ($bar->getMaxSteps() - $bar->getProgress()));
529
+ }
530
+
531
+ return Helper::formatTime($remaining);
532
+ },
533
+ 'estimated' => function (ProgressBar $bar) {
534
+ if (!$bar->getMaxSteps()) {
535
+ throw new LogicException('Unable to display the estimated time if the maximum number of steps is not set.');
536
+ }
537
+
538
+ if (!$bar->getProgress()) {
539
+ $estimated = 0;
540
+ } else {
541
+ $estimated = round((time() - $bar->getStartTime()) / $bar->getProgress() * $bar->getMaxSteps());
542
+ }
543
+
544
+ return Helper::formatTime($estimated);
545
+ },
546
+ 'memory' => function (ProgressBar $bar) {
547
+ return Helper::formatMemory(memory_get_usage(true));
548
+ },
549
+ 'current' => function (ProgressBar $bar) {
550
+ return str_pad($bar->getProgress(), $bar->getStepWidth(), ' ', STR_PAD_LEFT);
551
+ },
552
+ 'max' => function (ProgressBar $bar) {
553
+ return $bar->getMaxSteps();
554
+ },
555
+ 'percent' => function (ProgressBar $bar) {
556
+ return floor($bar->getProgressPercent() * 100);
557
+ },
558
+ );
559
+ }
560
+
561
+ private static function initFormats()
562
+ {
563
+ return array(
564
+ 'normal' => ' %current%/%max% [%bar%] %percent:3s%%',
565
+ 'normal_nomax' => ' %current% [%bar%]',
566
+
567
+ 'verbose' => ' %current%/%max% [%bar%] %percent:3s%% %elapsed:6s%',
568
+ 'verbose_nomax' => ' %current% [%bar%] %elapsed:6s%',
569
+
570
+ 'very_verbose' => ' %current%/%max% [%bar%] %percent:3s%% %elapsed:6s%/%estimated:-6s%',
571
+ 'very_verbose_nomax' => ' %current% [%bar%] %elapsed:6s%',
572
+
573
+ 'debug' => ' %current%/%max% [%bar%] %percent:3s%% %elapsed:6s%/%estimated:-6s% %memory:6s%',
574
+ 'debug_nomax' => ' %current% [%bar%] %elapsed:6s% %memory:6s%',
575
+ );
576
+ }
577
+
578
+ /**
579
+ * @return string
580
+ */
581
+ private function buildLine()
582
+ {
583
+ $regex = "{%([a-z\-_]+)(?:\:([^%]+))?%}i";
584
+ $callback = function ($matches) {
585
+ if ($formatter = $this::getPlaceholderFormatterDefinition($matches[1])) {
586
+ $text = call_user_func($formatter, $this, $this->output);
587
+ } elseif (isset($this->messages[$matches[1]])) {
588
+ $text = $this->messages[$matches[1]];
589
+ } else {
590
+ return $matches[0];
591
+ }
592
+
593
+ if (isset($matches[2])) {
594
+ $text = sprintf('%'.$matches[2], $text);
595
+ }
596
+
597
+ return $text;
598
+ };
599
+ $line = preg_replace_callback($regex, $callback, $this->format);
600
+
601
+ // gets string length for each sub line with multiline format
602
+ $linesLength = array_map(function ($subLine) {
603
+ return Helper::strlenWithoutDecoration($this->output->getFormatter(), rtrim($subLine, "\r"));
604
+ }, explode("\n", $line));
605
+
606
+ $linesWidth = max($linesLength);
607
+
608
+ $terminalWidth = $this->terminal->getWidth();
609
+ if ($linesWidth <= $terminalWidth) {
610
+ return $line;
611
+ }
612
+
613
+ $this->setBarWidth($this->barWidth - $linesWidth + $terminalWidth);
614
+
615
+ return preg_replace_callback($regex, $callback, $this->format);
616
+ }
617
+ }
vendor/symfony/console/Helper/ProgressIndicator.php ADDED
@@ -0,0 +1,271 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Helper;
13
+
14
+ use Symfony\Component\Console\Exception\InvalidArgumentException;
15
+ use Symfony\Component\Console\Exception\LogicException;
16
+ use Symfony\Component\Console\Output\OutputInterface;
17
+
18
+ /**
19
+ * @author Kevin Bond <kevinbond@gmail.com>
20
+ */
21
+ class ProgressIndicator
22
+ {
23
+ private $output;
24
+ private $startTime;
25
+ private $format;
26
+ private $message;
27
+ private $indicatorValues;
28
+ private $indicatorCurrent;
29
+ private $indicatorChangeInterval;
30
+ private $indicatorUpdateTime;
31
+ private $started = false;
32
+
33
+ private static $formatters;
34
+ private static $formats;
35
+
36
+ /**
37
+ * @param OutputInterface $output
38
+ * @param string|null $format Indicator format
39
+ * @param int $indicatorChangeInterval Change interval in milliseconds
40
+ * @param array|null $indicatorValues Animated indicator characters
41
+ */
42
+ public function __construct(OutputInterface $output, $format = null, $indicatorChangeInterval = 100, $indicatorValues = null)
43
+ {
44
+ $this->output = $output;
45
+
46
+ if (null === $format) {
47
+ $format = $this->determineBestFormat();
48
+ }
49
+
50
+ if (null === $indicatorValues) {
51
+ $indicatorValues = array('-', '\\', '|', '/');
52
+ }
53
+
54
+ $indicatorValues = array_values($indicatorValues);
55
+
56
+ if (2 > count($indicatorValues)) {
57
+ throw new InvalidArgumentException('Must have at least 2 indicator value characters.');
58
+ }
59
+
60
+ $this->format = self::getFormatDefinition($format);
61
+ $this->indicatorChangeInterval = $indicatorChangeInterval;
62
+ $this->indicatorValues = $indicatorValues;
63
+ $this->startTime = time();
64
+ }
65
+
66
+ /**
67
+ * Sets the current indicator message.
68
+ *
69
+ * @param string|null $message
70
+ */
71
+ public function setMessage($message)
72
+ {
73
+ $this->message = $message;
74
+
75
+ $this->display();
76
+ }
77
+
78
+ /**
79
+ * Starts the indicator output.
80
+ *
81
+ * @param $message
82
+ */
83
+ public function start($message)
84
+ {
85
+ if ($this->started) {
86
+ throw new LogicException('Progress indicator already started.');
87
+ }
88
+
89
+ $this->message = $message;
90
+ $this->started = true;
91
+ $this->startTime = time();
92
+ $this->indicatorUpdateTime = $this->getCurrentTimeInMilliseconds() + $this->indicatorChangeInterval;
93
+ $this->indicatorCurrent = 0;
94
+
95
+ $this->display();
96
+ }
97
+
98
+ /**
99
+ * Advances the indicator.
100
+ */
101
+ public function advance()
102
+ {
103
+ if (!$this->started) {
104
+ throw new LogicException('Progress indicator has not yet been started.');
105
+ }
106
+
107
+ if (!$this->output->isDecorated()) {
108
+ return;
109
+ }
110
+
111
+ $currentTime = $this->getCurrentTimeInMilliseconds();
112
+
113
+ if ($currentTime < $this->indicatorUpdateTime) {
114
+ return;
115
+ }
116
+
117
+ $this->indicatorUpdateTime = $currentTime + $this->indicatorChangeInterval;
118
+ ++$this->indicatorCurrent;
119
+
120
+ $this->display();
121
+ }
122
+
123
+ /**
124
+ * Finish the indicator with message.
125
+ *
126
+ * @param $message
127
+ */
128
+ public function finish($message)
129
+ {
130
+ if (!$this->started) {
131
+ throw new LogicException('Progress indicator has not yet been started.');
132
+ }
133
+
134
+ $this->message = $message;
135
+ $this->display();
136
+ $this->output->writeln('');
137
+ $this->started = false;
138
+ }
139
+
140
+ /**
141
+ * Gets the format for a given name.
142
+ *
143
+ * @param string $name The format name
144
+ *
145
+ * @return string|null A format string
146
+ */
147
+ public static function getFormatDefinition($name)
148
+ {
149
+ if (!self::$formats) {
150
+ self::$formats = self::initFormats();
151
+ }
152
+
153
+ return isset(self::$formats[$name]) ? self::$formats[$name] : null;
154
+ }
155
+
156
+ /**
157
+ * Sets a placeholder formatter for a given name.
158
+ *
159
+ * This method also allow you to override an existing placeholder.
160
+ *
161
+ * @param string $name The placeholder name (including the delimiter char like %)
162
+ * @param callable $callable A PHP callable
163
+ */
164
+ public static function setPlaceholderFormatterDefinition($name, $callable)
165
+ {
166
+ if (!self::$formatters) {
167
+ self::$formatters = self::initPlaceholderFormatters();
168
+ }
169
+
170
+ self::$formatters[$name] = $callable;
171
+ }
172
+
173
+ /**
174
+ * Gets the placeholder formatter for a given name.
175
+ *
176
+ * @param string $name The placeholder name (including the delimiter char like %)
177
+ *
178
+ * @return callable|null A PHP callable
179
+ */
180
+ public static function getPlaceholderFormatterDefinition($name)
181
+ {
182
+ if (!self::$formatters) {
183
+ self::$formatters = self::initPlaceholderFormatters();
184
+ }
185
+
186
+ return isset(self::$formatters[$name]) ? self::$formatters[$name] : null;
187
+ }
188
+
189
+ private function display()
190
+ {
191
+ if (OutputInterface::VERBOSITY_QUIET === $this->output->getVerbosity()) {
192
+ return;
193
+ }
194
+
195
+ $self = $this;
196
+
197
+ $this->overwrite(preg_replace_callback("{%([a-z\-_]+)(?:\:([^%]+))?%}i", function ($matches) use ($self) {
198
+ if ($formatter = $self::getPlaceholderFormatterDefinition($matches[1])) {
199
+ return call_user_func($formatter, $self);
200
+ }
201
+
202
+ return $matches[0];
203
+ }, $this->format));
204
+ }
205
+
206
+ private function determineBestFormat()
207
+ {
208
+ switch ($this->output->getVerbosity()) {
209
+ // OutputInterface::VERBOSITY_QUIET: display is disabled anyway
210
+ case OutputInterface::VERBOSITY_VERBOSE:
211
+ return $this->output->isDecorated() ? 'verbose' : 'verbose_no_ansi';
212
+ case OutputInterface::VERBOSITY_VERY_VERBOSE:
213
+ case OutputInterface::VERBOSITY_DEBUG:
214
+ return $this->output->isDecorated() ? 'very_verbose' : 'very_verbose_no_ansi';
215
+ default:
216
+ return $this->output->isDecorated() ? 'normal' : 'normal_no_ansi';
217
+ }
218
+ }
219
+
220
+ /**
221
+ * Overwrites a previous message to the output.
222
+ *
223
+ * @param string $message The message
224
+ */
225
+ private function overwrite($message)
226
+ {
227
+ if ($this->output->isDecorated()) {
228
+ $this->output->write("\x0D\x1B[2K");
229
+ $this->output->write($message);
230
+ } else {
231
+ $this->output->writeln($message);
232
+ }
233
+ }
234
+
235
+ private function getCurrentTimeInMilliseconds()
236
+ {
237
+ return round(microtime(true) * 1000);
238
+ }
239
+
240
+ private static function initPlaceholderFormatters()
241
+ {
242
+ return array(
243
+ 'indicator' => function (ProgressIndicator $indicator) {
244
+ return $indicator->indicatorValues[$indicator->indicatorCurrent % count($indicator->indicatorValues)];
245
+ },
246
+ 'message' => function (ProgressIndicator $indicator) {
247
+ return $indicator->message;
248
+ },
249
+ 'elapsed' => function (ProgressIndicator $indicator) {
250
+ return Helper::formatTime(time() - $indicator->startTime);
251
+ },
252
+ 'memory' => function () {
253
+ return Helper::formatMemory(memory_get_usage(true));
254
+ },
255
+ );
256
+ }
257
+
258
+ private static function initFormats()
259
+ {
260
+ return array(
261
+ 'normal' => ' %indicator% %message%',
262
+ 'normal_no_ansi' => ' %message%',
263
+
264
+ 'verbose' => ' %indicator% %message% (%elapsed:6s%)',
265
+ 'verbose_no_ansi' => ' %message% (%elapsed:6s%)',
266
+
267
+ 'very_verbose' => ' %indicator% %message% (%elapsed:6s%, %memory:6s%)',
268
+ 'very_verbose_no_ansi' => ' %message% (%elapsed:6s%, %memory:6s%)',
269
+ );
270
+ }
271
+ }
vendor/symfony/console/Helper/QuestionHelper.php ADDED
@@ -0,0 +1,461 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Helper;
13
+
14
+ use Symfony\Component\Console\Exception\InvalidArgumentException;
15
+ use Symfony\Component\Console\Exception\RuntimeException;
16
+ use Symfony\Component\Console\Formatter\OutputFormatter;
17
+ use Symfony\Component\Console\Formatter\OutputFormatterStyle;
18
+ use Symfony\Component\Console\Input\InputInterface;
19
+ use Symfony\Component\Console\Input\StreamableInputInterface;
20
+ use Symfony\Component\Console\Output\ConsoleOutputInterface;
21
+ use Symfony\Component\Console\Output\OutputInterface;
22
+ use Symfony\Component\Console\Question\Question;
23
+ use Symfony\Component\Console\Question\ChoiceQuestion;
24
+
25
+ /**
26
+ * The QuestionHelper class provides helpers to interact with the user.
27
+ *
28
+ * @author Fabien Potencier <fabien@symfony.com>
29
+ */
30
+ class QuestionHelper extends Helper
31
+ {
32
+ private $inputStream;
33
+ private static $shell;
34
+ private static $stty;
35
+
36
+ /**
37
+ * Asks a question to the user.
38
+ *
39
+ * @return mixed The user answer
40
+ *
41
+ * @throws RuntimeException If there is no data to read in the input stream
42
+ */
43
+ public function ask(InputInterface $input, OutputInterface $output, Question $question)
44
+ {
45
+ if ($output instanceof ConsoleOutputInterface) {
46
+ $output = $output->getErrorOutput();
47
+ }
48
+
49
+ if (!$input->isInteractive()) {
50
+ return $question->getDefault();
51
+ }
52
+
53
+ if ($input instanceof StreamableInputInterface && $stream = $input->getStream()) {
54
+ $this->inputStream = $stream;
55
+ }
56
+
57
+ if (!$question->getValidator()) {
58
+ return $this->doAsk($output, $question);
59
+ }
60
+
61
+ $interviewer = function () use ($output, $question) {
62
+ return $this->doAsk($output, $question);
63
+ };
64
+
65
+ return $this->validateAttempts($interviewer, $output, $question);
66
+ }
67
+
68
+ /**
69
+ * Sets the input stream to read from when interacting with the user.
70
+ *
71
+ * This is mainly useful for testing purpose.
72
+ *
73
+ * @deprecated since version 3.2, to be removed in 4.0. Use
74
+ * StreamableInputInterface::setStream() instead.
75
+ *
76
+ * @param resource $stream The input stream
77
+ *
78
+ * @throws InvalidArgumentException In case the stream is not a resource
79
+ */
80
+ public function setInputStream($stream)
81
+ {
82
+ @trigger_error(sprintf('The %s() method is deprecated since version 3.2 and will be removed in 4.0. Use %s::setStream() instead.', __METHOD__, StreamableInputInterface::class), E_USER_DEPRECATED);
83
+
84
+ if (!is_resource($stream)) {
85
+ throw new InvalidArgumentException('Input stream must be a valid resource.');
86
+ }
87
+
88
+ $this->inputStream = $stream;
89
+ }
90
+
91
+ /**
92
+ * Returns the helper's input stream.
93
+ *
94
+ * @deprecated since version 3.2, to be removed in 4.0. Use
95
+ * StreamableInputInterface::getStream() instead.
96
+ *
97
+ * @return resource
98
+ */
99
+ public function getInputStream()
100
+ {
101
+ if (0 === func_num_args() || func_get_arg(0)) {
102
+ @trigger_error(sprintf('The %s() method is deprecated since version 3.2 and will be removed in 4.0. Use %s::getStream() instead.', __METHOD__, StreamableInputInterface::class), E_USER_DEPRECATED);
103
+ }
104
+
105
+ return $this->inputStream;
106
+ }
107
+
108
+ /**
109
+ * {@inheritdoc}
110
+ */
111
+ public function getName()
112
+ {
113
+ return 'question';
114
+ }
115
+
116
+ /**
117
+ * Prevents usage of stty.
118
+ */
119
+ public static function disableStty()
120
+ {
121
+ self::$stty = false;
122
+ }
123
+
124
+ /**
125
+ * Asks the question to the user.
126
+ *
127
+ * @return bool|mixed|null|string
128
+ *
129
+ * @throws RuntimeException In case the fallback is deactivated and the response cannot be hidden
130
+ */
131
+ private function doAsk(OutputInterface $output, Question $question)
132
+ {
133
+ $this->writePrompt($output, $question);
134
+
135
+ $inputStream = $this->inputStream ?: STDIN;
136
+ $autocomplete = $question->getAutocompleterValues();
137
+
138
+ if (null === $autocomplete || !$this->hasSttyAvailable()) {
139
+ $ret = false;
140
+ if ($question->isHidden()) {
141
+ try {
142
+ $ret = trim($this->getHiddenResponse($output, $inputStream));
143
+ } catch (RuntimeException $e) {
144
+ if (!$question->isHiddenFallback()) {
145
+ throw $e;
146
+ }
147
+ }
148
+ }
149
+
150
+ if (false === $ret) {
151
+ $ret = fgets($inputStream, 4096);
152
+ if (false === $ret) {
153
+ throw new RuntimeException('Aborted');
154
+ }
155
+ $ret = trim($ret);
156
+ }
157
+ } else {
158
+ $ret = trim($this->autocomplete($output, $question, $inputStream, is_array($autocomplete) ? $autocomplete : iterator_to_array($autocomplete, false)));
159
+ }
160
+
161
+ $ret = strlen($ret) > 0 ? $ret : $question->getDefault();
162
+
163
+ if ($normalizer = $question->getNormalizer()) {
164
+ return $normalizer($ret);
165
+ }
166
+
167
+ return $ret;
168
+ }
169
+
170
+ /**
171
+ * Outputs the question prompt.
172
+ */
173
+ protected function writePrompt(OutputInterface $output, Question $question)
174
+ {
175
+ $message = $question->getQuestion();
176
+
177
+ if ($question instanceof ChoiceQuestion) {
178
+ $maxWidth = max(array_map(array($this, 'strlen'), array_keys($question->getChoices())));
179
+
180
+ $messages = (array) $question->getQuestion();
181
+ foreach ($question->getChoices() as $key => $value) {
182
+ $width = $maxWidth - $this->strlen($key);
183
+ $messages[] = ' [<info>'.$key.str_repeat(' ', $width).'</info>] '.$value;
184
+ }
185
+
186
+ $output->writeln($messages);
187
+
188
+ $message = $question->getPrompt();
189
+ }
190
+
191
+ $output->write($message);
192
+ }
193
+
194
+ /**
195
+ * Outputs an error message.
196
+ */
197
+ protected function writeError(OutputInterface $output, \Exception $error)
198
+ {
199
+ if (null !== $this->getHelperSet() && $this->getHelperSet()->has('formatter')) {
200
+ $message = $this->getHelperSet()->get('formatter')->formatBlock($error->getMessage(), 'error');
201
+ } else {
202
+ $message = '<error>'.$error->getMessage().'</error>';
203
+ }
204
+
205
+ $output->writeln($message);
206
+ }
207
+
208
+ /**
209
+ * Autocompletes a question.
210
+ *
211
+ * @param OutputInterface $output
212
+ * @param Question $question
213
+ * @param resource $inputStream
214
+ * @param array $autocomplete
215
+ *
216
+ * @return string
217
+ */
218
+ private function autocomplete(OutputInterface $output, Question $question, $inputStream, array $autocomplete)
219
+ {
220
+ $ret = '';
221
+
222
+ $i = 0;
223
+ $ofs = -1;
224
+ $matches = $autocomplete;
225
+ $numMatches = count($matches);
226
+
227
+ $sttyMode = shell_exec('stty -g');
228
+
229
+ // Disable icanon (so we can fread each keypress) and echo (we'll do echoing here instead)
230
+ shell_exec('stty -icanon -echo');
231
+
232
+ // Add highlighted text style
233
+ $output->getFormatter()->setStyle('hl', new OutputFormatterStyle('black', 'white'));
234
+
235
+ // Read a keypress
236
+ while (!feof($inputStream)) {
237
+ $c = fread($inputStream, 1);
238
+
239
+ // Backspace Character
240
+ if ("\177" === $c) {
241
+ if (0 === $numMatches && 0 !== $i) {
242
+ --$i;
243
+ // Move cursor backwards
244
+ $output->write("\033[1D");
245
+ }
246
+
247
+ if (0 === $i) {
248
+ $ofs = -1;
249
+ $matches = $autocomplete;
250
+ $numMatches = count($matches);
251
+ } else {
252
+ $numMatches = 0;
253
+ }
254
+
255
+ // Pop the last character off the end of our string
256
+ $ret = substr($ret, 0, $i);
257
+ } elseif ("\033" === $c) {
258
+ // Did we read an escape sequence?
259
+ $c .= fread($inputStream, 2);
260
+
261
+ // A = Up Arrow. B = Down Arrow
262
+ if (isset($c[2]) && ('A' === $c[2] || 'B' === $c[2])) {
263
+ if ('A' === $c[2] && -1 === $ofs) {
264
+ $ofs = 0;
265
+ }
266
+
267
+ if (0 === $numMatches) {
268
+ continue;
269
+ }
270
+
271
+ $ofs += ('A' === $c[2]) ? -1 : 1;
272
+ $ofs = ($numMatches + $ofs) % $numMatches;
273
+ }
274
+ } elseif (ord($c) < 32) {
275
+ if ("\t" === $c || "\n" === $c) {
276
+ if ($numMatches > 0 && -1 !== $ofs) {
277
+ $ret = $matches[$ofs];
278
+ // Echo out remaining chars for current match
279
+ $output->write(substr($ret, $i));
280
+ $i = strlen($ret);
281
+ }
282
+
283
+ if ("\n" === $c) {
284
+ $output->write($c);
285
+ break;
286
+ }
287
+
288
+ $numMatches = 0;
289
+ }
290
+
291
+ continue;
292
+ } else {
293
+ $output->write($c);
294
+ $ret .= $c;
295
+ ++$i;
296
+
297
+ $numMatches = 0;
298
+ $ofs = 0;
299
+
300
+ foreach ($autocomplete as $value) {
301
+ // If typed characters match the beginning chunk of value (e.g. [AcmeDe]moBundle)
302
+ if (0 === strpos($value, $ret) && $i !== strlen($value)) {
303
+ $matches[$numMatches++] = $value;
304
+ }
305
+ }
306
+ }
307
+
308
+ // Erase characters from cursor to end of line
309
+ $output->write("\033[K");
310
+
311
+ if ($numMatches > 0 && -1 !== $ofs) {
312
+ // Save cursor position
313
+ $output->write("\0337");
314
+ // Write highlighted text
315
+ $output->write('<hl>'.OutputFormatter::escapeTrailingBackslash(substr($matches[$ofs], $i)).'</hl>');
316
+ // Restore cursor position
317
+ $output->write("\0338");
318
+ }
319
+ }
320
+
321
+ // Reset stty so it behaves normally again
322
+ shell_exec(sprintf('stty %s', $sttyMode));
323
+
324
+ return $ret;
325
+ }
326
+
327
+ /**
328
+ * Gets a hidden response from user.
329
+ *
330
+ * @param OutputInterface $output An Output instance
331
+ * @param resource $inputStream The handler resource
332
+ *
333
+ * @return string The answer
334
+ *
335
+ * @throws RuntimeException In case the fallback is deactivated and the response cannot be hidden
336
+ */
337
+ private function getHiddenResponse(OutputInterface $output, $inputStream)
338
+ {
339
+ if ('\\' === DIRECTORY_SEPARATOR) {
340
+ $exe = __DIR__.'/../Resources/bin/hiddeninput.exe';
341
+
342
+ // handle code running from a phar
343
+ if ('phar:' === substr(__FILE__, 0, 5)) {
344
+ $tmpExe = sys_get_temp_dir().'/hiddeninput.exe';
345
+ copy($exe, $tmpExe);
346
+ $exe = $tmpExe;
347
+ }
348
+
349
+ $value = rtrim(shell_exec($exe));
350
+ $output->writeln('');
351
+
352
+ if (isset($tmpExe)) {
353
+ unlink($tmpExe);
354
+ }
355
+
356
+ return $value;
357
+ }
358
+
359
+ if ($this->hasSttyAvailable()) {
360
+ $sttyMode = shell_exec('stty -g');
361
+
362
+ shell_exec('stty -echo');
363
+ $value = fgets($inputStream, 4096);
364
+ shell_exec(sprintf('stty %s', $sttyMode));
365
+
366
+ if (false === $value) {
367
+ throw new RuntimeException('Aborted');
368
+ }
369
+
370
+ $value = trim($value);
371
+ $output->writeln('');
372
+
373
+ return $value;
374
+ }
375
+
376
+ if (false !== $shell = $this->getShell()) {
377
+ $readCmd = 'csh' === $shell ? 'set mypassword = $<' : 'read -r mypassword';
378
+ $command = sprintf("/usr/bin/env %s -c 'stty -echo; %s; stty echo; echo \$mypassword'", $shell, $readCmd);
379
+ $value = rtrim(shell_exec($command));
380
+ $output->writeln('');
381
+
382
+ return $value;
383
+ }
384
+
385
+ throw new RuntimeException('Unable to hide the response.');
386
+ }
387
+
388
+ /**
389
+ * Validates an attempt.
390
+ *
391
+ * @param callable $interviewer A callable that will ask for a question and return the result
392
+ * @param OutputInterface $output An Output instance
393
+ * @param Question $question A Question instance
394
+ *
395
+ * @return mixed The validated response
396
+ *
397
+ * @throws \Exception In case the max number of attempts has been reached and no valid response has been given
398
+ */
399
+ private function validateAttempts(callable $interviewer, OutputInterface $output, Question $question)
400
+ {
401
+ $error = null;
402
+ $attempts = $question->getMaxAttempts();
403
+ while (null === $attempts || $attempts--) {
404
+ if (null !== $error) {
405
+ $this->writeError($output, $error);
406
+ }
407
+
408
+ try {
409
+ return call_user_func($question->getValidator(), $interviewer());
410
+ } catch (RuntimeException $e) {
411
+ throw $e;
412
+ } catch (\Exception $error) {
413
+ }
414
+ }
415
+
416
+ throw $error;
417
+ }
418
+
419
+ /**
420
+ * Returns a valid unix shell.
421
+ *
422
+ * @return string|bool The valid shell name, false in case no valid shell is found
423
+ */
424
+ private function getShell()
425
+ {
426
+ if (null !== self::$shell) {
427
+ return self::$shell;
428
+ }
429
+
430
+ self::$shell = false;
431
+
432
+ if (file_exists('/usr/bin/env')) {
433
+ // handle other OSs with bash/zsh/ksh/csh if available to hide the answer
434
+ $test = "/usr/bin/env %s -c 'echo OK' 2> /dev/null";
435
+ foreach (array('bash', 'zsh', 'ksh', 'csh') as $sh) {
436
+ if ('OK' === rtrim(shell_exec(sprintf($test, $sh)))) {
437
+ self::$shell = $sh;
438
+ break;
439
+ }
440
+ }
441
+ }
442
+
443
+ return self::$shell;
444
+ }
445
+
446
+ /**
447
+ * Returns whether Stty is available or not.
448
+ *
449
+ * @return bool
450
+ */
451
+ private function hasSttyAvailable()
452
+ {
453
+ if (null !== self::$stty) {
454
+ return self::$stty;
455
+ }
456
+
457
+ exec('stty 2>&1', $output, $exitcode);
458
+
459
+ return self::$stty = 0 === $exitcode;
460
+ }
461
+ }
vendor/symfony/console/Helper/SymfonyQuestionHelper.php ADDED
@@ -0,0 +1,120 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Helper;
13
+
14
+ use Symfony\Component\Console\Exception\LogicException;
15
+ use Symfony\Component\Console\Input\InputInterface;
16
+ use Symfony\Component\Console\Output\OutputInterface;
17
+ use Symfony\Component\Console\Question\ChoiceQuestion;
18
+ use Symfony\Component\Console\Question\ConfirmationQuestion;
19
+ use Symfony\Component\Console\Question\Question;
20
+ use Symfony\Component\Console\Style\SymfonyStyle;
21
+ use Symfony\Component\Console\Formatter\OutputFormatter;
22
+
23
+ /**
24
+ * Symfony Style Guide compliant question helper.
25
+ *
26
+ * @author Kevin Bond <kevinbond@gmail.com>
27
+ */
28
+ class SymfonyQuestionHelper extends QuestionHelper
29
+ {
30
+ /**
31
+ * {@inheritdoc}
32
+ */
33
+ public function ask(InputInterface $input, OutputInterface $output, Question $question)
34
+ {
35
+ $validator = $question->getValidator();
36
+ $question->setValidator(function ($value) use ($validator) {
37
+ if (null !== $validator) {
38
+ $value = $validator($value);
39
+ } else {
40
+ // make required
41
+ if (!is_array($value) && !is_bool($value) && 0 === strlen($value)) {
42
+ throw new LogicException('A value is required.');
43
+ }
44
+ }
45
+
46
+ return $value;
47
+ });
48
+
49
+ return parent::ask($input, $output, $question);
50
+ }
51
+
52
+ /**
53
+ * {@inheritdoc}
54
+ */
55
+ protected function writePrompt(OutputInterface $output, Question $question)
56
+ {
57
+ $text = OutputFormatter::escapeTrailingBackslash($question->getQuestion());
58
+ $default = $question->getDefault();
59
+
60
+ switch (true) {
61
+ case null === $default:
62
+ $text = sprintf(' <info>%s</info>:', $text);
63
+
64
+ break;
65
+
66
+ case $question instanceof ConfirmationQuestion:
67
+ $text = sprintf(' <info>%s (yes/no)</info> [<comment>%s</comment>]:', $text, $default ? 'yes' : 'no');
68
+
69
+ break;
70
+
71
+ case $question instanceof ChoiceQuestion && $question->isMultiselect():
72
+ $choices = $question->getChoices();
73
+ $default = explode(',', $default);
74
+
75
+ foreach ($default as $key => $value) {
76
+ $default[$key] = $choices[trim($value)];
77
+ }
78
+
79
+ $text = sprintf(' <info>%s</info> [<comment>%s</comment>]:', $text, OutputFormatter::escape(implode(', ', $default)));
80
+
81
+ break;
82
+
83
+ case $question instanceof ChoiceQuestion:
84
+ $choices = $question->getChoices();
85
+ $text = sprintf(' <info>%s</info> [<comment>%s</comment>]:', $text, OutputFormatter::escape($choices[$default]));
86
+
87
+ break;
88
+
89
+ default:
90
+ $text = sprintf(' <info>%s</info> [<comment>%s</comment>]:', $text, OutputFormatter::escape($default));
91
+ }
92
+
93
+ $output->writeln($text);
94
+
95
+ if ($question instanceof ChoiceQuestion) {
96
+ $width = max(array_map('strlen', array_keys($question->getChoices())));
97
+
98
+ foreach ($question->getChoices() as $key => $value) {
99
+ $output->writeln(sprintf(" [<comment>%-${width}s</comment>] %s", $key, $value));
100
+ }
101
+ }
102
+
103
+ $output->write(' > ');
104
+ }
105
+
106
+ /**
107
+ * {@inheritdoc}
108
+ */
109
+ protected function writeError(OutputInterface $output, \Exception $error)
110
+ {
111
+ if ($output instanceof SymfonyStyle) {
112
+ $output->newLine();
113
+ $output->error($error->getMessage());
114
+
115
+ return;
116
+ }
117
+
118
+ parent::writeError($output, $error);
119
+ }
120
+ }
vendor/symfony/console/Helper/Table.php ADDED
@@ -0,0 +1,695 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Helper;
13
+
14
+ use Symfony\Component\Console\Output\OutputInterface;
15
+ use Symfony\Component\Console\Exception\InvalidArgumentException;
16
+
17
+ /**
18
+ * Provides helpers to display a table.
19
+ *
20
+ * @author Fabien Potencier <fabien@symfony.com>
21
+ * @author Саша Стаменковић <umpirsky@gmail.com>
22
+ * @author Abdellatif Ait boudad <a.aitboudad@gmail.com>
23
+ * @author Max Grigorian <maxakawizard@gmail.com>
24
+ */
25
+ class Table
26
+ {
27
+ /**
28
+ * Table headers.
29
+ */
30
+ private $headers = array();
31
+
32
+ /**
33
+ * Table rows.
34
+ */
35
+ private $rows = array();
36
+
37
+ /**
38
+ * Column widths cache.
39
+ */
40
+ private $effectiveColumnWidths = array();
41
+
42
+ /**
43
+ * Number of columns cache.
44
+ *
45
+ * @var int
46
+ */
47
+ private $numberOfColumns;
48
+
49
+ /**
50
+ * @var OutputInterface
51
+ */
52
+ private $output;
53
+
54
+ /**
55
+ * @var TableStyle
56
+ */
57
+ private $style;
58
+
59
+ /**
60
+ * @var array
61
+ */
62
+ private $columnStyles = array();
63
+
64
+ /**
65
+ * User set column widths.
66
+ *
67
+ * @var array
68
+ */
69
+ private $columnWidths = array();
70
+
71
+ private static $styles;
72
+
73
+ public function __construct(OutputInterface $output)
74
+ {
75
+ $this->output = $output;
76
+
77
+ if (!self::$styles) {
78
+ self::$styles = self::initStyles();
79
+ }
80
+
81
+ $this->setStyle('default');
82
+ }
83
+
84
+ /**
85
+ * Sets a style definition.
86
+ *
87
+ * @param string $name The style name
88
+ * @param TableStyle $style A TableStyle instance
89
+ */
90
+ public static function setStyleDefinition($name, TableStyle $style)
91
+ {
92
+ if (!self::$styles) {
93
+ self::$styles = self::initStyles();
94
+ }
95
+
96
+ self::$styles[$name] = $style;
97
+ }
98
+
99
+ /**
100
+ * Gets a style definition by name.
101
+ *
102
+ * @param string $name The style name
103
+ *
104
+ * @return TableStyle
105
+ */
106
+ public static function getStyleDefinition($name)
107
+ {
108
+ if (!self::$styles) {
109
+ self::$styles = self::initStyles();
110
+ }
111
+
112
+ if (isset(self::$styles[$name])) {
113
+ return self::$styles[$name];
114
+ }
115
+
116
+ throw new InvalidArgumentException(sprintf('Style "%s" is not defined.', $name));
117
+ }
118
+
119
+ /**
120
+ * Sets table style.
121
+ *
122
+ * @param TableStyle|string $name The style name or a TableStyle instance
123
+ *
124
+ * @return $this
125
+ */
126
+ public function setStyle($name)
127
+ {
128
+ $this->style = $this->resolveStyle($name);
129
+
130
+ return $this;
131
+ }
132
+
133
+ /**
134
+ * Gets the current table style.
135
+ *
136
+ * @return TableStyle
137
+ */
138
+ public function getStyle()
139
+ {
140
+ return $this->style;
141
+ }
142
+
143
+ /**
144
+ * Sets table column style.
145
+ *
146
+ * @param int $columnIndex Column index
147
+ * @param TableStyle|string $name The style name or a TableStyle instance
148
+ *
149
+ * @return $this
150
+ */
151
+ public function setColumnStyle($columnIndex, $name)
152
+ {
153
+ $columnIndex = (int) $columnIndex;
154
+
155
+ $this->columnStyles[$columnIndex] = $this->resolveStyle($name);
156
+
157
+ return $this;
158
+ }
159
+
160
+ /**
161
+ * Gets the current style for a column.
162
+ *
163
+ * If style was not set, it returns the global table style.
164
+ *
165
+ * @param int $columnIndex Column index
166
+ *
167
+ * @return TableStyle
168
+ */
169
+ public function getColumnStyle($columnIndex)
170
+ {
171
+ if (isset($this->columnStyles[$columnIndex])) {
172
+ return $this->columnStyles[$columnIndex];
173
+ }
174
+
175
+ return $this->getStyle();
176
+ }
177
+
178
+ /**
179
+ * Sets the minimum width of a column.
180
+ *
181
+ * @param int $columnIndex Column index
182
+ * @param int $width Minimum column width in characters
183
+ *
184
+ * @return $this
185
+ */
186
+ public function setColumnWidth($columnIndex, $width)
187
+ {
188
+ $this->columnWidths[(int) $columnIndex] = (int) $width;
189
+
190
+ return $this;
191
+ }
192
+
193
+ /**
194
+ * Sets the minimum width of all columns.
195
+ *
196
+ * @param array $widths
197
+ *
198
+ * @return $this
199
+ */
200
+ public function setColumnWidths(array $widths)
201
+ {
202
+ $this->columnWidths = array();
203
+ foreach ($widths as $index => $width) {
204
+ $this->setColumnWidth($index, $width);
205
+ }
206
+
207
+ return $this;
208
+ }
209
+
210
+ public function setHeaders(array $headers)
211
+ {
212
+ $headers = array_values($headers);
213
+ if (!empty($headers) && !is_array($headers[0])) {
214
+ $headers = array($headers);
215
+ }
216
+
217
+ $this->headers = $headers;
218
+
219
+ return $this;
220
+ }
221
+
222
+ public function setRows(array $rows)
223
+ {
224
+ $this->rows = array();
225
+
226
+ return $this->addRows($rows);
227
+ }
228
+
229
+ public function addRows(array $rows)
230
+ {
231
+ foreach ($rows as $row) {
232
+ $this->addRow($row);
233
+ }
234
+
235
+ return $this;
236
+ }
237
+
238
+ public function addRow($row)
239
+ {
240
+ if ($row instanceof TableSeparator) {
241
+ $this->rows[] = $row;
242
+
243
+ return $this;
244
+ }
245
+
246
+ if (!is_array($row)) {
247
+ throw new InvalidArgumentException('A row must be an array or a TableSeparator instance.');
248
+ }
249
+
250
+ $this->rows[] = array_values($row);
251
+
252
+ return $this;
253
+ }
254
+
255
+ public function setRow($column, array $row)
256
+ {
257
+ $this->rows[$column] = $row;
258
+
259
+ return $this;
260
+ }
261
+
262
+ /**
263
+ * Renders table to output.
264
+ *
265
+ * Example:
266
+ * +---------------+-----------------------+------------------+
267
+ * | ISBN | Title | Author |
268
+ * +---------------+-----------------------+------------------+
269
+ * | 99921-58-10-7 | Divine Comedy | Dante Alighieri |
270
+ * | 9971-5-0210-0 | A Tale of Two Cities | Charles Dickens |
271
+ * | 960-425-059-0 | The Lord of the Rings | J. R. R. Tolkien |
272
+ * +---------------+-----------------------+------------------+
273
+ */
274
+ public function render()
275
+ {
276
+ $this->calculateNumberOfColumns();
277
+ $rows = $this->buildTableRows($this->rows);
278
+ $headers = $this->buildTableRows($this->headers);
279
+
280
+ $this->calculateColumnsWidth(array_merge($headers, $rows));
281
+
282
+ $this->renderRowSeparator();
283
+ if (!empty($headers)) {
284
+ foreach ($headers as $header) {
285
+ $this->renderRow($header, $this->style->getCellHeaderFormat());
286
+ $this->renderRowSeparator();
287
+ }
288
+ }
289
+ foreach ($rows as $row) {
290
+ if ($row instanceof TableSeparator) {
291
+ $this->renderRowSeparator();
292
+ } else {
293
+ $this->renderRow($row, $this->style->getCellRowFormat());
294
+ }
295
+ }
296
+ if (!empty($rows)) {
297
+ $this->renderRowSeparator();
298
+ }
299
+
300
+ $this->cleanup();
301
+ }
302
+
303
+ /**
304
+ * Renders horizontal header separator.
305
+ *
306
+ * Example: +-----+-----------+-------+
307
+ */
308
+ private function renderRowSeparator()
309
+ {
310
+ if (0 === $count = $this->numberOfColumns) {
311
+ return;
312
+ }
313
+
314
+ if (!$this->style->getHorizontalBorderChar() && !$this->style->getCrossingChar()) {
315
+ return;
316
+ }
317
+
318
+ $markup = $this->style->getCrossingChar();
319
+ for ($column = 0; $column < $count; ++$column) {
320
+ $markup .= str_repeat($this->style->getHorizontalBorderChar(), $this->effectiveColumnWidths[$column]).$this->style->getCrossingChar();
321
+ }
322
+
323
+ $this->output->writeln(sprintf($this->style->getBorderFormat(), $markup));
324
+ }
325
+
326
+ /**
327
+ * Renders vertical column separator.
328
+ */
329
+ private function renderColumnSeparator()
330
+ {
331
+ return sprintf($this->style->getBorderFormat(), $this->style->getVerticalBorderChar());
332
+ }
333
+
334
+ /**
335
+ * Renders table row.
336
+ *
337
+ * Example: | 9971-5-0210-0 | A Tale of Two Cities | Charles Dickens |
338
+ *
339
+ * @param array $row
340
+ * @param string $cellFormat
341
+ */
342
+ private function renderRow(array $row, $cellFormat)
343
+ {
344
+ if (empty($row)) {
345
+ return;
346
+ }
347
+
348
+ $rowContent = $this->renderColumnSeparator();
349
+ foreach ($this->getRowColumns($row) as $column) {
350
+ $rowContent .= $this->renderCell($row, $column, $cellFormat);
351
+ $rowContent .= $this->renderColumnSeparator();
352
+ }
353
+ $this->output->writeln($rowContent);
354
+ }
355
+
356
+ /**
357
+ * Renders table cell with padding.
358
+ *
359
+ * @param array $row
360
+ * @param int $column
361
+ * @param string $cellFormat
362
+ */
363
+ private function renderCell(array $row, $column, $cellFormat)
364
+ {
365
+ $cell = isset($row[$column]) ? $row[$column] : '';
366
+ $width = $this->effectiveColumnWidths[$column];
367
+ if ($cell instanceof TableCell && $cell->getColspan() > 1) {
368
+ // add the width of the following columns(numbers of colspan).
369
+ foreach (range($column + 1, $column + $cell->getColspan() - 1) as $nextColumn) {
370
+ $width += $this->getColumnSeparatorWidth() + $this->effectiveColumnWidths[$nextColumn];
371
+ }
372
+ }
373
+
374
+ // str_pad won't work properly with multi-byte strings, we need to fix the padding
375
+ if (false !== $encoding = mb_detect_encoding($cell, null, true)) {
376
+ $width += strlen($cell) - mb_strwidth($cell, $encoding);
377
+ }
378
+
379
+ $style = $this->getColumnStyle($column);
380
+
381
+ if ($cell instanceof TableSeparator) {
382
+ return sprintf($style->getBorderFormat(), str_repeat($style->getHorizontalBorderChar(), $width));
383
+ }
384
+
385
+ $width += Helper::strlen($cell) - Helper::strlenWithoutDecoration($this->output->getFormatter(), $cell);
386
+ $content = sprintf($style->getCellRowContentFormat(), $cell);
387
+
388
+ return sprintf($cellFormat, str_pad($content, $width, $style->getPaddingChar(), $style->getPadType()));
389
+ }
390
+
391
+ /**
392
+ * Calculate number of columns for this table.
393
+ */
394
+ private function calculateNumberOfColumns()
395
+ {
396
+ if (null !== $this->numberOfColumns) {
397
+ return;
398
+ }
399
+
400
+ $columns = array(0);
401
+ foreach (array_merge($this->headers, $this->rows) as $row) {
402
+ if ($row instanceof TableSeparator) {
403
+ continue;
404
+ }
405
+
406
+ $columns[] = $this->getNumberOfColumns($row);
407
+ }
408
+
409
+ $this->numberOfColumns = max($columns);
410
+ }
411
+
412
+ private function buildTableRows($rows)
413
+ {
414
+ $unmergedRows = array();
415
+ for ($rowKey = 0; $rowKey < count($rows); ++$rowKey) {
416
+ $rows = $this->fillNextRows($rows, $rowKey);
417
+
418
+ // Remove any new line breaks and replace it with a new line
419
+ foreach ($rows[$rowKey] as $column => $cell) {
420
+ if (!strstr($cell, "\n")) {
421
+ continue;
422
+ }
423
+ $lines = explode("\n", str_replace("\n", "<fg=default;bg=default>\n</>", $cell));
424
+ foreach ($lines as $lineKey => $line) {
425
+ if ($cell instanceof TableCell) {
426
+ $line = new TableCell($line, array('colspan' => $cell->getColspan()));
427
+ }
428
+ if (0 === $lineKey) {
429
+ $rows[$rowKey][$column] = $line;
430
+ } else {
431
+ $unmergedRows[$rowKey][$lineKey][$column] = $line;
432
+ }
433
+ }
434
+ }
435
+ }
436
+
437
+ $tableRows = array();
438
+ foreach ($rows as $rowKey => $row) {
439
+ $tableRows[] = $this->fillCells($row);
440
+ if (isset($unmergedRows[$rowKey])) {
441
+ $tableRows = array_merge($tableRows, $unmergedRows[$rowKey]);
442
+ }
443
+ }
444
+
445
+ return $tableRows;
446
+ }
447
+
448
+ /**
449
+ * fill rows that contains rowspan > 1.
450
+ *
451
+ * @param array $rows
452
+ * @param int $line
453
+ *
454
+ * @return array
455
+ */
456
+ private function fillNextRows(array $rows, $line)
457
+ {
458
+ $unmergedRows = array();
459
+ foreach ($rows[$line] as $column => $cell) {
460
+ if ($cell instanceof TableCell && $cell->getRowspan() > 1) {
461
+ $nbLines = $cell->getRowspan() - 1;
462
+ $lines = array($cell);
463
+ if (strstr($cell, "\n")) {
464
+ $lines = explode("\n", str_replace("\n", "<fg=default;bg=default>\n</>", $cell));
465
+ $nbLines = count($lines) > $nbLines ? substr_count($cell, "\n") : $nbLines;
466
+
467
+ $rows[$line][$column] = new TableCell($lines[0], array('colspan' => $cell->getColspan()));
468
+ unset($lines[0]);
469
+ }
470
+
471
+ // create a two dimensional array (rowspan x colspan)
472
+ $unmergedRows = array_replace_recursive(array_fill($line + 1, $nbLines, array()), $unmergedRows);
473
+ foreach ($unmergedRows as $unmergedRowKey => $unmergedRow) {
474
+ $value = isset($lines[$unmergedRowKey - $line]) ? $lines[$unmergedRowKey - $line] : '';
475
+ $unmergedRows[$unmergedRowKey][$column] = new TableCell($value, array('colspan' => $cell->getColspan()));
476
+ if ($nbLines === $unmergedRowKey - $line) {
477
+ break;
478
+ }
479
+ }
480
+ }
481
+ }
482
+
483
+ foreach ($unmergedRows as $unmergedRowKey => $unmergedRow) {
484
+ // we need to know if $unmergedRow will be merged or inserted into $rows
485
+ if (isset($rows[$unmergedRowKey]) && is_array($rows[$unmergedRowKey]) && ($this->getNumberOfColumns($rows[$unmergedRowKey]) + $this->getNumberOfColumns($unmergedRows[$unmergedRowKey]) <= $this->numberOfColumns)) {
486
+ foreach ($unmergedRow as $cellKey => $cell) {
487
+ // insert cell into row at cellKey position
488
+ array_splice($rows[$unmergedRowKey], $cellKey, 0, array($cell));
489
+ }
490
+ } else {
491
+ $row = $this->copyRow($rows, $unmergedRowKey - 1);
492
+ foreach ($unmergedRow as $column => $cell) {
493
+ if (!empty($cell)) {
494
+ $row[$column] = $unmergedRow[$column];
495
+ }
496
+ }
497
+ array_splice($rows, $unmergedRowKey, 0, array($row));
498
+ }
499
+ }
500
+
501
+ return $rows;
502
+ }
503
+
504
+ /**
505
+ * fill cells for a row that contains colspan > 1.
506
+ *
507
+ * @return array
508
+ */
509
+ private function fillCells($row)
510
+ {
511
+ $newRow = array();
512
+ foreach ($row as $column => $cell) {
513
+ $newRow[] = $cell;
514
+ if ($cell instanceof TableCell && $cell->getColspan() > 1) {
515
+ foreach (range($column + 1, $column + $cell->getColspan() - 1) as $position) {
516
+ // insert empty value at column position
517
+ $newRow[] = '';
518
+ }
519
+ }
520
+ }
521
+
522
+ return $newRow ?: $row;
523
+ }
524
+
525
+ /**
526
+ * @param array $rows
527
+ * @param int $line
528
+ *
529
+ * @return array
530
+ */
531
+ private function copyRow(array $rows, $line)
532
+ {
533
+ $row = $rows[$line];
534
+ foreach ($row as $cellKey => $cellValue) {
535
+ $row[$cellKey] = '';
536
+ if ($cellValue instanceof TableCell) {
537
+ $row[$cellKey] = new TableCell('', array('colspan' => $cellValue->getColspan()));
538
+ }
539
+ }
540
+
541
+ return $row;
542
+ }
543
+
544
+ /**
545
+ * Gets number of columns by row.
546
+ *
547
+ * @return int
548
+ */
549
+ private function getNumberOfColumns(array $row)
550
+ {
551
+ $columns = count($row);
552
+ foreach ($row as $column) {
553
+ $columns += $column instanceof TableCell ? ($column->getColspan() - 1) : 0;
554
+ }
555
+
556
+ return $columns;
557
+ }
558
+
559
+ /**
560
+ * Gets list of columns for the given row.
561
+ *
562
+ * @return array
563
+ */
564
+ private function getRowColumns(array $row)
565
+ {
566
+ $columns = range(0, $this->numberOfColumns - 1);
567
+ foreach ($row as $cellKey => $cell) {
568
+ if ($cell instanceof TableCell && $cell->getColspan() > 1) {
569
+ // exclude grouped columns.
570
+ $columns = array_diff($columns, range($cellKey + 1, $cellKey + $cell->getColspan() - 1));
571
+ }
572
+ }
573
+
574
+ return $columns;
575
+ }
576
+
577
+ /**
578
+ * Calculates columns widths.
579
+ */
580
+ private function calculateColumnsWidth(array $rows)
581
+ {
582
+ for ($column = 0; $column < $this->numberOfColumns; ++$column) {
583
+ $lengths = array();
584
+ foreach ($rows as $row) {
585
+ if ($row instanceof TableSeparator) {
586
+ continue;
587
+ }
588
+
589
+ foreach ($row as $i => $cell) {
590
+ if ($cell instanceof TableCell) {
591
+ $textContent = Helper::removeDecoration($this->output->getFormatter(), $cell);
592
+ $textLength = Helper::strlen($textContent);
593
+ if ($textLength > 0) {
594
+ $contentColumns = str_split($textContent, ceil($textLength / $cell->getColspan()));
595
+ foreach ($contentColumns as $position => $content) {
596
+ $row[$i + $position] = $content;
597
+ }
598
+ }
599
+ }
600
+ }
601
+
602
+ $lengths[] = $this->getCellWidth($row, $column);
603
+ }
604
+
605
+ $this->effectiveColumnWidths[$column] = max($lengths) + strlen($this->style->getCellRowContentFormat()) - 2;
606
+ }
607
+ }
608
+
609
+ /**
610
+ * Gets column width.
611
+ *
612
+ * @return int
613
+ */
614
+ private function getColumnSeparatorWidth()
615
+ {
616
+ return strlen(sprintf($this->style->getBorderFormat(), $this->style->getVerticalBorderChar()));
617
+ }
618
+
619
+ /**
620
+ * Gets cell width.
621
+ *
622
+ * @param array $row
623
+ * @param int $column
624
+ *
625
+ * @return int
626
+ */
627
+ private function getCellWidth(array $row, $column)
628
+ {
629
+ $cellWidth = 0;
630
+
631
+ if (isset($row[$column])) {
632
+ $cell = $row[$column];
633
+ $cellWidth = Helper::strlenWithoutDecoration($this->output->getFormatter(), $cell);
634
+ }
635
+
636
+ $columnWidth = isset($this->columnWidths[$column]) ? $this->columnWidths[$column] : 0;
637
+
638
+ return max($cellWidth, $columnWidth);
639
+ }
640
+
641
+ /**
642
+ * Called after rendering to cleanup cache data.
643
+ */
644
+ private function cleanup()
645
+ {
646
+ $this->effectiveColumnWidths = array();
647
+ $this->numberOfColumns = null;
648
+ }
649
+
650
+ private static function initStyles()
651
+ {
652
+ $borderless = new TableStyle();
653
+ $borderless
654
+ ->setHorizontalBorderChar('=')
655
+ ->setVerticalBorderChar(' ')
656
+ ->setCrossingChar(' ')
657
+ ;
658
+
659
+ $compact = new TableStyle();
660
+ $compact
661
+ ->setHorizontalBorderChar('')
662
+ ->setVerticalBorderChar(' ')
663
+ ->setCrossingChar('')
664
+ ->setCellRowContentFormat('%s')
665
+ ;
666
+
667
+ $styleGuide = new TableStyle();
668
+ $styleGuide
669
+ ->setHorizontalBorderChar('-')
670
+ ->setVerticalBorderChar(' ')
671
+ ->setCrossingChar(' ')
672
+ ->setCellHeaderFormat('%s')
673
+ ;
674
+
675
+ return array(
676
+ 'default' => new TableStyle(),
677
+ 'borderless' => $borderless,
678
+ 'compact' => $compact,
679
+ 'symfony-style-guide' => $styleGuide,
680
+ );
681
+ }
682
+
683
+ private function resolveStyle($name)
684
+ {
685
+ if ($name instanceof TableStyle) {
686
+ return $name;
687
+ }
688
+
689
+ if (isset(self::$styles[$name])) {
690
+ return self::$styles[$name];
691
+ }
692
+
693
+ throw new InvalidArgumentException(sprintf('Style "%s" is not defined.', $name));
694
+ }
695
+ }
vendor/symfony/console/Helper/TableCell.php ADDED
@@ -0,0 +1,76 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Helper;
13
+
14
+ use Symfony\Component\Console\Exception\InvalidArgumentException;
15
+
16
+ /**
17
+ * @author Abdellatif Ait boudad <a.aitboudad@gmail.com>
18
+ */
19
+ class TableCell
20
+ {
21
+ private $value;
22
+ private $options = array(
23
+ 'rowspan' => 1,
24
+ 'colspan' => 1,
25
+ );
26
+
27
+ /**
28
+ * @param string $value
29
+ * @param array $options
30
+ */
31
+ public function __construct($value = '', array $options = array())
32
+ {
33
+ if (is_numeric($value) && !is_string($value)) {
34
+ $value = (string) $value;
35
+ }
36
+
37
+ $this->value = $value;
38
+
39
+ // check option names
40
+ if ($diff = array_diff(array_keys($options), array_keys($this->options))) {
41
+ throw new InvalidArgumentException(sprintf('The TableCell does not support the following options: \'%s\'.', implode('\', \'', $diff)));
42
+ }
43
+
44
+ $this->options = array_merge($this->options, $options);
45
+ }
46
+
47
+ /**
48
+ * Returns the cell value.
49
+ *
50
+ * @return string
51
+ */
52
+ public function __toString()
53
+ {
54
+ return $this->value;
55
+ }
56
+
57
+ /**
58
+ * Gets number of colspan.
59
+ *
60
+ * @return int
61
+ */
62
+ public function getColspan()
63
+ {
64
+ return (int) $this->options['colspan'];
65
+ }
66
+
67
+ /**
68
+ * Gets number of rowspan.
69
+ *
70
+ * @return int
71
+ */
72
+ public function getRowspan()
73
+ {
74
+ return (int) $this->options['rowspan'];
75
+ }
76
+ }
vendor/symfony/console/Helper/TableSeparator.php ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Helper;
13
+
14
+ /**
15
+ * Marks a row as being a separator.
16
+ *
17
+ * @author Fabien Potencier <fabien@symfony.com>
18
+ */
19
+ class TableSeparator extends TableCell
20
+ {
21
+ public function __construct(array $options = array())
22
+ {
23
+ parent::__construct('', $options);
24
+ }
25
+ }
vendor/symfony/console/Helper/TableStyle.php ADDED
@@ -0,0 +1,258 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Helper;
13
+
14
+ use Symfony\Component\Console\Exception\InvalidArgumentException;
15
+ use Symfony\Component\Console\Exception\LogicException;
16
+
17
+ /**
18
+ * Defines the styles for a Table.
19
+ *
20
+ * @author Fabien Potencier <fabien@symfony.com>
21
+ * @author Саша Стаменковић <umpirsky@gmail.com>
22
+ */
23
+ class TableStyle
24
+ {
25
+ private $paddingChar = ' ';
26
+ private $horizontalBorderChar = '-';
27
+ private $verticalBorderChar = '|';
28
+ private $crossingChar = '+';
29
+ private $cellHeaderFormat = '<info>%s</info>';
30
+ private $cellRowFormat = '%s';
31
+ private $cellRowContentFormat = ' %s ';
32
+ private $borderFormat = '%s';
33
+ private $padType = STR_PAD_RIGHT;
34
+
35
+ /**
36
+ * Sets padding character, used for cell padding.
37
+ *
38
+ * @param string $paddingChar
39
+ *
40
+ * @return $this
41
+ */
42
+ public function setPaddingChar($paddingChar)
43
+ {
44
+ if (!$paddingChar) {
45
+ throw new LogicException('The padding char must not be empty');
46
+ }
47
+
48
+ $this->paddingChar = $paddingChar;
49
+
50
+ return $this;
51
+ }
52
+
53
+ /**
54
+ * Gets padding character, used for cell padding.
55
+ *
56
+ * @return string
57
+ */
58
+ public function getPaddingChar()
59
+ {
60
+ return $this->paddingChar;
61
+ }
62
+
63
+ /**
64
+ * Sets horizontal border character.
65
+ *
66
+ * @param string $horizontalBorderChar
67
+ *
68
+ * @return $this
69
+ */
70
+ public function setHorizontalBorderChar($horizontalBorderChar)
71
+ {
72
+ $this->horizontalBorderChar = $horizontalBorderChar;
73
+
74
+ return $this;
75
+ }
76
+
77
+ /**
78
+ * Gets horizontal border character.
79
+ *
80
+ * @return string
81
+ */
82
+ public function getHorizontalBorderChar()
83
+ {
84
+ return $this->horizontalBorderChar;
85
+ }
86
+
87
+ /**
88
+ * Sets vertical border character.
89
+ *
90
+ * @param string $verticalBorderChar
91
+ *
92
+ * @return $this
93
+ */
94
+ public function setVerticalBorderChar($verticalBorderChar)
95
+ {
96
+ $this->verticalBorderChar = $verticalBorderChar;
97
+
98
+ return $this;
99
+ }
100
+
101
+ /**
102
+ * Gets vertical border character.
103
+ *
104
+ * @return string
105
+ */
106
+ public function getVerticalBorderChar()
107
+ {
108
+ return $this->verticalBorderChar;
109
+ }
110
+
111
+ /**
112
+ * Sets crossing character.
113
+ *
114
+ * @param string $crossingChar
115
+ *
116
+ * @return $this
117
+ */
118
+ public function setCrossingChar($crossingChar)
119
+ {
120
+ $this->crossingChar = $crossingChar;
121
+
122
+ return $this;
123
+ }
124
+
125
+ /**
126
+ * Gets crossing character.
127
+ *
128
+ * @return string $crossingChar
129
+ */
130
+ public function getCrossingChar()
131
+ {
132
+ return $this->crossingChar;
133
+ }
134
+
135
+ /**
136
+ * Sets header cell format.
137
+ *
138
+ * @param string $cellHeaderFormat
139
+ *
140
+ * @return $this
141
+ */
142
+ public function setCellHeaderFormat($cellHeaderFormat)
143
+ {
144
+ $this->cellHeaderFormat = $cellHeaderFormat;
145
+
146
+ return $this;
147
+ }
148
+
149
+ /**
150
+ * Gets header cell format.
151
+ *
152
+ * @return string
153
+ */
154
+ public function getCellHeaderFormat()
155
+ {
156
+ return $this->cellHeaderFormat;
157
+ }
158
+
159
+ /**
160
+ * Sets row cell format.
161
+ *
162
+ * @param string $cellRowFormat
163
+ *
164
+ * @return $this
165
+ */
166
+ public function setCellRowFormat($cellRowFormat)
167
+ {
168
+ $this->cellRowFormat = $cellRowFormat;
169
+
170
+ return $this;
171
+ }
172
+
173
+ /**
174
+ * Gets row cell format.
175
+ *
176
+ * @return string
177
+ */
178
+ public function getCellRowFormat()
179
+ {
180
+ return $this->cellRowFormat;
181
+ }
182
+
183
+ /**
184
+ * Sets row cell content format.
185
+ *
186
+ * @param string $cellRowContentFormat
187
+ *
188
+ * @return $this
189
+ */
190
+ public function setCellRowContentFormat($cellRowContentFormat)
191
+ {
192
+ $this->cellRowContentFormat = $cellRowContentFormat;
193
+
194
+ return $this;
195
+ }
196
+
197
+ /**
198
+ * Gets row cell content format.
199
+ *
200
+ * @return string
201
+ */
202
+ public function getCellRowContentFormat()
203
+ {
204
+ return $this->cellRowContentFormat;
205
+ }
206
+
207
+ /**
208
+ * Sets table border format.
209
+ *
210
+ * @param string $borderFormat
211
+ *
212
+ * @return $this
213
+ */
214
+ public function setBorderFormat($borderFormat)
215
+ {
216
+ $this->borderFormat = $borderFormat;
217
+
218
+ return $this;
219
+ }
220
+
221
+ /**
222
+ * Gets table border format.
223
+ *
224
+ * @return string
225
+ */
226
+ public function getBorderFormat()
227
+ {
228
+ return $this->borderFormat;
229
+ }
230
+
231
+ /**
232
+ * Sets cell padding type.
233
+ *
234
+ * @param int $padType STR_PAD_*
235
+ *
236
+ * @return $this
237
+ */
238
+ public function setPadType($padType)
239
+ {
240
+ if (!in_array($padType, array(STR_PAD_LEFT, STR_PAD_RIGHT, STR_PAD_BOTH), true)) {
241
+ throw new InvalidArgumentException('Invalid padding type. Expected one of (STR_PAD_LEFT, STR_PAD_RIGHT, STR_PAD_BOTH).');
242
+ }
243
+
244
+ $this->padType = $padType;
245
+
246
+ return $this;
247
+ }
248
+
249
+ /**
250
+ * Gets cell padding type.
251
+ *
252
+ * @return int
253
+ */
254
+ public function getPadType()
255
+ {
256
+ return $this->padType;
257
+ }
258
+ }
vendor/symfony/console/Helper/index.php ADDED
File without changes
vendor/symfony/console/Input/ArgvInput.php ADDED
@@ -0,0 +1,351 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Input;
13
+
14
+ use Symfony\Component\Console\Exception\RuntimeException;
15
+
16
+ /**
17
+ * ArgvInput represents an input coming from the CLI arguments.
18
+ *
19
+ * Usage:
20
+ *
21
+ * $input = new ArgvInput();
22
+ *
23
+ * By default, the `$_SERVER['argv']` array is used for the input values.
24
+ *
25
+ * This can be overridden by explicitly passing the input values in the constructor:
26
+ *
27
+ * $input = new ArgvInput($_SERVER['argv']);
28
+ *
29
+ * If you pass it yourself, don't forget that the first element of the array
30
+ * is the name of the running application.
31
+ *
32
+ * When passing an argument to the constructor, be sure that it respects
33
+ * the same rules as the argv one. It's almost always better to use the
34
+ * `StringInput` when you want to provide your own input.
35
+ *
36
+ * @author Fabien Potencier <fabien@symfony.com>
37
+ *
38
+ * @see http://www.gnu.org/software/libc/manual/html_node/Argument-Syntax.html
39
+ * @see http://www.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap12.html#tag_12_02
40
+ */
41
+ class ArgvInput extends Input
42
+ {
43
+ private $tokens;
44
+ private $parsed;
45
+
46
+ /**
47
+ * @param array|null $argv An array of parameters from the CLI (in the argv format)
48
+ * @param InputDefinition|null $definition A InputDefinition instance
49
+ */
50
+ public function __construct(array $argv = null, InputDefinition $definition = null)
51
+ {
52
+ if (null === $argv) {
53
+ $argv = $_SERVER['argv'];
54
+ }
55
+
56
+ // strip the application name
57
+ array_shift($argv);
58
+
59
+ $this->tokens = $argv;
60
+
61
+ parent::__construct($definition);
62
+ }
63
+
64
+ protected function setTokens(array $tokens)
65
+ {
66
+ $this->tokens = $tokens;
67
+ }
68
+
69
+ /**
70
+ * {@inheritdoc}
71
+ */
72
+ protected function parse()
73
+ {
74
+ $parseOptions = true;
75
+ $this->parsed = $this->tokens;
76
+ while (null !== $token = array_shift($this->parsed)) {
77
+ if ($parseOptions && '' == $token) {
78
+ $this->parseArgument($token);
79
+ } elseif ($parseOptions && '--' == $token) {
80
+ $parseOptions = false;
81
+ } elseif ($parseOptions && 0 === strpos($token, '--')) {
82
+ $this->parseLongOption($token);
83
+ } elseif ($parseOptions && '-' === $token[0] && '-' !== $token) {
84
+ $this->parseShortOption($token);
85
+ } else {
86
+ $this->parseArgument($token);
87
+ }
88
+ }
89
+ }
90
+
91
+ /**
92
+ * Parses a short option.
93
+ *
94
+ * @param string $token The current token
95
+ */
96
+ private function parseShortOption($token)
97
+ {
98
+ $name = substr($token, 1);
99
+
100
+ if (strlen($name) > 1) {
101
+ if ($this->definition->hasShortcut($name[0]) && $this->definition->getOptionForShortcut($name[0])->acceptValue()) {
102
+ // an option with a value (with no space)
103
+ $this->addShortOption($name[0], substr($name, 1));
104
+ } else {
105
+ $this->parseShortOptionSet($name);
106
+ }
107
+ } else {
108
+ $this->addShortOption($name, null);
109
+ }
110
+ }
111
+
112
+ /**
113
+ * Parses a short option set.
114
+ *
115
+ * @param string $name The current token
116
+ *
117
+ * @throws RuntimeException When option given doesn't exist
118
+ */
119
+ private function parseShortOptionSet($name)
120
+ {
121
+ $len = strlen($name);
122
+ for ($i = 0; $i < $len; ++$i) {
123
+ if (!$this->definition->hasShortcut($name[$i])) {
124
+ throw new RuntimeException(sprintf('The "-%s" option does not exist.', $name[$i]));
125
+ }
126
+
127
+ $option = $this->definition->getOptionForShortcut($name[$i]);
128
+ if ($option->acceptValue()) {
129
+ $this->addLongOption($option->getName(), $i === $len - 1 ? null : substr($name, $i + 1));
130
+
131
+ break;
132
+ } else {
133
+ $this->addLongOption($option->getName(), null);
134
+ }
135
+ }
136
+ }
137
+
138
+ /**
139
+ * Parses a long option.
140
+ *
141
+ * @param string $token The current token
142
+ */
143
+ private function parseLongOption($token)
144
+ {
145
+ $name = substr($token, 2);
146
+
147
+ if (false !== $pos = strpos($name, '=')) {
148
+ if (0 === strlen($value = substr($name, $pos + 1))) {
149
+ // if no value after "=" then substr() returns "" since php7 only, false before
150
+ // see http://php.net/manual/fr/migration70.incompatible.php#119151
151
+ if (\PHP_VERSION_ID < 70000 && false === $value) {
152
+ $value = '';
153
+ }
154
+ array_unshift($this->parsed, $value);
155
+ }
156
+ $this->addLongOption(substr($name, 0, $pos), $value);
157
+ } else {
158
+ $this->addLongOption($name, null);
159
+ }
160
+ }
161
+
162
+ /**
163
+ * Parses an argument.
164
+ *
165
+ * @param string $token The current token
166
+ *
167
+ * @throws RuntimeException When too many arguments are given
168
+ */
169
+ private function parseArgument($token)
170
+ {
171
+ $c = count($this->arguments);
172
+
173
+ // if input is expecting another argument, add it
174
+ if ($this->definition->hasArgument($c)) {
175
+ $arg = $this->definition->getArgument($c);
176
+ $this->arguments[$arg->getName()] = $arg->isArray() ? array($token) : $token;
177
+
178
+ // if last argument isArray(), append token to last argument
179
+ } elseif ($this->definition->hasArgument($c - 1) && $this->definition->getArgument($c - 1)->isArray()) {
180
+ $arg = $this->definition->getArgument($c - 1);
181
+ $this->arguments[$arg->getName()][] = $token;
182
+
183
+ // unexpected argument
184
+ } else {
185
+ $all = $this->definition->getArguments();
186
+ if (count($all)) {
187
+ throw new RuntimeException(sprintf('Too many arguments, expected arguments "%s".', implode('" "', array_keys($all))));
188
+ }
189
+
190
+ throw new RuntimeException(sprintf('No arguments expected, got "%s".', $token));
191
+ }
192
+ }
193
+
194
+ /**
195
+ * Adds a short option value.
196
+ *
197
+ * @param string $shortcut The short option key
198
+ * @param mixed $value The value for the option
199
+ *
200
+ * @throws RuntimeException When option given doesn't exist
201
+ */
202
+ private function addShortOption($shortcut, $value)
203
+ {
204
+ if (!$this->definition->hasShortcut($shortcut)) {
205
+ throw new RuntimeException(sprintf('The "-%s" option does not exist.', $shortcut));
206
+ }
207
+
208
+ $this->addLongOption($this->definition->getOptionForShortcut($shortcut)->getName(), $value);
209
+ }
210
+
211
+ /**
212
+ * Adds a long option value.
213
+ *
214
+ * @param string $name The long option key
215
+ * @param mixed $value The value for the option
216
+ *
217
+ * @throws RuntimeException When option given doesn't exist
218
+ */
219
+ private function addLongOption($name, $value)
220
+ {
221
+ if (!$this->definition->hasOption($name)) {
222
+ throw new RuntimeException(sprintf('The "--%s" option does not exist.', $name));
223
+ }
224
+
225
+ $option = $this->definition->getOption($name);
226
+
227
+ if (null !== $value && !$option->acceptValue()) {
228
+ throw new RuntimeException(sprintf('The "--%s" option does not accept a value.', $name));
229
+ }
230
+
231
+ if (in_array($value, array('', null), true) && $option->acceptValue() && count($this->parsed)) {
232
+ // if option accepts an optional or mandatory argument
233
+ // let's see if there is one provided
234
+ $next = array_shift($this->parsed);
235
+ if ((isset($next[0]) && '-' !== $next[0]) || in_array($next, array('', null), true)) {
236
+ $value = $next;
237
+ } else {
238
+ array_unshift($this->parsed, $next);
239
+ }
240
+ }
241
+
242
+ if (null === $value) {
243
+ if ($option->isValueRequired()) {
244
+ throw new RuntimeException(sprintf('The "--%s" option requires a value.', $name));
245
+ }
246
+
247
+ if (!$option->isArray() && !$option->isValueOptional()) {
248
+ $value = true;
249
+ }
250
+ }
251
+
252
+ if ($option->isArray()) {
253
+ $this->options[$name][] = $value;
254
+ } else {
255
+ $this->options[$name] = $value;
256
+ }
257
+ }
258
+
259
+ /**
260
+ * {@inheritdoc}
261
+ */
262
+ public function getFirstArgument()
263
+ {
264
+ foreach ($this->tokens as $token) {
265
+ if ($token && '-' === $token[0]) {
266
+ continue;
267
+ }
268
+
269
+ return $token;
270
+ }
271
+ }
272
+
273
+ /**
274
+ * {@inheritdoc}
275
+ */
276
+ public function hasParameterOption($values, $onlyParams = false)
277
+ {
278
+ $values = (array) $values;
279
+
280
+ foreach ($this->tokens as $token) {
281
+ if ($onlyParams && '--' === $token) {
282
+ return false;
283
+ }
284
+ foreach ($values as $value) {
285
+ if ($token === $value || 0 === strpos($token, $value.'=')) {
286
+ return true;
287
+ }
288
+
289
+ if (0 === strpos($token, '-') && 0 !== strpos($token, '--')) {
290
+ $searchableToken = str_replace('-', '', $token);
291
+ $searchableValue = str_replace('-', '', $value);
292
+ if ('' !== $searchableToken && '' !== $searchableValue && false !== strpos($searchableToken, $searchableValue)) {
293
+ return true;
294
+ }
295
+ }
296
+ }
297
+ }
298
+
299
+ return false;
300
+ }
301
+
302
+ /**
303
+ * {@inheritdoc}
304
+ */
305
+ public function getParameterOption($values, $default = false, $onlyParams = false)
306
+ {
307
+ $values = (array) $values;
308
+ $tokens = $this->tokens;
309
+
310
+ while (0 < count($tokens)) {
311
+ $token = array_shift($tokens);
312
+ if ($onlyParams && '--' === $token) {
313
+ return false;
314
+ }
315
+
316
+ foreach ($values as $value) {
317
+ if ($token === $value || 0 === strpos($token, $value.'=')) {
318
+ if (false !== $pos = strpos($token, '=')) {
319
+ return substr($token, $pos + 1);
320
+ }
321
+
322
+ return array_shift($tokens);
323
+ }
324
+ }
325
+ }
326
+
327
+ return $default;
328
+ }
329
+
330
+ /**
331
+ * Returns a stringified representation of the args passed to the command.
332
+ *
333
+ * @return string
334
+ */
335
+ public function __toString()
336
+ {
337
+ $tokens = array_map(function ($token) {
338
+ if (preg_match('{^(-[^=]+=)(.+)}', $token, $match)) {
339
+ return $match[1].$this->escapeToken($match[2]);
340
+ }
341
+
342
+ if ($token && '-' !== $token[0]) {
343
+ return $this->escapeToken($token);
344
+ }
345
+
346
+ return $token;
347
+ }, $this->tokens);
348
+
349
+ return implode(' ', $tokens);
350
+ }
351
+ }
vendor/symfony/console/Input/ArrayInput.php ADDED
@@ -0,0 +1,206 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Input;
13
+
14
+ use Symfony\Component\Console\Exception\InvalidArgumentException;
15
+ use Symfony\Component\Console\Exception\InvalidOptionException;
16
+
17
+ /**
18
+ * ArrayInput represents an input provided as an array.
19
+ *
20
+ * Usage:
21
+ *
22
+ * $input = new ArrayInput(array('name' => 'foo', '--bar' => 'foobar'));
23
+ *
24
+ * @author Fabien Potencier <fabien@symfony.com>
25
+ */
26
+ class ArrayInput extends Input
27
+ {
28
+ private $parameters;
29
+
30
+ public function __construct(array $parameters, InputDefinition $definition = null)
31
+ {
32
+ $this->parameters = $parameters;
33
+
34
+ parent::__construct($definition);
35
+ }
36
+
37
+ /**
38
+ * {@inheritdoc}
39
+ */
40
+ public function getFirstArgument()
41
+ {
42
+ foreach ($this->parameters as $key => $value) {
43
+ if ($key && '-' === $key[0]) {
44
+ continue;
45
+ }
46
+
47
+ return $value;
48
+ }
49
+ }
50
+
51
+ /**
52
+ * {@inheritdoc}
53
+ */
54
+ public function hasParameterOption($values, $onlyParams = false)
55
+ {
56
+ $values = (array) $values;
57
+
58
+ foreach ($this->parameters as $k => $v) {
59
+ if (!is_int($k)) {
60
+ $v = $k;
61
+ }
62
+
63
+ if ($onlyParams && '--' === $v) {
64
+ return false;
65
+ }
66
+
67
+ if (in_array($v, $values)) {
68
+ return true;
69
+ }
70
+ }
71
+
72
+ return false;
73
+ }
74
+
75
+ /**
76
+ * {@inheritdoc}
77
+ */
78
+ public function getParameterOption($values, $default = false, $onlyParams = false)
79
+ {
80
+ $values = (array) $values;
81
+
82
+ foreach ($this->parameters as $k => $v) {
83
+ if ($onlyParams && ('--' === $k || (is_int($k) && '--' === $v))) {
84
+ return false;
85
+ }
86
+
87
+ if (is_int($k)) {
88
+ if (in_array($v, $values)) {
89
+ return true;
90
+ }
91
+ } elseif (in_array($k, $values)) {
92
+ return $v;
93
+ }
94
+ }
95
+
96
+ return $default;
97
+ }
98
+
99
+ /**
100
+ * Returns a stringified representation of the args passed to the command.
101
+ *
102
+ * @return string
103
+ */
104
+ public function __toString()
105
+ {
106
+ $params = array();
107
+ foreach ($this->parameters as $param => $val) {
108
+ if ($param && '-' === $param[0]) {
109
+ if (is_array($val)) {
110
+ foreach ($val as $v) {
111
+ $params[] = $param.('' != $v ? '='.$this->escapeToken($v) : '');
112
+ }
113
+ } else {
114
+ $params[] = $param.('' != $val ? '='.$this->escapeToken($val) : '');
115
+ }
116
+ } else {
117
+ $params[] = is_array($val) ? array_map(array($this, 'escapeToken'), $val) : $this->escapeToken($val);
118
+ }
119
+ }
120
+
121
+ return implode(' ', $params);
122
+ }
123
+
124
+ /**
125
+ * {@inheritdoc}
126
+ */
127
+ protected function parse()
128
+ {
129
+ foreach ($this->parameters as $key => $value) {
130
+ if ('--' === $key) {
131
+ return;
132
+ }
133
+ if (0 === strpos($key, '--')) {
134
+ $this->addLongOption(substr($key, 2), $value);
135
+ } elseif ('-' === $key[0]) {
136
+ $this->addShortOption(substr($key, 1), $value);
137
+ } else {
138
+ $this->addArgument($key, $value);
139
+ }
140
+ }
141
+ }
142
+
143
+ /**
144
+ * Adds a short option value.
145
+ *
146
+ * @param string $shortcut The short option key
147
+ * @param mixed $value The value for the option
148
+ *
149
+ * @throws InvalidOptionException When option given doesn't exist
150
+ */
151
+ private function addShortOption($shortcut, $value)
152
+ {
153
+ if (!$this->definition->hasShortcut($shortcut)) {
154
+ throw new InvalidOptionException(sprintf('The "-%s" option does not exist.', $shortcut));
155
+ }
156
+
157
+ $this->addLongOption($this->definition->getOptionForShortcut($shortcut)->getName(), $value);
158
+ }
159
+
160
+ /**
161
+ * Adds a long option value.
162
+ *
163
+ * @param string $name The long option key
164
+ * @param mixed $value The value for the option
165
+ *
166
+ * @throws InvalidOptionException When option given doesn't exist
167
+ * @throws InvalidOptionException When a required value is missing
168
+ */
169
+ private function addLongOption($name, $value)
170
+ {
171
+ if (!$this->definition->hasOption($name)) {
172
+ throw new InvalidOptionException(sprintf('The "--%s" option does not exist.', $name));
173
+ }
174
+
175
+ $option = $this->definition->getOption($name);
176
+
177
+ if (null === $value) {
178
+ if ($option->isValueRequired()) {
179
+ throw new InvalidOptionException(sprintf('The "--%s" option requires a value.', $name));
180
+ }
181
+
182
+ if (!$option->isValueOptional()) {
183
+ $value = true;
184
+ }
185
+ }
186
+
187
+ $this->options[$name] = $value;
188
+ }
189
+
190
+ /**
191
+ * Adds an argument value.
192
+ *
193
+ * @param string $name The argument name
194
+ * @param mixed $value The value for the argument
195
+ *
196
+ * @throws InvalidArgumentException When argument given doesn't exist
197
+ */
198
+ private function addArgument($name, $value)
199
+ {
200
+ if (!$this->definition->hasArgument($name)) {
201
+ throw new InvalidArgumentException(sprintf('The "%s" argument does not exist.', $name));
202
+ }
203
+
204
+ $this->arguments[$name] = $value;
205
+ }
206
+ }
vendor/symfony/console/Input/Input.php ADDED
@@ -0,0 +1,203 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Input;
13
+
14
+ use Symfony\Component\Console\Exception\InvalidArgumentException;
15
+ use Symfony\Component\Console\Exception\RuntimeException;
16
+
17
+ /**
18
+ * Input is the base class for all concrete Input classes.
19
+ *
20
+ * Three concrete classes are provided by default:
21
+ *
22
+ * * `ArgvInput`: The input comes from the CLI arguments (argv)
23
+ * * `StringInput`: The input is provided as a string
24
+ * * `ArrayInput`: The input is provided as an array
25
+ *
26
+ * @author Fabien Potencier <fabien@symfony.com>
27
+ */
28
+ abstract class Input implements InputInterface, StreamableInputInterface
29
+ {
30
+ protected $definition;
31
+ protected $stream;
32
+ protected $options = array();
33
+ protected $arguments = array();
34
+ protected $interactive = true;
35
+
36
+ public function __construct(InputDefinition $definition = null)
37
+ {
38
+ if (null === $definition) {
39
+ $this->definition = new InputDefinition();
40
+ } else {
41
+ $this->bind($definition);
42
+ $this->validate();
43
+ }
44
+ }
45
+
46
+ /**
47
+ * {@inheritdoc}
48
+ */
49
+ public function bind(InputDefinition $definition)
50
+ {
51
+ $this->arguments = array();
52
+ $this->options = array();
53
+ $this->definition = $definition;
54
+
55
+ $this->parse();
56
+ }
57
+
58
+ /**
59
+ * Processes command line arguments.
60
+ */
61
+ abstract protected function parse();
62
+
63
+ /**
64
+ * {@inheritdoc}
65
+ */
66
+ public function validate()
67
+ {
68
+ $definition = $this->definition;
69
+ $givenArguments = $this->arguments;
70
+
71
+ $missingArguments = array_filter(array_keys($definition->getArguments()), function ($argument) use ($definition, $givenArguments) {
72
+ return !array_key_exists($argument, $givenArguments) && $definition->getArgument($argument)->isRequired();
73
+ });
74
+
75
+ if (count($missingArguments) > 0) {
76
+ throw new RuntimeException(sprintf('Not enough arguments (missing: "%s").', implode(', ', $missingArguments)));
77
+ }
78
+ }
79
+
80
+ /**
81
+ * {@inheritdoc}
82
+ */
83
+ public function isInteractive()
84
+ {
85
+ return $this->interactive;
86
+ }
87
+
88
+ /**
89
+ * {@inheritdoc}
90
+ */
91
+ public function setInteractive($interactive)
92
+ {
93
+ $this->interactive = (bool) $interactive;
94
+ }
95
+
96
+ /**
97
+ * {@inheritdoc}
98
+ */
99
+ public function getArguments()
100
+ {
101
+ return array_merge($this->definition->getArgumentDefaults(), $this->arguments);
102
+ }
103
+
104
+ /**
105
+ * {@inheritdoc}
106
+ */
107
+ public function getArgument($name)
108
+ {
109
+ if (!$this->definition->hasArgument($name)) {
110
+ throw new InvalidArgumentException(sprintf('The "%s" argument does not exist.', $name));
111
+ }
112
+
113
+ return isset($this->arguments[$name]) ? $this->arguments[$name] : $this->definition->getArgument($name)->getDefault();
114
+ }
115
+
116
+ /**
117
+ * {@inheritdoc}
118
+ */
119
+ public function setArgument($name, $value)
120
+ {
121
+ if (!$this->definition->hasArgument($name)) {
122
+ throw new InvalidArgumentException(sprintf('The "%s" argument does not exist.', $name));
123
+ }
124
+
125
+ $this->arguments[$name] = $value;
126
+ }
127
+
128
+ /**
129
+ * {@inheritdoc}
130
+ */
131
+ public function hasArgument($name)
132
+ {
133
+ return $this->definition->hasArgument($name);
134
+ }
135
+
136
+ /**
137
+ * {@inheritdoc}
138
+ */
139
+ public function getOptions()
140
+ {
141
+ return array_merge($this->definition->getOptionDefaults(), $this->options);
142
+ }
143
+
144
+ /**
145
+ * {@inheritdoc}
146
+ */
147
+ public function getOption($name)
148
+ {
149
+ if (!$this->definition->hasOption($name)) {
150
+ throw new InvalidArgumentException(sprintf('The "%s" option does not exist.', $name));
151
+ }
152
+
153
+ return array_key_exists($name, $this->options) ? $this->options[$name] : $this->definition->getOption($name)->getDefault();
154
+ }
155
+
156
+ /**
157
+ * {@inheritdoc}
158
+ */
159
+ public function setOption($name, $value)
160
+ {
161
+ if (!$this->definition->hasOption($name)) {
162
+ throw new InvalidArgumentException(sprintf('The "%s" option does not exist.', $name));
163
+ }
164
+
165
+ $this->options[$name] = $value;
166
+ }
167
+
168
+ /**
169
+ * {@inheritdoc}
170
+ */
171
+ public function hasOption($name)
172
+ {
173
+ return $this->definition->hasOption($name);
174
+ }
175
+
176
+ /**
177
+ * Escapes a token through escapeshellarg if it contains unsafe chars.
178
+ *
179
+ * @param string $token
180
+ *
181
+ * @return string
182
+ */
183
+ public function escapeToken($token)
184
+ {
185
+ return preg_match('{^[\w-]+$}', $token) ? $token : escapeshellarg($token);
186
+ }
187
+
188
+ /**
189
+ * {@inheritdoc}
190
+ */
191
+ public function setStream($stream)
192
+ {
193
+ $this->stream = $stream;
194
+ }
195
+
196
+ /**
197
+ * {@inheritdoc}
198
+ */
199
+ public function getStream()
200
+ {
201
+ return $this->stream;
202
+ }
203
+ }
vendor/symfony/console/Input/InputArgument.php ADDED
@@ -0,0 +1,129 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Input;
13
+
14
+ use Symfony\Component\Console\Exception\InvalidArgumentException;
15
+ use Symfony\Component\Console\Exception\LogicException;
16
+
17
+ /**
18
+ * Represents a command line argument.
19
+ *
20
+ * @author Fabien Potencier <fabien@symfony.com>
21
+ */
22
+ class InputArgument
23
+ {
24
+ const REQUIRED = 1;
25
+ const OPTIONAL = 2;
26
+ const IS_ARRAY = 4;
27
+
28
+ private $name;
29
+ private $mode;
30
+ private $default;
31
+ private $description;
32
+
33
+ /**
34
+ * @param string $name The argument name
35
+ * @param int $mode The argument mode: self::REQUIRED or self::OPTIONAL
36
+ * @param string $description A description text
37
+ * @param mixed $default The default value (for self::OPTIONAL mode only)
38
+ *
39
+ * @throws InvalidArgumentException When argument mode is not valid
40
+ */
41
+ public function __construct($name, $mode = null, $description = '', $default = null)
42
+ {
43
+ if (null === $mode) {
44
+ $mode = self::OPTIONAL;
45
+ } elseif (!is_int($mode) || $mode > 7 || $mode < 1) {
46
+ throw new InvalidArgumentException(sprintf('Argument mode "%s" is not valid.', $mode));
47
+ }
48
+
49
+ $this->name = $name;
50
+ $this->mode = $mode;
51
+ $this->description = $description;
52
+
53
+ $this->setDefault($default);
54
+ }
55
+
56
+ /**
57
+ * Returns the argument name.
58
+ *
59
+ * @return string The argument name
60
+ */
61
+ public function getName()
62
+ {
63
+ return $this->name;
64
+ }
65
+
66
+ /**
67
+ * Returns true if the argument is required.
68
+ *
69
+ * @return bool true if parameter mode is self::REQUIRED, false otherwise
70
+ */
71
+ public function isRequired()
72
+ {
73
+ return self::REQUIRED === (self::REQUIRED & $this->mode);
74
+ }
75
+
76
+ /**
77
+ * Returns true if the argument can take multiple values.
78
+ *
79
+ * @return bool true if mode is self::IS_ARRAY, false otherwise
80
+ */
81
+ public function isArray()
82
+ {
83
+ return self::IS_ARRAY === (self::IS_ARRAY & $this->mode);
84
+ }
85
+
86
+ /**
87
+ * Sets the default value.
88
+ *
89
+ * @param mixed $default The default value
90
+ *
91
+ * @throws LogicException When incorrect default value is given
92
+ */
93
+ public function setDefault($default = null)
94
+ {
95
+ if (self::REQUIRED === $this->mode && null !== $default) {
96
+ throw new LogicException('Cannot set a default value except for InputArgument::OPTIONAL mode.');
97
+ }
98
+
99
+ if ($this->isArray()) {
100
+ if (null === $default) {
101
+ $default = array();
102
+ } elseif (!is_array($default)) {
103
+ throw new LogicException('A default value for an array argument must be an array.');
104
+ }
105
+ }
106
+
107
+ $this->default = $default;
108
+ }
109
+
110
+ /**
111
+ * Returns the default value.
112
+ *
113
+ * @return mixed The default value
114
+ */
115
+ public function getDefault()
116
+ {
117
+ return $this->default;
118
+ }
119
+
120
+ /**
121
+ * Returns the description text.
122
+ *
123
+ * @return string The description text
124
+ */
125
+ public function getDescription()
126
+ {
127
+ return $this->description;
128
+ }
129
+ }
vendor/symfony/console/Input/InputAwareInterface.php ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Input;
13
+
14
+ /**
15
+ * InputAwareInterface should be implemented by classes that depends on the
16
+ * Console Input.
17
+ *
18
+ * @author Wouter J <waldio.webdesign@gmail.com>
19
+ */
20
+ interface InputAwareInterface
21
+ {
22
+ /**
23
+ * Sets the Console Input.
24
+ *
25
+ * @param InputInterface
26
+ */
27
+ public function setInput(InputInterface $input);
28
+ }
vendor/symfony/console/Input/InputDefinition.php ADDED
@@ -0,0 +1,402 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Input;
13
+
14
+ use Symfony\Component\Console\Exception\InvalidArgumentException;
15
+ use Symfony\Component\Console\Exception\LogicException;
16
+
17
+ /**
18
+ * A InputDefinition represents a set of valid command line arguments and options.
19
+ *
20
+ * Usage:
21
+ *
22
+ * $definition = new InputDefinition(array(
23
+ * new InputArgument('name', InputArgument::REQUIRED),
24
+ * new InputOption('foo', 'f', InputOption::VALUE_REQUIRED),
25
+ * ));
26
+ *
27
+ * @author Fabien Potencier <fabien@symfony.com>
28
+ */
29
+ class InputDefinition
30
+ {
31
+ private $arguments;
32
+ private $requiredCount;
33
+ private $hasAnArrayArgument = false;
34
+ private $hasOptional;
35
+ private $options;
36
+ private $shortcuts;
37
+
38
+ /**
39
+ * @param array $definition An array of InputArgument and InputOption instance
40
+ */
41
+ public function __construct(array $definition = array())
42
+ {
43
+ $this->setDefinition($definition);
44
+ }
45
+
46
+ /**
47
+ * Sets the definition of the input.
48
+ */
49
+ public function setDefinition(array $definition)
50
+ {
51
+ $arguments = array();
52
+ $options = array();
53
+ foreach ($definition as $item) {
54
+ if ($item instanceof InputOption) {
55
+ $options[] = $item;
56
+ } else {
57
+ $arguments[] = $item;
58
+ }
59
+ }
60
+
61
+ $this->setArguments($arguments);
62
+ $this->setOptions($options);
63
+ }
64
+
65
+ /**
66
+ * Sets the InputArgument objects.
67
+ *
68
+ * @param InputArgument[] $arguments An array of InputArgument objects
69
+ */
70
+ public function setArguments($arguments = array())
71
+ {
72
+ $this->arguments = array();
73
+ $this->requiredCount = 0;
74
+ $this->hasOptional = false;
75
+ $this->hasAnArrayArgument = false;
76
+ $this->addArguments($arguments);
77
+ }
78
+
79
+ /**
80
+ * Adds an array of InputArgument objects.
81
+ *
82
+ * @param InputArgument[] $arguments An array of InputArgument objects
83
+ */
84
+ public function addArguments($arguments = array())
85
+ {
86
+ if (null !== $arguments) {
87
+ foreach ($arguments as $argument) {
88
+ $this->addArgument($argument);
89
+ }
90
+ }
91
+ }
92
+
93
+ /**
94
+ * @throws LogicException When incorrect argument is given
95
+ */
96
+ public function addArgument(InputArgument $argument)
97
+ {
98
+ if (isset($this->arguments[$argument->getName()])) {
99
+ throw new LogicException(sprintf('An argument with name "%s" already exists.', $argument->getName()));
100
+ }
101
+
102
+ if ($this->hasAnArrayArgument) {
103
+ throw new LogicException('Cannot add an argument after an array argument.');
104
+ }
105
+
106
+ if ($argument->isRequired() && $this->hasOptional) {
107
+ throw new LogicException('Cannot add a required argument after an optional one.');
108
+ }
109
+
110
+ if ($argument->isArray()) {
111
+ $this->hasAnArrayArgument = true;
112
+ }
113
+
114
+ if ($argument->isRequired()) {
115
+ ++$this->requiredCount;
116
+ } else {
117
+ $this->hasOptional = true;
118
+ }
119
+
120
+ $this->arguments[$argument->getName()] = $argument;
121
+ }
122
+
123
+ /**
124
+ * Returns an InputArgument by name or by position.
125
+ *
126
+ * @param string|int $name The InputArgument name or position
127
+ *
128
+ * @return InputArgument An InputArgument object
129
+ *
130
+ * @throws InvalidArgumentException When argument given doesn't exist
131
+ */
132
+ public function getArgument($name)
133
+ {
134
+ if (!$this->hasArgument($name)) {
135
+ throw new InvalidArgumentException(sprintf('The "%s" argument does not exist.', $name));
136
+ }
137
+
138
+ $arguments = is_int($name) ? array_values($this->arguments) : $this->arguments;
139
+
140
+ return $arguments[$name];
141
+ }
142
+
143
+ /**
144
+ * Returns true if an InputArgument object exists by name or position.
145
+ *
146
+ * @param string|int $name The InputArgument name or position
147
+ *
148
+ * @return bool true if the InputArgument object exists, false otherwise
149
+ */
150
+ public function hasArgument($name)
151
+ {
152
+ $arguments = is_int($name) ? array_values($this->arguments) : $this->arguments;
153
+
154
+ return isset($arguments[$name]);
155
+ }
156
+
157
+ /**
158
+ * Gets the array of InputArgument objects.
159
+ *
160
+ * @return InputArgument[] An array of InputArgument objects
161
+ */
162
+ public function getArguments()
163
+ {
164
+ return $this->arguments;
165
+ }
166
+
167
+ /**
168
+ * Returns the number of InputArguments.
169
+ *
170
+ * @return int The number of InputArguments
171
+ */
172
+ public function getArgumentCount()
173
+ {
174
+ return $this->hasAnArrayArgument ? PHP_INT_MAX : count($this->arguments);
175
+ }
176
+
177
+ /**
178
+ * Returns the number of required InputArguments.
179
+ *
180
+ * @return int The number of required InputArguments
181
+ */
182
+ public function getArgumentRequiredCount()
183
+ {
184
+ return $this->requiredCount;
185
+ }
186
+
187
+ /**
188
+ * Gets the default values.
189
+ *
190
+ * @return array An array of default values
191
+ */
192
+ public function getArgumentDefaults()
193
+ {
194
+ $values = array();
195
+ foreach ($this->arguments as $argument) {
196
+ $values[$argument->getName()] = $argument->getDefault();
197
+ }
198
+
199
+ return $values;
200
+ }
201
+
202
+ /**
203
+ * Sets the InputOption objects.
204
+ *
205
+ * @param InputOption[] $options An array of InputOption objects
206
+ */
207
+ public function setOptions($options = array())
208
+ {
209
+ $this->options = array();
210
+ $this->shortcuts = array();
211
+ $this->addOptions($options);
212
+ }
213
+
214
+ /**
215
+ * Adds an array of InputOption objects.
216
+ *
217
+ * @param InputOption[] $options An array of InputOption objects
218
+ */
219
+ public function addOptions($options = array())
220
+ {
221
+ foreach ($options as $option) {
222
+ $this->addOption($option);
223
+ }
224
+ }
225
+
226
+ /**
227
+ * @throws LogicException When option given already exist
228
+ */
229
+ public function addOption(InputOption $option)
230
+ {
231
+ if (isset($this->options[$option->getName()]) && !$option->equals($this->options[$option->getName()])) {
232
+ throw new LogicException(sprintf('An option named "%s" already exists.', $option->getName()));
233
+ }
234
+
235
+ if ($option->getShortcut()) {
236
+ foreach (explode('|', $option->getShortcut()) as $shortcut) {
237
+ if (isset($this->shortcuts[$shortcut]) && !$option->equals($this->options[$this->shortcuts[$shortcut]])) {
238
+ throw new LogicException(sprintf('An option with shortcut "%s" already exists.', $shortcut));
239
+ }
240
+ }
241
+ }
242
+
243
+ $this->options[$option->getName()] = $option;
244
+ if ($option->getShortcut()) {
245
+ foreach (explode('|', $option->getShortcut()) as $shortcut) {
246
+ $this->shortcuts[$shortcut] = $option->getName();
247
+ }
248
+ }
249
+ }
250
+
251
+ /**
252
+ * Returns an InputOption by name.
253
+ *
254
+ * @param string $name The InputOption name
255
+ *
256
+ * @return InputOption A InputOption object
257
+ *
258
+ * @throws InvalidArgumentException When option given doesn't exist
259
+ */
260
+ public function getOption($name)
261
+ {
262
+ if (!$this->hasOption($name)) {
263
+ throw new InvalidArgumentException(sprintf('The "--%s" option does not exist.', $name));
264
+ }
265
+
266
+ return $this->options[$name];
267
+ }
268
+
269
+ /**
270
+ * Returns true if an InputOption object exists by name.
271
+ *
272
+ * This method can't be used to check if the user included the option when
273
+ * executing the command (use getOption() instead).
274
+ *
275
+ * @param string $name The InputOption name
276
+ *
277
+ * @return bool true if the InputOption object exists, false otherwise
278
+ */
279
+ public function hasOption($name)
280
+ {
281
+ return isset($this->options[$name]);
282
+ }
283
+
284
+ /**
285
+ * Gets the array of InputOption objects.
286
+ *
287
+ * @return InputOption[] An array of InputOption objects
288
+ */
289
+ public function getOptions()
290
+ {
291
+ return $this->options;
292
+ }
293
+
294
+ /**
295
+ * Returns true if an InputOption object exists by shortcut.
296
+ *
297
+ * @param string $name The InputOption shortcut
298
+ *
299
+ * @return bool true if the InputOption object exists, false otherwise
300
+ */
301
+ public function hasShortcut($name)
302
+ {
303
+ return isset($this->shortcuts[$name]);
304
+ }
305
+
306
+ /**
307
+ * Gets an InputOption by shortcut.
308
+ *
309
+ * @param string $shortcut The Shortcut name
310
+ *
311
+ * @return InputOption An InputOption object
312
+ */
313
+ public function getOptionForShortcut($shortcut)
314
+ {
315
+ return $this->getOption($this->shortcutToName($shortcut));
316
+ }
317
+
318
+ /**
319
+ * Gets an array of default values.
320
+ *
321
+ * @return array An array of all default values
322
+ */
323
+ public function getOptionDefaults()
324
+ {
325
+ $values = array();
326
+ foreach ($this->options as $option) {
327
+ $values[$option->getName()] = $option->getDefault();
328
+ }
329
+
330
+ return $values;
331
+ }
332
+
333
+ /**
334
+ * Returns the InputOption name given a shortcut.
335
+ *
336
+ * @param string $shortcut The shortcut
337
+ *
338
+ * @return string The InputOption name
339
+ *
340
+ * @throws InvalidArgumentException When option given does not exist
341
+ */
342
+ private function shortcutToName($shortcut)
343
+ {
344
+ if (!isset($this->shortcuts[$shortcut])) {
345
+ throw new InvalidArgumentException(sprintf('The "-%s" option does not exist.', $shortcut));
346
+ }
347
+
348
+ return $this->shortcuts[$shortcut];
349
+ }
350
+
351
+ /**
352
+ * Gets the synopsis.
353
+ *
354
+ * @param bool $short Whether to return the short version (with options folded) or not
355
+ *
356
+ * @return string The synopsis
357
+ */
358
+ public function getSynopsis($short = false)
359
+ {
360
+ $elements = array();
361
+
362
+ if ($short && $this->getOptions()) {
363
+ $elements[] = '[options]';
364
+ } elseif (!$short) {
365
+ foreach ($this->getOptions() as $option) {
366
+ $value = '';
367
+ if ($option->acceptValue()) {
368
+ $value = sprintf(
369
+ ' %s%s%s',
370
+ $option->isValueOptional() ? '[' : '',
371
+ strtoupper($option->getName()),
372
+ $option->isValueOptional() ? ']' : ''
373
+ );
374
+ }
375
+
376
+ $shortcut = $option->getShortcut() ? sprintf('-%s|', $option->getShortcut()) : '';
377
+ $elements[] = sprintf('[%s--%s%s]', $shortcut, $option->getName(), $value);
378
+ }
379
+ }
380
+
381
+ if (count($elements) && $this->getArguments()) {
382
+ $elements[] = '[--]';
383
+ }
384
+
385
+ foreach ($this->getArguments() as $argument) {
386
+ $element = '<'.$argument->getName().'>';
387
+ if (!$argument->isRequired()) {
388
+ $element = '['.$element.']';
389
+ } elseif ($argument->isArray()) {
390
+ $element = $element.' ('.$element.')';
391
+ }
392
+
393
+ if ($argument->isArray()) {
394
+ $element .= '...';
395
+ }
396
+
397
+ $elements[] = $element;
398
+ }
399
+
400
+ return implode(' ', $elements);
401
+ }
402
+ }
vendor/symfony/console/Input/InputInterface.php ADDED
@@ -0,0 +1,157 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Input;
13
+
14
+ use Symfony\Component\Console\Exception\InvalidArgumentException;
15
+ use Symfony\Component\Console\Exception\RuntimeException;
16
+
17
+ /**
18
+ * InputInterface is the interface implemented by all input classes.
19
+ *
20
+ * @author Fabien Potencier <fabien@symfony.com>
21
+ */
22
+ interface InputInterface
23
+ {
24
+ /**
25
+ * Returns the first argument from the raw parameters (not parsed).
26
+ *
27
+ * @return string The value of the first argument or null otherwise
28
+ */
29
+ public function getFirstArgument();
30
+
31
+ /**
32
+ * Returns true if the raw parameters (not parsed) contain a value.
33
+ *
34
+ * This method is to be used to introspect the input parameters
35
+ * before they have been validated. It must be used carefully.
36
+ *
37
+ * @param string|array $values The values to look for in the raw parameters (can be an array)
38
+ * @param bool $onlyParams Only check real parameters, skip those following an end of options (--) signal
39
+ *
40
+ * @return bool true if the value is contained in the raw parameters
41
+ */
42
+ public function hasParameterOption($values, $onlyParams = false);
43
+
44
+ /**
45
+ * Returns the value of a raw option (not parsed).
46
+ *
47
+ * This method is to be used to introspect the input parameters
48
+ * before they have been validated. It must be used carefully.
49
+ *
50
+ * @param string|array $values The value(s) to look for in the raw parameters (can be an array)
51
+ * @param mixed $default The default value to return if no result is found
52
+ * @param bool $onlyParams Only check real parameters, skip those following an end of options (--) signal
53
+ *
54
+ * @return mixed The option value
55
+ */
56
+ public function getParameterOption($values, $default = false, $onlyParams = false);
57
+
58
+ /**
59
+ * Binds the current Input instance with the given arguments and options.
60
+ */
61
+ public function bind(InputDefinition $definition);
62
+
63
+ /**
64
+ * Validates the input.
65
+ *
66
+ * @throws RuntimeException When not enough arguments are given
67
+ */
68
+ public function validate();
69
+
70
+ /**
71
+ * Returns all the given arguments merged with the default values.
72
+ *
73
+ * @return array
74
+ */
75
+ public function getArguments();
76
+
77
+ /**
78
+ * Returns the argument value for a given argument name.
79
+ *
80
+ * @param string $name The argument name
81
+ *
82
+ * @return mixed The argument value
83
+ *
84
+ * @throws InvalidArgumentException When argument given doesn't exist
85
+ */
86
+ public function getArgument($name);
87
+
88
+ /**
89
+ * Sets an argument value by name.
90
+ *
91
+ * @param string $name The argument name
92
+ * @param string $value The argument value
93
+ *
94
+ * @throws InvalidArgumentException When argument given doesn't exist
95
+ */
96
+ public function setArgument($name, $value);
97
+
98
+ /**
99
+ * Returns true if an InputArgument object exists by name or position.
100
+ *
101
+ * @param string|int $name The InputArgument name or position
102
+ *
103
+ * @return bool true if the InputArgument object exists, false otherwise
104
+ */
105
+ public function hasArgument($name);
106
+
107
+ /**
108
+ * Returns all the given options merged with the default values.
109
+ *
110
+ * @return array
111
+ */
112
+ public function getOptions();
113
+
114
+ /**
115
+ * Returns the option value for a given option name.
116
+ *
117
+ * @param string $name The option name
118
+ *
119
+ * @return mixed The option value
120
+ *
121
+ * @throws InvalidArgumentException When option given doesn't exist
122
+ */
123
+ public function getOption($name);
124
+
125
+ /**
126
+ * Sets an option value by name.
127
+ *
128
+ * @param string $name The option name
129
+ * @param string|bool $value The option value
130
+ *
131
+ * @throws InvalidArgumentException When option given doesn't exist
132
+ */
133
+ public function setOption($name, $value);
134
+
135
+ /**
136
+ * Returns true if an InputOption object exists by name.
137
+ *
138
+ * @param string $name The InputOption name
139
+ *
140
+ * @return bool true if the InputOption object exists, false otherwise
141
+ */
142
+ public function hasOption($name);
143
+
144
+ /**
145
+ * Is this input means interactive?
146
+ *
147
+ * @return bool
148
+ */
149
+ public function isInteractive();
150
+
151
+ /**
152
+ * Sets the input interactivity.
153
+ *
154
+ * @param bool $interactive If the input should be interactive
155
+ */
156
+ public function setInteractive($interactive);
157
+ }
vendor/symfony/console/Input/InputOption.php ADDED
@@ -0,0 +1,208 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Input;
13
+
14
+ use Symfony\Component\Console\Exception\InvalidArgumentException;
15
+ use Symfony\Component\Console\Exception\LogicException;
16
+
17
+ /**
18
+ * Represents a command line option.
19
+ *
20
+ * @author Fabien Potencier <fabien@symfony.com>
21
+ */
22
+ class InputOption
23
+ {
24
+ const VALUE_NONE = 1;
25
+ const VALUE_REQUIRED = 2;
26
+ const VALUE_OPTIONAL = 4;
27
+ const VALUE_IS_ARRAY = 8;
28
+
29
+ private $name;
30
+ private $shortcut;
31
+ private $mode;
32
+ private $default;
33
+ private $description;
34
+
35
+ /**
36
+ * @param string $name The option name
37
+ * @param string|array $shortcut The shortcuts, can be null, a string of shortcuts delimited by | or an array of shortcuts
38
+ * @param int $mode The option mode: One of the VALUE_* constants
39
+ * @param string $description A description text
40
+ * @param mixed $default The default value (must be null for self::VALUE_NONE)
41
+ *
42
+ * @throws InvalidArgumentException If option mode is invalid or incompatible
43
+ */
44
+ public function __construct($name, $shortcut = null, $mode = null, $description = '', $default = null)
45
+ {
46
+ if (0 === strpos($name, '--')) {
47
+ $name = substr($name, 2);
48
+ }
49
+
50
+ if (empty($name)) {
51
+ throw new InvalidArgumentException('An option name cannot be empty.');
52
+ }
53
+
54
+ if (empty($shortcut)) {
55
+ $shortcut = null;
56
+ }
57
+
58
+ if (null !== $shortcut) {
59
+ if (is_array($shortcut)) {
60
+ $shortcut = implode('|', $shortcut);
61
+ }
62
+ $shortcuts = preg_split('{(\|)-?}', ltrim($shortcut, '-'));
63
+ $shortcuts = array_filter($shortcuts);
64
+ $shortcut = implode('|', $shortcuts);
65
+
66
+ if (empty($shortcut)) {
67
+ throw new InvalidArgumentException('An option shortcut cannot be empty.');
68
+ }
69
+ }
70
+
71
+ if (null === $mode) {
72
+ $mode = self::VALUE_NONE;
73
+ } elseif (!is_int($mode) || $mode > 15 || $mode < 1) {
74
+ throw new InvalidArgumentException(sprintf('Option mode "%s" is not valid.', $mode));
75
+ }
76
+
77
+ $this->name = $name;
78
+ $this->shortcut = $shortcut;
79
+ $this->mode = $mode;
80
+ $this->description = $description;
81
+
82
+ if ($this->isArray() && !$this->acceptValue()) {
83
+ throw new InvalidArgumentException('Impossible to have an option mode VALUE_IS_ARRAY if the option does not accept a value.');
84
+ }
85
+
86
+ $this->setDefault($default);
87
+ }
88
+
89
+ /**
90
+ * Returns the option shortcut.
91
+ *
92
+ * @return string The shortcut
93
+ */
94
+ public function getShortcut()
95
+ {
96
+ return $this->shortcut;
97
+ }
98
+
99
+ /**
100
+ * Returns the option name.
101
+ *
102
+ * @return string The name
103
+ */
104
+ public function getName()
105
+ {
106
+ return $this->name;
107
+ }
108
+
109
+ /**
110
+ * Returns true if the option accepts a value.
111
+ *
112
+ * @return bool true if value mode is not self::VALUE_NONE, false otherwise
113
+ */
114
+ public function acceptValue()
115
+ {
116
+ return $this->isValueRequired() || $this->isValueOptional();
117
+ }
118
+
119
+ /**
120
+ * Returns true if the option requires a value.
121
+ *
122
+ * @return bool true if value mode is self::VALUE_REQUIRED, false otherwise
123
+ */
124
+ public function isValueRequired()
125
+ {
126
+ return self::VALUE_REQUIRED === (self::VALUE_REQUIRED & $this->mode);
127
+ }
128
+
129
+ /**
130
+ * Returns true if the option takes an optional value.
131
+ *
132
+ * @return bool true if value mode is self::VALUE_OPTIONAL, false otherwise
133
+ */
134
+ public function isValueOptional()
135
+ {
136
+ return self::VALUE_OPTIONAL === (self::VALUE_OPTIONAL & $this->mode);
137
+ }
138
+
139
+ /**
140
+ * Returns true if the option can take multiple values.
141
+ *
142
+ * @return bool true if mode is self::VALUE_IS_ARRAY, false otherwise
143
+ */
144
+ public function isArray()
145
+ {
146
+ return self::VALUE_IS_ARRAY === (self::VALUE_IS_ARRAY & $this->mode);
147
+ }
148
+
149
+ /**
150
+ * Sets the default value.
151
+ *
152
+ * @param mixed $default The default value
153
+ *
154
+ * @throws LogicException When incorrect default value is given
155
+ */
156
+ public function setDefault($default = null)
157
+ {
158
+ if (self::VALUE_NONE === (self::VALUE_NONE & $this->mode) && null !== $default) {
159
+ throw new LogicException('Cannot set a default value when using InputOption::VALUE_NONE mode.');
160
+ }
161
+
162
+ if ($this->isArray()) {
163
+ if (null === $default) {
164
+ $default = array();
165
+ } elseif (!is_array($default)) {
166
+ throw new LogicException('A default value for an array option must be an array.');
167
+ }
168
+ }
169
+
170
+ $this->default = $this->acceptValue() ? $default : false;
171
+ }
172
+
173
+ /**
174
+ * Returns the default value.
175
+ *
176
+ * @return mixed The default value
177
+ */
178
+ public function getDefault()
179
+ {
180
+ return $this->default;
181
+ }
182
+
183
+ /**
184
+ * Returns the description text.
185
+ *
186
+ * @return string The description text
187
+ */
188
+ public function getDescription()
189
+ {
190
+ return $this->description;
191
+ }
192
+
193
+ /**
194
+ * Checks whether the given option equals this one.
195
+ *
196
+ * @return bool
197
+ */
198
+ public function equals(InputOption $option)
199
+ {
200
+ return $option->getName() === $this->getName()
201
+ && $option->getShortcut() === $this->getShortcut()
202
+ && $option->getDefault() === $this->getDefault()
203
+ && $option->isArray() === $this->isArray()
204
+ && $option->isValueRequired() === $this->isValueRequired()
205
+ && $option->isValueOptional() === $this->isValueOptional()
206
+ ;
207
+ }
208
+ }
vendor/symfony/console/Input/StreamableInputInterface.php ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Input;
13
+
14
+ /**
15
+ * StreamableInputInterface is the interface implemented by all input classes
16
+ * that have an input stream.
17
+ *
18
+ * @author Robin Chalas <robin.chalas@gmail.com>
19
+ */
20
+ interface StreamableInputInterface extends InputInterface
21
+ {
22
+ /**
23
+ * Sets the input stream to read from when interacting with the user.
24
+ *
25
+ * This is mainly useful for testing purpose.
26
+ *
27
+ * @param resource $stream The input stream
28
+ */
29
+ public function setStream($stream);
30
+
31
+ /**
32
+ * Returns the input stream.
33
+ *
34
+ * @return resource|null
35
+ */
36
+ public function getStream();
37
+ }
vendor/symfony/console/Input/StringInput.php ADDED
@@ -0,0 +1,72 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Input;
13
+
14
+ use Symfony\Component\Console\Exception\InvalidArgumentException;
15
+
16
+ /**
17
+ * StringInput represents an input provided as a string.
18
+ *
19
+ * Usage:
20
+ *
21
+ * $input = new StringInput('foo --bar="foobar"');
22
+ *
23
+ * @author Fabien Potencier <fabien@symfony.com>
24
+ */
25
+ class StringInput extends ArgvInput
26
+ {
27
+ const REGEX_STRING = '([^\s]+?)(?:\s|(?<!\\\\)"|(?<!\\\\)\'|$)';
28
+ const REGEX_QUOTED_STRING = '(?:"([^"\\\\]*(?:\\\\.[^"\\\\]*)*)"|\'([^\'\\\\]*(?:\\\\.[^\'\\\\]*)*)\')';
29
+
30
+ /**
31
+ * @param string $input An array of parameters from the CLI (in the argv format)
32
+ */
33
+ public function __construct($input)
34
+ {
35
+ parent::__construct(array());
36
+
37
+ $this->setTokens($this->tokenize($input));
38
+ }
39
+
40
+ /**
41
+ * Tokenizes a string.
42
+ *
43
+ * @param string $input The input to tokenize
44
+ *
45
+ * @return array An array of tokens
46
+ *
47
+ * @throws InvalidArgumentException When unable to parse input (should never happen)
48
+ */
49
+ private function tokenize($input)
50
+ {
51
+ $tokens = array();
52
+ $length = strlen($input);
53
+ $cursor = 0;
54
+ while ($cursor < $length) {
55
+ if (preg_match('/\s+/A', $input, $match, null, $cursor)) {
56
+ } elseif (preg_match('/([^="\'\s]+?)(=?)('.self::REGEX_QUOTED_STRING.'+)/A', $input, $match, null, $cursor)) {
57
+ $tokens[] = $match[1].$match[2].stripcslashes(str_replace(array('"\'', '\'"', '\'\'', '""'), '', substr($match[3], 1, strlen($match[3]) - 2)));
58
+ } elseif (preg_match('/'.self::REGEX_QUOTED_STRING.'/A', $input, $match, null, $cursor)) {
59
+ $tokens[] = stripcslashes(substr($match[0], 1, strlen($match[0]) - 2));
60
+ } elseif (preg_match('/'.self::REGEX_STRING.'/A', $input, $match, null, $cursor)) {
61
+ $tokens[] = stripcslashes($match[1]);
62
+ } else {
63
+ // should never happen
64
+ throw new InvalidArgumentException(sprintf('Unable to parse input near "... %s ..."', substr($input, $cursor, 10)));
65
+ }
66
+
67
+ $cursor += strlen($match[0]);
68
+ }
69
+
70
+ return $tokens;
71
+ }
72
+ }
vendor/symfony/console/Input/index.php ADDED
File without changes
vendor/symfony/console/Logger/ConsoleLogger.php ADDED
@@ -0,0 +1,119 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Logger;
13
+
14
+ use Psr\Log\AbstractLogger;
15
+ use Psr\Log\InvalidArgumentException;
16
+ use Psr\Log\LogLevel;
17
+ use Symfony\Component\Console\Output\OutputInterface;
18
+ use Symfony\Component\Console\Output\ConsoleOutputInterface;
19
+
20
+ /**
21
+ * PSR-3 compliant console logger.
22
+ *
23
+ * @author Kévin Dunglas <dunglas@gmail.com>
24
+ *
25
+ * @see http://www.php-fig.org/psr/psr-3/
26
+ */
27
+ class ConsoleLogger extends AbstractLogger
28
+ {
29
+ const INFO = 'info';
30
+ const ERROR = 'error';
31
+
32
+ private $output;
33
+ private $verbosityLevelMap = array(
34
+ LogLevel::EMERGENCY => OutputInterface::VERBOSITY_NORMAL,
35
+ LogLevel::ALERT => OutputInterface::VERBOSITY_NORMAL,
36
+ LogLevel::CRITICAL => OutputInterface::VERBOSITY_NORMAL,
37
+ LogLevel::ERROR => OutputInterface::VERBOSITY_NORMAL,
38
+ LogLevel::WARNING => OutputInterface::VERBOSITY_NORMAL,
39
+ LogLevel::NOTICE => OutputInterface::VERBOSITY_VERBOSE,
40
+ LogLevel::INFO => OutputInterface::VERBOSITY_VERY_VERBOSE,
41
+ LogLevel::DEBUG => OutputInterface::VERBOSITY_DEBUG,
42
+ );
43
+ private $formatLevelMap = array(
44
+ LogLevel::EMERGENCY => self::ERROR,
45
+ LogLevel::ALERT => self::ERROR,
46
+ LogLevel::CRITICAL => self::ERROR,
47
+ LogLevel::ERROR => self::ERROR,
48
+ LogLevel::WARNING => self::INFO,
49
+ LogLevel::NOTICE => self::INFO,
50
+ LogLevel::INFO => self::INFO,
51
+ LogLevel::DEBUG => self::INFO,
52
+ );
53
+ private $errored = false;
54
+
55
+ public function __construct(OutputInterface $output, array $verbosityLevelMap = array(), array $formatLevelMap = array())
56
+ {
57
+ $this->output = $output;
58
+ $this->verbosityLevelMap = $verbosityLevelMap + $this->verbosityLevelMap;
59
+ $this->formatLevelMap = $formatLevelMap + $this->formatLevelMap;
60
+ }
61
+
62
+ /**
63
+ * {@inheritdoc}
64
+ */
65
+ public function log($level, $message, array $context = array())
66
+ {
67
+ if (!isset($this->verbosityLevelMap[$level])) {
68
+ throw new InvalidArgumentException(sprintf('The log level "%s" does not exist.', $level));
69
+ }
70
+
71
+ $output = $this->output;
72
+
73
+ // Write to the error output if necessary and available
74
+ if (self::ERROR === $this->formatLevelMap[$level]) {
75
+ if ($this->output instanceof ConsoleOutputInterface) {
76
+ $output = $output->getErrorOutput();
77
+ }
78
+ $this->errored = true;
79
+ }
80
+
81
+ // the if condition check isn't necessary -- it's the same one that $output will do internally anyway.
82
+ // We only do it for efficiency here as the message formatting is relatively expensive.
83
+ if ($output->getVerbosity() >= $this->verbosityLevelMap[$level]) {
84
+ $output->writeln(sprintf('<%1$s>[%2$s] %3$s</%1$s>', $this->formatLevelMap[$level], $level, $this->interpolate($message, $context)), $this->verbosityLevelMap[$level]);
85
+ }
86
+ }
87
+
88
+ /**
89
+ * Returns true when any messages have been logged at error levels.
90
+ */
91
+ public function hasErrored()
92
+ {
93
+ return $this->errored;
94
+ }
95
+
96
+ /**
97
+ * Interpolates context values into the message placeholders.
98
+ *
99
+ * @author PHP Framework Interoperability Group
100
+ *
101
+ * @param string $message
102
+ * @param array $context
103
+ *
104
+ * @return string
105
+ */
106
+ private function interpolate($message, array $context)
107
+ {
108
+ // build a replacement array with braces around the context keys
109
+ $replace = array();
110
+ foreach ($context as $key => $val) {
111
+ if (!is_array($val) && (!is_object($val) || method_exists($val, '__toString'))) {
112
+ $replace[sprintf('{%s}', $key)] = $val;
113
+ }
114
+ }
115
+
116
+ // interpolate replacement values into the message and return
117
+ return strtr($message, $replace);
118
+ }
119
+ }
vendor/symfony/console/Logger/index.php ADDED
File without changes
vendor/symfony/console/Output/BufferedOutput.php ADDED
@@ -0,0 +1,45 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Output;
13
+
14
+ /**
15
+ * @author Jean-François Simon <contact@jfsimon.fr>
16
+ */
17
+ class BufferedOutput extends Output
18
+ {
19
+ private $buffer = '';
20
+
21
+ /**
22
+ * Empties buffer and returns its content.
23
+ *
24
+ * @return string
25
+ */
26
+ public function fetch()
27
+ {
28
+ $content = $this->buffer;
29
+ $this->buffer = '';
30
+
31
+ return $content;
32
+ }
33
+
34
+ /**
35
+ * {@inheritdoc}
36
+ */
37
+ protected function doWrite($message, $newline)
38
+ {
39
+ $this->buffer .= $message;
40
+
41
+ if ($newline) {
42
+ $this->buffer .= PHP_EOL;
43
+ }
44
+ }
45
+ }
vendor/symfony/console/Output/ConsoleOutput.php ADDED
@@ -0,0 +1,152 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Output;
13
+
14
+ use Symfony\Component\Console\Formatter\OutputFormatterInterface;
15
+
16
+ /**
17
+ * ConsoleOutput is the default class for all CLI output. It uses STDOUT and STDERR.
18
+ *
19
+ * This class is a convenient wrapper around `StreamOutput` for both STDOUT and STDERR.
20
+ *
21
+ * $output = new ConsoleOutput();
22
+ *
23
+ * This is equivalent to:
24
+ *
25
+ * $output = new StreamOutput(fopen('php://stdout', 'w'));
26
+ * $stdErr = new StreamOutput(fopen('php://stderr', 'w'));
27
+ *
28
+ * @author Fabien Potencier <fabien@symfony.com>
29
+ */
30
+ class ConsoleOutput extends StreamOutput implements ConsoleOutputInterface
31
+ {
32
+ private $stderr;
33
+
34
+ /**
35
+ * @param int $verbosity The verbosity level (one of the VERBOSITY constants in OutputInterface)
36
+ * @param bool|null $decorated Whether to decorate messages (null for auto-guessing)
37
+ * @param OutputFormatterInterface|null $formatter Output formatter instance (null to use default OutputFormatter)
38
+ */
39
+ public function __construct($verbosity = self::VERBOSITY_NORMAL, $decorated = null, OutputFormatterInterface $formatter = null)
40
+ {
41
+ parent::__construct($this->openOutputStream(), $verbosity, $decorated, $formatter);
42
+
43
+ $actualDecorated = $this->isDecorated();
44
+ $this->stderr = new StreamOutput($this->openErrorStream(), $verbosity, $decorated, $this->getFormatter());
45
+
46
+ if (null === $decorated) {
47
+ $this->setDecorated($actualDecorated && $this->stderr->isDecorated());
48
+ }
49
+ }
50
+
51
+ /**
52
+ * {@inheritdoc}
53
+ */
54
+ public function setDecorated($decorated)
55
+ {
56
+ parent::setDecorated($decorated);
57
+ $this->stderr->setDecorated($decorated);
58
+ }
59
+
60
+ /**
61
+ * {@inheritdoc}
62
+ */
63
+ public function setFormatter(OutputFormatterInterface $formatter)
64
+ {
65
+ parent::setFormatter($formatter);
66
+ $this->stderr->setFormatter($formatter);
67
+ }
68
+
69
+ /**
70
+ * {@inheritdoc}
71
+ */
72
+ public function setVerbosity($level)
73
+ {
74
+ parent::setVerbosity($level);
75
+ $this->stderr->setVerbosity($level);
76
+ }
77
+
78
+ /**
79
+ * {@inheritdoc}
80
+ */
81
+ public function getErrorOutput()
82
+ {
83
+ return $this->stderr;
84
+ }
85
+
86
+ /**
87
+ * {@inheritdoc}
88
+ */
89
+ public function setErrorOutput(OutputInterface $error)
90
+ {
91
+ $this->stderr = $error;
92
+ }
93
+
94
+ /**
95
+ * Returns true if current environment supports writing console output to
96
+ * STDOUT.
97
+ *
98
+ * @return bool
99
+ */
100
+ protected function hasStdoutSupport()
101
+ {
102
+ return false === $this->isRunningOS400();
103
+ }
104
+
105
+ /**
106
+ * Returns true if current environment supports writing console output to
107
+ * STDERR.
108
+ *
109
+ * @return bool
110
+ */
111
+ protected function hasStderrSupport()
112
+ {
113
+ return false === $this->isRunningOS400();
114
+ }
115
+
116
+ /**
117
+ * Checks if current executing environment is IBM iSeries (OS400), which
118
+ * doesn't properly convert character-encodings between ASCII to EBCDIC.
119
+ *
120
+ * @return bool
121
+ */
122
+ private function isRunningOS400()
123
+ {
124
+ $checks = array(
125
+ function_exists('php_uname') ? php_uname('s') : '',
126
+ getenv('OSTYPE'),
127
+ PHP_OS,
128
+ );
129
+
130
+ return false !== stripos(implode(';', $checks), 'OS400');
131
+ }
132
+
133
+ /**
134
+ * @return resource
135
+ */
136
+ private function openOutputStream()
137
+ {
138
+ if (!$this->hasStdoutSupport()) {
139
+ return fopen('php://output', 'w');
140
+ }
141
+
142
+ return @fopen('php://stdout', 'w') ?: fopen('php://output', 'w');
143
+ }
144
+
145
+ /**
146
+ * @return resource
147
+ */
148
+ private function openErrorStream()
149
+ {
150
+ return fopen($this->hasStderrSupport() ? 'php://stderr' : 'php://output', 'w');
151
+ }
152
+ }
vendor/symfony/console/Output/ConsoleOutputInterface.php ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Output;
13
+
14
+ /**
15
+ * ConsoleOutputInterface is the interface implemented by ConsoleOutput class.
16
+ * This adds information about stderr output stream.
17
+ *
18
+ * @author Dariusz Górecki <darek.krk@gmail.com>
19
+ */
20
+ interface ConsoleOutputInterface extends OutputInterface
21
+ {
22
+ /**
23
+ * Gets the OutputInterface for errors.
24
+ *
25
+ * @return OutputInterface
26
+ */
27
+ public function getErrorOutput();
28
+
29
+ public function setErrorOutput(OutputInterface $error);
30
+ }
vendor/symfony/console/Output/NullOutput.php ADDED
@@ -0,0 +1,123 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Output;
13
+
14
+ use Symfony\Component\Console\Formatter\OutputFormatter;
15
+ use Symfony\Component\Console\Formatter\OutputFormatterInterface;
16
+
17
+ /**
18
+ * NullOutput suppresses all output.
19
+ *
20
+ * $output = new NullOutput();
21
+ *
22
+ * @author Fabien Potencier <fabien@symfony.com>
23
+ * @author Tobias Schultze <http://tobion.de>
24
+ */
25
+ class NullOutput implements OutputInterface
26
+ {
27
+ /**
28
+ * {@inheritdoc}
29
+ */
30
+ public function setFormatter(OutputFormatterInterface $formatter)
31
+ {
32
+ // do nothing
33
+ }
34
+
35
+ /**
36
+ * {@inheritdoc}
37
+ */
38
+ public function getFormatter()
39
+ {
40
+ // to comply with the interface we must return a OutputFormatterInterface
41
+ return new OutputFormatter();
42
+ }
43
+
44
+ /**
45
+ * {@inheritdoc}
46
+ */
47
+ public function setDecorated($decorated)
48
+ {
49
+ // do nothing
50
+ }
51
+
52
+ /**
53
+ * {@inheritdoc}
54
+ */
55
+ public function isDecorated()
56
+ {
57
+ return false;
58
+ }
59
+
60
+ /**
61
+ * {@inheritdoc}
62
+ */
63
+ public function setVerbosity($level)
64
+ {
65
+ // do nothing
66
+ }
67
+
68
+ /**
69
+ * {@inheritdoc}
70
+ */
71
+ public function getVerbosity()
72
+ {
73
+ return self::VERBOSITY_QUIET;
74
+ }
75
+
76
+ /**
77
+ * {@inheritdoc}
78
+ */
79
+ public function isQuiet()
80
+ {
81
+ return true;
82
+ }
83
+
84
+ /**
85
+ * {@inheritdoc}
86
+ */
87
+ public function isVerbose()
88
+ {
89
+ return false;
90
+ }
91
+
92
+ /**
93
+ * {@inheritdoc}
94
+ */
95
+ public function isVeryVerbose()
96
+ {
97
+ return false;
98
+ }
99
+
100
+ /**
101
+ * {@inheritdoc}
102
+ */
103
+ public function isDebug()
104
+ {
105
+ return false;
106
+ }
107
+
108
+ /**
109
+ * {@inheritdoc}
110
+ */
111
+ public function writeln($messages, $options = self::OUTPUT_NORMAL)
112
+ {
113
+ // do nothing
114
+ }
115
+
116
+ /**
117
+ * {@inheritdoc}
118
+ */
119
+ public function write($messages, $newline = false, $options = self::OUTPUT_NORMAL)
120
+ {
121
+ // do nothing
122
+ }
123
+ }
vendor/symfony/console/Output/Output.php ADDED
@@ -0,0 +1,175 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Output;
13
+
14
+ use Symfony\Component\Console\Formatter\OutputFormatterInterface;
15
+ use Symfony\Component\Console\Formatter\OutputFormatter;
16
+
17
+ /**
18
+ * Base class for output classes.
19
+ *
20
+ * There are five levels of verbosity:
21
+ *
22
+ * * normal: no option passed (normal output)
23
+ * * verbose: -v (more output)
24
+ * * very verbose: -vv (highly extended output)
25
+ * * debug: -vvv (all debug output)
26
+ * * quiet: -q (no output)
27
+ *
28
+ * @author Fabien Potencier <fabien@symfony.com>
29
+ */
30
+ abstract class Output implements OutputInterface
31
+ {
32
+ private $verbosity;
33
+ private $formatter;
34
+
35
+ /**
36
+ * @param int $verbosity The verbosity level (one of the VERBOSITY constants in OutputInterface)
37
+ * @param bool $decorated Whether to decorate messages
38
+ * @param OutputFormatterInterface|null $formatter Output formatter instance (null to use default OutputFormatter)
39
+ */
40
+ public function __construct($verbosity = self::VERBOSITY_NORMAL, $decorated = false, OutputFormatterInterface $formatter = null)
41
+ {
42
+ $this->verbosity = null === $verbosity ? self::VERBOSITY_NORMAL : $verbosity;
43
+ $this->formatter = $formatter ?: new OutputFormatter();
44
+ $this->formatter->setDecorated($decorated);
45
+ }
46
+
47
+ /**
48
+ * {@inheritdoc}
49
+ */
50
+ public function setFormatter(OutputFormatterInterface $formatter)
51
+ {
52
+ $this->formatter = $formatter;
53
+ }
54
+
55
+ /**
56
+ * {@inheritdoc}
57
+ */
58
+ public function getFormatter()
59
+ {
60
+ return $this->formatter;
61
+ }
62
+
63
+ /**
64
+ * {@inheritdoc}
65
+ */
66
+ public function setDecorated($decorated)
67
+ {
68
+ $this->formatter->setDecorated($decorated);
69
+ }
70
+
71
+ /**
72
+ * {@inheritdoc}
73
+ */
74
+ public function isDecorated()
75
+ {
76
+ return $this->formatter->isDecorated();
77
+ }
78
+
79
+ /**
80
+ * {@inheritdoc}
81
+ */
82
+ public function setVerbosity($level)
83
+ {
84
+ $this->verbosity = (int) $level;
85
+ }
86
+
87
+ /**
88
+ * {@inheritdoc}
89
+ */
90
+ public function getVerbosity()
91
+ {
92
+ return $this->verbosity;
93
+ }
94
+
95
+ /**
96
+ * {@inheritdoc}
97
+ */
98
+ public function isQuiet()
99
+ {
100
+ return self::VERBOSITY_QUIET === $this->verbosity;
101
+ }
102
+
103
+ /**
104
+ * {@inheritdoc}
105
+ */
106
+ public function isVerbose()
107
+ {
108
+ return self::VERBOSITY_VERBOSE <= $this->verbosity;
109
+ }
110
+
111
+ /**
112
+ * {@inheritdoc}
113
+ */
114
+ public function isVeryVerbose()
115
+ {
116
+ return self::VERBOSITY_VERY_VERBOSE <= $this->verbosity;
117
+ }
118
+
119
+ /**
120
+ * {@inheritdoc}
121
+ */
122
+ public function isDebug()
123
+ {
124
+ return self::VERBOSITY_DEBUG <= $this->verbosity;
125
+ }
126
+
127
+ /**
128
+ * {@inheritdoc}
129
+ */
130
+ public function writeln($messages, $options = self::OUTPUT_NORMAL)
131
+ {
132
+ $this->write($messages, true, $options);
133
+ }
134
+
135
+ /**
136
+ * {@inheritdoc}
137
+ */
138
+ public function write($messages, $newline = false, $options = self::OUTPUT_NORMAL)
139
+ {
140
+ $messages = (array) $messages;
141
+
142
+ $types = self::OUTPUT_NORMAL | self::OUTPUT_RAW | self::OUTPUT_PLAIN;
143
+ $type = $types & $options ?: self::OUTPUT_NORMAL;
144
+
145
+ $verbosities = self::VERBOSITY_QUIET | self::VERBOSITY_NORMAL | self::VERBOSITY_VERBOSE | self::VERBOSITY_VERY_VERBOSE | self::VERBOSITY_DEBUG;
146
+ $verbosity = $verbosities & $options ?: self::VERBOSITY_NORMAL;
147
+
148
+ if ($verbosity > $this->getVerbosity()) {
149
+ return;
150
+ }
151
+
152
+ foreach ($messages as $message) {
153
+ switch ($type) {
154
+ case OutputInterface::OUTPUT_NORMAL:
155
+ $message = $this->formatter->format($message);
156
+ break;
157
+ case OutputInterface::OUTPUT_RAW:
158
+ break;
159
+ case OutputInterface::OUTPUT_PLAIN:
160
+ $message = strip_tags($this->formatter->format($message));
161
+ break;
162
+ }
163
+
164
+ $this->doWrite($message, $newline);
165
+ }
166
+ }
167
+
168
+ /**
169
+ * Writes a message to the output.
170
+ *
171
+ * @param string $message A message to write to the output
172
+ * @param bool $newline Whether to add a newline or not
173
+ */
174
+ abstract protected function doWrite($message, $newline);
175
+ }
vendor/symfony/console/Output/OutputInterface.php ADDED
@@ -0,0 +1,114 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Output;
13
+
14
+ use Symfony\Component\Console\Formatter\OutputFormatterInterface;
15
+
16
+ /**
17
+ * OutputInterface is the interface implemented by all Output classes.
18
+ *
19
+ * @author Fabien Potencier <fabien@symfony.com>
20
+ */
21
+ interface OutputInterface
22
+ {
23
+ const VERBOSITY_QUIET = 16;
24
+ const VERBOSITY_NORMAL = 32;
25
+ const VERBOSITY_VERBOSE = 64;
26
+ const VERBOSITY_VERY_VERBOSE = 128;
27
+ const VERBOSITY_DEBUG = 256;
28
+
29
+ const OUTPUT_NORMAL = 1;
30
+ const OUTPUT_RAW = 2;
31
+ const OUTPUT_PLAIN = 4;
32
+
33
+ /**
34
+ * Writes a message to the output.
35
+ *
36
+ * @param string|array $messages The message as an array of lines or a single string
37
+ * @param bool $newline Whether to add a newline
38
+ * @param int $options A bitmask of options (one of the OUTPUT or VERBOSITY constants), 0 is considered the same as self::OUTPUT_NORMAL | self::VERBOSITY_NORMAL
39
+ */
40
+ public function write($messages, $newline = false, $options = 0);
41
+
42
+ /**
43
+ * Writes a message to the output and adds a newline at the end.
44
+ *
45
+ * @param string|array $messages The message as an array of lines of a single string
46
+ * @param int $options A bitmask of options (one of the OUTPUT or VERBOSITY constants), 0 is considered the same as self::OUTPUT_NORMAL | self::VERBOSITY_NORMAL
47
+ */
48
+ public function writeln($messages, $options = 0);
49
+
50
+ /**
51
+ * Sets the verbosity of the output.
52
+ *
53
+ * @param int $level The level of verbosity (one of the VERBOSITY constants)
54
+ */
55
+ public function setVerbosity($level);
56
+
57
+ /**
58
+ * Gets the current verbosity of the output.
59
+ *
60
+ * @return int The current level of verbosity (one of the VERBOSITY constants)
61
+ */
62
+ public function getVerbosity();
63
+
64
+ /**
65
+ * Returns whether verbosity is quiet (-q).
66
+ *
67
+ * @return bool true if verbosity is set to VERBOSITY_QUIET, false otherwise
68
+ */
69
+ public function isQuiet();
70
+
71
+ /**
72
+ * Returns whether verbosity is verbose (-v).
73
+ *
74
+ * @return bool true if verbosity is set to VERBOSITY_VERBOSE, false otherwise
75
+ */
76
+ public function isVerbose();
77
+
78
+ /**
79
+ * Returns whether verbosity is very verbose (-vv).
80
+ *
81
+ * @return bool true if verbosity is set to VERBOSITY_VERY_VERBOSE, false otherwise
82
+ */
83
+ public function isVeryVerbose();
84
+
85
+ /**
86
+ * Returns whether verbosity is debug (-vvv).
87
+ *
88
+ * @return bool true if verbosity is set to VERBOSITY_DEBUG, false otherwise
89
+ */
90
+ public function isDebug();
91
+
92
+ /**
93
+ * Sets the decorated flag.
94
+ *
95
+ * @param bool $decorated Whether to decorate the messages
96
+ */
97
+ public function setDecorated($decorated);
98
+
99
+ /**
100
+ * Gets the decorated flag.
101
+ *
102
+ * @return bool true if the output will decorate messages, false otherwise
103
+ */
104
+ public function isDecorated();
105
+
106
+ public function setFormatter(OutputFormatterInterface $formatter);
107
+
108
+ /**
109
+ * Returns current output formatter instance.
110
+ *
111
+ * @return OutputFormatterInterface
112
+ */
113
+ public function getFormatter();
114
+ }
vendor/symfony/console/Output/StreamOutput.php ADDED
@@ -0,0 +1,103 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Output;
13
+
14
+ use Symfony\Component\Console\Exception\InvalidArgumentException;
15
+ use Symfony\Component\Console\Exception\RuntimeException;
16
+ use Symfony\Component\Console\Formatter\OutputFormatterInterface;
17
+
18
+ /**
19
+ * StreamOutput writes the output to a given stream.
20
+ *
21
+ * Usage:
22
+ *
23
+ * $output = new StreamOutput(fopen('php://stdout', 'w'));
24
+ *
25
+ * As `StreamOutput` can use any stream, you can also use a file:
26
+ *
27
+ * $output = new StreamOutput(fopen('/path/to/output.log', 'a', false));
28
+ *
29
+ * @author Fabien Potencier <fabien@symfony.com>
30
+ */
31
+ class StreamOutput extends Output
32
+ {
33
+ private $stream;
34
+
35
+ /**
36
+ * @param resource $stream A stream resource
37
+ * @param int $verbosity The verbosity level (one of the VERBOSITY constants in OutputInterface)
38
+ * @param bool|null $decorated Whether to decorate messages (null for auto-guessing)
39
+ * @param OutputFormatterInterface|null $formatter Output formatter instance (null to use default OutputFormatter)
40
+ *
41
+ * @throws InvalidArgumentException When first argument is not a real stream
42
+ */
43
+ public function __construct($stream, $verbosity = self::VERBOSITY_NORMAL, $decorated = null, OutputFormatterInterface $formatter = null)
44
+ {
45
+ if (!is_resource($stream) || 'stream' !== get_resource_type($stream)) {
46
+ throw new InvalidArgumentException('The StreamOutput class needs a stream as its first argument.');
47
+ }
48
+
49
+ $this->stream = $stream;
50
+
51
+ if (null === $decorated) {
52
+ $decorated = $this->hasColorSupport();
53
+ }
54
+
55
+ parent::__construct($verbosity, $decorated, $formatter);
56
+ }
57
+
58
+ /**
59
+ * Gets the stream attached to this StreamOutput instance.
60
+ *
61
+ * @return resource A stream resource
62
+ */
63
+ public function getStream()
64
+ {
65
+ return $this->stream;
66
+ }
67
+
68
+ /**
69
+ * {@inheritdoc}
70
+ */
71
+ protected function doWrite($message, $newline)
72
+ {
73
+ if (false === @fwrite($this->stream, $message) || ($newline && (false === @fwrite($this->stream, PHP_EOL)))) {
74
+ // should never happen
75
+ throw new RuntimeException('Unable to write output.');
76
+ }
77
+
78
+ fflush($this->stream);
79
+ }
80
+
81
+ /**
82
+ * Returns true if the stream supports colorization.
83
+ *
84
+ * Colorization is disabled if not supported by the stream:
85
+ *
86
+ * - Windows != 10.0.10586 without Ansicon, ConEmu or Mintty
87
+ * - non tty consoles
88
+ *
89
+ * @return bool true if the stream supports colorization, false otherwise
90
+ */
91
+ protected function hasColorSupport()
92
+ {
93
+ if (DIRECTORY_SEPARATOR === '\\') {
94
+ return
95
+ '10.0.10586' === PHP_WINDOWS_VERSION_MAJOR.'.'.PHP_WINDOWS_VERSION_MINOR.'.'.PHP_WINDOWS_VERSION_BUILD
96
+ || false !== getenv('ANSICON')
97
+ || 'ON' === getenv('ConEmuANSI')
98
+ || 'xterm' === getenv('TERM');
99
+ }
100
+
101
+ return function_exists('posix_isatty') && @posix_isatty($this->stream);
102
+ }
103
+ }
vendor/symfony/console/Output/index.php ADDED
File without changes
vendor/symfony/console/Question/ChoiceQuestion.php ADDED
@@ -0,0 +1,189 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Question;
13
+
14
+ use Symfony\Component\Console\Exception\InvalidArgumentException;
15
+
16
+ /**
17
+ * Represents a choice question.
18
+ *
19
+ * @author Fabien Potencier <fabien@symfony.com>
20
+ */
21
+ class ChoiceQuestion extends Question
22
+ {
23
+ private $choices;
24
+ private $multiselect = false;
25
+ private $prompt = ' > ';
26
+ private $errorMessage = 'Value "%s" is invalid';
27
+
28
+ /**
29
+ * @param string $question The question to ask to the user
30
+ * @param array $choices The list of available choices
31
+ * @param mixed $default The default answer to return
32
+ */
33
+ public function __construct($question, array $choices, $default = null)
34
+ {
35
+ if (!$choices) {
36
+ throw new \LogicException('Choice question must have at least 1 choice available.');
37
+ }
38
+
39
+ parent::__construct($question, $default);
40
+
41
+ $this->choices = $choices;
42
+ $this->setValidator($this->getDefaultValidator());
43
+ $this->setAutocompleterValues($choices);
44
+ }
45
+
46
+ /**
47
+ * Returns available choices.
48
+ *
49
+ * @return array
50
+ */
51
+ public function getChoices()
52
+ {
53
+ return $this->choices;
54
+ }
55
+
56
+ /**
57
+ * Sets multiselect option.
58
+ *
59
+ * When multiselect is set to true, multiple choices can be answered.
60
+ *
61
+ * @param bool $multiselect
62
+ *
63
+ * @return $this
64
+ */
65
+ public function setMultiselect($multiselect)
66
+ {
67
+ $this->multiselect = $multiselect;
68
+ $this->setValidator($this->getDefaultValidator());
69
+
70
+ return $this;
71
+ }
72
+
73
+ /**
74
+ * Returns whether the choices are multiselect.
75
+ *
76
+ * @return bool
77
+ */
78
+ public function isMultiselect()
79
+ {
80
+ return $this->multiselect;
81
+ }
82
+
83
+ /**
84
+ * Gets the prompt for choices.
85
+ *
86
+ * @return string
87
+ */
88
+ public function getPrompt()
89
+ {
90
+ return $this->prompt;
91
+ }
92
+
93
+ /**
94
+ * Sets the prompt for choices.
95
+ *
96
+ * @param string $prompt
97
+ *
98
+ * @return $this
99
+ */
100
+ public function setPrompt($prompt)
101
+ {
102
+ $this->prompt = $prompt;
103
+
104
+ return $this;
105
+ }
106
+
107
+ /**
108
+ * Sets the error message for invalid values.
109
+ *
110
+ * The error message has a string placeholder (%s) for the invalid value.
111
+ *
112
+ * @param string $errorMessage
113
+ *
114
+ * @return $this
115
+ */
116
+ public function setErrorMessage($errorMessage)
117
+ {
118
+ $this->errorMessage = $errorMessage;
119
+ $this->setValidator($this->getDefaultValidator());
120
+
121
+ return $this;
122
+ }
123
+
124
+ /**
125
+ * Returns the default answer validator.
126
+ *
127
+ * @return callable
128
+ */
129
+ private function getDefaultValidator()
130
+ {
131
+ $choices = $this->choices;
132
+ $errorMessage = $this->errorMessage;
133
+ $multiselect = $this->multiselect;
134
+ $isAssoc = $this->isAssoc($choices);
135
+
136
+ return function ($selected) use ($choices, $errorMessage, $multiselect, $isAssoc) {
137
+ // Collapse all spaces.
138
+ $selectedChoices = str_replace(' ', '', $selected);
139
+
140
+ if ($multiselect) {
141
+ // Check for a separated comma values
142
+ if (!preg_match('/^[^,]+(?:,[^,]+)*$/', $selectedChoices, $matches)) {
143
+ throw new InvalidArgumentException(sprintf($errorMessage, $selected));
144
+ }
145
+ $selectedChoices = explode(',', $selectedChoices);
146
+ } else {
147
+ $selectedChoices = array($selected);
148
+ }
149
+
150
+ $multiselectChoices = array();
151
+ foreach ($selectedChoices as $value) {
152
+ $results = array();
153
+ foreach ($choices as $key => $choice) {
154
+ if ($choice === $value) {
155
+ $results[] = $key;
156
+ }
157
+ }
158
+
159
+ if (count($results) > 1) {
160
+ throw new InvalidArgumentException(sprintf('The provided answer is ambiguous. Value should be one of %s.', implode(' or ', $results)));
161
+ }
162
+
163
+ $result = array_search($value, $choices);
164
+
165
+ if (!$isAssoc) {
166
+ if (false !== $result) {
167
+ $result = $choices[$result];
168
+ } elseif (isset($choices[$value])) {
169
+ $result = $choices[$value];
170
+ }
171
+ } elseif (false === $result && isset($choices[$value])) {
172
+ $result = $value;
173
+ }
174
+
175
+ if (false === $result) {
176
+ throw new InvalidArgumentException(sprintf($errorMessage, $value));
177
+ }
178
+
179
+ $multiselectChoices[] = (string) $result;
180
+ }
181
+
182
+ if ($multiselect) {
183
+ return $multiselectChoices;
184
+ }
185
+
186
+ return current($multiselectChoices);
187
+ };
188
+ }
189
+ }
vendor/symfony/console/Question/ConfirmationQuestion.php ADDED
@@ -0,0 +1,59 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Question;
13
+
14
+ /**
15
+ * Represents a yes/no question.
16
+ *
17
+ * @author Fabien Potencier <fabien@symfony.com>
18
+ */
19
+ class ConfirmationQuestion extends Question
20
+ {
21
+ private $trueAnswerRegex;
22
+
23
+ /**
24
+ * @param string $question The question to ask to the user
25
+ * @param bool $default The default answer to return, true or false
26
+ * @param string $trueAnswerRegex A regex to match the "yes" answer
27
+ */
28
+ public function __construct($question, $default = true, $trueAnswerRegex = '/^y/i')
29
+ {
30
+ parent::__construct($question, (bool) $default);
31
+
32
+ $this->trueAnswerRegex = $trueAnswerRegex;
33
+ $this->setNormalizer($this->getDefaultNormalizer());
34
+ }
35
+
36
+ /**
37
+ * Returns the default answer normalizer.
38
+ *
39
+ * @return callable
40
+ */
41
+ private function getDefaultNormalizer()
42
+ {
43
+ $default = $this->getDefault();
44
+ $regex = $this->trueAnswerRegex;
45
+
46
+ return function ($answer) use ($default, $regex) {
47
+ if (is_bool($answer)) {
48
+ return $answer;
49
+ }
50
+
51
+ $answerIsTrue = (bool) preg_match($regex, $answer);
52
+ if (false === $default) {
53
+ return $answer && $answerIsTrue;
54
+ }
55
+
56
+ return !$answer || $answerIsTrue;
57
+ };
58
+ }
59
+ }
vendor/symfony/console/Question/Question.php ADDED
@@ -0,0 +1,246 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Question;
13
+
14
+ use Symfony\Component\Console\Exception\InvalidArgumentException;
15
+ use Symfony\Component\Console\Exception\LogicException;
16
+
17
+ /**
18
+ * Represents a Question.
19
+ *
20
+ * @author Fabien Potencier <fabien@symfony.com>
21
+ */
22
+ class Question
23
+ {
24
+ private $question;
25
+ private $attempts;
26
+ private $hidden = false;
27
+ private $hiddenFallback = true;
28
+ private $autocompleterValues;
29
+ private $validator;
30
+ private $default;
31
+ private $normalizer;
32
+
33
+ /**
34
+ * @param string $question The question to ask to the user
35
+ * @param mixed $default The default answer to return if the user enters nothing
36
+ */
37
+ public function __construct($question, $default = null)
38
+ {
39
+ $this->question = $question;
40
+ $this->default = $default;
41
+ }
42
+
43
+ /**
44
+ * Returns the question.
45
+ *
46
+ * @return string
47
+ */
48
+ public function getQuestion()
49
+ {
50
+ return $this->question;
51
+ }
52
+
53
+ /**
54
+ * Returns the default answer.
55
+ *
56
+ * @return mixed
57
+ */
58
+ public function getDefault()
59
+ {
60
+ return $this->default;
61
+ }
62
+
63
+ /**
64
+ * Returns whether the user response must be hidden.
65
+ *
66
+ * @return bool
67
+ */
68
+ public function isHidden()
69
+ {
70
+ return $this->hidden;
71
+ }
72
+
73
+ /**
74
+ * Sets whether the user response must be hidden or not.
75
+ *
76
+ * @param bool $hidden
77
+ *
78
+ * @return $this
79
+ *
80
+ * @throws LogicException In case the autocompleter is also used
81
+ */
82
+ public function setHidden($hidden)
83
+ {
84
+ if ($this->autocompleterValues) {
85
+ throw new LogicException('A hidden question cannot use the autocompleter.');
86
+ }
87
+
88
+ $this->hidden = (bool) $hidden;
89
+
90
+ return $this;
91
+ }
92
+
93
+ /**
94
+ * In case the response can not be hidden, whether to fallback on non-hidden question or not.
95
+ *
96
+ * @return bool
97
+ */
98
+ public function isHiddenFallback()
99
+ {
100
+ return $this->hiddenFallback;
101
+ }
102
+
103
+ /**
104
+ * Sets whether to fallback on non-hidden question if the response can not be hidden.
105
+ *
106
+ * @param bool $fallback
107
+ *
108
+ * @return $this
109
+ */
110
+ public function setHiddenFallback($fallback)
111
+ {
112
+ $this->hiddenFallback = (bool) $fallback;
113
+
114
+ return $this;
115
+ }
116
+
117
+ /**
118
+ * Gets values for the autocompleter.
119
+ *
120
+ * @return null|iterable
121
+ */
122
+ public function getAutocompleterValues()
123
+ {
124
+ return $this->autocompleterValues;
125
+ }
126
+
127
+ /**
128
+ * Sets values for the autocompleter.
129
+ *
130
+ * @param null|iterable $values
131
+ *
132
+ * @return $this
133
+ *
134
+ * @throws InvalidArgumentException
135
+ * @throws LogicException
136
+ */
137
+ public function setAutocompleterValues($values)
138
+ {
139
+ if (is_array($values)) {
140
+ $values = $this->isAssoc($values) ? array_merge(array_keys($values), array_values($values)) : array_values($values);
141
+ }
142
+
143
+ if (null !== $values && !is_array($values) && !$values instanceof \Traversable) {
144
+ throw new InvalidArgumentException('Autocompleter values can be either an array, `null` or a `Traversable` object.');
145
+ }
146
+
147
+ if ($this->hidden) {
148
+ throw new LogicException('A hidden question cannot use the autocompleter.');
149
+ }
150
+
151
+ $this->autocompleterValues = $values;
152
+
153
+ return $this;
154
+ }
155
+
156
+ /**
157
+ * Sets a validator for the question.
158
+ *
159
+ * @param null|callable $validator
160
+ *
161
+ * @return $this
162
+ */
163
+ public function setValidator(callable $validator = null)
164
+ {
165
+ $this->validator = $validator;
166
+
167
+ return $this;
168
+ }
169
+
170
+ /**
171
+ * Gets the validator for the question.
172
+ *
173
+ * @return null|callable
174
+ */
175
+ public function getValidator()
176
+ {
177
+ return $this->validator;
178
+ }
179
+
180
+ /**
181
+ * Sets the maximum number of attempts.
182
+ *
183
+ * Null means an unlimited number of attempts.
184
+ *
185
+ * @param null|int $attempts
186
+ *
187
+ * @return $this
188
+ *
189
+ * @throws InvalidArgumentException in case the number of attempts is invalid
190
+ */
191
+ public function setMaxAttempts($attempts)
192
+ {
193
+ if (null !== $attempts && $attempts < 1) {
194
+ throw new InvalidArgumentException('Maximum number of attempts must be a positive value.');
195
+ }
196
+
197
+ $this->attempts = $attempts;
198
+
199
+ return $this;
200
+ }
201
+
202
+ /**
203
+ * Gets the maximum number of attempts.
204
+ *
205
+ * Null means an unlimited number of attempts.
206
+ *
207
+ * @return null|int
208
+ */
209
+ public function getMaxAttempts()
210
+ {
211
+ return $this->attempts;
212
+ }
213
+
214
+ /**
215
+ * Sets a normalizer for the response.
216
+ *
217
+ * The normalizer can be a callable (a string), a closure or a class implementing __invoke.
218
+ *
219
+ * @param callable $normalizer
220
+ *
221
+ * @return $this
222
+ */
223
+ public function setNormalizer(callable $normalizer)
224
+ {
225
+ $this->normalizer = $normalizer;
226
+
227
+ return $this;
228
+ }
229
+
230
+ /**
231
+ * Gets the normalizer for the response.
232
+ *
233
+ * The normalizer can ba a callable (a string), a closure or a class implementing __invoke.
234
+ *
235
+ * @return callable
236
+ */
237
+ public function getNormalizer()
238
+ {
239
+ return $this->normalizer;
240
+ }
241
+
242
+ protected function isAssoc($array)
243
+ {
244
+ return (bool) count(array_filter(array_keys($array), 'is_string'));
245
+ }
246
+ }
vendor/symfony/console/Question/index.php ADDED
File without changes
vendor/symfony/console/Resources/bin/hiddeninput.exe ADDED
Binary file
vendor/symfony/console/Resources/bin/index.php ADDED
File without changes
vendor/symfony/console/Resources/index.php ADDED
File without changes
vendor/symfony/console/Style/OutputStyle.php ADDED
@@ -0,0 +1,155 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Style;
13
+
14
+ use Symfony\Component\Console\Formatter\OutputFormatterInterface;
15
+ use Symfony\Component\Console\Helper\ProgressBar;
16
+ use Symfony\Component\Console\Output\OutputInterface;
17
+ use Symfony\Component\Console\Output\ConsoleOutputInterface;
18
+
19
+ /**
20
+ * Decorates output to add console style guide helpers.
21
+ *
22
+ * @author Kevin Bond <kevinbond@gmail.com>
23
+ */
24
+ abstract class OutputStyle implements OutputInterface, StyleInterface
25
+ {
26
+ private $output;
27
+
28
+ public function __construct(OutputInterface $output)
29
+ {
30
+ $this->output = $output;
31
+ }
32
+
33
+ /**
34
+ * {@inheritdoc}
35
+ */
36
+ public function newLine($count = 1)
37
+ {
38
+ $this->output->write(str_repeat(PHP_EOL, $count));
39
+ }
40
+
41
+ /**
42
+ * @param int $max
43
+ *
44
+ * @return ProgressBar
45
+ */
46
+ public function createProgressBar($max = 0)
47
+ {
48
+ return new ProgressBar($this->output, $max);
49
+ }
50
+
51
+ /**
52
+ * {@inheritdoc}
53
+ */
54
+ public function write($messages, $newline = false, $type = self::OUTPUT_NORMAL)
55
+ {
56
+ $this->output->write($messages, $newline, $type);
57
+ }
58
+
59
+ /**
60
+ * {@inheritdoc}
61
+ */
62
+ public function writeln($messages, $type = self::OUTPUT_NORMAL)
63
+ {
64
+ $this->output->writeln($messages, $type);
65
+ }
66
+
67
+ /**
68
+ * {@inheritdoc}
69
+ */
70
+ public function setVerbosity($level)
71
+ {
72
+ $this->output->setVerbosity($level);
73
+ }
74
+
75
+ /**
76
+ * {@inheritdoc}
77
+ */
78
+ public function getVerbosity()
79
+ {
80
+ return $this->output->getVerbosity();
81
+ }
82
+
83
+ /**
84
+ * {@inheritdoc}
85
+ */
86
+ public function setDecorated($decorated)
87
+ {
88
+ $this->output->setDecorated($decorated);
89
+ }
90
+
91
+ /**
92
+ * {@inheritdoc}
93
+ */
94
+ public function isDecorated()
95
+ {
96
+ return $this->output->isDecorated();
97
+ }
98
+
99
+ /**
100
+ * {@inheritdoc}
101
+ */
102
+ public function setFormatter(OutputFormatterInterface $formatter)
103
+ {
104
+ $this->output->setFormatter($formatter);
105
+ }
106
+
107
+ /**
108
+ * {@inheritdoc}
109
+ */
110
+ public function getFormatter()
111
+ {
112
+ return $this->output->getFormatter();
113
+ }
114
+
115
+ /**
116
+ * {@inheritdoc}
117
+ */
118
+ public function isQuiet()
119
+ {
120
+ return $this->output->isQuiet();
121
+ }
122
+
123
+ /**
124
+ * {@inheritdoc}
125
+ */
126
+ public function isVerbose()
127
+ {
128
+ return $this->output->isVerbose();
129
+ }
130
+
131
+ /**
132
+ * {@inheritdoc}
133
+ */
134
+ public function isVeryVerbose()
135
+ {
136
+ return $this->output->isVeryVerbose();
137
+ }
138
+
139
+ /**
140
+ * {@inheritdoc}
141
+ */
142
+ public function isDebug()
143
+ {
144
+ return $this->output->isDebug();
145
+ }
146
+
147
+ protected function getErrorOutput()
148
+ {
149
+ if (!$this->output instanceof ConsoleOutputInterface) {
150
+ return $this->output;
151
+ }
152
+
153
+ return $this->output->getErrorOutput();
154
+ }
155
+ }
vendor/symfony/console/Style/StyleInterface.php ADDED
@@ -0,0 +1,154 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Style;
13
+
14
+ /**
15
+ * Output style helpers.
16
+ *
17
+ * @author Kevin Bond <kevinbond@gmail.com>
18
+ */
19
+ interface StyleInterface
20
+ {
21
+ /**
22
+ * Formats a command title.
23
+ *
24
+ * @param string $message
25
+ */
26
+ public function title($message);
27
+
28
+ /**
29
+ * Formats a section title.
30
+ *
31
+ * @param string $message
32
+ */
33
+ public function section($message);
34
+
35
+ /**
36
+ * Formats a list.
37
+ */
38
+ public function listing(array $elements);
39
+
40
+ /**
41
+ * Formats informational text.
42
+ *
43
+ * @param string|array $message
44
+ */
45
+ public function text($message);
46
+
47
+ /**
48
+ * Formats a success result bar.
49
+ *
50
+ * @param string|array $message
51
+ */
52
+ public function success($message);
53
+
54
+ /**
55
+ * Formats an error result bar.
56
+ *
57
+ * @param string|array $message
58
+ */
59
+ public function error($message);
60
+
61
+ /**
62
+ * Formats an warning result bar.
63
+ *
64
+ * @param string|array $message
65
+ */
66
+ public function warning($message);
67
+
68
+ /**
69
+ * Formats a note admonition.
70
+ *
71
+ * @param string|array $message
72
+ */
73
+ public function note($message);
74
+
75
+ /**
76
+ * Formats a caution admonition.
77
+ *
78
+ * @param string|array $message
79
+ */
80
+ public function caution($message);
81
+
82
+ /**
83
+ * Formats a table.
84
+ */
85
+ public function table(array $headers, array $rows);
86
+
87
+ /**
88
+ * Asks a question.
89
+ *
90
+ * @param string $question
91
+ * @param string|null $default
92
+ * @param callable|null $validator
93
+ *
94
+ * @return string
95
+ */
96
+ public function ask($question, $default = null, $validator = null);
97
+
98
+ /**
99
+ * Asks a question with the user input hidden.
100
+ *
101
+ * @param string $question
102
+ * @param callable|null $validator
103
+ *
104
+ * @return string
105
+ */
106
+ public function askHidden($question, $validator = null);
107
+
108
+ /**
109
+ * Asks for confirmation.
110
+ *
111
+ * @param string $question
112
+ * @param bool $default
113
+ *
114
+ * @return bool
115
+ */
116
+ public function confirm($question, $default = true);
117
+
118
+ /**
119
+ * Asks a choice question.
120
+ *
121
+ * @param string $question
122
+ * @param array $choices
123
+ * @param string|int|null $default
124
+ *
125
+ * @return string
126
+ */
127
+ public function choice($question, array $choices, $default = null);
128
+
129
+ /**
130
+ * Add newline(s).
131
+ *
132
+ * @param int $count The number of newlines
133
+ */
134
+ public function newLine($count = 1);
135
+
136
+ /**
137
+ * Starts the progress output.
138
+ *
139
+ * @param int $max Maximum steps (0 if unknown)
140
+ */
141
+ public function progressStart($max = 0);
142
+
143
+ /**
144
+ * Advances the progress output X steps.
145
+ *
146
+ * @param int $step Number of steps to advance
147
+ */
148
+ public function progressAdvance($step = 1);
149
+
150
+ /**
151
+ * Finishes the progress output.
152
+ */
153
+ public function progressFinish();
154
+ }
vendor/symfony/console/Style/SymfonyStyle.php ADDED
@@ -0,0 +1,429 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Style;
13
+
14
+ use Symfony\Component\Console\Exception\RuntimeException;
15
+ use Symfony\Component\Console\Formatter\OutputFormatter;
16
+ use Symfony\Component\Console\Helper\Helper;
17
+ use Symfony\Component\Console\Helper\ProgressBar;
18
+ use Symfony\Component\Console\Helper\SymfonyQuestionHelper;
19
+ use Symfony\Component\Console\Helper\Table;
20
+ use Symfony\Component\Console\Input\InputInterface;
21
+ use Symfony\Component\Console\Output\BufferedOutput;
22
+ use Symfony\Component\Console\Output\OutputInterface;
23
+ use Symfony\Component\Console\Question\ChoiceQuestion;
24
+ use Symfony\Component\Console\Question\ConfirmationQuestion;
25
+ use Symfony\Component\Console\Question\Question;
26
+ use Symfony\Component\Console\Terminal;
27
+
28
+ /**
29
+ * Output decorator helpers for the Symfony Style Guide.
30
+ *
31
+ * @author Kevin Bond <kevinbond@gmail.com>
32
+ */
33
+ class SymfonyStyle extends OutputStyle
34
+ {
35
+ const MAX_LINE_LENGTH = 120;
36
+
37
+ private $input;
38
+ private $questionHelper;
39
+ private $progressBar;
40
+ private $lineLength;
41
+ private $bufferedOutput;
42
+
43
+ public function __construct(InputInterface $input, OutputInterface $output)
44
+ {
45
+ $this->input = $input;
46
+ $this->bufferedOutput = new BufferedOutput($output->getVerbosity(), false, clone $output->getFormatter());
47
+ // Windows cmd wraps lines as soon as the terminal width is reached, whether there are following chars or not.
48
+ $width = (new Terminal())->getWidth() ?: self::MAX_LINE_LENGTH;
49
+ $this->lineLength = min($width - (int) (DIRECTORY_SEPARATOR === '\\'), self::MAX_LINE_LENGTH);
50
+
51
+ parent::__construct($output);
52
+ }
53
+
54
+ /**
55
+ * Formats a message as a block of text.
56
+ *
57
+ * @param string|array $messages The message to write in the block
58
+ * @param string|null $type The block type (added in [] on first line)
59
+ * @param string|null $style The style to apply to the whole block
60
+ * @param string $prefix The prefix for the block
61
+ * @param bool $padding Whether to add vertical padding
62
+ * @param bool $escape Whether to escape the message
63
+ */
64
+ public function block($messages, $type = null, $style = null, $prefix = ' ', $padding = false, $escape = true)
65
+ {
66
+ $messages = is_array($messages) ? array_values($messages) : array($messages);
67
+
68
+ $this->autoPrependBlock();
69
+ $this->writeln($this->createBlock($messages, $type, $style, $prefix, $padding, $escape));
70
+ $this->newLine();
71
+ }
72
+
73
+ /**
74
+ * {@inheritdoc}
75
+ */
76
+ public function title($message)
77
+ {
78
+ $this->autoPrependBlock();
79
+ $this->writeln(array(
80
+ sprintf('<comment>%s</>', OutputFormatter::escapeTrailingBackslash($message)),
81
+ sprintf('<comment>%s</>', str_repeat('=', Helper::strlenWithoutDecoration($this->getFormatter(), $message))),
82
+ ));
83
+ $this->newLine();
84
+ }
85
+
86
+ /**
87
+ * {@inheritdoc}
88
+ */
89
+ public function section($message)
90
+ {
91
+ $this->autoPrependBlock();
92
+ $this->writeln(array(
93
+ sprintf('<comment>%s</>', OutputFormatter::escapeTrailingBackslash($message)),
94
+ sprintf('<comment>%s</>', str_repeat('-', Helper::strlenWithoutDecoration($this->getFormatter(), $message))),
95
+ ));
96
+ $this->newLine();
97
+ }
98
+
99
+ /**
100
+ * {@inheritdoc}
101
+ */
102
+ public function listing(array $elements)
103
+ {
104
+ $this->autoPrependText();
105
+ $elements = array_map(function ($element) {
106
+ return sprintf(' * %s', $element);
107
+ }, $elements);
108
+
109
+ $this->writeln($elements);
110
+ $this->newLine();
111
+ }
112
+
113
+ /**
114
+ * {@inheritdoc}
115
+ */
116
+ public function text($message)
117
+ {
118
+ $this->autoPrependText();
119
+
120
+ $messages = is_array($message) ? array_values($message) : array($message);
121
+ foreach ($messages as $message) {
122
+ $this->writeln(sprintf(' %s', $message));
123
+ }
124
+ }
125
+
126
+ /**
127
+ * Formats a command comment.
128
+ *
129
+ * @param string|array $message
130
+ */
131
+ public function comment($message)
132
+ {
133
+ $this->block($message, null, null, '<fg=default;bg=default> // </>', false, false);
134
+ }
135
+
136
+ /**
137
+ * {@inheritdoc}
138
+ */
139
+ public function success($message)
140
+ {
141
+ $this->block($message, 'OK', 'fg=black;bg=green', ' ', true);
142
+ }
143
+
144
+ /**
145
+ * {@inheritdoc}
146
+ */
147
+ public function error($message)
148
+ {
149
+ $this->block($message, 'ERROR', 'fg=white;bg=red', ' ', true);
150
+ }
151
+
152
+ /**
153
+ * {@inheritdoc}
154
+ */
155
+ public function warning($message)
156
+ {
157
+ $this->block($message, 'WARNING', 'fg=white;bg=red', ' ', true);
158
+ }
159
+
160
+ /**
161
+ * {@inheritdoc}
162
+ */
163
+ public function note($message)
164
+ {
165
+ $this->block($message, 'NOTE', 'fg=yellow', ' ! ');
166
+ }
167
+
168
+ /**
169
+ * {@inheritdoc}
170
+ */
171
+ public function caution($message)
172
+ {
173
+ $this->block($message, 'CAUTION', 'fg=white;bg=red', ' ! ', true);
174
+ }
175
+
176
+ /**
177
+ * {@inheritdoc}
178
+ */
179
+ public function table(array $headers, array $rows)
180
+ {
181
+ $style = clone Table::getStyleDefinition('symfony-style-guide');
182
+ $style->setCellHeaderFormat('<info>%s</info>');
183
+
184
+ $table = new Table($this);
185
+ $table->setHeaders($headers);
186
+ $table->setRows($rows);
187
+ $table->setStyle($style);
188
+
189
+ $table->render();
190
+ $this->newLine();
191
+ }
192
+
193
+ /**
194
+ * {@inheritdoc}
195
+ */
196
+ public function ask($question, $default = null, $validator = null)
197
+ {
198
+ $question = new Question($question, $default);
199
+ $question->setValidator($validator);
200
+
201
+ return $this->askQuestion($question);
202
+ }
203
+
204
+ /**
205
+ * {@inheritdoc}
206
+ */
207
+ public function askHidden($question, $validator = null)
208
+ {
209
+ $question = new Question($question);
210
+
211
+ $question->setHidden(true);
212
+ $question->setValidator($validator);
213
+
214
+ return $this->askQuestion($question);
215
+ }
216
+
217
+ /**
218
+ * {@inheritdoc}
219
+ */
220
+ public function confirm($question, $default = true)
221
+ {
222
+ return $this->askQuestion(new ConfirmationQuestion($question, $default));
223
+ }
224
+
225
+ /**
226
+ * {@inheritdoc}
227
+ */
228
+ public function choice($question, array $choices, $default = null)
229
+ {
230
+ if (null !== $default) {
231
+ $values = array_flip($choices);
232
+ $default = $values[$default];
233
+ }
234
+
235
+ return $this->askQuestion(new ChoiceQuestion($question, $choices, $default));
236
+ }
237
+
238
+ /**
239
+ * {@inheritdoc}
240
+ */
241
+ public function progressStart($max = 0)
242
+ {
243
+ $this->progressBar = $this->createProgressBar($max);
244
+ $this->progressBar->start();
245
+ }
246
+
247
+ /**
248
+ * {@inheritdoc}
249
+ */
250
+ public function progressAdvance($step = 1)
251
+ {
252
+ $this->getProgressBar()->advance($step);
253
+ }
254
+
255
+ /**
256
+ * {@inheritdoc}
257
+ */
258
+ public function progressFinish()
259
+ {
260
+ $this->getProgressBar()->finish();
261
+ $this->newLine(2);
262
+ $this->progressBar = null;
263
+ }
264
+
265
+ /**
266
+ * {@inheritdoc}
267
+ */
268
+ public function createProgressBar($max = 0)
269
+ {
270
+ $progressBar = parent::createProgressBar($max);
271
+
272
+ if ('\\' !== DIRECTORY_SEPARATOR) {
273
+ $progressBar->setEmptyBarCharacter('░'); // light shade character \u2591
274
+ $progressBar->setProgressCharacter('');
275
+ $progressBar->setBarCharacter('▓'); // dark shade character \u2593
276
+ }
277
+
278
+ return $progressBar;
279
+ }
280
+
281
+ /**
282
+ * @return string
283
+ */
284
+ public function askQuestion(Question $question)
285
+ {
286
+ if ($this->input->isInteractive()) {
287
+ $this->autoPrependBlock();
288
+ }
289
+
290
+ if (!$this->questionHelper) {
291
+ $this->questionHelper = new SymfonyQuestionHelper();
292
+ }
293
+
294
+ $answer = $this->questionHelper->ask($this->input, $this, $question);
295
+
296
+ if ($this->input->isInteractive()) {
297
+ $this->newLine();
298
+ $this->bufferedOutput->write("\n");
299
+ }
300
+
301
+ return $answer;
302
+ }
303
+
304
+ /**
305
+ * {@inheritdoc}
306
+ */
307
+ public function writeln($messages, $type = self::OUTPUT_NORMAL)
308
+ {
309
+ parent::writeln($messages, $type);
310
+ $this->bufferedOutput->writeln($this->reduceBuffer($messages), $type);
311
+ }
312
+
313
+ /**
314
+ * {@inheritdoc}
315
+ */
316
+ public function write($messages, $newline = false, $type = self::OUTPUT_NORMAL)
317
+ {
318
+ parent::write($messages, $newline, $type);
319
+ $this->bufferedOutput->write($this->reduceBuffer($messages), $newline, $type);
320
+ }
321
+
322
+ /**
323
+ * {@inheritdoc}
324
+ */
325
+ public function newLine($count = 1)
326
+ {
327
+ parent::newLine($count);
328
+ $this->bufferedOutput->write(str_repeat("\n", $count));
329
+ }
330
+
331
+ /**
332
+ * Returns a new instance which makes use of stderr if available.
333
+ *
334
+ * @return self
335
+ */
336
+ public function getErrorStyle()
337
+ {
338
+ return new self($this->input, $this->getErrorOutput());
339
+ }
340
+
341
+ /**
342
+ * @return ProgressBar
343
+ */
344
+ private function getProgressBar()
345
+ {
346
+ if (!$this->progressBar) {
347
+ throw new RuntimeException('The ProgressBar is not started.');
348
+ }
349
+
350
+ return $this->progressBar;
351
+ }
352
+
353
+ private function autoPrependBlock()
354
+ {
355
+ $chars = substr(str_replace(PHP_EOL, "\n", $this->bufferedOutput->fetch()), -2);
356
+
357
+ if (!isset($chars[0])) {
358
+ return $this->newLine(); //empty history, so we should start with a new line.
359
+ }
360
+ //Prepend new line for each non LF chars (This means no blank line was output before)
361
+ $this->newLine(2 - substr_count($chars, "\n"));
362
+ }
363
+
364
+ private function autoPrependText()
365
+ {
366
+ $fetched = $this->bufferedOutput->fetch();
367
+ //Prepend new line if last char isn't EOL:
368
+ if ("\n" !== substr($fetched, -1)) {
369
+ $this->newLine();
370
+ }
371
+ }
372
+
373
+ private function reduceBuffer($messages)
374
+ {
375
+ // We need to know if the two last chars are PHP_EOL
376
+ // Preserve the last 4 chars inserted (PHP_EOL on windows is two chars) in the history buffer
377
+ return array_map(function ($value) {
378
+ return substr($value, -4);
379
+ }, array_merge(array($this->bufferedOutput->fetch()), (array) $messages));
380
+ }
381
+
382
+ private function createBlock($messages, $type = null, $style = null, $prefix = ' ', $padding = false, $escape = false)
383
+ {
384
+ $indentLength = 0;
385
+ $prefixLength = Helper::strlenWithoutDecoration($this->getFormatter(), $prefix);
386
+ $lines = array();
387
+
388
+ if (null !== $type) {
389
+ $type = sprintf('[%s] ', $type);
390
+ $indentLength = strlen($type);
391
+ $lineIndentation = str_repeat(' ', $indentLength);
392
+ }
393
+
394
+ // wrap and add newlines for each element
395
+ foreach ($messages as $key => $message) {
396
+ if ($escape) {
397
+ $message = OutputFormatter::escape($message);
398
+ }
399
+
400
+ $lines = array_merge($lines, explode(PHP_EOL, wordwrap($message, $this->lineLength - $prefixLength - $indentLength, PHP_EOL, true)));
401
+
402
+ if (count($messages) > 1 && $key < count($messages) - 1) {
403
+ $lines[] = '';
404
+ }
405
+ }
406
+
407
+ $firstLineIndex = 0;
408
+ if ($padding && $this->isDecorated()) {
409
+ $firstLineIndex = 1;
410
+ array_unshift($lines, '');
411
+ $lines[] = '';
412
+ }
413
+
414
+ foreach ($lines as $i => &$line) {
415
+ if (null !== $type) {
416
+ $line = $firstLineIndex === $i ? $type.$line : $lineIndentation.$line;
417
+ }
418
+
419
+ $line = $prefix.$line;
420
+ $line .= str_repeat(' ', $this->lineLength - Helper::strlenWithoutDecoration($this->getFormatter(), $line));
421
+
422
+ if ($style) {
423
+ $line = sprintf('<%s>%s</>', $style, $line);
424
+ }
425
+ }
426
+
427
+ return $lines;
428
+ }
429
+ }
vendor/symfony/console/Style/index.php ADDED
File without changes
vendor/symfony/console/Terminal.php ADDED
@@ -0,0 +1,137 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console;
13
+
14
+ class Terminal
15
+ {
16
+ private static $width;
17
+ private static $height;
18
+
19
+ /**
20
+ * Gets the terminal width.
21
+ *
22
+ * @return int
23
+ */
24
+ public function getWidth()
25
+ {
26
+ $width = getenv('COLUMNS');
27
+ if (false !== $width) {
28
+ return (int) trim($width);
29
+ }
30
+
31
+ if (null === self::$width) {
32
+ self::initDimensions();
33
+ }
34
+
35
+ return self::$width ?: 80;
36
+ }
37
+
38
+ /**
39
+ * Gets the terminal height.
40
+ *
41
+ * @return int
42
+ */
43
+ public function getHeight()
44
+ {
45
+ $height = getenv('LINES');
46
+ if (false !== $height) {
47
+ return (int) trim($height);
48
+ }
49
+
50
+ if (null === self::$height) {
51
+ self::initDimensions();
52
+ }
53
+
54
+ return self::$height ?: 50;
55
+ }
56
+
57
+ private static function initDimensions()
58
+ {
59
+ if ('\\' === DIRECTORY_SEPARATOR) {
60
+ if (preg_match('/^(\d+)x(\d+)(?: \((\d+)x(\d+)\))?$/', trim(getenv('ANSICON')), $matches)) {
61
+ // extract [w, H] from "wxh (WxH)"
62
+ // or [w, h] from "wxh"
63
+ self::$width = (int) $matches[1];
64
+ self::$height = isset($matches[4]) ? (int) $matches[4] : (int) $matches[2];
65
+ } elseif (null !== $dimensions = self::getConsoleMode()) {
66
+ // extract [w, h] from "wxh"
67
+ self::$width = (int) $dimensions[0];
68
+ self::$height = (int) $dimensions[1];
69
+ }
70
+ } elseif ($sttyString = self::getSttyColumns()) {
71
+ if (preg_match('/rows.(\d+);.columns.(\d+);/i', $sttyString, $matches)) {
72
+ // extract [w, h] from "rows h; columns w;"
73
+ self::$width = (int) $matches[2];
74
+ self::$height = (int) $matches[1];
75
+ } elseif (preg_match('/;.(\d+).rows;.(\d+).columns/i', $sttyString, $matches)) {
76
+ // extract [w, h] from "; h rows; w columns"
77
+ self::$width = (int) $matches[2];
78
+ self::$height = (int) $matches[1];
79
+ }
80
+ }
81
+ }
82
+
83
+ /**
84
+ * Runs and parses mode CON if it's available, suppressing any error output.
85
+ *
86
+ * @return int[]|null An array composed of the width and the height or null if it could not be parsed
87
+ */
88
+ private static function getConsoleMode()
89
+ {
90
+ if (!function_exists('proc_open')) {
91
+ return;
92
+ }
93
+
94
+ $descriptorspec = array(
95
+ 1 => array('pipe', 'w'),
96
+ 2 => array('pipe', 'w'),
97
+ );
98
+ $process = proc_open('mode CON', $descriptorspec, $pipes, null, null, array('suppress_errors' => true));
99
+ if (is_resource($process)) {
100
+ $info = stream_get_contents($pipes[1]);
101
+ fclose($pipes[1]);
102
+ fclose($pipes[2]);
103
+ proc_close($process);
104
+
105
+ if (preg_match('/--------+\r?\n.+?(\d+)\r?\n.+?(\d+)\r?\n/', $info, $matches)) {
106
+ return array((int) $matches[2], (int) $matches[1]);
107
+ }
108
+ }
109
+ }
110
+
111
+ /**
112
+ * Runs and parses stty -a if it's available, suppressing any error output.
113
+ *
114
+ * @return string|null
115
+ */
116
+ private static function getSttyColumns()
117
+ {
118
+ if (!function_exists('proc_open')) {
119
+ return;
120
+ }
121
+
122
+ $descriptorspec = array(
123
+ 1 => array('pipe', 'w'),
124
+ 2 => array('pipe', 'w'),
125
+ );
126
+
127
+ $process = proc_open('stty -a | grep columns', $descriptorspec, $pipes, null, null, array('suppress_errors' => true));
128
+ if (is_resource($process)) {
129
+ $info = stream_get_contents($pipes[1]);
130
+ fclose($pipes[1]);
131
+ fclose($pipes[2]);
132
+ proc_close($process);
133
+
134
+ return $info;
135
+ }
136
+ }
137
+ }
vendor/symfony/console/Tester/ApplicationTester.php ADDED
@@ -0,0 +1,176 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Tester;
13
+
14
+ use Symfony\Component\Console\Application;
15
+ use Symfony\Component\Console\Input\ArrayInput;
16
+ use Symfony\Component\Console\Input\InputInterface;
17
+ use Symfony\Component\Console\Output\ConsoleOutput;
18
+ use Symfony\Component\Console\Output\OutputInterface;
19
+ use Symfony\Component\Console\Output\StreamOutput;
20
+
21
+ /**
22
+ * Eases the testing of console applications.
23
+ *
24
+ * When testing an application, don't forget to disable the auto exit flag:
25
+ *
26
+ * $application = new Application();
27
+ * $application->setAutoExit(false);
28
+ *
29
+ * @author Fabien Potencier <fabien@symfony.com>
30
+ */
31
+ class ApplicationTester
32
+ {
33
+ private $application;
34
+ private $input;
35
+ private $statusCode;
36
+ /**
37
+ * @var OutputInterface
38
+ */
39
+ private $output;
40
+ private $captureStreamsIndependently = false;
41
+
42
+ public function __construct(Application $application)
43
+ {
44
+ $this->application = $application;
45
+ }
46
+
47
+ /**
48
+ * Executes the application.
49
+ *
50
+ * Available options:
51
+ *
52
+ * * interactive: Sets the input interactive flag
53
+ * * decorated: Sets the output decorated flag
54
+ * * verbosity: Sets the output verbosity flag
55
+ * * capture_stderr_separately: Make output of stdOut and stdErr separately available
56
+ *
57
+ * @param array $input An array of arguments and options
58
+ * @param array $options An array of options
59
+ *
60
+ * @return int The command exit code
61
+ */
62
+ public function run(array $input, $options = array())
63
+ {
64
+ $this->input = new ArrayInput($input);
65
+ if (isset($options['interactive'])) {
66
+ $this->input->setInteractive($options['interactive']);
67
+ }
68
+
69
+ $this->captureStreamsIndependently = array_key_exists('capture_stderr_separately', $options) && $options['capture_stderr_separately'];
70
+ if (!$this->captureStreamsIndependently) {
71
+ $this->output = new StreamOutput(fopen('php://memory', 'w', false));
72
+ if (isset($options['decorated'])) {
73
+ $this->output->setDecorated($options['decorated']);
74
+ }
75
+ if (isset($options['verbosity'])) {
76
+ $this->output->setVerbosity($options['verbosity']);
77
+ }
78
+ } else {
79
+ $this->output = new ConsoleOutput(
80
+ isset($options['verbosity']) ? $options['verbosity'] : ConsoleOutput::VERBOSITY_NORMAL,
81
+ isset($options['decorated']) ? $options['decorated'] : null
82
+ );
83
+
84
+ $errorOutput = new StreamOutput(fopen('php://memory', 'w', false));
85
+ $errorOutput->setFormatter($this->output->getFormatter());
86
+ $errorOutput->setVerbosity($this->output->getVerbosity());
87
+ $errorOutput->setDecorated($this->output->isDecorated());
88
+
89
+ $reflectedOutput = new \ReflectionObject($this->output);
90
+ $strErrProperty = $reflectedOutput->getProperty('stderr');
91
+ $strErrProperty->setAccessible(true);
92
+ $strErrProperty->setValue($this->output, $errorOutput);
93
+
94
+ $reflectedParent = $reflectedOutput->getParentClass();
95
+ $streamProperty = $reflectedParent->getProperty('stream');
96
+ $streamProperty->setAccessible(true);
97
+ $streamProperty->setValue($this->output, fopen('php://memory', 'w', false));
98
+ }
99
+
100
+ return $this->statusCode = $this->application->run($this->input, $this->output);
101
+ }
102
+
103
+ /**
104
+ * Gets the display returned by the last execution of the application.
105
+ *
106
+ * @param bool $normalize Whether to normalize end of lines to \n or not
107
+ *
108
+ * @return string The display
109
+ */
110
+ public function getDisplay($normalize = false)
111
+ {
112
+ rewind($this->output->getStream());
113
+
114
+ $display = stream_get_contents($this->output->getStream());
115
+
116
+ if ($normalize) {
117
+ $display = str_replace(PHP_EOL, "\n", $display);
118
+ }
119
+
120
+ return $display;
121
+ }
122
+
123
+ /**
124
+ * Gets the output written to STDERR by the application.
125
+ *
126
+ * @param bool $normalize Whether to normalize end of lines to \n or not
127
+ *
128
+ * @return string
129
+ */
130
+ public function getErrorOutput($normalize = false)
131
+ {
132
+ if (!$this->captureStreamsIndependently) {
133
+ throw new \LogicException('The error output is not available when the tester is run without "capture_stderr_separately" option set.');
134
+ }
135
+
136
+ rewind($this->output->getErrorOutput()->getStream());
137
+
138
+ $display = stream_get_contents($this->output->getErrorOutput()->getStream());
139
+
140
+ if ($normalize) {
141
+ $display = str_replace(PHP_EOL, "\n", $display);
142
+ }
143
+
144
+ return $display;
145
+ }
146
+
147
+ /**
148
+ * Gets the input instance used by the last execution of the application.
149
+ *
150
+ * @return InputInterface The current input instance
151
+ */
152
+ public function getInput()
153
+ {
154
+ return $this->input;
155
+ }
156
+
157
+ /**
158
+ * Gets the output instance used by the last execution of the application.
159
+ *
160
+ * @return OutputInterface The current output instance
161
+ */
162
+ public function getOutput()
163
+ {
164
+ return $this->output;
165
+ }
166
+
167
+ /**
168
+ * Gets the status code returned by the last execution of the application.
169
+ *
170
+ * @return int The status code
171
+ */
172
+ public function getStatusCode()
173
+ {
174
+ return $this->statusCode;
175
+ }
176
+ }
vendor/symfony/console/Tester/CommandTester.php ADDED
@@ -0,0 +1,156 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Tester;
13
+
14
+ use Symfony\Component\Console\Command\Command;
15
+ use Symfony\Component\Console\Input\ArrayInput;
16
+ use Symfony\Component\Console\Output\StreamOutput;
17
+ use Symfony\Component\Console\Input\InputInterface;
18
+ use Symfony\Component\Console\Output\OutputInterface;
19
+
20
+ /**
21
+ * Eases the testing of console commands.
22
+ *
23
+ * @author Fabien Potencier <fabien@symfony.com>
24
+ * @author Robin Chalas <robin.chalas@gmail.com>
25
+ */
26
+ class CommandTester
27
+ {
28
+ private $command;
29
+ private $input;
30
+ private $output;
31
+ private $inputs = array();
32
+ private $statusCode;
33
+
34
+ public function __construct(Command $command)
35
+ {
36
+ $this->command = $command;
37
+ }
38
+
39
+ /**
40
+ * Executes the command.
41
+ *
42
+ * Available execution options:
43
+ *
44
+ * * interactive: Sets the input interactive flag
45
+ * * decorated: Sets the output decorated flag
46
+ * * verbosity: Sets the output verbosity flag
47
+ *
48
+ * @param array $input An array of command arguments and options
49
+ * @param array $options An array of execution options
50
+ *
51
+ * @return int The command exit code
52
+ */
53
+ public function execute(array $input, array $options = array())
54
+ {
55
+ // set the command name automatically if the application requires
56
+ // this argument and no command name was passed
57
+ if (!isset($input['command'])
58
+ && (null !== $application = $this->command->getApplication())
59
+ && $application->getDefinition()->hasArgument('command')
60
+ ) {
61
+ $input = array_merge(array('command' => $this->command->getName()), $input);
62
+ }
63
+
64
+ $this->input = new ArrayInput($input);
65
+ if ($this->inputs) {
66
+ $this->input->setStream(self::createStream($this->inputs));
67
+ }
68
+
69
+ if (isset($options['interactive'])) {
70
+ $this->input->setInteractive($options['interactive']);
71
+ }
72
+
73
+ $this->output = new StreamOutput(fopen('php://memory', 'w', false));
74
+ $this->output->setDecorated(isset($options['decorated']) ? $options['decorated'] : false);
75
+ if (isset($options['verbosity'])) {
76
+ $this->output->setVerbosity($options['verbosity']);
77
+ }
78
+
79
+ return $this->statusCode = $this->command->run($this->input, $this->output);
80
+ }
81
+
82
+ /**
83
+ * Gets the display returned by the last execution of the command.
84
+ *
85
+ * @param bool $normalize Whether to normalize end of lines to \n or not
86
+ *
87
+ * @return string The display
88
+ */
89
+ public function getDisplay($normalize = false)
90
+ {
91
+ rewind($this->output->getStream());
92
+
93
+ $display = stream_get_contents($this->output->getStream());
94
+
95
+ if ($normalize) {
96
+ $display = str_replace(PHP_EOL, "\n", $display);
97
+ }
98
+
99
+ return $display;
100
+ }
101
+
102
+ /**
103
+ * Gets the input instance used by the last execution of the command.
104
+ *
105
+ * @return InputInterface The current input instance
106
+ */
107
+ public function getInput()
108
+ {
109
+ return $this->input;
110
+ }
111
+
112
+ /**
113
+ * Gets the output instance used by the last execution of the command.
114
+ *
115
+ * @return OutputInterface The current output instance
116
+ */
117
+ public function getOutput()
118
+ {
119
+ return $this->output;
120
+ }
121
+
122
+ /**
123
+ * Gets the status code returned by the last execution of the application.
124
+ *
125
+ * @return int The status code
126
+ */
127
+ public function getStatusCode()
128
+ {
129
+ return $this->statusCode;
130
+ }
131
+
132
+ /**
133
+ * Sets the user inputs.
134
+ *
135
+ * @param array $inputs An array of strings representing each input
136
+ * passed to the command input stream
137
+ *
138
+ * @return CommandTester
139
+ */
140
+ public function setInputs(array $inputs)
141
+ {
142
+ $this->inputs = $inputs;
143
+
144
+ return $this;
145
+ }
146
+
147
+ private static function createStream(array $inputs)
148
+ {
149
+ $stream = fopen('php://memory', 'r+', false);
150
+
151
+ fwrite($stream, implode(PHP_EOL, $inputs));
152
+ rewind($stream);
153
+
154
+ return $stream;
155
+ }
156
+ }
vendor/symfony/console/Tester/index.php ADDED
File without changes
vendor/symfony/console/Tests/ApplicationTest.php ADDED
@@ -0,0 +1,1493 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Tests;
13
+
14
+ use PHPUnit\Framework\TestCase;
15
+ use Symfony\Component\Console\Application;
16
+ use Symfony\Component\Console\Helper\HelperSet;
17
+ use Symfony\Component\Console\Helper\FormatterHelper;
18
+ use Symfony\Component\Console\Input\ArgvInput;
19
+ use Symfony\Component\Console\Input\ArrayInput;
20
+ use Symfony\Component\Console\Input\InputInterface;
21
+ use Symfony\Component\Console\Input\InputArgument;
22
+ use Symfony\Component\Console\Input\InputDefinition;
23
+ use Symfony\Component\Console\Input\InputOption;
24
+ use Symfony\Component\Console\Output\NullOutput;
25
+ use Symfony\Component\Console\Output\Output;
26
+ use Symfony\Component\Console\Output\OutputInterface;
27
+ use Symfony\Component\Console\Output\StreamOutput;
28
+ use Symfony\Component\Console\Tester\ApplicationTester;
29
+ use Symfony\Component\Console\Event\ConsoleCommandEvent;
30
+ use Symfony\Component\Console\Event\ConsoleErrorEvent;
31
+ use Symfony\Component\Console\Event\ConsoleExceptionEvent;
32
+ use Symfony\Component\Console\Event\ConsoleTerminateEvent;
33
+ use Symfony\Component\Console\Exception\CommandNotFoundException;
34
+ use Symfony\Component\EventDispatcher\EventDispatcher;
35
+
36
+ class ApplicationTest extends TestCase
37
+ {
38
+ protected static $fixturesPath;
39
+
40
+ public static function setUpBeforeClass()
41
+ {
42
+ self::$fixturesPath = realpath(__DIR__.'/Fixtures/');
43
+ require_once self::$fixturesPath.'/FooCommand.php';
44
+ require_once self::$fixturesPath.'/FooOptCommand.php';
45
+ require_once self::$fixturesPath.'/Foo1Command.php';
46
+ require_once self::$fixturesPath.'/Foo2Command.php';
47
+ require_once self::$fixturesPath.'/Foo3Command.php';
48
+ require_once self::$fixturesPath.'/Foo4Command.php';
49
+ require_once self::$fixturesPath.'/Foo5Command.php';
50
+ require_once self::$fixturesPath.'/FoobarCommand.php';
51
+ require_once self::$fixturesPath.'/BarBucCommand.php';
52
+ require_once self::$fixturesPath.'/FooSubnamespaced1Command.php';
53
+ require_once self::$fixturesPath.'/FooSubnamespaced2Command.php';
54
+ }
55
+
56
+ protected function normalizeLineBreaks($text)
57
+ {
58
+ return str_replace(PHP_EOL, "\n", $text);
59
+ }
60
+
61
+ /**
62
+ * Replaces the dynamic placeholders of the command help text with a static version.
63
+ * The placeholder %command.full_name% includes the script path that is not predictable
64
+ * and can not be tested against.
65
+ */
66
+ protected function ensureStaticCommandHelp(Application $application)
67
+ {
68
+ foreach ($application->all() as $command) {
69
+ $command->setHelp(str_replace('%command.full_name%', 'app/console %command.name%', $command->getHelp()));
70
+ }
71
+ }
72
+
73
+ public function testConstructor()
74
+ {
75
+ $application = new Application('foo', 'bar');
76
+ $this->assertEquals('foo', $application->getName(), '__construct() takes the application name as its first argument');
77
+ $this->assertEquals('bar', $application->getVersion(), '__construct() takes the application version as its second argument');
78
+ $this->assertEquals(array('help', 'list'), array_keys($application->all()), '__construct() registered the help and list commands by default');
79
+ }
80
+
81
+ public function testSetGetName()
82
+ {
83
+ $application = new Application();
84
+ $application->setName('foo');
85
+ $this->assertEquals('foo', $application->getName(), '->setName() sets the name of the application');
86
+ }
87
+
88
+ public function testSetGetVersion()
89
+ {
90
+ $application = new Application();
91
+ $application->setVersion('bar');
92
+ $this->assertEquals('bar', $application->getVersion(), '->setVersion() sets the version of the application');
93
+ }
94
+
95
+ public function testGetLongVersion()
96
+ {
97
+ $application = new Application('foo', 'bar');
98
+ $this->assertEquals('foo <info>bar</info>', $application->getLongVersion(), '->getLongVersion() returns the long version of the application');
99
+ }
100
+
101
+ public function testHelp()
102
+ {
103
+ $application = new Application();
104
+ $this->assertStringEqualsFile(self::$fixturesPath.'/application_gethelp.txt', $this->normalizeLineBreaks($application->getHelp()), '->getHelp() returns a help message');
105
+ }
106
+
107
+ public function testAll()
108
+ {
109
+ $application = new Application();
110
+ $commands = $application->all();
111
+ $this->assertInstanceOf('Symfony\\Component\\Console\\Command\\HelpCommand', $commands['help'], '->all() returns the registered commands');
112
+
113
+ $application->add(new \FooCommand());
114
+ $commands = $application->all('foo');
115
+ $this->assertCount(1, $commands, '->all() takes a namespace as its first argument');
116
+ }
117
+
118
+ public function testRegister()
119
+ {
120
+ $application = new Application();
121
+ $command = $application->register('foo');
122
+ $this->assertEquals('foo', $command->getName(), '->register() registers a new command');
123
+ }
124
+
125
+ public function testAdd()
126
+ {
127
+ $application = new Application();
128
+ $application->add($foo = new \FooCommand());
129
+ $commands = $application->all();
130
+ $this->assertEquals($foo, $commands['foo:bar'], '->add() registers a command');
131
+
132
+ $application = new Application();
133
+ $application->addCommands(array($foo = new \FooCommand(), $foo1 = new \Foo1Command()));
134
+ $commands = $application->all();
135
+ $this->assertEquals(array($foo, $foo1), array($commands['foo:bar'], $commands['foo:bar1']), '->addCommands() registers an array of commands');
136
+ }
137
+
138
+ /**
139
+ * @expectedException \LogicException
140
+ * @expectedExceptionMessage Command class "Foo5Command" is not correctly initialized. You probably forgot to call the parent constructor.
141
+ */
142
+ public function testAddCommandWithEmptyConstructor()
143
+ {
144
+ $application = new Application();
145
+ $application->add(new \Foo5Command());
146
+ }
147
+
148
+ public function testHasGet()
149
+ {
150
+ $application = new Application();
151
+ $this->assertTrue($application->has('list'), '->has() returns true if a named command is registered');
152
+ $this->assertFalse($application->has('afoobar'), '->has() returns false if a named command is not registered');
153
+
154
+ $application->add($foo = new \FooCommand());
155
+ $this->assertTrue($application->has('afoobar'), '->has() returns true if an alias is registered');
156
+ $this->assertEquals($foo, $application->get('foo:bar'), '->get() returns a command by name');
157
+ $this->assertEquals($foo, $application->get('afoobar'), '->get() returns a command by alias');
158
+
159
+ $application = new Application();
160
+ $application->add($foo = new \FooCommand());
161
+ // simulate --help
162
+ $r = new \ReflectionObject($application);
163
+ $p = $r->getProperty('wantHelps');
164
+ $p->setAccessible(true);
165
+ $p->setValue($application, true);
166
+ $command = $application->get('foo:bar');
167
+ $this->assertInstanceOf('Symfony\Component\Console\Command\HelpCommand', $command, '->get() returns the help command if --help is provided as the input');
168
+ }
169
+
170
+ public function testSilentHelp()
171
+ {
172
+ $application = new Application();
173
+ $application->setAutoExit(false);
174
+ $application->setCatchExceptions(false);
175
+
176
+ $tester = new ApplicationTester($application);
177
+ $tester->run(array('-h' => true, '-q' => true), array('decorated' => false));
178
+
179
+ $this->assertEmpty($tester->getDisplay(true));
180
+ }
181
+
182
+ /**
183
+ * @expectedException \Symfony\Component\Console\Exception\CommandNotFoundException
184
+ * @expectedExceptionMessage The command "foofoo" does not exist.
185
+ */
186
+ public function testGetInvalidCommand()
187
+ {
188
+ $application = new Application();
189
+ $application->get('foofoo');
190
+ }
191
+
192
+ public function testGetNamespaces()
193
+ {
194
+ $application = new Application();
195
+ $application->add(new \FooCommand());
196
+ $application->add(new \Foo1Command());
197
+ $this->assertEquals(array('foo'), $application->getNamespaces(), '->getNamespaces() returns an array of unique used namespaces');
198
+ }
199
+
200
+ public function testFindNamespace()
201
+ {
202
+ $application = new Application();
203
+ $application->add(new \FooCommand());
204
+ $this->assertEquals('foo', $application->findNamespace('foo'), '->findNamespace() returns the given namespace if it exists');
205
+ $this->assertEquals('foo', $application->findNamespace('f'), '->findNamespace() finds a namespace given an abbreviation');
206
+ $application->add(new \Foo2Command());
207
+ $this->assertEquals('foo', $application->findNamespace('foo'), '->findNamespace() returns the given namespace if it exists');
208
+ }
209
+
210
+ public function testFindNamespaceWithSubnamespaces()
211
+ {
212
+ $application = new Application();
213
+ $application->add(new \FooSubnamespaced1Command());
214
+ $application->add(new \FooSubnamespaced2Command());
215
+ $this->assertEquals('foo', $application->findNamespace('foo'), '->findNamespace() returns commands even if the commands are only contained in subnamespaces');
216
+ }
217
+
218
+ public function testFindAmbiguousNamespace()
219
+ {
220
+ $application = new Application();
221
+ $application->add(new \BarBucCommand());
222
+ $application->add(new \FooCommand());
223
+ $application->add(new \Foo2Command());
224
+
225
+ $expectedMsg = "The namespace \"f\" is ambiguous.\nDid you mean one of these?\n foo\n foo1";
226
+
227
+ if (method_exists($this, 'expectException')) {
228
+ $this->expectException(CommandNotFoundException::class);
229
+ $this->expectExceptionMessage($expectedMsg);
230
+ } else {
231
+ $this->setExpectedException(CommandNotFoundException::class, $expectedMsg);
232
+ }
233
+
234
+ $application->findNamespace('f');
235
+ }
236
+
237
+ /**
238
+ * @expectedException \Symfony\Component\Console\Exception\CommandNotFoundException
239
+ * @expectedExceptionMessage There are no commands defined in the "bar" namespace.
240
+ */
241
+ public function testFindInvalidNamespace()
242
+ {
243
+ $application = new Application();
244
+ $application->findNamespace('bar');
245
+ }
246
+
247
+ /**
248
+ * @expectedException \Symfony\Component\Console\Exception\CommandNotFoundException
249
+ * @expectedExceptionMessage Command "foo1" is not defined
250
+ */
251
+ public function testFindUniqueNameButNamespaceName()
252
+ {
253
+ $application = new Application();
254
+ $application->add(new \FooCommand());
255
+ $application->add(new \Foo1Command());
256
+ $application->add(new \Foo2Command());
257
+
258
+ $application->find($commandName = 'foo1');
259
+ }
260
+
261
+ public function testFind()
262
+ {
263
+ $application = new Application();
264
+ $application->add(new \FooCommand());
265
+
266
+ $this->assertInstanceOf('FooCommand', $application->find('foo:bar'), '->find() returns a command if its name exists');
267
+ $this->assertInstanceOf('Symfony\Component\Console\Command\HelpCommand', $application->find('h'), '->find() returns a command if its name exists');
268
+ $this->assertInstanceOf('FooCommand', $application->find('f:bar'), '->find() returns a command if the abbreviation for the namespace exists');
269
+ $this->assertInstanceOf('FooCommand', $application->find('f:b'), '->find() returns a command if the abbreviation for the namespace and the command name exist');
270
+ $this->assertInstanceOf('FooCommand', $application->find('a'), '->find() returns a command if the abbreviation exists for an alias');
271
+ }
272
+
273
+ /**
274
+ * @dataProvider provideAmbiguousAbbreviations
275
+ */
276
+ public function testFindWithAmbiguousAbbreviations($abbreviation, $expectedExceptionMessage)
277
+ {
278
+ if (method_exists($this, 'expectException')) {
279
+ $this->expectException('Symfony\Component\Console\Exception\CommandNotFoundException');
280
+ $this->expectExceptionMessage($expectedExceptionMessage);
281
+ } else {
282
+ $this->setExpectedException('Symfony\Component\Console\Exception\CommandNotFoundException', $expectedExceptionMessage);
283
+ }
284
+
285
+ $application = new Application();
286
+ $application->add(new \FooCommand());
287
+ $application->add(new \Foo1Command());
288
+ $application->add(new \Foo2Command());
289
+
290
+ $application->find($abbreviation);
291
+ }
292
+
293
+ public function provideAmbiguousAbbreviations()
294
+ {
295
+ return array(
296
+ array('f', 'Command "f" is not defined.'),
297
+ array(
298
+ 'a',
299
+ "Command \"a\" is ambiguous.\nDid you mean one of these?\n".
300
+ " afoobar The foo:bar command\n".
301
+ " afoobar1 The foo:bar1 command\n".
302
+ ' afoobar2 The foo1:bar command',
303
+ ),
304
+ array(
305
+ 'foo:b',
306
+ "Command \"foo:b\" is ambiguous.\nDid you mean one of these?\n".
307
+ " foo:bar The foo:bar command\n".
308
+ " foo:bar1 The foo:bar1 command\n".
309
+ ' foo1:bar The foo1:bar command',
310
+ ),
311
+ );
312
+ }
313
+
314
+ public function testFindCommandEqualNamespace()
315
+ {
316
+ $application = new Application();
317
+ $application->add(new \Foo3Command());
318
+ $application->add(new \Foo4Command());
319
+
320
+ $this->assertInstanceOf('Foo3Command', $application->find('foo3:bar'), '->find() returns the good command even if a namespace has same name');
321
+ $this->assertInstanceOf('Foo4Command', $application->find('foo3:bar:toh'), '->find() returns a command even if its namespace equals another command name');
322
+ }
323
+
324
+ public function testFindCommandWithAmbiguousNamespacesButUniqueName()
325
+ {
326
+ $application = new Application();
327
+ $application->add(new \FooCommand());
328
+ $application->add(new \FoobarCommand());
329
+
330
+ $this->assertInstanceOf('FoobarCommand', $application->find('f:f'));
331
+ }
332
+
333
+ public function testFindCommandWithMissingNamespace()
334
+ {
335
+ $application = new Application();
336
+ $application->add(new \Foo4Command());
337
+
338
+ $this->assertInstanceOf('Foo4Command', $application->find('f::t'));
339
+ }
340
+
341
+ /**
342
+ * @dataProvider provideInvalidCommandNamesSingle
343
+ * @expectedException \Symfony\Component\Console\Exception\CommandNotFoundException
344
+ * @expectedExceptionMessage Did you mean this
345
+ */
346
+ public function testFindAlternativeExceptionMessageSingle($name)
347
+ {
348
+ $application = new Application();
349
+ $application->add(new \Foo3Command());
350
+ $application->find($name);
351
+ }
352
+
353
+ public function provideInvalidCommandNamesSingle()
354
+ {
355
+ return array(
356
+ array('foo3:baR'),
357
+ array('foO3:bar'),
358
+ );
359
+ }
360
+
361
+ public function testFindAlternativeExceptionMessageMultiple()
362
+ {
363
+ $application = new Application();
364
+ $application->add(new \FooCommand());
365
+ $application->add(new \Foo1Command());
366
+ $application->add(new \Foo2Command());
367
+
368
+ // Command + plural
369
+ try {
370
+ $application->find('foo:baR');
371
+ $this->fail('->find() throws a CommandNotFoundException if command does not exist, with alternatives');
372
+ } catch (\Exception $e) {
373
+ $this->assertInstanceOf('Symfony\Component\Console\Exception\CommandNotFoundException', $e, '->find() throws a CommandNotFoundException if command does not exist, with alternatives');
374
+ $this->assertRegExp('/Did you mean one of these/', $e->getMessage(), '->find() throws a CommandNotFoundException if command does not exist, with alternatives');
375
+ $this->assertRegExp('/foo1:bar/', $e->getMessage());
376
+ $this->assertRegExp('/foo:bar/', $e->getMessage());
377
+ }
378
+
379
+ // Namespace + plural
380
+ try {
381
+ $application->find('foo2:bar');
382
+ $this->fail('->find() throws a CommandNotFoundException if command does not exist, with alternatives');
383
+ } catch (\Exception $e) {
384
+ $this->assertInstanceOf('Symfony\Component\Console\Exception\CommandNotFoundException', $e, '->find() throws a CommandNotFoundException if command does not exist, with alternatives');
385
+ $this->assertRegExp('/Did you mean one of these/', $e->getMessage(), '->find() throws a CommandNotFoundException if command does not exist, with alternatives');
386
+ $this->assertRegExp('/foo1/', $e->getMessage());
387
+ }
388
+
389
+ $application->add(new \Foo3Command());
390
+ $application->add(new \Foo4Command());
391
+
392
+ // Subnamespace + plural
393
+ try {
394
+ $a = $application->find('foo3:');
395
+ $this->fail('->find() should throw an Symfony\Component\Console\Exception\CommandNotFoundException if a command is ambiguous because of a subnamespace, with alternatives');
396
+ } catch (\Exception $e) {
397
+ $this->assertInstanceOf('Symfony\Component\Console\Exception\CommandNotFoundException', $e);
398
+ $this->assertRegExp('/foo3:bar/', $e->getMessage());
399
+ $this->assertRegExp('/foo3:bar:toh/', $e->getMessage());
400
+ }
401
+ }
402
+
403
+ public function testFindAlternativeCommands()
404
+ {
405
+ $application = new Application();
406
+
407
+ $application->add(new \FooCommand());
408
+ $application->add(new \Foo1Command());
409
+ $application->add(new \Foo2Command());
410
+
411
+ try {
412
+ $application->find($commandName = 'Unknown command');
413
+ $this->fail('->find() throws a CommandNotFoundException if command does not exist');
414
+ } catch (\Exception $e) {
415
+ $this->assertInstanceOf('Symfony\Component\Console\Exception\CommandNotFoundException', $e, '->find() throws a CommandNotFoundException if command does not exist');
416
+ $this->assertSame(array(), $e->getAlternatives());
417
+ $this->assertEquals(sprintf('Command "%s" is not defined.', $commandName), $e->getMessage(), '->find() throws a CommandNotFoundException if command does not exist, without alternatives');
418
+ }
419
+
420
+ // Test if "bar1" command throw a "CommandNotFoundException" and does not contain
421
+ // "foo:bar" as alternative because "bar1" is too far from "foo:bar"
422
+ try {
423
+ $application->find($commandName = 'bar1');
424
+ $this->fail('->find() throws a CommandNotFoundException if command does not exist');
425
+ } catch (\Exception $e) {
426
+ $this->assertInstanceOf('Symfony\Component\Console\Exception\CommandNotFoundException', $e, '->find() throws a CommandNotFoundException if command does not exist');
427
+ $this->assertSame(array('afoobar1', 'foo:bar1'), $e->getAlternatives());
428
+ $this->assertRegExp(sprintf('/Command "%s" is not defined./', $commandName), $e->getMessage(), '->find() throws a CommandNotFoundException if command does not exist, with alternatives');
429
+ $this->assertRegExp('/afoobar1/', $e->getMessage(), '->find() throws a CommandNotFoundException if command does not exist, with alternative : "afoobar1"');
430
+ $this->assertRegExp('/foo:bar1/', $e->getMessage(), '->find() throws a CommandNotFoundException if command does not exist, with alternative : "foo:bar1"');
431
+ $this->assertNotRegExp('/foo:bar(?>!1)/', $e->getMessage(), '->find() throws a CommandNotFoundException if command does not exist, without "foo:bar" alternative');
432
+ }
433
+ }
434
+
435
+ public function testFindAlternativeCommandsWithAnAlias()
436
+ {
437
+ $fooCommand = new \FooCommand();
438
+ $fooCommand->setAliases(array('foo2'));
439
+
440
+ $application = new Application();
441
+ $application->add($fooCommand);
442
+
443
+ $result = $application->find('foo');
444
+
445
+ $this->assertSame($fooCommand, $result);
446
+ }
447
+
448
+ public function testFindAlternativeNamespace()
449
+ {
450
+ $application = new Application();
451
+
452
+ $application->add(new \FooCommand());
453
+ $application->add(new \Foo1Command());
454
+ $application->add(new \Foo2Command());
455
+ $application->add(new \Foo3Command());
456
+
457
+ try {
458
+ $application->find('Unknown-namespace:Unknown-command');
459
+ $this->fail('->find() throws a CommandNotFoundException if namespace does not exist');
460
+ } catch (\Exception $e) {
461
+ $this->assertInstanceOf('Symfony\Component\Console\Exception\CommandNotFoundException', $e, '->find() throws a CommandNotFoundException if namespace does not exist');
462
+ $this->assertSame(array(), $e->getAlternatives());
463
+ $this->assertEquals('There are no commands defined in the "Unknown-namespace" namespace.', $e->getMessage(), '->find() throws a CommandNotFoundException if namespace does not exist, without alternatives');
464
+ }
465
+
466
+ try {
467
+ $application->find('foo2:command');
468
+ $this->fail('->find() throws a CommandNotFoundException if namespace does not exist');
469
+ } catch (\Exception $e) {
470
+ $this->assertInstanceOf('Symfony\Component\Console\Exception\CommandNotFoundException', $e, '->find() throws a CommandNotFoundException if namespace does not exist');
471
+ $this->assertCount(3, $e->getAlternatives());
472
+ $this->assertContains('foo', $e->getAlternatives());
473
+ $this->assertContains('foo1', $e->getAlternatives());
474
+ $this->assertContains('foo3', $e->getAlternatives());
475
+ $this->assertRegExp('/There are no commands defined in the "foo2" namespace./', $e->getMessage(), '->find() throws a CommandNotFoundException if namespace does not exist, with alternative');
476
+ $this->assertRegExp('/foo/', $e->getMessage(), '->find() throws a CommandNotFoundException if namespace does not exist, with alternative : "foo"');
477
+ $this->assertRegExp('/foo1/', $e->getMessage(), '->find() throws a CommandNotFoundException if namespace does not exist, with alternative : "foo1"');
478
+ $this->assertRegExp('/foo3/', $e->getMessage(), '->find() throws a CommandNotFoundException if namespace does not exist, with alternative : "foo3"');
479
+ }
480
+ }
481
+
482
+ public function testFindAlternativesOutput()
483
+ {
484
+ $application = new Application();
485
+
486
+ $application->add(new \FooCommand());
487
+ $application->add(new \Foo1Command());
488
+ $application->add(new \Foo2Command());
489
+ $application->add(new \Foo3Command());
490
+
491
+ $expectedAlternatives = array(
492
+ 'afoobar',
493
+ 'afoobar1',
494
+ 'afoobar2',
495
+ 'foo1:bar',
496
+ 'foo3:bar',
497
+ 'foo:bar',
498
+ 'foo:bar1',
499
+ );
500
+
501
+ try {
502
+ $application->find('foo');
503
+ $this->fail('->find() throws a CommandNotFoundException if command is not defined');
504
+ } catch (\Exception $e) {
505
+ $this->assertInstanceOf('Symfony\Component\Console\Exception\CommandNotFoundException', $e, '->find() throws a CommandNotFoundException if command is not defined');
506
+ $this->assertSame($expectedAlternatives, $e->getAlternatives());
507
+
508
+ $this->assertRegExp('/Command "foo" is not defined\..*Did you mean one of these\?.*/Ums', $e->getMessage());
509
+ }
510
+ }
511
+
512
+ public function testFindNamespaceDoesNotFailOnDeepSimilarNamespaces()
513
+ {
514
+ $application = $this->getMockBuilder('Symfony\Component\Console\Application')->setMethods(array('getNamespaces'))->getMock();
515
+ $application->expects($this->once())
516
+ ->method('getNamespaces')
517
+ ->will($this->returnValue(array('foo:sublong', 'bar:sub')));
518
+
519
+ $this->assertEquals('foo:sublong', $application->findNamespace('f:sub'));
520
+ }
521
+
522
+ /**
523
+ * @expectedException \Symfony\Component\Console\Exception\CommandNotFoundException
524
+ * @expectedExceptionMessage Command "foo::bar" is not defined.
525
+ */
526
+ public function testFindWithDoubleColonInNameThrowsException()
527
+ {
528
+ $application = new Application();
529
+ $application->add(new \FooCommand());
530
+ $application->add(new \Foo4Command());
531
+ $application->find('foo::bar');
532
+ }
533
+
534
+ public function testSetCatchExceptions()
535
+ {
536
+ $application = new Application();
537
+ $application->setAutoExit(false);
538
+ putenv('COLUMNS=120');
539
+ $tester = new ApplicationTester($application);
540
+
541
+ $application->setCatchExceptions(true);
542
+ $this->assertTrue($application->areExceptionsCaught());
543
+
544
+ $tester->run(array('command' => 'foo'), array('decorated' => false));
545
+ $this->assertStringEqualsFile(self::$fixturesPath.'/application_renderexception1.txt', $tester->getDisplay(true), '->setCatchExceptions() sets the catch exception flag');
546
+
547
+ $tester->run(array('command' => 'foo'), array('decorated' => false, 'capture_stderr_separately' => true));
548
+ $this->assertStringEqualsFile(self::$fixturesPath.'/application_renderexception1.txt', $tester->getErrorOutput(true), '->setCatchExceptions() sets the catch exception flag');
549
+ $this->assertSame('', $tester->getDisplay(true));
550
+
551
+ $application->setCatchExceptions(false);
552
+ try {
553
+ $tester->run(array('command' => 'foo'), array('decorated' => false));
554
+ $this->fail('->setCatchExceptions() sets the catch exception flag');
555
+ } catch (\Exception $e) {
556
+ $this->assertInstanceOf('\Exception', $e, '->setCatchExceptions() sets the catch exception flag');
557
+ $this->assertEquals('Command "foo" is not defined.', $e->getMessage(), '->setCatchExceptions() sets the catch exception flag');
558
+ }
559
+ }
560
+
561
+ public function testAutoExitSetting()
562
+ {
563
+ $application = new Application();
564
+ $this->assertTrue($application->isAutoExitEnabled());
565
+
566
+ $application->setAutoExit(false);
567
+ $this->assertFalse($application->isAutoExitEnabled());
568
+ }
569
+
570
+ public function testRenderException()
571
+ {
572
+ $application = new Application();
573
+ $application->setAutoExit(false);
574
+ putenv('COLUMNS=120');
575
+ $tester = new ApplicationTester($application);
576
+
577
+ $tester->run(array('command' => 'foo'), array('decorated' => false, 'capture_stderr_separately' => true));
578
+ $this->assertStringEqualsFile(self::$fixturesPath.'/application_renderexception1.txt', $tester->getErrorOutput(true), '->renderException() renders a pretty exception');
579
+
580
+ $tester->run(array('command' => 'foo'), array('decorated' => false, 'verbosity' => Output::VERBOSITY_VERBOSE, 'capture_stderr_separately' => true));
581
+ $this->assertContains('Exception trace', $tester->getErrorOutput(), '->renderException() renders a pretty exception with a stack trace when verbosity is verbose');
582
+
583
+ $tester->run(array('command' => 'list', '--foo' => true), array('decorated' => false, 'capture_stderr_separately' => true));
584
+ $this->assertStringEqualsFile(self::$fixturesPath.'/application_renderexception2.txt', $tester->getErrorOutput(true), '->renderException() renders the command synopsis when an exception occurs in the context of a command');
585
+
586
+ $application->add(new \Foo3Command());
587
+ $tester = new ApplicationTester($application);
588
+ $tester->run(array('command' => 'foo3:bar'), array('decorated' => false, 'capture_stderr_separately' => true));
589
+ $this->assertStringEqualsFile(self::$fixturesPath.'/application_renderexception3.txt', $tester->getErrorOutput(true), '->renderException() renders a pretty exceptions with previous exceptions');
590
+
591
+ $tester->run(array('command' => 'foo3:bar'), array('decorated' => false, 'verbosity' => Output::VERBOSITY_VERBOSE));
592
+ $this->assertRegExp('/\[Exception\]\s*First exception/', $tester->getDisplay(), '->renderException() renders a pretty exception without code exception when code exception is default and verbosity is verbose');
593
+ $this->assertRegExp('/\[Exception\]\s*Second exception/', $tester->getDisplay(), '->renderException() renders a pretty exception without code exception when code exception is 0 and verbosity is verbose');
594
+ $this->assertRegExp('/\[Exception \(404\)\]\s*Third exception/', $tester->getDisplay(), '->renderException() renders a pretty exception with code exception when code exception is 404 and verbosity is verbose');
595
+
596
+ $tester->run(array('command' => 'foo3:bar'), array('decorated' => true));
597
+ $this->assertStringEqualsFile(self::$fixturesPath.'/application_renderexception3decorated.txt', $tester->getDisplay(true), '->renderException() renders a pretty exceptions with previous exceptions');
598
+
599
+ $tester->run(array('command' => 'foo3:bar'), array('decorated' => true, 'capture_stderr_separately' => true));
600
+ $this->assertStringEqualsFile(self::$fixturesPath.'/application_renderexception3decorated.txt', $tester->getErrorOutput(true), '->renderException() renders a pretty exceptions with previous exceptions');
601
+
602
+ $application = new Application();
603
+ $application->setAutoExit(false);
604
+ putenv('COLUMNS=32');
605
+ $tester = new ApplicationTester($application);
606
+
607
+ $tester->run(array('command' => 'foo'), array('decorated' => false, 'capture_stderr_separately' => true));
608
+ $this->assertStringEqualsFile(self::$fixturesPath.'/application_renderexception4.txt', $tester->getErrorOutput(true), '->renderException() wraps messages when they are bigger than the terminal');
609
+ putenv('COLUMNS=120');
610
+ }
611
+
612
+ public function testRenderExceptionWithDoubleWidthCharacters()
613
+ {
614
+ $application = new Application();
615
+ $application->setAutoExit(false);
616
+ putenv('COLUMNS=120');
617
+ $application->register('foo')->setCode(function () {
618
+ throw new \Exception('エラーメッセージ');
619
+ });
620
+ $tester = new ApplicationTester($application);
621
+
622
+ $tester->run(array('command' => 'foo'), array('decorated' => false, 'capture_stderr_separately' => true));
623
+ $this->assertStringEqualsFile(self::$fixturesPath.'/application_renderexception_doublewidth1.txt', $tester->getErrorOutput(true), '->renderException() renders a pretty exceptions with previous exceptions');
624
+
625
+ $tester->run(array('command' => 'foo'), array('decorated' => true, 'capture_stderr_separately' => true));
626
+ $this->assertStringEqualsFile(self::$fixturesPath.'/application_renderexception_doublewidth1decorated.txt', $tester->getErrorOutput(true), '->renderException() renders a pretty exceptions with previous exceptions');
627
+
628
+ $application = new Application();
629
+ $application->setAutoExit(false);
630
+ putenv('COLUMNS=32');
631
+ $application->register('foo')->setCode(function () {
632
+ throw new \Exception('コマンドの実行中にエラーが発生しました。');
633
+ });
634
+ $tester = new ApplicationTester($application);
635
+ $tester->run(array('command' => 'foo'), array('decorated' => false, 'capture_stderr_separately' => true));
636
+ $this->assertStringEqualsFile(self::$fixturesPath.'/application_renderexception_doublewidth2.txt', $tester->getErrorOutput(true), '->renderException() wraps messages when they are bigger than the terminal');
637
+ putenv('COLUMNS=120');
638
+ }
639
+
640
+ public function testRenderExceptionEscapesLines()
641
+ {
642
+ $application = new Application();
643
+ $application->setAutoExit(false);
644
+ putenv('COLUMNS=22');
645
+ $application->register('foo')->setCode(function () {
646
+ throw new \Exception('dont break here <info>!</info>');
647
+ });
648
+ $tester = new ApplicationTester($application);
649
+
650
+ $tester->run(array('command' => 'foo'), array('decorated' => false));
651
+ $this->assertStringEqualsFile(self::$fixturesPath.'/application_renderexception_escapeslines.txt', $tester->getDisplay(true), '->renderException() escapes lines containing formatting');
652
+ putenv('COLUMNS=120');
653
+ }
654
+
655
+ public function testRenderExceptionLineBreaks()
656
+ {
657
+ $application = $this->getMockBuilder('Symfony\Component\Console\Application')->setMethods(array('getTerminalWidth'))->getMock();
658
+ $application->setAutoExit(false);
659
+ $application->expects($this->any())
660
+ ->method('getTerminalWidth')
661
+ ->will($this->returnValue(120));
662
+ $application->register('foo')->setCode(function () {
663
+ throw new \InvalidArgumentException("\n\nline 1 with extra spaces \nline 2\n\nline 4\n");
664
+ });
665
+ $tester = new ApplicationTester($application);
666
+
667
+ $tester->run(array('command' => 'foo'), array('decorated' => false));
668
+ $this->assertStringEqualsFile(self::$fixturesPath.'/application_renderexception_linebreaks.txt', $tester->getDisplay(true), '->renderException() keep multiple line breaks');
669
+ }
670
+
671
+ public function testRun()
672
+ {
673
+ $application = new Application();
674
+ $application->setAutoExit(false);
675
+ $application->setCatchExceptions(false);
676
+ $application->add($command = new \Foo1Command());
677
+ $_SERVER['argv'] = array('cli.php', 'foo:bar1');
678
+
679
+ ob_start();
680
+ $application->run();
681
+ ob_end_clean();
682
+
683
+ $this->assertInstanceOf('Symfony\Component\Console\Input\ArgvInput', $command->input, '->run() creates an ArgvInput by default if none is given');
684
+ $this->assertInstanceOf('Symfony\Component\Console\Output\ConsoleOutput', $command->output, '->run() creates a ConsoleOutput by default if none is given');
685
+
686
+ $application = new Application();
687
+ $application->setAutoExit(false);
688
+ $application->setCatchExceptions(false);
689
+
690
+ $this->ensureStaticCommandHelp($application);
691
+ $tester = new ApplicationTester($application);
692
+
693
+ $tester->run(array(), array('decorated' => false));
694
+ $this->assertStringEqualsFile(self::$fixturesPath.'/application_run1.txt', $tester->getDisplay(true), '->run() runs the list command if no argument is passed');
695
+
696
+ $tester->run(array('--help' => true), array('decorated' => false));
697
+ $this->assertStringEqualsFile(self::$fixturesPath.'/application_run2.txt', $tester->getDisplay(true), '->run() runs the help command if --help is passed');
698
+
699
+ $tester->run(array('-h' => true), array('decorated' => false));
700
+ $this->assertStringEqualsFile(self::$fixturesPath.'/application_run2.txt', $tester->getDisplay(true), '->run() runs the help command if -h is passed');
701
+
702
+ $tester->run(array('command' => 'list', '--help' => true), array('decorated' => false));
703
+ $this->assertStringEqualsFile(self::$fixturesPath.'/application_run3.txt', $tester->getDisplay(true), '->run() displays the help if --help is passed');
704
+
705
+ $tester->run(array('command' => 'list', '-h' => true), array('decorated' => false));
706
+ $this->assertStringEqualsFile(self::$fixturesPath.'/application_run3.txt', $tester->getDisplay(true), '->run() displays the help if -h is passed');
707
+
708
+ $tester->run(array('--ansi' => true));
709
+ $this->assertTrue($tester->getOutput()->isDecorated(), '->run() forces color output if --ansi is passed');
710
+
711
+ $tester->run(array('--no-ansi' => true));
712
+ $this->assertFalse($tester->getOutput()->isDecorated(), '->run() forces color output to be disabled if --no-ansi is passed');
713
+
714
+ $tester->run(array('--version' => true), array('decorated' => false));
715
+ $this->assertStringEqualsFile(self::$fixturesPath.'/application_run4.txt', $tester->getDisplay(true), '->run() displays the program version if --version is passed');
716
+
717
+ $tester->run(array('-V' => true), array('decorated' => false));
718
+ $this->assertStringEqualsFile(self::$fixturesPath.'/application_run4.txt', $tester->getDisplay(true), '->run() displays the program version if -v is passed');
719
+
720
+ $tester->run(array('command' => 'list', '--quiet' => true));
721
+ $this->assertSame('', $tester->getDisplay(), '->run() removes all output if --quiet is passed');
722
+ $this->assertFalse($tester->getInput()->isInteractive(), '->run() sets off the interactive mode if --quiet is passed');
723
+
724
+ $tester->run(array('command' => 'list', '-q' => true));
725
+ $this->assertSame('', $tester->getDisplay(), '->run() removes all output if -q is passed');
726
+ $this->assertFalse($tester->getInput()->isInteractive(), '->run() sets off the interactive mode if -q is passed');
727
+
728
+ $tester->run(array('command' => 'list', '--verbose' => true));
729
+ $this->assertSame(Output::VERBOSITY_VERBOSE, $tester->getOutput()->getVerbosity(), '->run() sets the output to verbose if --verbose is passed');
730
+
731
+ $tester->run(array('command' => 'list', '--verbose' => 1));
732
+ $this->assertSame(Output::VERBOSITY_VERBOSE, $tester->getOutput()->getVerbosity(), '->run() sets the output to verbose if --verbose=1 is passed');
733
+
734
+ $tester->run(array('command' => 'list', '--verbose' => 2));
735
+ $this->assertSame(Output::VERBOSITY_VERY_VERBOSE, $tester->getOutput()->getVerbosity(), '->run() sets the output to very verbose if --verbose=2 is passed');
736
+
737
+ $tester->run(array('command' => 'list', '--verbose' => 3));
738
+ $this->assertSame(Output::VERBOSITY_DEBUG, $tester->getOutput()->getVerbosity(), '->run() sets the output to debug if --verbose=3 is passed');
739
+
740
+ $tester->run(array('command' => 'list', '--verbose' => 4));
741
+ $this->assertSame(Output::VERBOSITY_VERBOSE, $tester->getOutput()->getVerbosity(), '->run() sets the output to verbose if unknown --verbose level is passed');
742
+
743
+ $tester->run(array('command' => 'list', '-v' => true));
744
+ $this->assertSame(Output::VERBOSITY_VERBOSE, $tester->getOutput()->getVerbosity(), '->run() sets the output to verbose if -v is passed');
745
+
746
+ $tester->run(array('command' => 'list', '-vv' => true));
747
+ $this->assertSame(Output::VERBOSITY_VERY_VERBOSE, $tester->getOutput()->getVerbosity(), '->run() sets the output to verbose if -v is passed');
748
+
749
+ $tester->run(array('command' => 'list', '-vvv' => true));
750
+ $this->assertSame(Output::VERBOSITY_DEBUG, $tester->getOutput()->getVerbosity(), '->run() sets the output to verbose if -v is passed');
751
+
752
+ $application = new Application();
753
+ $application->setAutoExit(false);
754
+ $application->setCatchExceptions(false);
755
+ $application->add(new \FooCommand());
756
+ $tester = new ApplicationTester($application);
757
+
758
+ $tester->run(array('command' => 'foo:bar', '--no-interaction' => true), array('decorated' => false));
759
+ $this->assertSame('called'.PHP_EOL, $tester->getDisplay(), '->run() does not call interact() if --no-interaction is passed');
760
+
761
+ $tester->run(array('command' => 'foo:bar', '-n' => true), array('decorated' => false));
762
+ $this->assertSame('called'.PHP_EOL, $tester->getDisplay(), '->run() does not call interact() if -n is passed');
763
+ }
764
+
765
+ /**
766
+ * Issue #9285.
767
+ *
768
+ * If the "verbose" option is just before an argument in ArgvInput,
769
+ * an argument value should not be treated as verbosity value.
770
+ * This test will fail with "Not enough arguments." if broken
771
+ */
772
+ public function testVerboseValueNotBreakArguments()
773
+ {
774
+ $application = new Application();
775
+ $application->setAutoExit(false);
776
+ $application->setCatchExceptions(false);
777
+ $application->add(new \FooCommand());
778
+
779
+ $output = new StreamOutput(fopen('php://memory', 'w', false));
780
+
781
+ $input = new ArgvInput(array('cli.php', '-v', 'foo:bar'));
782
+ $application->run($input, $output);
783
+
784
+ $this->addToAssertionCount(1);
785
+
786
+ $input = new ArgvInput(array('cli.php', '--verbose', 'foo:bar'));
787
+ $application->run($input, $output);
788
+
789
+ $this->addToAssertionCount(1);
790
+ }
791
+
792
+ public function testRunReturnsIntegerExitCode()
793
+ {
794
+ $exception = new \Exception('', 4);
795
+
796
+ $application = $this->getMockBuilder('Symfony\Component\Console\Application')->setMethods(array('doRun'))->getMock();
797
+ $application->setAutoExit(false);
798
+ $application->expects($this->once())
799
+ ->method('doRun')
800
+ ->will($this->throwException($exception));
801
+
802
+ $exitCode = $application->run(new ArrayInput(array()), new NullOutput());
803
+
804
+ $this->assertSame(4, $exitCode, '->run() returns integer exit code extracted from raised exception');
805
+ }
806
+
807
+ public function testRunReturnsExitCodeOneForExceptionCodeZero()
808
+ {
809
+ $exception = new \Exception('', 0);
810
+
811
+ $application = $this->getMockBuilder('Symfony\Component\Console\Application')->setMethods(array('doRun'))->getMock();
812
+ $application->setAutoExit(false);
813
+ $application->expects($this->once())
814
+ ->method('doRun')
815
+ ->will($this->throwException($exception));
816
+
817
+ $exitCode = $application->run(new ArrayInput(array()), new NullOutput());
818
+
819
+ $this->assertSame(1, $exitCode, '->run() returns exit code 1 when exception code is 0');
820
+ }
821
+
822
+ /**
823
+ * @expectedException \LogicException
824
+ * @expectedExceptionMessage An option with shortcut "e" already exists.
825
+ */
826
+ public function testAddingOptionWithDuplicateShortcut()
827
+ {
828
+ $dispatcher = new EventDispatcher();
829
+ $application = new Application();
830
+ $application->setAutoExit(false);
831
+ $application->setCatchExceptions(false);
832
+ $application->setDispatcher($dispatcher);
833
+
834
+ $application->getDefinition()->addOption(new InputOption('--env', '-e', InputOption::VALUE_REQUIRED, 'Environment'));
835
+
836
+ $application
837
+ ->register('foo')
838
+ ->setAliases(array('f'))
839
+ ->setDefinition(array(new InputOption('survey', 'e', InputOption::VALUE_REQUIRED, 'My option with a shortcut.')))
840
+ ->setCode(function (InputInterface $input, OutputInterface $output) {})
841
+ ;
842
+
843
+ $input = new ArrayInput(array('command' => 'foo'));
844
+ $output = new NullOutput();
845
+
846
+ $application->run($input, $output);
847
+ }
848
+
849
+ /**
850
+ * @expectedException \LogicException
851
+ * @dataProvider getAddingAlreadySetDefinitionElementData
852
+ */
853
+ public function testAddingAlreadySetDefinitionElementData($def)
854
+ {
855
+ $application = new Application();
856
+ $application->setAutoExit(false);
857
+ $application->setCatchExceptions(false);
858
+ $application
859
+ ->register('foo')
860
+ ->setDefinition(array($def))
861
+ ->setCode(function (InputInterface $input, OutputInterface $output) {})
862
+ ;
863
+
864
+ $input = new ArrayInput(array('command' => 'foo'));
865
+ $output = new NullOutput();
866
+ $application->run($input, $output);
867
+ }
868
+
869
+ public function getAddingAlreadySetDefinitionElementData()
870
+ {
871
+ return array(
872
+ array(new InputArgument('command', InputArgument::REQUIRED)),
873
+ array(new InputOption('quiet', '', InputOption::VALUE_NONE)),
874
+ array(new InputOption('query', 'q', InputOption::VALUE_NONE)),
875
+ );
876
+ }
877
+
878
+ public function testGetDefaultHelperSetReturnsDefaultValues()
879
+ {
880
+ $application = new Application();
881
+ $application->setAutoExit(false);
882
+ $application->setCatchExceptions(false);
883
+
884
+ $helperSet = $application->getHelperSet();
885
+
886
+ $this->assertTrue($helperSet->has('formatter'));
887
+ }
888
+
889
+ public function testAddingSingleHelperSetOverwritesDefaultValues()
890
+ {
891
+ $application = new Application();
892
+ $application->setAutoExit(false);
893
+ $application->setCatchExceptions(false);
894
+
895
+ $application->setHelperSet(new HelperSet(array(new FormatterHelper())));
896
+
897
+ $helperSet = $application->getHelperSet();
898
+
899
+ $this->assertTrue($helperSet->has('formatter'));
900
+
901
+ // no other default helper set should be returned
902
+ $this->assertFalse($helperSet->has('dialog'));
903
+ $this->assertFalse($helperSet->has('progress'));
904
+ }
905
+
906
+ public function testOverwritingDefaultHelperSetOverwritesDefaultValues()
907
+ {
908
+ $application = new CustomApplication();
909
+ $application->setAutoExit(false);
910
+ $application->setCatchExceptions(false);
911
+
912
+ $application->setHelperSet(new HelperSet(array(new FormatterHelper())));
913
+
914
+ $helperSet = $application->getHelperSet();
915
+
916
+ $this->assertTrue($helperSet->has('formatter'));
917
+
918
+ // no other default helper set should be returned
919
+ $this->assertFalse($helperSet->has('dialog'));
920
+ $this->assertFalse($helperSet->has('progress'));
921
+ }
922
+
923
+ public function testGetDefaultInputDefinitionReturnsDefaultValues()
924
+ {
925
+ $application = new Application();
926
+ $application->setAutoExit(false);
927
+ $application->setCatchExceptions(false);
928
+
929
+ $inputDefinition = $application->getDefinition();
930
+
931
+ $this->assertTrue($inputDefinition->hasArgument('command'));
932
+
933
+ $this->assertTrue($inputDefinition->hasOption('help'));
934
+ $this->assertTrue($inputDefinition->hasOption('quiet'));
935
+ $this->assertTrue($inputDefinition->hasOption('verbose'));
936
+ $this->assertTrue($inputDefinition->hasOption('version'));
937
+ $this->assertTrue($inputDefinition->hasOption('ansi'));
938
+ $this->assertTrue($inputDefinition->hasOption('no-ansi'));
939
+ $this->assertTrue($inputDefinition->hasOption('no-interaction'));
940
+ }
941
+
942
+ public function testOverwritingDefaultInputDefinitionOverwritesDefaultValues()
943
+ {
944
+ $application = new CustomApplication();
945
+ $application->setAutoExit(false);
946
+ $application->setCatchExceptions(false);
947
+
948
+ $inputDefinition = $application->getDefinition();
949
+
950
+ // check whether the default arguments and options are not returned any more
951
+ $this->assertFalse($inputDefinition->hasArgument('command'));
952
+
953
+ $this->assertFalse($inputDefinition->hasOption('help'));
954
+ $this->assertFalse($inputDefinition->hasOption('quiet'));
955
+ $this->assertFalse($inputDefinition->hasOption('verbose'));
956
+ $this->assertFalse($inputDefinition->hasOption('version'));
957
+ $this->assertFalse($inputDefinition->hasOption('ansi'));
958
+ $this->assertFalse($inputDefinition->hasOption('no-ansi'));
959
+ $this->assertFalse($inputDefinition->hasOption('no-interaction'));
960
+
961
+ $this->assertTrue($inputDefinition->hasOption('custom'));
962
+ }
963
+
964
+ public function testSettingCustomInputDefinitionOverwritesDefaultValues()
965
+ {
966
+ $application = new Application();
967
+ $application->setAutoExit(false);
968
+ $application->setCatchExceptions(false);
969
+
970
+ $application->setDefinition(new InputDefinition(array(new InputOption('--custom', '-c', InputOption::VALUE_NONE, 'Set the custom input definition.'))));
971
+
972
+ $inputDefinition = $application->getDefinition();
973
+
974
+ // check whether the default arguments and options are not returned any more
975
+ $this->assertFalse($inputDefinition->hasArgument('command'));
976
+
977
+ $this->assertFalse($inputDefinition->hasOption('help'));
978
+ $this->assertFalse($inputDefinition->hasOption('quiet'));
979
+ $this->assertFalse($inputDefinition->hasOption('verbose'));
980
+ $this->assertFalse($inputDefinition->hasOption('version'));
981
+ $this->assertFalse($inputDefinition->hasOption('ansi'));
982
+ $this->assertFalse($inputDefinition->hasOption('no-ansi'));
983
+ $this->assertFalse($inputDefinition->hasOption('no-interaction'));
984
+
985
+ $this->assertTrue($inputDefinition->hasOption('custom'));
986
+ }
987
+
988
+ public function testRunWithDispatcher()
989
+ {
990
+ $application = new Application();
991
+ $application->setAutoExit(false);
992
+ $application->setDispatcher($this->getDispatcher());
993
+
994
+ $application->register('foo')->setCode(function (InputInterface $input, OutputInterface $output) {
995
+ $output->write('foo.');
996
+ });
997
+
998
+ $tester = new ApplicationTester($application);
999
+ $tester->run(array('command' => 'foo'));
1000
+ $this->assertEquals('before.foo.after.'.PHP_EOL, $tester->getDisplay());
1001
+ }
1002
+
1003
+ /**
1004
+ * @expectedException \LogicException
1005
+ * @expectedExceptionMessage error
1006
+ */
1007
+ public function testRunWithExceptionAndDispatcher()
1008
+ {
1009
+ $application = new Application();
1010
+ $application->setDispatcher($this->getDispatcher());
1011
+ $application->setAutoExit(false);
1012
+ $application->setCatchExceptions(false);
1013
+
1014
+ $application->register('foo')->setCode(function (InputInterface $input, OutputInterface $output) {
1015
+ throw new \RuntimeException('foo');
1016
+ });
1017
+
1018
+ $tester = new ApplicationTester($application);
1019
+ $tester->run(array('command' => 'foo'));
1020
+ }
1021
+
1022
+ public function testRunDispatchesAllEventsWithException()
1023
+ {
1024
+ $application = new Application();
1025
+ $application->setDispatcher($this->getDispatcher());
1026
+ $application->setAutoExit(false);
1027
+
1028
+ $application->register('foo')->setCode(function (InputInterface $input, OutputInterface $output) {
1029
+ $output->write('foo.');
1030
+
1031
+ throw new \RuntimeException('foo');
1032
+ });
1033
+
1034
+ $tester = new ApplicationTester($application);
1035
+ $tester->run(array('command' => 'foo'));
1036
+ $this->assertContains('before.foo.error.after.', $tester->getDisplay());
1037
+ }
1038
+
1039
+ public function testRunDispatchesAllEventsWithExceptionInListener()
1040
+ {
1041
+ $dispatcher = $this->getDispatcher();
1042
+ $dispatcher->addListener('console.command', function () {
1043
+ throw new \RuntimeException('foo');
1044
+ });
1045
+
1046
+ $application = new Application();
1047
+ $application->setDispatcher($dispatcher);
1048
+ $application->setAutoExit(false);
1049
+
1050
+ $application->register('foo')->setCode(function (InputInterface $input, OutputInterface $output) {
1051
+ $output->write('foo.');
1052
+ });
1053
+
1054
+ $tester = new ApplicationTester($application);
1055
+ $tester->run(array('command' => 'foo'));
1056
+ $this->assertContains('before.error.after.', $tester->getDisplay());
1057
+ }
1058
+
1059
+ /**
1060
+ * @requires PHP 7
1061
+ */
1062
+ public function testRunWithError()
1063
+ {
1064
+ $application = new Application();
1065
+ $application->setAutoExit(false);
1066
+ $application->setCatchExceptions(false);
1067
+
1068
+ $application->register('dym')->setCode(function (InputInterface $input, OutputInterface $output) {
1069
+ $output->write('dym.');
1070
+
1071
+ throw new \Error('dymerr');
1072
+ });
1073
+
1074
+ $tester = new ApplicationTester($application);
1075
+
1076
+ try {
1077
+ $tester->run(array('command' => 'dym'));
1078
+ $this->fail('Error expected.');
1079
+ } catch (\Error $e) {
1080
+ $this->assertSame('dymerr', $e->getMessage());
1081
+ }
1082
+ }
1083
+
1084
+ public function testRunAllowsErrorListenersToSilenceTheException()
1085
+ {
1086
+ $dispatcher = $this->getDispatcher();
1087
+ $dispatcher->addListener('console.error', function (ConsoleErrorEvent $event) {
1088
+ $event->getOutput()->write('silenced.');
1089
+
1090
+ $event->setExitCode(0);
1091
+ });
1092
+
1093
+ $dispatcher->addListener('console.command', function () {
1094
+ throw new \RuntimeException('foo');
1095
+ });
1096
+
1097
+ $application = new Application();
1098
+ $application->setDispatcher($dispatcher);
1099
+ $application->setAutoExit(false);
1100
+
1101
+ $application->register('foo')->setCode(function (InputInterface $input, OutputInterface $output) {
1102
+ $output->write('foo.');
1103
+ });
1104
+
1105
+ $tester = new ApplicationTester($application);
1106
+ $tester->run(array('command' => 'foo'));
1107
+ $this->assertContains('before.error.silenced.after.', $tester->getDisplay());
1108
+ $this->assertEquals(ConsoleCommandEvent::RETURN_CODE_DISABLED, $tester->getStatusCode());
1109
+ }
1110
+
1111
+ public function testConsoleErrorEventIsTriggeredOnCommandNotFound()
1112
+ {
1113
+ $dispatcher = new EventDispatcher();
1114
+ $dispatcher->addListener('console.error', function (ConsoleErrorEvent $event) {
1115
+ $this->assertNull($event->getCommand());
1116
+ $this->assertInstanceOf(CommandNotFoundException::class, $event->getError());
1117
+ $event->getOutput()->write('silenced command not found');
1118
+ });
1119
+
1120
+ $application = new Application();
1121
+ $application->setDispatcher($dispatcher);
1122
+ $application->setAutoExit(false);
1123
+
1124
+ $tester = new ApplicationTester($application);
1125
+ $tester->run(array('command' => 'unknown'));
1126
+ $this->assertContains('silenced command not found', $tester->getDisplay());
1127
+ $this->assertEquals(1, $tester->getStatusCode());
1128
+ }
1129
+
1130
+ /**
1131
+ * @group legacy
1132
+ * @expectedDeprecation The "ConsoleEvents::EXCEPTION" event is deprecated since Symfony 3.3 and will be removed in 4.0. Listen to the "ConsoleEvents::ERROR" event instead.
1133
+ */
1134
+ public function testLegacyExceptionListenersAreStillTriggered()
1135
+ {
1136
+ $dispatcher = $this->getDispatcher();
1137
+ $dispatcher->addListener('console.exception', function (ConsoleExceptionEvent $event) {
1138
+ $event->getOutput()->write('caught.');
1139
+
1140
+ $event->setException(new \RuntimeException('replaced in caught.'));
1141
+ });
1142
+
1143
+ $application = new Application();
1144
+ $application->setDispatcher($dispatcher);
1145
+ $application->setAutoExit(false);
1146
+
1147
+ $application->register('foo')->setCode(function (InputInterface $input, OutputInterface $output) {
1148
+ throw new \RuntimeException('foo');
1149
+ });
1150
+
1151
+ $tester = new ApplicationTester($application);
1152
+ $tester->run(array('command' => 'foo'));
1153
+ $this->assertContains('before.caught.error.after.', $tester->getDisplay());
1154
+ $this->assertContains('replaced in caught.', $tester->getDisplay());
1155
+ }
1156
+
1157
+ /**
1158
+ * @requires PHP 7
1159
+ */
1160
+ public function testErrorIsRethrownIfNotHandledByConsoleErrorEvent()
1161
+ {
1162
+ $application = new Application();
1163
+ $application->setAutoExit(false);
1164
+ $application->setCatchExceptions(false);
1165
+ $application->setDispatcher(new EventDispatcher());
1166
+
1167
+ $application->register('dym')->setCode(function (InputInterface $input, OutputInterface $output) {
1168
+ new \UnknownClass();
1169
+ });
1170
+
1171
+ $tester = new ApplicationTester($application);
1172
+
1173
+ try {
1174
+ $tester->run(array('command' => 'dym'));
1175
+ $this->fail('->run() should rethrow PHP errors if not handled via ConsoleErrorEvent.');
1176
+ } catch (\Error $e) {
1177
+ $this->assertSame($e->getMessage(), 'Class \'UnknownClass\' not found');
1178
+ }
1179
+ }
1180
+
1181
+ /**
1182
+ * @requires PHP 7
1183
+ * @expectedException \LogicException
1184
+ * @expectedExceptionMessage error
1185
+ */
1186
+ public function testRunWithErrorAndDispatcher()
1187
+ {
1188
+ $application = new Application();
1189
+ $application->setDispatcher($this->getDispatcher());
1190
+ $application->setAutoExit(false);
1191
+ $application->setCatchExceptions(false);
1192
+
1193
+ $application->register('dym')->setCode(function (InputInterface $input, OutputInterface $output) {
1194
+ $output->write('dym.');
1195
+
1196
+ throw new \Error('dymerr');
1197
+ });
1198
+
1199
+ $tester = new ApplicationTester($application);
1200
+ $tester->run(array('command' => 'dym'));
1201
+ $this->assertContains('before.dym.error.after.', $tester->getDisplay(), 'The PHP Error did not dispached events');
1202
+ }
1203
+
1204
+ /**
1205
+ * @requires PHP 7
1206
+ */
1207
+ public function testRunDispatchesAllEventsWithError()
1208
+ {
1209
+ $application = new Application();
1210
+ $application->setDispatcher($this->getDispatcher());
1211
+ $application->setAutoExit(false);
1212
+
1213
+ $application->register('dym')->setCode(function (InputInterface $input, OutputInterface $output) {
1214
+ $output->write('dym.');
1215
+
1216
+ throw new \Error('dymerr');
1217
+ });
1218
+
1219
+ $tester = new ApplicationTester($application);
1220
+ $tester->run(array('command' => 'dym'));
1221
+ $this->assertContains('before.dym.error.after.', $tester->getDisplay(), 'The PHP Error did not dispached events');
1222
+ }
1223
+
1224
+ /**
1225
+ * @requires PHP 7
1226
+ */
1227
+ public function testRunWithErrorFailingStatusCode()
1228
+ {
1229
+ $application = new Application();
1230
+ $application->setDispatcher($this->getDispatcher());
1231
+ $application->setAutoExit(false);
1232
+
1233
+ $application->register('dus')->setCode(function (InputInterface $input, OutputInterface $output) {
1234
+ $output->write('dus.');
1235
+
1236
+ throw new \Error('duserr');
1237
+ });
1238
+
1239
+ $tester = new ApplicationTester($application);
1240
+ $tester->run(array('command' => 'dus'));
1241
+ $this->assertSame(1, $tester->getStatusCode(), 'Status code should be 1');
1242
+ }
1243
+
1244
+ public function testRunWithDispatcherSkippingCommand()
1245
+ {
1246
+ $application = new Application();
1247
+ $application->setDispatcher($this->getDispatcher(true));
1248
+ $application->setAutoExit(false);
1249
+
1250
+ $application->register('foo')->setCode(function (InputInterface $input, OutputInterface $output) {
1251
+ $output->write('foo.');
1252
+ });
1253
+
1254
+ $tester = new ApplicationTester($application);
1255
+ $exitCode = $tester->run(array('command' => 'foo'));
1256
+ $this->assertContains('before.after.', $tester->getDisplay());
1257
+ $this->assertEquals(ConsoleCommandEvent::RETURN_CODE_DISABLED, $exitCode);
1258
+ }
1259
+
1260
+ public function testRunWithDispatcherAccessingInputOptions()
1261
+ {
1262
+ $noInteractionValue = null;
1263
+ $quietValue = null;
1264
+
1265
+ $dispatcher = $this->getDispatcher();
1266
+ $dispatcher->addListener('console.command', function (ConsoleCommandEvent $event) use (&$noInteractionValue, &$quietValue) {
1267
+ $input = $event->getInput();
1268
+
1269
+ $noInteractionValue = $input->getOption('no-interaction');
1270
+ $quietValue = $input->getOption('quiet');
1271
+ });
1272
+
1273
+ $application = new Application();
1274
+ $application->setDispatcher($dispatcher);
1275
+ $application->setAutoExit(false);
1276
+
1277
+ $application->register('foo')->setCode(function (InputInterface $input, OutputInterface $output) {
1278
+ $output->write('foo.');
1279
+ });
1280
+
1281
+ $tester = new ApplicationTester($application);
1282
+ $tester->run(array('command' => 'foo', '--no-interaction' => true));
1283
+
1284
+ $this->assertTrue($noInteractionValue);
1285
+ $this->assertFalse($quietValue);
1286
+ }
1287
+
1288
+ public function testRunWithDispatcherAddingInputOptions()
1289
+ {
1290
+ $extraValue = null;
1291
+
1292
+ $dispatcher = $this->getDispatcher();
1293
+ $dispatcher->addListener('console.command', function (ConsoleCommandEvent $event) use (&$extraValue) {
1294
+ $definition = $event->getCommand()->getDefinition();
1295
+ $input = $event->getInput();
1296
+
1297
+ $definition->addOption(new InputOption('extra', null, InputOption::VALUE_REQUIRED));
1298
+ $input->bind($definition);
1299
+
1300
+ $extraValue = $input->getOption('extra');
1301
+ });
1302
+
1303
+ $application = new Application();
1304
+ $application->setDispatcher($dispatcher);
1305
+ $application->setAutoExit(false);
1306
+
1307
+ $application->register('foo')->setCode(function (InputInterface $input, OutputInterface $output) {
1308
+ $output->write('foo.');
1309
+ });
1310
+
1311
+ $tester = new ApplicationTester($application);
1312
+ $tester->run(array('command' => 'foo', '--extra' => 'some test value'));
1313
+
1314
+ $this->assertEquals('some test value', $extraValue);
1315
+ }
1316
+
1317
+ /**
1318
+ * @group legacy
1319
+ */
1320
+ public function testTerminalDimensions()
1321
+ {
1322
+ $application = new Application();
1323
+ $originalDimensions = $application->getTerminalDimensions();
1324
+ $this->assertCount(2, $originalDimensions);
1325
+
1326
+ $width = 80;
1327
+ if ($originalDimensions[0] == $width) {
1328
+ $width = 100;
1329
+ }
1330
+
1331
+ $application->setTerminalDimensions($width, 80);
1332
+ $this->assertSame(array($width, 80), $application->getTerminalDimensions());
1333
+ }
1334
+
1335
+ public function testSetRunCustomDefaultCommand()
1336
+ {
1337
+ $command = new \FooCommand();
1338
+
1339
+ $application = new Application();
1340
+ $application->setAutoExit(false);
1341
+ $application->add($command);
1342
+ $application->setDefaultCommand($command->getName());
1343
+
1344
+ $tester = new ApplicationTester($application);
1345
+ $tester->run(array(), array('interactive' => false));
1346
+ $this->assertEquals('called'.PHP_EOL, $tester->getDisplay(), 'Application runs the default set command if different from \'list\' command');
1347
+
1348
+ $application = new CustomDefaultCommandApplication();
1349
+ $application->setAutoExit(false);
1350
+
1351
+ $tester = new ApplicationTester($application);
1352
+ $tester->run(array(), array('interactive' => false));
1353
+
1354
+ $this->assertEquals('called'.PHP_EOL, $tester->getDisplay(), 'Application runs the default set command if different from \'list\' command');
1355
+ }
1356
+
1357
+ public function testSetRunCustomDefaultCommandWithOption()
1358
+ {
1359
+ $command = new \FooOptCommand();
1360
+
1361
+ $application = new Application();
1362
+ $application->setAutoExit(false);
1363
+ $application->add($command);
1364
+ $application->setDefaultCommand($command->getName());
1365
+
1366
+ $tester = new ApplicationTester($application);
1367
+ $tester->run(array('--fooopt' => 'opt'), array('interactive' => false));
1368
+
1369
+ $this->assertEquals('called'.PHP_EOL.'opt'.PHP_EOL, $tester->getDisplay(), 'Application runs the default set command if different from \'list\' command');
1370
+ }
1371
+
1372
+ public function testSetRunCustomSingleCommand()
1373
+ {
1374
+ $command = new \FooCommand();
1375
+
1376
+ $application = new Application();
1377
+ $application->setAutoExit(false);
1378
+ $application->add($command);
1379
+ $application->setDefaultCommand($command->getName(), true);
1380
+
1381
+ $tester = new ApplicationTester($application);
1382
+
1383
+ $tester->run(array());
1384
+ $this->assertContains('called', $tester->getDisplay());
1385
+
1386
+ $tester->run(array('--help' => true));
1387
+ $this->assertContains('The foo:bar command', $tester->getDisplay());
1388
+ }
1389
+
1390
+ /**
1391
+ * @requires function posix_isatty
1392
+ */
1393
+ public function testCanCheckIfTerminalIsInteractive()
1394
+ {
1395
+ $application = new CustomDefaultCommandApplication();
1396
+ $application->setAutoExit(false);
1397
+
1398
+ $tester = new ApplicationTester($application);
1399
+ $tester->run(array('command' => 'help'));
1400
+
1401
+ $this->assertFalse($tester->getInput()->hasParameterOption(array('--no-interaction', '-n')));
1402
+
1403
+ $inputStream = $tester->getInput()->getStream();
1404
+ $this->assertEquals($tester->getInput()->isInteractive(), @posix_isatty($inputStream));
1405
+ }
1406
+
1407
+ protected function getDispatcher($skipCommand = false)
1408
+ {
1409
+ $dispatcher = new EventDispatcher();
1410
+ $dispatcher->addListener('console.command', function (ConsoleCommandEvent $event) use ($skipCommand) {
1411
+ $event->getOutput()->write('before.');
1412
+
1413
+ if ($skipCommand) {
1414
+ $event->disableCommand();
1415
+ }
1416
+ });
1417
+ $dispatcher->addListener('console.terminate', function (ConsoleTerminateEvent $event) use ($skipCommand) {
1418
+ $event->getOutput()->writeln('after.');
1419
+
1420
+ if (!$skipCommand) {
1421
+ $event->setExitCode(ConsoleCommandEvent::RETURN_CODE_DISABLED);
1422
+ }
1423
+ });
1424
+ $dispatcher->addListener('console.error', function (ConsoleErrorEvent $event) {
1425
+ $event->getOutput()->write('error.');
1426
+
1427
+ $event->setError(new \LogicException('error.', $event->getExitCode(), $event->getError()));
1428
+ });
1429
+
1430
+ return $dispatcher;
1431
+ }
1432
+
1433
+ /**
1434
+ * @requires PHP 7
1435
+ */
1436
+ public function testErrorIsRethrownIfNotHandledByConsoleErrorEventWithCatchingEnabled()
1437
+ {
1438
+ $application = new Application();
1439
+ $application->setAutoExit(false);
1440
+ $application->setDispatcher(new EventDispatcher());
1441
+
1442
+ $application->register('dym')->setCode(function (InputInterface $input, OutputInterface $output) {
1443
+ new \UnknownClass();
1444
+ });
1445
+
1446
+ $tester = new ApplicationTester($application);
1447
+
1448
+ try {
1449
+ $tester->run(array('command' => 'dym'));
1450
+ $this->fail('->run() should rethrow PHP errors if not handled via ConsoleErrorEvent.');
1451
+ } catch (\Error $e) {
1452
+ $this->assertSame($e->getMessage(), 'Class \'UnknownClass\' not found');
1453
+ }
1454
+ }
1455
+ }
1456
+
1457
+ class CustomApplication extends Application
1458
+ {
1459
+ /**
1460
+ * Overwrites the default input definition.
1461
+ *
1462
+ * @return InputDefinition An InputDefinition instance
1463
+ */
1464
+ protected function getDefaultInputDefinition()
1465
+ {
1466
+ return new InputDefinition(array(new InputOption('--custom', '-c', InputOption::VALUE_NONE, 'Set the custom input definition.')));
1467
+ }
1468
+
1469
+ /**
1470
+ * Gets the default helper set with the helpers that should always be available.
1471
+ *
1472
+ * @return HelperSet A HelperSet instance
1473
+ */
1474
+ protected function getDefaultHelperSet()
1475
+ {
1476
+ return new HelperSet(array(new FormatterHelper()));
1477
+ }
1478
+ }
1479
+
1480
+ class CustomDefaultCommandApplication extends Application
1481
+ {
1482
+ /**
1483
+ * Overwrites the constructor in order to set a different default command.
1484
+ */
1485
+ public function __construct()
1486
+ {
1487
+ parent::__construct();
1488
+
1489
+ $command = new \FooCommand();
1490
+ $this->add($command);
1491
+ $this->setDefaultCommand($command->getName());
1492
+ }
1493
+ }
vendor/symfony/console/Tests/Command/CommandTest.php ADDED
@@ -0,0 +1,434 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Tests\Command;
13
+
14
+ use PHPUnit\Framework\TestCase;
15
+ use Symfony\Component\Console\Command\Command;
16
+ use Symfony\Component\Console\Helper\FormatterHelper;
17
+ use Symfony\Component\Console\Application;
18
+ use Symfony\Component\Console\Input\InputDefinition;
19
+ use Symfony\Component\Console\Input\InputArgument;
20
+ use Symfony\Component\Console\Input\InputOption;
21
+ use Symfony\Component\Console\Input\InputInterface;
22
+ use Symfony\Component\Console\Input\StringInput;
23
+ use Symfony\Component\Console\Output\OutputInterface;
24
+ use Symfony\Component\Console\Output\NullOutput;
25
+ use Symfony\Component\Console\Tester\CommandTester;
26
+
27
+ class CommandTest extends TestCase
28
+ {
29
+ protected static $fixturesPath;
30
+
31
+ public static function setUpBeforeClass()
32
+ {
33
+ self::$fixturesPath = __DIR__.'/../Fixtures/';
34
+ require_once self::$fixturesPath.'/TestCommand.php';
35
+ }
36
+
37
+ public function testConstructor()
38
+ {
39
+ $command = new Command('foo:bar');
40
+ $this->assertEquals('foo:bar', $command->getName(), '__construct() takes the command name as its first argument');
41
+ }
42
+
43
+ /**
44
+ * @expectedException \LogicException
45
+ * @expectedExceptionMessage The command defined in "Symfony\Component\Console\Command\Command" cannot have an empty name.
46
+ */
47
+ public function testCommandNameCannotBeEmpty()
48
+ {
49
+ new Command();
50
+ }
51
+
52
+ public function testSetApplication()
53
+ {
54
+ $application = new Application();
55
+ $command = new \TestCommand();
56
+ $command->setApplication($application);
57
+ $this->assertEquals($application, $command->getApplication(), '->setApplication() sets the current application');
58
+ $this->assertEquals($application->getHelperSet(), $command->getHelperSet());
59
+ }
60
+
61
+ public function testSetApplicationNull()
62
+ {
63
+ $command = new \TestCommand();
64
+ $command->setApplication(null);
65
+ $this->assertNull($command->getHelperSet());
66
+ }
67
+
68
+ public function testSetGetDefinition()
69
+ {
70
+ $command = new \TestCommand();
71
+ $ret = $command->setDefinition($definition = new InputDefinition());
72
+ $this->assertEquals($command, $ret, '->setDefinition() implements a fluent interface');
73
+ $this->assertEquals($definition, $command->getDefinition(), '->setDefinition() sets the current InputDefinition instance');
74
+ $command->setDefinition(array(new InputArgument('foo'), new InputOption('bar')));
75
+ $this->assertTrue($command->getDefinition()->hasArgument('foo'), '->setDefinition() also takes an array of InputArguments and InputOptions as an argument');
76
+ $this->assertTrue($command->getDefinition()->hasOption('bar'), '->setDefinition() also takes an array of InputArguments and InputOptions as an argument');
77
+ $command->setDefinition(new InputDefinition());
78
+ }
79
+
80
+ public function testAddArgument()
81
+ {
82
+ $command = new \TestCommand();
83
+ $ret = $command->addArgument('foo');
84
+ $this->assertEquals($command, $ret, '->addArgument() implements a fluent interface');
85
+ $this->assertTrue($command->getDefinition()->hasArgument('foo'), '->addArgument() adds an argument to the command');
86
+ }
87
+
88
+ public function testAddOption()
89
+ {
90
+ $command = new \TestCommand();
91
+ $ret = $command->addOption('foo');
92
+ $this->assertEquals($command, $ret, '->addOption() implements a fluent interface');
93
+ $this->assertTrue($command->getDefinition()->hasOption('foo'), '->addOption() adds an option to the command');
94
+ }
95
+
96
+ public function testSetHidden()
97
+ {
98
+ $command = new \TestCommand();
99
+ $command->setHidden(true);
100
+ $this->assertTrue($command->isHidden());
101
+ }
102
+
103
+ public function testGetNamespaceGetNameSetName()
104
+ {
105
+ $command = new \TestCommand();
106
+ $this->assertEquals('namespace:name', $command->getName(), '->getName() returns the command name');
107
+ $command->setName('foo');
108
+ $this->assertEquals('foo', $command->getName(), '->setName() sets the command name');
109
+
110
+ $ret = $command->setName('foobar:bar');
111
+ $this->assertEquals($command, $ret, '->setName() implements a fluent interface');
112
+ $this->assertEquals('foobar:bar', $command->getName(), '->setName() sets the command name');
113
+ }
114
+
115
+ /**
116
+ * @dataProvider provideInvalidCommandNames
117
+ */
118
+ public function testInvalidCommandNames($name)
119
+ {
120
+ if (method_exists($this, 'expectException')) {
121
+ $this->expectException('InvalidArgumentException');
122
+ $this->expectExceptionMessage(sprintf('Command name "%s" is invalid.', $name));
123
+ } else {
124
+ $this->setExpectedException('InvalidArgumentException', sprintf('Command name "%s" is invalid.', $name));
125
+ }
126
+
127
+ $command = new \TestCommand();
128
+ $command->setName($name);
129
+ }
130
+
131
+ public function provideInvalidCommandNames()
132
+ {
133
+ return array(
134
+ array(''),
135
+ array('foo:'),
136
+ );
137
+ }
138
+
139
+ public function testGetSetDescription()
140
+ {
141
+ $command = new \TestCommand();
142
+ $this->assertEquals('description', $command->getDescription(), '->getDescription() returns the description');
143
+ $ret = $command->setDescription('description1');
144
+ $this->assertEquals($command, $ret, '->setDescription() implements a fluent interface');
145
+ $this->assertEquals('description1', $command->getDescription(), '->setDescription() sets the description');
146
+ }
147
+
148
+ public function testGetSetHelp()
149
+ {
150
+ $command = new \TestCommand();
151
+ $this->assertEquals('help', $command->getHelp(), '->getHelp() returns the help');
152
+ $ret = $command->setHelp('help1');
153
+ $this->assertEquals($command, $ret, '->setHelp() implements a fluent interface');
154
+ $this->assertEquals('help1', $command->getHelp(), '->setHelp() sets the help');
155
+ $command->setHelp('');
156
+ $this->assertEquals('', $command->getHelp(), '->getHelp() does not fall back to the description');
157
+ }
158
+
159
+ public function testGetProcessedHelp()
160
+ {
161
+ $command = new \TestCommand();
162
+ $command->setHelp('The %command.name% command does... Example: php %command.full_name%.');
163
+ $this->assertContains('The namespace:name command does...', $command->getProcessedHelp(), '->getProcessedHelp() replaces %command.name% correctly');
164
+ $this->assertNotContains('%command.full_name%', $command->getProcessedHelp(), '->getProcessedHelp() replaces %command.full_name%');
165
+
166
+ $command = new \TestCommand();
167
+ $command->setHelp('');
168
+ $this->assertContains('description', $command->getProcessedHelp(), '->getProcessedHelp() falls back to the description');
169
+ }
170
+
171
+ public function testGetSetAliases()
172
+ {
173
+ $command = new \TestCommand();
174
+ $this->assertEquals(array('name'), $command->getAliases(), '->getAliases() returns the aliases');
175
+ $ret = $command->setAliases(array('name1'));
176
+ $this->assertEquals($command, $ret, '->setAliases() implements a fluent interface');
177
+ $this->assertEquals(array('name1'), $command->getAliases(), '->setAliases() sets the aliases');
178
+ }
179
+
180
+ public function testSetAliasesNull()
181
+ {
182
+ $command = new \TestCommand();
183
+ $this->{method_exists($this, $_ = 'expectException') ? $_ : 'setExpectedException'}('InvalidArgumentException');
184
+ $command->setAliases(null);
185
+ }
186
+
187
+ public function testGetSynopsis()
188
+ {
189
+ $command = new \TestCommand();
190
+ $command->addOption('foo');
191
+ $command->addArgument('bar');
192
+ $this->assertEquals('namespace:name [--foo] [--] [<bar>]', $command->getSynopsis(), '->getSynopsis() returns the synopsis');
193
+ }
194
+
195
+ public function testAddGetUsages()
196
+ {
197
+ $command = new \TestCommand();
198
+ $command->addUsage('foo1');
199
+ $command->addUsage('foo2');
200
+ $this->assertContains('namespace:name foo1', $command->getUsages());
201
+ $this->assertContains('namespace:name foo2', $command->getUsages());
202
+ }
203
+
204
+ public function testGetHelper()
205
+ {
206
+ $application = new Application();
207
+ $command = new \TestCommand();
208
+ $command->setApplication($application);
209
+ $formatterHelper = new FormatterHelper();
210
+ $this->assertEquals($formatterHelper->getName(), $command->getHelper('formatter')->getName(), '->getHelper() returns the correct helper');
211
+ }
212
+
213
+ /**
214
+ * @expectedException \LogicException
215
+ * @expectedExceptionMessage Cannot retrieve helper "formatter" because there is no HelperSet defined.
216
+ */
217
+ public function testGetHelperWithoutHelperSet()
218
+ {
219
+ $command = new \TestCommand();
220
+ $command->getHelper('formatter');
221
+ }
222
+
223
+ public function testMergeApplicationDefinition()
224
+ {
225
+ $application1 = new Application();
226
+ $application1->getDefinition()->addArguments(array(new InputArgument('foo')));
227
+ $application1->getDefinition()->addOptions(array(new InputOption('bar')));
228
+ $command = new \TestCommand();
229
+ $command->setApplication($application1);
230
+ $command->setDefinition($definition = new InputDefinition(array(new InputArgument('bar'), new InputOption('foo'))));
231
+
232
+ $r = new \ReflectionObject($command);
233
+ $m = $r->getMethod('mergeApplicationDefinition');
234
+ $m->setAccessible(true);
235
+ $m->invoke($command);
236
+ $this->assertTrue($command->getDefinition()->hasArgument('foo'), '->mergeApplicationDefinition() merges the application arguments and the command arguments');
237
+ $this->assertTrue($command->getDefinition()->hasArgument('bar'), '->mergeApplicationDefinition() merges the application arguments and the command arguments');
238
+ $this->assertTrue($command->getDefinition()->hasOption('foo'), '->mergeApplicationDefinition() merges the application options and the command options');
239
+ $this->assertTrue($command->getDefinition()->hasOption('bar'), '->mergeApplicationDefinition() merges the application options and the command options');
240
+
241
+ $m->invoke($command);
242
+ $this->assertEquals(3, $command->getDefinition()->getArgumentCount(), '->mergeApplicationDefinition() does not try to merge twice the application arguments and options');
243
+ }
244
+
245
+ public function testMergeApplicationDefinitionWithoutArgsThenWithArgsAddsArgs()
246
+ {
247
+ $application1 = new Application();
248
+ $application1->getDefinition()->addArguments(array(new InputArgument('foo')));
249
+ $application1->getDefinition()->addOptions(array(new InputOption('bar')));
250
+ $command = new \TestCommand();
251
+ $command->setApplication($application1);
252
+ $command->setDefinition($definition = new InputDefinition(array()));
253
+
254
+ $r = new \ReflectionObject($command);
255
+ $m = $r->getMethod('mergeApplicationDefinition');
256
+ $m->setAccessible(true);
257
+ $m->invoke($command, false);
258
+ $this->assertTrue($command->getDefinition()->hasOption('bar'), '->mergeApplicationDefinition(false) merges the application and the command options');
259
+ $this->assertFalse($command->getDefinition()->hasArgument('foo'), '->mergeApplicationDefinition(false) does not merge the application arguments');
260
+
261
+ $m->invoke($command, true);
262
+ $this->assertTrue($command->getDefinition()->hasArgument('foo'), '->mergeApplicationDefinition(true) merges the application arguments and the command arguments');
263
+
264
+ $m->invoke($command);
265
+ $this->assertEquals(2, $command->getDefinition()->getArgumentCount(), '->mergeApplicationDefinition() does not try to merge twice the application arguments');
266
+ }
267
+
268
+ public function testRunInteractive()
269
+ {
270
+ $tester = new CommandTester(new \TestCommand());
271
+
272
+ $tester->execute(array(), array('interactive' => true));
273
+
274
+ $this->assertEquals('interact called'.PHP_EOL.'execute called'.PHP_EOL, $tester->getDisplay(), '->run() calls the interact() method if the input is interactive');
275
+ }
276
+
277
+ public function testRunNonInteractive()
278
+ {
279
+ $tester = new CommandTester(new \TestCommand());
280
+
281
+ $tester->execute(array(), array('interactive' => false));
282
+
283
+ $this->assertEquals('execute called'.PHP_EOL, $tester->getDisplay(), '->run() does not call the interact() method if the input is not interactive');
284
+ }
285
+
286
+ /**
287
+ * @expectedException \LogicException
288
+ * @expectedExceptionMessage You must override the execute() method in the concrete command class.
289
+ */
290
+ public function testExecuteMethodNeedsToBeOverridden()
291
+ {
292
+ $command = new Command('foo');
293
+ $command->run(new StringInput(''), new NullOutput());
294
+ }
295
+
296
+ /**
297
+ * @expectedException \Symfony\Component\Console\Exception\InvalidOptionException
298
+ * @expectedExceptionMessage The "--bar" option does not exist.
299
+ */
300
+ public function testRunWithInvalidOption()
301
+ {
302
+ $command = new \TestCommand();
303
+ $tester = new CommandTester($command);
304
+ $tester->execute(array('--bar' => true));
305
+ }
306
+
307
+ public function testRunReturnsIntegerExitCode()
308
+ {
309
+ $command = new \TestCommand();
310
+ $exitCode = $command->run(new StringInput(''), new NullOutput());
311
+ $this->assertSame(0, $exitCode, '->run() returns integer exit code (treats null as 0)');
312
+
313
+ $command = $this->getMockBuilder('TestCommand')->setMethods(array('execute'))->getMock();
314
+ $command->expects($this->once())
315
+ ->method('execute')
316
+ ->will($this->returnValue('2.3'));
317
+ $exitCode = $command->run(new StringInput(''), new NullOutput());
318
+ $this->assertSame(2, $exitCode, '->run() returns integer exit code (casts numeric to int)');
319
+ }
320
+
321
+ public function testRunWithApplication()
322
+ {
323
+ $command = new \TestCommand();
324
+ $command->setApplication(new Application());
325
+ $exitCode = $command->run(new StringInput(''), new NullOutput());
326
+
327
+ $this->assertSame(0, $exitCode, '->run() returns an integer exit code');
328
+ }
329
+
330
+ public function testRunReturnsAlwaysInteger()
331
+ {
332
+ $command = new \TestCommand();
333
+
334
+ $this->assertSame(0, $command->run(new StringInput(''), new NullOutput()));
335
+ }
336
+
337
+ public function testRunWithProcessTitle()
338
+ {
339
+ $command = new \TestCommand();
340
+ $command->setApplication(new Application());
341
+ $command->setProcessTitle('foo');
342
+ $this->assertSame(0, $command->run(new StringInput(''), new NullOutput()));
343
+ if (function_exists('cli_set_process_title')) {
344
+ if (null === @cli_get_process_title() && 'Darwin' === PHP_OS) {
345
+ $this->markTestSkipped('Running "cli_get_process_title" as an unprivileged user is not supported on MacOS.');
346
+ }
347
+ $this->assertEquals('foo', cli_get_process_title());
348
+ }
349
+ }
350
+
351
+ public function testSetCode()
352
+ {
353
+ $command = new \TestCommand();
354
+ $ret = $command->setCode(function (InputInterface $input, OutputInterface $output) {
355
+ $output->writeln('from the code...');
356
+ });
357
+ $this->assertEquals($command, $ret, '->setCode() implements a fluent interface');
358
+ $tester = new CommandTester($command);
359
+ $tester->execute(array());
360
+ $this->assertEquals('interact called'.PHP_EOL.'from the code...'.PHP_EOL, $tester->getDisplay());
361
+ }
362
+
363
+ public function getSetCodeBindToClosureTests()
364
+ {
365
+ return array(
366
+ array(true, 'not bound to the command'),
367
+ array(false, 'bound to the command'),
368
+ );
369
+ }
370
+
371
+ /**
372
+ * @dataProvider getSetCodeBindToClosureTests
373
+ */
374
+ public function testSetCodeBindToClosure($previouslyBound, $expected)
375
+ {
376
+ $code = createClosure();
377
+ if ($previouslyBound) {
378
+ $code = $code->bindTo($this);
379
+ }
380
+
381
+ $command = new \TestCommand();
382
+ $command->setCode($code);
383
+ $tester = new CommandTester($command);
384
+ $tester->execute(array());
385
+ $this->assertEquals('interact called'.PHP_EOL.$expected.PHP_EOL, $tester->getDisplay());
386
+ }
387
+
388
+ public function testSetCodeWithStaticClosure()
389
+ {
390
+ $command = new \TestCommand();
391
+ $command->setCode(self::createClosure());
392
+ $tester = new CommandTester($command);
393
+ $tester->execute(array());
394
+
395
+ if (\PHP_VERSION_ID < 70000) {
396
+ // Cannot bind static closures in PHP 5
397
+ $this->assertEquals('interact called'.PHP_EOL.'not bound'.PHP_EOL, $tester->getDisplay());
398
+ } else {
399
+ // Can bind static closures in PHP 7
400
+ $this->assertEquals('interact called'.PHP_EOL.'bound'.PHP_EOL, $tester->getDisplay());
401
+ }
402
+ }
403
+
404
+ private static function createClosure()
405
+ {
406
+ return function (InputInterface $input, OutputInterface $output) {
407
+ $output->writeln(isset($this) ? 'bound' : 'not bound');
408
+ };
409
+ }
410
+
411
+ public function testSetCodeWithNonClosureCallable()
412
+ {
413
+ $command = new \TestCommand();
414
+ $ret = $command->setCode(array($this, 'callableMethodCommand'));
415
+ $this->assertEquals($command, $ret, '->setCode() implements a fluent interface');
416
+ $tester = new CommandTester($command);
417
+ $tester->execute(array());
418
+ $this->assertEquals('interact called'.PHP_EOL.'from the code...'.PHP_EOL, $tester->getDisplay());
419
+ }
420
+
421
+ public function callableMethodCommand(InputInterface $input, OutputInterface $output)
422
+ {
423
+ $output->writeln('from the code...');
424
+ }
425
+ }
426
+
427
+ // In order to get an unbound closure, we should create it outside a class
428
+ // scope.
429
+ function createClosure()
430
+ {
431
+ return function (InputInterface $input, OutputInterface $output) {
432
+ $output->writeln($this instanceof Command ? 'bound to the command' : 'not bound to the command');
433
+ };
434
+ }
vendor/symfony/console/Tests/Command/HelpCommandTest.php ADDED
@@ -0,0 +1,71 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Tests\Command;
13
+
14
+ use PHPUnit\Framework\TestCase;
15
+ use Symfony\Component\Console\Tester\CommandTester;
16
+ use Symfony\Component\Console\Command\HelpCommand;
17
+ use Symfony\Component\Console\Command\ListCommand;
18
+ use Symfony\Component\Console\Application;
19
+
20
+ class HelpCommandTest extends TestCase
21
+ {
22
+ public function testExecuteForCommandAlias()
23
+ {
24
+ $command = new HelpCommand();
25
+ $command->setApplication(new Application());
26
+ $commandTester = new CommandTester($command);
27
+ $commandTester->execute(array('command_name' => 'li'), array('decorated' => false));
28
+ $this->assertContains('list [options] [--] [<namespace>]', $commandTester->getDisplay(), '->execute() returns a text help for the given command alias');
29
+ $this->assertContains('format=FORMAT', $commandTester->getDisplay(), '->execute() returns a text help for the given command alias');
30
+ $this->assertContains('raw', $commandTester->getDisplay(), '->execute() returns a text help for the given command alias');
31
+ }
32
+
33
+ public function testExecuteForCommand()
34
+ {
35
+ $command = new HelpCommand();
36
+ $commandTester = new CommandTester($command);
37
+ $command->setCommand(new ListCommand());
38
+ $commandTester->execute(array(), array('decorated' => false));
39
+ $this->assertContains('list [options] [--] [<namespace>]', $commandTester->getDisplay(), '->execute() returns a text help for the given command');
40
+ $this->assertContains('format=FORMAT', $commandTester->getDisplay(), '->execute() returns a text help for the given command');
41
+ $this->assertContains('raw', $commandTester->getDisplay(), '->execute() returns a text help for the given command');
42
+ }
43
+
44
+ public function testExecuteForCommandWithXmlOption()
45
+ {
46
+ $command = new HelpCommand();
47
+ $commandTester = new CommandTester($command);
48
+ $command->setCommand(new ListCommand());
49
+ $commandTester->execute(array('--format' => 'xml'));
50
+ $this->assertContains('<command', $commandTester->getDisplay(), '->execute() returns an XML help text if --xml is passed');
51
+ }
52
+
53
+ public function testExecuteForApplicationCommand()
54
+ {
55
+ $application = new Application();
56
+ $commandTester = new CommandTester($application->get('help'));
57
+ $commandTester->execute(array('command_name' => 'list'));
58
+ $this->assertContains('list [options] [--] [<namespace>]', $commandTester->getDisplay(), '->execute() returns a text help for the given command');
59
+ $this->assertContains('format=FORMAT', $commandTester->getDisplay(), '->execute() returns a text help for the given command');
60
+ $this->assertContains('raw', $commandTester->getDisplay(), '->execute() returns a text help for the given command');
61
+ }
62
+
63
+ public function testExecuteForApplicationCommandWithXmlOption()
64
+ {
65
+ $application = new Application();
66
+ $commandTester = new CommandTester($application->get('help'));
67
+ $commandTester->execute(array('command_name' => 'list', '--format' => 'xml'));
68
+ $this->assertContains('list [--raw] [--format FORMAT] [--] [&lt;namespace&gt;]', $commandTester->getDisplay(), '->execute() returns a text help for the given command');
69
+ $this->assertContains('<command', $commandTester->getDisplay(), '->execute() returns an XML help text if --format=xml is passed');
70
+ }
71
+ }
vendor/symfony/console/Tests/Command/ListCommandTest.php ADDED
@@ -0,0 +1,113 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Tests\Command;
13
+
14
+ use PHPUnit\Framework\TestCase;
15
+ use Symfony\Component\Console\Tester\CommandTester;
16
+ use Symfony\Component\Console\Application;
17
+
18
+ class ListCommandTest extends TestCase
19
+ {
20
+ public function testExecuteListsCommands()
21
+ {
22
+ $application = new Application();
23
+ $commandTester = new CommandTester($command = $application->get('list'));
24
+ $commandTester->execute(array('command' => $command->getName()), array('decorated' => false));
25
+
26
+ $this->assertRegExp('/help\s{2,}Displays help for a command/', $commandTester->getDisplay(), '->execute() returns a list of available commands');
27
+ }
28
+
29
+ public function testExecuteListsCommandsWithXmlOption()
30
+ {
31
+ $application = new Application();
32
+ $commandTester = new CommandTester($command = $application->get('list'));
33
+ $commandTester->execute(array('command' => $command->getName(), '--format' => 'xml'));
34
+ $this->assertRegExp('/<command id="list" name="list" hidden="0">/', $commandTester->getDisplay(), '->execute() returns a list of available commands in XML if --xml is passed');
35
+ }
36
+
37
+ public function testExecuteListsCommandsWithRawOption()
38
+ {
39
+ $application = new Application();
40
+ $commandTester = new CommandTester($command = $application->get('list'));
41
+ $commandTester->execute(array('command' => $command->getName(), '--raw' => true));
42
+ $output = <<<'EOF'
43
+ help Displays help for a command
44
+ list Lists commands
45
+
46
+ EOF;
47
+
48
+ $this->assertEquals($output, $commandTester->getDisplay(true));
49
+ }
50
+
51
+ public function testExecuteListsCommandsWithNamespaceArgument()
52
+ {
53
+ require_once realpath(__DIR__.'/../Fixtures/FooCommand.php');
54
+ $application = new Application();
55
+ $application->add(new \FooCommand());
56
+ $commandTester = new CommandTester($command = $application->get('list'));
57
+ $commandTester->execute(array('command' => $command->getName(), 'namespace' => 'foo', '--raw' => true));
58
+ $output = <<<'EOF'
59
+ foo:bar The foo:bar command
60
+
61
+ EOF;
62
+
63
+ $this->assertEquals($output, $commandTester->getDisplay(true));
64
+ }
65
+
66
+ public function testExecuteListsCommandsOrder()
67
+ {
68
+ require_once realpath(__DIR__.'/../Fixtures/Foo6Command.php');
69
+ $application = new Application();
70
+ $application->add(new \Foo6Command());
71
+ $commandTester = new CommandTester($command = $application->get('list'));
72
+ $commandTester->execute(array('command' => $command->getName()), array('decorated' => false));
73
+ $output = <<<'EOF'
74
+ Console Tool
75
+
76
+ Usage:
77
+ command [options] [arguments]
78
+
79
+ Options:
80
+ -h, --help Display this help message
81
+ -q, --quiet Do not output any message
82
+ -V, --version Display this application version
83
+ --ansi Force ANSI output
84
+ --no-ansi Disable ANSI output
85
+ -n, --no-interaction Do not ask any interactive question
86
+ -v|vv|vvv, --verbose Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
87
+
88
+ Available commands:
89
+ help Displays help for a command
90
+ list Lists commands
91
+ 0foo
92
+ 0foo:bar 0foo:bar command
93
+ EOF;
94
+
95
+ $this->assertEquals($output, trim($commandTester->getDisplay(true)));
96
+ }
97
+
98
+ public function testExecuteListsCommandsOrderRaw()
99
+ {
100
+ require_once realpath(__DIR__.'/../Fixtures/Foo6Command.php');
101
+ $application = new Application();
102
+ $application->add(new \Foo6Command());
103
+ $commandTester = new CommandTester($command = $application->get('list'));
104
+ $commandTester->execute(array('command' => $command->getName(), '--raw' => true));
105
+ $output = <<<'EOF'
106
+ help Displays help for a command
107
+ list Lists commands
108
+ 0foo:bar 0foo:bar command
109
+ EOF;
110
+
111
+ $this->assertEquals($output, trim($commandTester->getDisplay(true)));
112
+ }
113
+ }
vendor/symfony/console/Tests/Command/LockableTraitTest.php ADDED
@@ -0,0 +1,59 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Tests\Command;
13
+
14
+ use PHPUnit\Framework\TestCase;
15
+ use Symfony\Component\Console\Tester\CommandTester;
16
+ use Symfony\Component\Filesystem\LockHandler;
17
+
18
+ class LockableTraitTest extends TestCase
19
+ {
20
+ protected static $fixturesPath;
21
+
22
+ public static function setUpBeforeClass()
23
+ {
24
+ self::$fixturesPath = __DIR__.'/../Fixtures/';
25
+ require_once self::$fixturesPath.'/FooLockCommand.php';
26
+ require_once self::$fixturesPath.'/FooLock2Command.php';
27
+ }
28
+
29
+ public function testLockIsReleased()
30
+ {
31
+ $command = new \FooLockCommand();
32
+
33
+ $tester = new CommandTester($command);
34
+ $this->assertSame(2, $tester->execute(array()));
35
+ $this->assertSame(2, $tester->execute(array()));
36
+ }
37
+
38
+ public function testLockReturnsFalseIfAlreadyLockedByAnotherCommand()
39
+ {
40
+ $command = new \FooLockCommand();
41
+
42
+ $lock = new LockHandler($command->getName());
43
+ $lock->lock();
44
+
45
+ $tester = new CommandTester($command);
46
+ $this->assertSame(1, $tester->execute(array()));
47
+
48
+ $lock->release();
49
+ $this->assertSame(2, $tester->execute(array()));
50
+ }
51
+
52
+ public function testMultipleLockCallsThrowLogicException()
53
+ {
54
+ $command = new \FooLock2Command();
55
+
56
+ $tester = new CommandTester($command);
57
+ $this->assertSame(1, $tester->execute(array()));
58
+ }
59
+ }
vendor/symfony/console/Tests/Command/index.php ADDED
File without changes
vendor/symfony/console/Tests/DependencyInjection/AddConsoleCommandPassTest.php ADDED
@@ -0,0 +1,123 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Tests\DependencyInjection;
13
+
14
+ use PHPUnit\Framework\TestCase;
15
+ use Symfony\Component\Console\DependencyInjection\AddConsoleCommandPass;
16
+ use Symfony\Component\Console\Command\Command;
17
+ use Symfony\Component\DependencyInjection\ContainerBuilder;
18
+ use Symfony\Component\DependencyInjection\Definition;
19
+
20
+ class AddConsoleCommandPassTest extends TestCase
21
+ {
22
+ /**
23
+ * @dataProvider visibilityProvider
24
+ */
25
+ public function testProcess($public)
26
+ {
27
+ $container = new ContainerBuilder();
28
+ $container->addCompilerPass(new AddConsoleCommandPass());
29
+ $container->setParameter('my-command.class', 'Symfony\Component\Console\Tests\DependencyInjection\MyCommand');
30
+
31
+ $definition = new Definition('%my-command.class%');
32
+ $definition->setPublic($public);
33
+ $definition->addTag('console.command');
34
+ $container->setDefinition('my-command', $definition);
35
+
36
+ $container->compile();
37
+
38
+ $alias = 'console.command.symfony_component_console_tests_dependencyinjection_mycommand';
39
+
40
+ if ($public) {
41
+ $this->assertFalse($container->hasAlias($alias));
42
+ $id = 'my-command';
43
+ } else {
44
+ $id = $alias;
45
+ // The alias is replaced by a Definition by the ReplaceAliasByActualDefinitionPass
46
+ // in case the original service is private
47
+ $this->assertFalse($container->hasDefinition('my-command'));
48
+ $this->assertTrue($container->hasDefinition($alias));
49
+ }
50
+
51
+ $this->assertTrue($container->hasParameter('console.command.ids'));
52
+ $this->assertSame(array($alias => $id), $container->getParameter('console.command.ids'));
53
+ }
54
+
55
+ public function visibilityProvider()
56
+ {
57
+ return array(
58
+ array(true),
59
+ array(false),
60
+ );
61
+ }
62
+
63
+ /**
64
+ * @expectedException \InvalidArgumentException
65
+ * @expectedExceptionMessage The service "my-command" tagged "console.command" must not be abstract.
66
+ */
67
+ public function testProcessThrowAnExceptionIfTheServiceIsAbstract()
68
+ {
69
+ $container = new ContainerBuilder();
70
+ $container->setResourceTracking(false);
71
+ $container->addCompilerPass(new AddConsoleCommandPass());
72
+
73
+ $definition = new Definition('Symfony\Component\Console\Tests\DependencyInjection\MyCommand');
74
+ $definition->addTag('console.command');
75
+ $definition->setAbstract(true);
76
+ $container->setDefinition('my-command', $definition);
77
+
78
+ $container->compile();
79
+ }
80
+
81
+ /**
82
+ * @expectedException \InvalidArgumentException
83
+ * @expectedExceptionMessage The service "my-command" tagged "console.command" must be a subclass of "Symfony\Component\Console\Command\Command".
84
+ */
85
+ public function testProcessThrowAnExceptionIfTheServiceIsNotASubclassOfCommand()
86
+ {
87
+ $container = new ContainerBuilder();
88
+ $container->setResourceTracking(false);
89
+ $container->addCompilerPass(new AddConsoleCommandPass());
90
+
91
+ $definition = new Definition('SplObjectStorage');
92
+ $definition->addTag('console.command');
93
+ $container->setDefinition('my-command', $definition);
94
+
95
+ $container->compile();
96
+ }
97
+
98
+ public function testProcessPrivateServicesWithSameCommand()
99
+ {
100
+ $container = new ContainerBuilder();
101
+ $className = 'Symfony\Component\Console\Tests\DependencyInjection\MyCommand';
102
+
103
+ $definition1 = new Definition($className);
104
+ $definition1->addTag('console.command')->setPublic(false);
105
+
106
+ $definition2 = new Definition($className);
107
+ $definition2->addTag('console.command')->setPublic(false);
108
+
109
+ $container->setDefinition('my-command1', $definition1);
110
+ $container->setDefinition('my-command2', $definition2);
111
+
112
+ (new AddConsoleCommandPass())->process($container);
113
+
114
+ $alias1 = 'console.command.symfony_component_console_tests_dependencyinjection_mycommand';
115
+ $alias2 = $alias1.'_my-command2';
116
+ $this->assertTrue($container->hasAlias($alias1));
117
+ $this->assertTrue($container->hasAlias($alias2));
118
+ }
119
+ }
120
+
121
+ class MyCommand extends Command
122
+ {
123
+ }
vendor/symfony/console/Tests/DependencyInjection/index.php ADDED
File without changes
vendor/symfony/console/Tests/Descriptor/AbstractDescriptorTest.php ADDED
@@ -0,0 +1,107 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Tests\Descriptor;
13
+
14
+ use PHPUnit\Framework\TestCase;
15
+ use Symfony\Component\Console\Application;
16
+ use Symfony\Component\Console\Command\Command;
17
+ use Symfony\Component\Console\Input\InputArgument;
18
+ use Symfony\Component\Console\Input\InputDefinition;
19
+ use Symfony\Component\Console\Input\InputOption;
20
+ use Symfony\Component\Console\Output\BufferedOutput;
21
+
22
+ abstract class AbstractDescriptorTest extends TestCase
23
+ {
24
+ /** @dataProvider getDescribeInputArgumentTestData */
25
+ public function testDescribeInputArgument(InputArgument $argument, $expectedDescription)
26
+ {
27
+ $this->assertDescription($expectedDescription, $argument);
28
+ }
29
+
30
+ /** @dataProvider getDescribeInputOptionTestData */
31
+ public function testDescribeInputOption(InputOption $option, $expectedDescription)
32
+ {
33
+ $this->assertDescription($expectedDescription, $option);
34
+ }
35
+
36
+ /** @dataProvider getDescribeInputDefinitionTestData */
37
+ public function testDescribeInputDefinition(InputDefinition $definition, $expectedDescription)
38
+ {
39
+ $this->assertDescription($expectedDescription, $definition);
40
+ }
41
+
42
+ /** @dataProvider getDescribeCommandTestData */
43
+ public function testDescribeCommand(Command $command, $expectedDescription)
44
+ {
45
+ $this->assertDescription($expectedDescription, $command);
46
+ }
47
+
48
+ /** @dataProvider getDescribeApplicationTestData */
49
+ public function testDescribeApplication(Application $application, $expectedDescription)
50
+ {
51
+ // Replaces the dynamic placeholders of the command help text with a static version.
52
+ // The placeholder %command.full_name% includes the script path that is not predictable
53
+ // and can not be tested against.
54
+ foreach ($application->all() as $command) {
55
+ $command->setHelp(str_replace('%command.full_name%', 'app/console %command.name%', $command->getHelp()));
56
+ }
57
+
58
+ $this->assertDescription($expectedDescription, $application);
59
+ }
60
+
61
+ public function getDescribeInputArgumentTestData()
62
+ {
63
+ return $this->getDescriptionTestData(ObjectsProvider::getInputArguments());
64
+ }
65
+
66
+ public function getDescribeInputOptionTestData()
67
+ {
68
+ return $this->getDescriptionTestData(ObjectsProvider::getInputOptions());
69
+ }
70
+
71
+ public function getDescribeInputDefinitionTestData()
72
+ {
73
+ return $this->getDescriptionTestData(ObjectsProvider::getInputDefinitions());
74
+ }
75
+
76
+ public function getDescribeCommandTestData()
77
+ {
78
+ return $this->getDescriptionTestData(ObjectsProvider::getCommands());
79
+ }
80
+
81
+ public function getDescribeApplicationTestData()
82
+ {
83
+ return $this->getDescriptionTestData(ObjectsProvider::getApplications());
84
+ }
85
+
86
+ abstract protected function getDescriptor();
87
+
88
+ abstract protected function getFormat();
89
+
90
+ protected function getDescriptionTestData(array $objects)
91
+ {
92
+ $data = array();
93
+ foreach ($objects as $name => $object) {
94
+ $description = file_get_contents(sprintf('%s/../Fixtures/%s.%s', __DIR__, $name, $this->getFormat()));
95
+ $data[] = array($object, $description);
96
+ }
97
+
98
+ return $data;
99
+ }
100
+
101
+ protected function assertDescription($expectedDescription, $describedObject, array $options = array())
102
+ {
103
+ $output = new BufferedOutput(BufferedOutput::VERBOSITY_NORMAL, true);
104
+ $this->getDescriptor()->describe($output, $describedObject, $options + array('raw_output' => true));
105
+ $this->assertEquals(trim($expectedDescription), trim(str_replace(PHP_EOL, "\n", $output->fetch())));
106
+ }
107
+ }
vendor/symfony/console/Tests/Descriptor/JsonDescriptorTest.php ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Tests\Descriptor;
13
+
14
+ use Symfony\Component\Console\Descriptor\JsonDescriptor;
15
+ use Symfony\Component\Console\Output\BufferedOutput;
16
+
17
+ class JsonDescriptorTest extends AbstractDescriptorTest
18
+ {
19
+ protected function getDescriptor()
20
+ {
21
+ return new JsonDescriptor();
22
+ }
23
+
24
+ protected function getFormat()
25
+ {
26
+ return 'json';
27
+ }
28
+
29
+ protected function assertDescription($expectedDescription, $describedObject, array $options = array())
30
+ {
31
+ $output = new BufferedOutput(BufferedOutput::VERBOSITY_NORMAL, true);
32
+ $this->getDescriptor()->describe($output, $describedObject, $options + array('raw_output' => true));
33
+ $this->assertEquals(json_decode(trim($expectedDescription), true), json_decode(trim(str_replace(PHP_EOL, "\n", $output->fetch())), true));
34
+ }
35
+ }
vendor/symfony/console/Tests/Descriptor/MarkdownDescriptorTest.php ADDED
@@ -0,0 +1,45 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Tests\Descriptor;
13
+
14
+ use Symfony\Component\Console\Descriptor\MarkdownDescriptor;
15
+ use Symfony\Component\Console\Tests\Fixtures\DescriptorApplicationMbString;
16
+ use Symfony\Component\Console\Tests\Fixtures\DescriptorCommandMbString;
17
+
18
+ class MarkdownDescriptorTest extends AbstractDescriptorTest
19
+ {
20
+ public function getDescribeCommandTestData()
21
+ {
22
+ return $this->getDescriptionTestData(array_merge(
23
+ ObjectsProvider::getCommands(),
24
+ array('command_mbstring' => new DescriptorCommandMbString())
25
+ ));
26
+ }
27
+
28
+ public function getDescribeApplicationTestData()
29
+ {
30
+ return $this->getDescriptionTestData(array_merge(
31
+ ObjectsProvider::getApplications(),
32
+ array('application_mbstring' => new DescriptorApplicationMbString())
33
+ ));
34
+ }
35
+
36
+ protected function getDescriptor()
37
+ {
38
+ return new MarkdownDescriptor();
39
+ }
40
+
41
+ protected function getFormat()
42
+ {
43
+ return 'md';
44
+ }
45
+ }
vendor/symfony/console/Tests/Descriptor/ObjectsProvider.php ADDED
@@ -0,0 +1,82 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Tests\Descriptor;
13
+
14
+ use Symfony\Component\Console\Input\InputArgument;
15
+ use Symfony\Component\Console\Input\InputDefinition;
16
+ use Symfony\Component\Console\Input\InputOption;
17
+ use Symfony\Component\Console\Tests\Fixtures\DescriptorApplication1;
18
+ use Symfony\Component\Console\Tests\Fixtures\DescriptorApplication2;
19
+ use Symfony\Component\Console\Tests\Fixtures\DescriptorCommand1;
20
+ use Symfony\Component\Console\Tests\Fixtures\DescriptorCommand2;
21
+
22
+ /**
23
+ * @author Jean-François Simon <contact@jfsimon.fr>
24
+ */
25
+ class ObjectsProvider
26
+ {
27
+ public static function getInputArguments()
28
+ {
29
+ return array(
30
+ 'input_argument_1' => new InputArgument('argument_name', InputArgument::REQUIRED),
31
+ 'input_argument_2' => new InputArgument('argument_name', InputArgument::IS_ARRAY, 'argument description'),
32
+ 'input_argument_3' => new InputArgument('argument_name', InputArgument::OPTIONAL, 'argument description', 'default_value'),
33
+ 'input_argument_4' => new InputArgument('argument_name', InputArgument::REQUIRED, "multiline\nargument description"),
34
+ 'input_argument_with_style' => new InputArgument('argument_name', InputArgument::OPTIONAL, 'argument description', '<comment>style</>'),
35
+ 'input_argument_with_default_inf_value' => new InputArgument('argument_name', InputArgument::OPTIONAL, 'argument description', INF),
36
+ );
37
+ }
38
+
39
+ public static function getInputOptions()
40
+ {
41
+ return array(
42
+ 'input_option_1' => new InputOption('option_name', 'o', InputOption::VALUE_NONE),
43
+ 'input_option_2' => new InputOption('option_name', 'o', InputOption::VALUE_OPTIONAL, 'option description', 'default_value'),
44
+ 'input_option_3' => new InputOption('option_name', 'o', InputOption::VALUE_REQUIRED, 'option description'),
45
+ 'input_option_4' => new InputOption('option_name', 'o', InputOption::VALUE_IS_ARRAY | InputOption::VALUE_OPTIONAL, 'option description', array()),
46
+ 'input_option_5' => new InputOption('option_name', 'o', InputOption::VALUE_REQUIRED, "multiline\noption description"),
47
+ 'input_option_6' => new InputOption('option_name', array('o', 'O'), InputOption::VALUE_REQUIRED, 'option with multiple shortcuts'),
48
+ 'input_option_with_style' => new InputOption('option_name', 'o', InputOption::VALUE_REQUIRED, 'option description', '<comment>style</>'),
49
+ 'input_option_with_style_array' => new InputOption('option_name', 'o', InputOption::VALUE_IS_ARRAY | InputOption::VALUE_REQUIRED, 'option description', array('<comment>Hello</comment>', '<info>world</info>')),
50
+ 'input_option_with_default_inf_value' => new InputOption('option_name', 'o', InputOption::VALUE_OPTIONAL, 'option description', INF),
51
+ );
52
+ }
53
+
54
+ public static function getInputDefinitions()
55
+ {
56
+ return array(
57
+ 'input_definition_1' => new InputDefinition(),
58
+ 'input_definition_2' => new InputDefinition(array(new InputArgument('argument_name', InputArgument::REQUIRED))),
59
+ 'input_definition_3' => new InputDefinition(array(new InputOption('option_name', 'o', InputOption::VALUE_NONE))),
60
+ 'input_definition_4' => new InputDefinition(array(
61
+ new InputArgument('argument_name', InputArgument::REQUIRED),
62
+ new InputOption('option_name', 'o', InputOption::VALUE_NONE),
63
+ )),
64
+ );
65
+ }
66
+
67
+ public static function getCommands()
68
+ {
69
+ return array(
70
+ 'command_1' => new DescriptorCommand1(),
71
+ 'command_2' => new DescriptorCommand2(),
72
+ );
73
+ }
74
+
75
+ public static function getApplications()
76
+ {
77
+ return array(
78
+ 'application_1' => new DescriptorApplication1(),
79
+ 'application_2' => new DescriptorApplication2(),
80
+ );
81
+ }
82
+ }
vendor/symfony/console/Tests/Descriptor/TextDescriptorTest.php ADDED
@@ -0,0 +1,53 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Tests\Descriptor;
13
+
14
+ use Symfony\Component\Console\Descriptor\TextDescriptor;
15
+ use Symfony\Component\Console\Tests\Fixtures\DescriptorApplication2;
16
+ use Symfony\Component\Console\Tests\Fixtures\DescriptorApplicationMbString;
17
+ use Symfony\Component\Console\Tests\Fixtures\DescriptorCommandMbString;
18
+
19
+ class TextDescriptorTest extends AbstractDescriptorTest
20
+ {
21
+ public function getDescribeCommandTestData()
22
+ {
23
+ return $this->getDescriptionTestData(array_merge(
24
+ ObjectsProvider::getCommands(),
25
+ array('command_mbstring' => new DescriptorCommandMbString())
26
+ ));
27
+ }
28
+
29
+ public function getDescribeApplicationTestData()
30
+ {
31
+ return $this->getDescriptionTestData(array_merge(
32
+ ObjectsProvider::getApplications(),
33
+ array('application_mbstring' => new DescriptorApplicationMbString())
34
+ ));
35
+ }
36
+
37
+ public function testDescribeApplicationWithFilteredNamespace()
38
+ {
39
+ $application = new DescriptorApplication2();
40
+
41
+ $this->assertDescription(file_get_contents(__DIR__.'/../Fixtures/application_filtered_namespace.txt'), $application, array('namespace' => 'command4'));
42
+ }
43
+
44
+ protected function getDescriptor()
45
+ {
46
+ return new TextDescriptor();
47
+ }
48
+
49
+ protected function getFormat()
50
+ {
51
+ return 'txt';
52
+ }
53
+ }
vendor/symfony/console/Tests/Descriptor/XmlDescriptorTest.php ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Tests\Descriptor;
13
+
14
+ use Symfony\Component\Console\Descriptor\XmlDescriptor;
15
+
16
+ class XmlDescriptorTest extends AbstractDescriptorTest
17
+ {
18
+ protected function getDescriptor()
19
+ {
20
+ return new XmlDescriptor();
21
+ }
22
+
23
+ protected function getFormat()
24
+ {
25
+ return 'xml';
26
+ }
27
+ }
vendor/symfony/console/Tests/Descriptor/index.php ADDED
File without changes
vendor/symfony/console/Tests/EventListener/ErrorListenerTest.php ADDED
@@ -0,0 +1,156 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Tests\EventListener;
13
+
14
+ use PHPUnit\Framework\TestCase;
15
+ use Psr\Log\LoggerInterface;
16
+ use Symfony\Component\Console\Command\Command;
17
+ use Symfony\Component\Console\Event\ConsoleErrorEvent;
18
+ use Symfony\Component\Console\Event\ConsoleTerminateEvent;
19
+ use Symfony\Component\Console\EventListener\ErrorListener;
20
+ use Symfony\Component\Console\Input\ArgvInput;
21
+ use Symfony\Component\Console\Input\ArrayInput;
22
+ use Symfony\Component\Console\Input\Input;
23
+ use Symfony\Component\Console\Input\StringInput;
24
+ use Symfony\Component\Console\Input\InputInterface;
25
+ use Symfony\Component\Console\Output\OutputInterface;
26
+
27
+ class ErrorListenerTest extends TestCase
28
+ {
29
+ public function testOnConsoleError()
30
+ {
31
+ $error = new \TypeError('An error occurred');
32
+
33
+ $logger = $this->getLogger();
34
+ $logger
35
+ ->expects($this->once())
36
+ ->method('error')
37
+ ->with('Error thrown while running command "{command}". Message: "{message}"', array('error' => $error, 'command' => 'test:run --foo=baz buzz', 'message' => 'An error occurred'))
38
+ ;
39
+
40
+ $listener = new ErrorListener($logger);
41
+ $listener->onConsoleError(new ConsoleErrorEvent(new ArgvInput(array('console.php', 'test:run', '--foo=baz', 'buzz')), $this->getOutput(), $error, new Command('test:run')));
42
+ }
43
+
44
+ public function testOnConsoleErrorWithNoCommandAndNoInputString()
45
+ {
46
+ $error = new \RuntimeException('An error occurred');
47
+
48
+ $logger = $this->getLogger();
49
+ $logger
50
+ ->expects($this->once())
51
+ ->method('error')
52
+ ->with('An error occurred while using the console. Message: "{message}"', array('error' => $error, 'message' => 'An error occurred'))
53
+ ;
54
+
55
+ $listener = new ErrorListener($logger);
56
+ $listener->onConsoleError(new ConsoleErrorEvent(new NonStringInput(), $this->getOutput(), $error));
57
+ }
58
+
59
+ public function testOnConsoleTerminateForNonZeroExitCodeWritesToLog()
60
+ {
61
+ $logger = $this->getLogger();
62
+ $logger
63
+ ->expects($this->once())
64
+ ->method('debug')
65
+ ->with('Command "{command}" exited with code "{code}"', array('command' => 'test:run', 'code' => 255))
66
+ ;
67
+
68
+ $listener = new ErrorListener($logger);
69
+ $listener->onConsoleTerminate($this->getConsoleTerminateEvent(new ArgvInput(array('console.php', 'test:run')), 255));
70
+ }
71
+
72
+ public function testOnConsoleTerminateForZeroExitCodeDoesNotWriteToLog()
73
+ {
74
+ $logger = $this->getLogger();
75
+ $logger
76
+ ->expects($this->never())
77
+ ->method('debug')
78
+ ;
79
+
80
+ $listener = new ErrorListener($logger);
81
+ $listener->onConsoleTerminate($this->getConsoleTerminateEvent(new ArgvInput(array('console.php', 'test:run')), 0));
82
+ }
83
+
84
+ public function testGetSubscribedEvents()
85
+ {
86
+ $this->assertEquals(
87
+ array(
88
+ 'console.error' => array('onConsoleError', -128),
89
+ 'console.terminate' => array('onConsoleTerminate', -128),
90
+ ),
91
+ ErrorListener::getSubscribedEvents()
92
+ );
93
+ }
94
+
95
+ public function testAllKindsOfInputCanBeLogged()
96
+ {
97
+ $logger = $this->getLogger();
98
+ $logger
99
+ ->expects($this->exactly(3))
100
+ ->method('debug')
101
+ ->with('Command "{command}" exited with code "{code}"', array('command' => 'test:run --foo=bar', 'code' => 255))
102
+ ;
103
+
104
+ $listener = new ErrorListener($logger);
105
+ $listener->onConsoleTerminate($this->getConsoleTerminateEvent(new ArgvInput(array('console.php', 'test:run', '--foo=bar')), 255));
106
+ $listener->onConsoleTerminate($this->getConsoleTerminateEvent(new ArrayInput(array('name' => 'test:run', '--foo' => 'bar')), 255));
107
+ $listener->onConsoleTerminate($this->getConsoleTerminateEvent(new StringInput('test:run --foo=bar'), 255));
108
+ }
109
+
110
+ public function testCommandNameIsDisplayedForNonStringableInput()
111
+ {
112
+ $logger = $this->getLogger();
113
+ $logger
114
+ ->expects($this->once())
115
+ ->method('debug')
116
+ ->with('Command "{command}" exited with code "{code}"', array('command' => 'test:run', 'code' => 255))
117
+ ;
118
+
119
+ $listener = new ErrorListener($logger);
120
+ $listener->onConsoleTerminate($this->getConsoleTerminateEvent($this->getMockBuilder(InputInterface::class)->getMock(), 255));
121
+ }
122
+
123
+ private function getLogger()
124
+ {
125
+ return $this->getMockForAbstractClass(LoggerInterface::class);
126
+ }
127
+
128
+ private function getConsoleTerminateEvent(InputInterface $input, $exitCode)
129
+ {
130
+ return new ConsoleTerminateEvent(new Command('test:run'), $input, $this->getOutput(), $exitCode);
131
+ }
132
+
133
+ private function getOutput()
134
+ {
135
+ return $this->getMockBuilder(OutputInterface::class)->getMock();
136
+ }
137
+ }
138
+
139
+ class NonStringInput extends Input
140
+ {
141
+ public function getFirstArgument()
142
+ {
143
+ }
144
+
145
+ public function hasParameterOption($values, $onlyParams = false)
146
+ {
147
+ }
148
+
149
+ public function getParameterOption($values, $default = false, $onlyParams = false)
150
+ {
151
+ }
152
+
153
+ public function parse()
154
+ {
155
+ }
156
+ }
vendor/symfony/console/Tests/EventListener/index.php ADDED
File without changes
vendor/symfony/console/Tests/Fixtures/BarBucCommand.php ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ use Symfony\Component\Console\Command\Command;
4
+
5
+ class BarBucCommand extends Command
6
+ {
7
+ protected function configure()
8
+ {
9
+ $this->setName('bar:buc');
10
+ }
11
+ }
vendor/symfony/console/Tests/Fixtures/DescriptorApplication1.php ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Tests\Fixtures;
13
+
14
+ use Symfony\Component\Console\Application;
15
+
16
+ class DescriptorApplication1 extends Application
17
+ {
18
+ }
vendor/symfony/console/Tests/Fixtures/DescriptorApplication2.php ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Tests\Fixtures;
13
+
14
+ use Symfony\Component\Console\Application;
15
+
16
+ class DescriptorApplication2 extends Application
17
+ {
18
+ public function __construct()
19
+ {
20
+ parent::__construct('My Symfony application', 'v1.0');
21
+ $this->add(new DescriptorCommand1());
22
+ $this->add(new DescriptorCommand2());
23
+ $this->add(new DescriptorCommand3());
24
+ $this->add(new DescriptorCommand4());
25
+ }
26
+ }
vendor/symfony/console/Tests/Fixtures/DescriptorApplicationMbString.php ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Tests\Fixtures;
13
+
14
+ use Symfony\Component\Console\Application;
15
+
16
+ class DescriptorApplicationMbString extends Application
17
+ {
18
+ public function __construct()
19
+ {
20
+ parent::__construct('MbString åpplicätion');
21
+
22
+ $this->add(new DescriptorCommandMbString());
23
+ }
24
+ }
vendor/symfony/console/Tests/Fixtures/DescriptorCommand1.php ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Tests\Fixtures;
13
+
14
+ use Symfony\Component\Console\Command\Command;
15
+
16
+ class DescriptorCommand1 extends Command
17
+ {
18
+ protected function configure()
19
+ {
20
+ $this
21
+ ->setName('descriptor:command1')
22
+ ->setAliases(array('alias1', 'alias2'))
23
+ ->setDescription('command 1 description')
24
+ ->setHelp('command 1 help')
25
+ ;
26
+ }
27
+ }
vendor/symfony/console/Tests/Fixtures/DescriptorCommand2.php ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Tests\Fixtures;
13
+
14
+ use Symfony\Component\Console\Command\Command;
15
+ use Symfony\Component\Console\Input\InputArgument;
16
+ use Symfony\Component\Console\Input\InputOption;
17
+
18
+ class DescriptorCommand2 extends Command
19
+ {
20
+ protected function configure()
21
+ {
22
+ $this
23
+ ->setName('descriptor:command2')
24
+ ->setDescription('command 2 description')
25
+ ->setHelp('command 2 help')
26
+ ->addUsage('-o|--option_name <argument_name>')
27
+ ->addUsage('<argument_name>')
28
+ ->addArgument('argument_name', InputArgument::REQUIRED)
29
+ ->addOption('option_name', 'o', InputOption::VALUE_NONE)
30
+ ;
31
+ }
32
+ }
vendor/symfony/console/Tests/Fixtures/DescriptorCommand3.php ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Tests\Fixtures;
13
+
14
+ use Symfony\Component\Console\Command\Command;
15
+
16
+ class DescriptorCommand3 extends Command
17
+ {
18
+ protected function configure()
19
+ {
20
+ $this
21
+ ->setName('descriptor:command3')
22
+ ->setDescription('command 3 description')
23
+ ->setHelp('command 3 help')
24
+ ->setHidden(true)
25
+ ;
26
+ }
27
+ }
vendor/symfony/console/Tests/Fixtures/DescriptorCommand4.php ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Tests\Fixtures;
13
+
14
+ use Symfony\Component\Console\Command\Command;
15
+
16
+ class DescriptorCommand4 extends Command
17
+ {
18
+ protected function configure()
19
+ {
20
+ $this
21
+ ->setName('descriptor:command4')
22
+ ->setAliases(array('descriptor:alias_command4', 'command4:descriptor'))
23
+ ;
24
+ }
25
+ }
vendor/symfony/console/Tests/Fixtures/DescriptorCommandMbString.php ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Tests\Fixtures;
13
+
14
+ use Symfony\Component\Console\Command\Command;
15
+ use Symfony\Component\Console\Input\InputArgument;
16
+ use Symfony\Component\Console\Input\InputOption;
17
+
18
+ class DescriptorCommandMbString extends Command
19
+ {
20
+ protected function configure()
21
+ {
22
+ $this
23
+ ->setName('descriptor:åèä')
24
+ ->setDescription('command åèä description')
25
+ ->setHelp('command åèä help')
26
+ ->addUsage('-o|--option_name <argument_name>')
27
+ ->addUsage('<argument_name>')
28
+ ->addArgument('argument_åèä', InputArgument::REQUIRED)
29
+ ->addOption('option_åèä', 'o', InputOption::VALUE_NONE)
30
+ ;
31
+ }
32
+ }
vendor/symfony/console/Tests/Fixtures/DummyOutput.php ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Console\Tests\Fixtures;
13
+
14
+ use Symfony\Component\Console\Output\BufferedOutput;
15
+
16
+ /**
17
+ * Dummy output.
18
+ *
19
+ * @author Kévin Dunglas <dunglas@gmail.com>
20
+ */
21
+ class DummyOutput extends BufferedOutput
22
+ {
23
+ /**
24
+ * @return array
25
+ */
26
+ public function getLogs()
27
+ {
28
+ $logs = array();
29
+ foreach (explode(PHP_EOL, trim($this->fetch())) as $message) {
30
+ preg_match('/^\[(.*)\] (.*)/', $message, $matches);
31
+ $logs[] = sprintf('%s %s', $matches[1], $matches[2]);
32
+ }
33
+
34
+ return $logs;
35
+ }
36
+ }
vendor/symfony/console/Tests/Fixtures/Foo1Command.php ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ use Symfony\Component\Console\Command\Command;
4
+ use Symfony\Component\Console\Input\InputInterface;
5
+ use Symfony\Component\Console\Output\OutputInterface;
6
+
7
+ class Foo1Command extends Command
8
+ {
9
+ public $input;
10
+ public $output;
11
+
12
+ protected function configure()
13
+ {
14
+ $this
15
+ ->setName('foo:bar1')
16
+ ->setDescription('The foo:bar1 command')
17
+ ->setAliases(array('afoobar1'))
18
+ ;
19
+ }
20
+
21
+ protected function execute(InputInterface $input, OutputInterface $output)
22
+ {
23
+ $this->input = $input;
24
+ $this->output = $output;
25
+ }
26
+ }
vendor/symfony/console/Tests/Fixtures/Foo2Command.php ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ use Symfony\Component\Console\Command\Command;
4
+ use Symfony\Component\Console\Input\InputInterface;
5
+ use Symfony\Component\Console\Output\OutputInterface;
6
+
7
+ class Foo2Command extends Command
8
+ {
9
+ protected function configure()
10
+ {
11
+ $this
12
+ ->setName('foo1:bar')
13
+ ->setDescription('The foo1:bar command')
14
+ ->setAliases(array('afoobar2'))
15
+ ;
16
+ }
17
+
18
+ protected function execute(InputInterface $input, OutputInterface $output)
19
+ {
20
+ }
21
+ }
vendor/symfony/console/Tests/Fixtures/Foo3Command.php ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ use Symfony\Component\Console\Command\Command;
4
+ use Symfony\Component\Console\Input\InputInterface;
5
+ use Symfony\Component\Console\Output\OutputInterface;
6
+
7
+ class Foo3Command extends Command
8
+ {
9
+ protected function configure()
10
+ {
11
+ $this
12
+ ->setName('foo3:bar')
13
+ ->setDescription('The foo3:bar command')
14
+ ;
15
+ }
16
+
17
+ protected function execute(InputInterface $input, OutputInterface $output)
18
+ {
19
+ try {
20
+ try {
21
+ throw new \Exception('First exception <p>this is html</p>');
22
+ } catch (\Exception $e) {
23
+ throw new \Exception('Second exception <comment>comment</comment>', 0, $e);
24
+ }
25
+ } catch (\Exception $e) {
26
+ throw new \Exception('Third exception <fg=blue;bg=red>comment</>', 404, $e);
27
+ }
28
+ }
29
+ }
vendor/symfony/console/Tests/Fixtures/Foo4Command.php ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ use Symfony\Component\Console\Command\Command;
4
+
5
+ class Foo4Command extends Command
6
+ {
7
+ protected function configure()
8
+ {
9
+ $this->setName('foo3:bar:toh');
10
+ }
11
+ }
vendor/symfony/console/Tests/Fixtures/Foo5Command.php ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ use Symfony\Component\Console\Command\Command;
4
+
5
+ class Foo5Command extends Command
6
+ {
7
+ public function __construct()
8
+ {
9
+ }
10
+ }
vendor/symfony/console/Tests/Fixtures/Foo6Command.php ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+
4
+ use Symfony\Component\Console\Command\Command;
5
+
6
+ class Foo6Command extends Command
7
+ {
8
+ protected function configure()
9
+ {
10
+ $this->setName('0foo:bar')->setDescription('0foo:bar command');
11
+ }
12
+ }
vendor/symfony/console/Tests/Fixtures/FooCommand.php ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ use Symfony\Component\Console\Command\Command;
4
+ use Symfony\Component\Console\Input\InputInterface;
5
+ use Symfony\Component\Console\Output\OutputInterface;
6
+
7
+ class FooCommand extends Command
8
+ {
9
+ public $input;
10
+ public $output;
11
+
12
+ protected function configure()
13
+ {
14
+ $this
15
+ ->setName('foo:bar')
16
+ ->setDescription('The foo:bar command')
17
+ ->setAliases(array('afoobar'))
18
+ ;
19
+ }
20
+
21
+ protected function interact(InputInterface $input, OutputInterface $output)
22
+ {
23
+ $output->writeln('interact called');
24
+ }
25
+
26
+ protected function execute(InputInterface $input, OutputInterface $output)
27
+ {
28
+ $this->input = $input;
29
+ $this->output = $output;
30
+
31
+ $output->writeln('called');
32
+ }
33
+ }
vendor/symfony/console/Tests/Fixtures/FooLock2Command.php ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ use Symfony\Component\Console\Command\Command;
4
+ use Symfony\Component\Console\Command\LockableTrait;
5
+ use Symfony\Component\Console\Input\InputInterface;
6
+ use Symfony\Component\Console\Output\OutputInterface;
7
+
8
+ class FooLock2Command extends Command
9
+ {
10
+ use LockableTrait;
11
+
12
+ protected function configure()
13
+ {
14
+ $this->setName('foo:lock2');
15
+ }
16
+
17
+ protected function execute(InputInterface $input, OutputInterface $output)
18
+ {
19
+ try {
20
+ $this->lock();
21
+ $this->lock();
22
+ } catch (LogicException $e) {
23
+ return 1;
24
+ }
25
+
26
+ return 2;
27
+ }
28
+ }
vendor/symfony/console/Tests/Fixtures/FooLockCommand.php ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ use Symfony\Component\Console\Command\Command;
4
+ use Symfony\Component\Console\Command\LockableTrait;
5
+ use Symfony\Component\Console\Input\InputInterface;
6
+ use Symfony\Component\Console\Output\OutputInterface;
7
+
8
+ class FooLockCommand extends Command
9
+ {
10
+ use LockableTrait;
11
+
12
+ protected function configure()
13
+ {
14
+ $this->setName('foo:lock');
15
+ }
16
+
17
+ protected function execute(InputInterface $input, OutputInterface $output)
18
+ {
19
+ if (!$this->lock()) {
20
+ return 1;
21
+ }
22
+
23
+ $this->release();
24
+
25
+ return 2;
26
+ }
27
+ }
vendor/symfony/console/Tests/Fixtures/FooOptCommand.php ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ use Symfony\Component\Console\Command\Command;
4
+ use Symfony\Component\Console\Input\InputInterface;
5
+ use Symfony\Component\Console\Input\InputOption;
6
+ use Symfony\Component\Console\Output\OutputInterface;
7
+
8
+ class FooOptCommand extends Command
9
+ {
10
+ public $input;
11
+ public $output;
12
+
13
+ protected function configure()
14
+ {
15
+ $this
16
+ ->setName('foo:bar')
17
+ ->setDescription('The foo:bar command')
18
+ ->setAliases(array('afoobar'))
19
+ ->addOption('fooopt', 'fo', InputOption::VALUE_OPTIONAL, 'fooopt description')
20
+ ;
21
+ }
22
+
23
+ protected function interact(InputInterface $input, OutputInterface $output)
24
+ {
25
+ $output->writeln('interact called');
26
+ }
27
+
28
+ protected function execute(InputInterface $input, OutputInterface $output)
29
+ {
30
+ $this->input = $input;
31
+ $this->output = $output;
32
+
33
+ $output->writeln('called');
34
+ $output->writeln($this->input->getOption('fooopt'));
35
+ }
36
+ }
vendor/symfony/console/Tests/Fixtures/FooSubnamespaced1Command.php ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ use Symfony\Component\Console\Command\Command;
4
+ use Symfony\Component\Console\Input\InputInterface;
5
+ use Symfony\Component\Console\Output\OutputInterface;
6
+
7
+ class FooSubnamespaced1Command extends Command
8
+ {
9
+ public $input;
10
+ public $output;
11
+
12
+ protected function configure()
13
+ {
14
+ $this
15
+ ->setName('foo:bar:baz')
16
+ ->setDescription('The foo:bar:baz command')
17
+ ->setAliases(array('foobarbaz'))
18
+ ;
19
+ }
20
+
21
+ protected function execute(InputInterface $input, OutputInterface $output)
22
+ {
23
+ $this->input = $input;
24
+ $this->output = $output;
25
+ }
26
+ }
vendor/symfony/console/Tests/Fixtures/FooSubnamespaced2Command.php ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ use Symfony\Component\Console\Command\Command;
4
+ use Symfony\Component\Console\Input\InputInterface;
5
+ use Symfony\Component\Console\Output\OutputInterface;
6
+
7
+ class FooSubnamespaced2Command extends Command
8
+ {
9
+ public $input;
10
+ public $output;
11
+
12
+ protected function configure()
13
+ {
14
+ $this
15
+ ->setName('foo:go:bret')
16
+ ->setDescription('The foo:bar:go command')
17
+ ->setAliases(array('foobargo'))
18
+ ;
19
+ }
20
+
21
+ protected function execute(InputInterface $input, OutputInterface $output)
22
+ {
23
+ $this->input = $input;
24
+ $this->output = $output;
25
+ }
26
+ }
vendor/symfony/console/Tests/Fixtures/FoobarCommand.php ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ use Symfony\Component\Console\Command\Command;
4
+ use Symfony\Component\Console\Input\InputInterface;
5
+ use Symfony\Component\Console\Output\OutputInterface;
6
+
7
+ class FoobarCommand extends Command
8
+ {
9
+ public $input;
10
+ public $output;
11
+
12
+ protected function configure()
13
+ {
14
+ $this
15
+ ->setName('foobar:foo')
16
+ ->setDescription('The foobar:foo command')
17
+ ;
18
+ }
19
+
20
+ protected function execute(InputInterface $input, OutputInterface $output)
21
+ {
22
+ $this->input = $input;
23
+ $this->output = $output;
24
+ }
25
+ }
vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/command/command_0.php ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ use Symfony\Component\Console\Input\InputInterface;
4
+ use Symfony\Component\Console\Output\OutputInterface;
5
+ use Symfony\Component\Console\Style\SymfonyStyle;
6
+
7
+ //Ensure has single blank line at start when using block element
8
+ return function (InputInterface $input, OutputInterface $output) {
9
+ $output = new SymfonyStyle($input, $output);
10
+ $output->caution('Lorem ipsum dolor sit amet');
11
+ };
vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/command/command_1.php ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ use Symfony\Component\Console\Input\InputInterface;
4
+ use Symfony\Component\Console\Output\OutputInterface;
5
+ use Symfony\Component\Console\Style\SymfonyStyle;
6
+
7
+ //Ensure has single blank line between titles and blocks
8
+ return function (InputInterface $input, OutputInterface $output) {
9
+ $output = new SymfonyStyle($input, $output);
10
+ $output->title('Title');
11
+ $output->warning('Lorem ipsum dolor sit amet');
12
+ $output->title('Title');
13
+ };
vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/command/command_10.php ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ use Symfony\Component\Console\Input\InputInterface;
4
+ use Symfony\Component\Console\Output\OutputInterface;
5
+ use Symfony\Component\Console\Style\SymfonyStyle;
6
+
7
+ //Ensure that all lines are aligned to the begin of the first line in a very long line block
8
+ return function (InputInterface $input, OutputInterface $output) {
9
+ $output = new SymfonyStyle($input, $output);
10
+ $output->block(
11
+ 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum',
12
+ 'CUSTOM',
13
+ 'fg=white;bg=green',
14
+ 'X ',
15
+ true
16
+ );
17
+ };
vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/command/command_11.php ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ use Symfony\Component\Console\Input\InputInterface;
4
+ use Symfony\Component\Console\Output\OutputInterface;
5
+ use Symfony\Component\Console\Style\SymfonyStyle;
6
+
7
+ // ensure long words are properly wrapped in blocks
8
+ return function (InputInterface $input, OutputInterface $output) {
9
+ $word = 'Lopadotemachoselachogaleokranioleipsanodrimhypotrimmatosilphioparaomelitokatakechymenokichlepikossyphophattoperisteralektryonoptekephalliokigklopeleiolagoiosiraiobaphetraganopterygon';
10
+ $sfStyle = new SymfonyStyle($input, $output);
11
+ $sfStyle->block($word, 'CUSTOM', 'fg=white;bg=blue', ' § ', false);
12
+ };
vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/command/command_12.php ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ use Symfony\Component\Console\Input\InputInterface;
4
+ use Symfony\Component\Console\Output\OutputInterface;
5
+ use Symfony\Component\Console\Style\SymfonyStyle;
6
+
7
+ // ensure that all lines are aligned to the begin of the first one and start with '//' in a very long line comment
8
+ return function (InputInterface $input, OutputInterface $output) {
9
+ $output = new SymfonyStyle($input, $output);
10
+ $output->comment(
11
+ 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum'
12
+ );
13
+ };
vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/command/command_13.php ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ use Symfony\Component\Console\Input\InputInterface;
4
+ use Symfony\Component\Console\Output\OutputInterface;
5
+ use Symfony\Component\Console\Style\SymfonyStyle;
6
+
7
+ // ensure that nested tags have no effect on the color of the '//' prefix
8
+ return function (InputInterface $input, OutputInterface $output) {
9
+ $output->setDecorated(true);
10
+ $output = new SymfonyStyle($input, $output);
11
+ $output->comment(
12
+ 'Lorem ipsum dolor sit <comment>amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.</comment> Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum'
13
+ );
14
+ };
vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/command/command_14.php ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ use Symfony\Component\Console\Input\InputInterface;
4
+ use Symfony\Component\Console\Output\OutputInterface;
5
+ use Symfony\Component\Console\Style\SymfonyStyle;
6
+
7
+ // ensure that block() behaves properly with a prefix and without type
8
+ return function (InputInterface $input, OutputInterface $output) {
9
+ $output = new SymfonyStyle($input, $output);
10
+ $output->block(
11
+ 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum',
12
+ null,
13
+ null,
14
+ '$ ',
15
+ true
16
+ );
17
+ };
vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/command/command_15.php ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ use Symfony\Component\Console\Input\InputInterface;
4
+ use Symfony\Component\Console\Output\OutputInterface;
5
+ use Symfony\Component\Console\Style\SymfonyStyle;
6
+
7
+ // ensure that block() behaves properly with a type and without prefix
8
+ return function (InputInterface $input, OutputInterface $output) {
9
+ $output = new SymfonyStyle($input, $output);
10
+ $output->block(
11
+ 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum',
12
+ 'TEST'
13
+ );
14
+ };
vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/command/command_16.php ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ use Symfony\Component\Console\Input\InputInterface;
4
+ use Symfony\Component\Console\Output\OutputInterface;
5
+ use Symfony\Component\Console\Style\SymfonyStyle;
6
+
7
+ // ensure that block() output is properly formatted (even padding lines)
8
+ return function (InputInterface $input, OutputInterface $output) {
9
+ $output->setDecorated(true);
10
+ $output = new SymfonyStyle($input, $output);
11
+ $output->success(
12
+ 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum',
13
+ 'TEST'
14
+ );
15
+ };
vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/command/command_17.php ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ use Symfony\Component\Console\Input\InputInterface;
4
+ use Symfony\Component\Console\Output\OutputInterface;
5
+ use Symfony\Component\Console\Style\SymfonyStyle;
6
+
7
+ //Ensure symfony style helper methods handle trailing backslashes properly when decorating user texts
8
+ return function (InputInterface $input, OutputInterface $output) {
9
+ $output = new SymfonyStyle($input, $output);
10
+
11
+ $output->title('Title ending with \\');
12
+ $output->section('Section ending with \\');
13
+ };
vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/command/command_2.php ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ use Symfony\Component\Console\Input\InputInterface;
4
+ use Symfony\Component\Console\Output\OutputInterface;
5
+ use Symfony\Component\Console\Style\SymfonyStyle;
6
+
7
+ //Ensure has single blank line between blocks
8
+ return function (InputInterface $input, OutputInterface $output) {
9
+ $output = new SymfonyStyle($input, $output);
10
+ $output->warning('Warning');
11
+ $output->caution('Caution');
12
+ $output->error('Error');
13
+ $output->success('Success');
14
+ $output->note('Note');
15
+ $output->block('Custom block', 'CUSTOM', 'fg=white;bg=green', 'X ', true);
16
+ };
vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/command/command_3.php ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ use Symfony\Component\Console\Input\InputInterface;
4
+ use Symfony\Component\Console\Output\OutputInterface;
5
+ use Symfony\Component\Console\Style\SymfonyStyle;
6
+
7
+ //Ensure has single blank line between two titles
8
+ return function (InputInterface $input, OutputInterface $output) {
9
+ $output = new SymfonyStyle($input, $output);
10
+ $output->title('First title');
11
+ $output->title('Second title');
12
+ };
vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/command/command_4.php ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ use Symfony\Component\Console\Input\InputInterface;
4
+ use Symfony\Component\Console\Output\OutputInterface;
5
+ use Symfony\Component\Console\Style\SymfonyStyle;
6
+
7
+ //Ensure has single blank line after any text and a title
8
+ return function (InputInterface $input, OutputInterface $output) {
9
+ $output = new SymfonyStyle($input, $output);
10
+
11
+ $output->write('Lorem ipsum dolor sit amet');
12
+ $output->title('First title');
13
+
14
+ $output->writeln('Lorem ipsum dolor sit amet');
15
+ $output->title('Second title');
16
+
17
+ $output->write('Lorem ipsum dolor sit amet');
18
+ $output->write('');
19
+ $output->title('Third title');
20
+
21
+ //Ensure edge case by appending empty strings to history:
22
+ $output->write('Lorem ipsum dolor sit amet');
23
+ $output->write(array('', '', ''));
24
+ $output->title('Fourth title');
25
+
26
+ //Ensure have manual control over number of blank lines:
27
+ $output->writeln('Lorem ipsum dolor sit amet');
28
+ $output->writeln(array('', '')); //Should append an extra blank line
29
+ $output->title('Fifth title');
30
+
31
+ $output->writeln('Lorem ipsum dolor sit amet');
32
+ $output->newLine(2); //Should append an extra blank line
33
+ $output->title('Fifth title');
34
+ };
vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/command/command_5.php ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ use Symfony\Component\Console\Input\InputInterface;
4
+ use Symfony\Component\Console\Output\OutputInterface;
5
+ use Symfony\Component\Console\Style\SymfonyStyle;
6
+
7
+ //Ensure has proper line ending before outputting a text block like with SymfonyStyle::listing() or SymfonyStyle::text()
8
+ return function (InputInterface $input, OutputInterface $output) {
9
+ $output = new SymfonyStyle($input, $output);
10
+
11
+ $output->writeln('Lorem ipsum dolor sit amet');
12
+ $output->listing(array(
13
+ 'Lorem ipsum dolor sit amet',
14
+ 'consectetur adipiscing elit',
15
+ ));
16
+
17
+ //Even using write:
18
+ $output->write('Lorem ipsum dolor sit amet');
19
+ $output->listing(array(
20
+ 'Lorem ipsum dolor sit amet',
21
+ 'consectetur adipiscing elit',
22
+ ));
23
+
24
+ $output->write('Lorem ipsum dolor sit amet');
25
+ $output->text(array(
26
+ 'Lorem ipsum dolor sit amet',
27
+ 'consectetur adipiscing elit',
28
+ ));
29
+
30
+ $output->newLine();
31
+
32
+ $output->write('Lorem ipsum dolor sit amet');
33
+ $output->comment(array(
34
+ 'Lorem ipsum dolor sit amet',
35
+ 'consectetur adipiscing elit',
36
+ ));
37
+ };
vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/command/command_6.php ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ use Symfony\Component\Console\Input\InputInterface;
4
+ use Symfony\Component\Console\Output\OutputInterface;
5
+ use Symfony\Component\Console\Style\SymfonyStyle;
6
+
7
+ //Ensure has proper blank line after text block when using a block like with SymfonyStyle::success
8
+ return function (InputInterface $input, OutputInterface $output) {
9
+ $output = new SymfonyStyle($input, $output);
10
+
11
+ $output->listing(array(
12
+ 'Lorem ipsum dolor sit amet',
13
+ 'consectetur adipiscing elit',
14
+ ));
15
+ $output->success('Lorem ipsum dolor sit amet');
16
+ };
vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/command/command_7.php ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ use Symfony\Component\Console\Input\InputInterface;
4
+ use Symfony\Component\Console\Output\OutputInterface;
5
+ use Symfony\Component\Console\Style\SymfonyStyle;
6
+
7
+ //Ensure questions do not output anything when input is non-interactive
8
+ return function (InputInterface $input, OutputInterface $output) {
9
+ $output = new SymfonyStyle($input, $output);
10
+ $output->title('Title');
11
+ $output->askHidden('Hidden question');
12
+ $output->choice('Choice question with default', array('choice1', 'choice2'), 'choice1');
13
+ $output->confirm('Confirmation with yes default', true);
14
+ $output->text('Duis aute irure dolor in reprehenderit in voluptate velit esse');
15
+ };
vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/command/command_8.php ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ use Symfony\Component\Console\Input\InputInterface;
4
+ use Symfony\Component\Console\Output\OutputInterface;
5
+ use Symfony\Component\Console\Style\SymfonyStyle;
6
+ use Symfony\Component\Console\Helper\TableCell;
7
+
8
+ //Ensure formatting tables when using multiple headers with TableCell
9
+ return function (InputInterface $input, OutputInterface $output) {
10
+ $headers = array(
11
+ array(new TableCell('Main table title', array('colspan' => 3))),
12
+ array('ISBN', 'Title', 'Author'),
13
+ );
14
+
15
+ $rows = array(
16
+ array(
17
+ '978-0521567817',
18
+ 'De Monarchia',
19
+ new TableCell("Dante Alighieri\nspans multiple rows", array('rowspan' => 2)),
20
+ ),
21
+ array('978-0804169127', 'Divine Comedy'),
22
+ );
23
+
24
+ $output = new SymfonyStyle($input, $output);
25
+ $output->table($headers, $rows);
26
+ };
vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/command/command_9.php ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ use Symfony\Component\Console\Input\InputInterface;
4
+ use Symfony\Component\Console\Output\OutputInterface;
5
+ use Symfony\Component\Console\Style\SymfonyStyle;
6
+
7
+ //Ensure that all lines are aligned to the begin of the first line in a multi-line block
8
+ return function (InputInterface $input, OutputInterface $output) {
9
+ $output = new SymfonyStyle($input, $output);
10
+ $output->block(array('Custom block', 'Second custom block line'), 'CUSTOM', 'fg=white;bg=green', 'X ', true);
11
+ };
vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/command/index.php ADDED
File without changes
vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/command/interactive_command_1.php ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ use Symfony\Component\Console\Input\InputInterface;
4
+ use Symfony\Component\Console\Output\OutputInterface;
5
+ use Symfony\Component\Console\Style\SymfonyStyle;
6
+
7
+ //Ensure that questions have the expected outputs
8
+ return function (InputInterface $input, OutputInterface $output) {
9
+ $output = new SymfonyStyle($input, $output);
10
+ $stream = fopen('php://memory', 'r+', false);
11
+
12
+ fwrite($stream, "Foo\nBar\nBaz");
13
+ rewind($stream);
14
+ $input->setStream($stream);
15
+
16
+ $output->ask('What\'s your name?');
17
+ $output->ask('How are you?');
18
+ $output->ask('Where do you come from?');
19
+ };
vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/index.php ADDED
File without changes
vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/output/index.php ADDED
File without changes
vendor/symfony/console/Tests/Fixtures/Style/index.php ADDED
File without changes
vendor/symfony/console/Tests/Fixtures/TestCommand.php ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ use Symfony\Component\Console\Command\Command;
4
+ use Symfony\Component\Console\Input\InputInterface;
5
+ use Symfony\Component\Console\Output\OutputInterface;
6
+
7
+ class TestCommand extends Command
8
+ {
9
+ protected function configure()
10
+ {
11
+ $this
12
+ ->setName('namespace:name')
13
+ ->setAliases(array('name'))
14
+ ->setDescription('description')
15
+ ->setHelp('help')
16
+ ;
17
+ }
18
+
19
+ protected function execute(InputInterface $input, OutputInterface $output)
20
+ {
21
+ $output->writeln('execute called');
22
+ }
23
+
24
+ protected function interact(InputInterface $input, OutputInterface $output)
25
+ {
26
+ $output->writeln('interact called');
27
+ }
28
+ }
vendor/symfony/console/Tests/Fixtures/application_1.json ADDED
@@ -0,0 +1,156 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "commands": [
3
+ {
4
+ "name": "help",
5
+ "hidden": false,
6
+ "usage": [
7
+ "help [--format FORMAT] [--raw] [--] [<command_name>]"
8
+ ],
9
+ "description": "Displays help for a command",
10
+ "help": "The <info>help<\/info> command displays help for a given command:\n\n <info>php app\/console help list<\/info>\n\nYou can also output the help in other formats by using the <comment>--format<\/comment> option:\n\n <info>php app\/console help --format=xml list<\/info>\n\nTo display the list of available commands, please use the <info>list<\/info> command.",
11
+ "definition": {
12
+ "arguments": {
13
+ "command_name": {
14
+ "name": "command_name",
15
+ "is_required": false,
16
+ "is_array": false,
17
+ "description": "The command name",
18
+ "default": "help"
19
+ }
20
+ },
21
+ "options": {
22
+ "format": {
23
+ "name": "--format",
24
+ "shortcut": "",
25
+ "accept_value": true,
26
+ "is_value_required": true,
27
+ "is_multiple": false,
28
+ "description": "The output format (txt, xml, json, or md)",
29
+ "default": "txt"
30
+ },
31
+ "raw": {
32
+ "name": "--raw",
33
+ "shortcut": "",
34
+ "accept_value": false,
35
+ "is_value_required": false,
36
+ "is_multiple": false,
37
+ "description": "To output raw command help",
38
+ "default": false
39
+ },
40
+ "help": {
41
+ "name": "--help",
42
+ "shortcut": "-h",
43
+ "accept_value": false,
44
+ "is_value_required": false,
45
+ "is_multiple": false,
46
+ "description": "Display this help message",
47
+ "default": false
48
+ },
49
+ "quiet": {
50
+ "name": "--quiet",
51
+ "shortcut": "-q",
52
+ "accept_value": false,
53
+ "is_value_required": false,
54
+ "is_multiple": false,
55
+ "description": "Do not output any message",
56
+ "default": false
57
+ },
58
+ "verbose": {
59
+ "name": "--verbose",
60
+ "shortcut": "-v|-vv|-vvv",
61
+ "accept_value": false,
62
+ "is_value_required": false,
63
+ "is_multiple": false,
64
+ "description": "Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug",
65
+ "default": false
66
+ },
67
+ "version": {
68
+ "name": "--version",
69
+ "shortcut": "-V",
70
+ "accept_value": false,
71
+ "is_value_required": false,
72
+ "is_multiple": false,
73
+ "description": "Display this application version",
74
+ "default": false
75
+ },
76
+ "ansi": {
77
+ "name": "--ansi",
78
+ "shortcut": "",
79
+ "accept_value": false,
80
+ "is_value_required": false,
81
+ "is_multiple": false,
82
+ "description": "Force ANSI output",
83
+ "default": false
84
+ },
85
+ "no-ansi": {
86
+ "name": "--no-ansi",
87
+ "shortcut": "",
88
+ "accept_value": false,
89
+ "is_value_required": false,
90
+ "is_multiple": false,
91
+ "description": "Disable ANSI output",
92
+ "default": false
93
+ },
94
+ "no-interaction": {
95
+ "name": "--no-interaction",
96
+ "shortcut": "-n",
97
+ "accept_value": false,
98
+ "is_value_required": false,
99
+ "is_multiple": false,
100
+ "description": "Do not ask any interactive question",
101
+ "default": false
102
+ }
103
+ }
104
+ }
105
+ },
106
+ {
107
+ "name": "list",
108
+ "hidden": false,
109
+ "usage": [
110
+ "list [--raw] [--format FORMAT] [--] [<namespace>]"
111
+ ],
112
+ "description": "Lists commands",
113
+ "help": "The <info>list<\/info> command lists all commands:\n\n <info>php app\/console list<\/info>\n\nYou can also display the commands for a specific namespace:\n\n <info>php app\/console list test<\/info>\n\nYou can also output the information in other formats by using the <comment>--format<\/comment> option:\n\n <info>php app\/console list --format=xml<\/info>\n\nIt's also possible to get raw list of commands (useful for embedding command runner):\n\n <info>php app\/console list --raw<\/info>",
114
+ "definition": {
115
+ "arguments": {
116
+ "namespace": {
117
+ "name": "namespace",
118
+ "is_required": false,
119
+ "is_array": false,
120
+ "description": "The namespace name",
121
+ "default": null
122
+ }
123
+ },
124
+ "options": {
125
+ "raw": {
126
+ "name": "--raw",
127
+ "shortcut": "",
128
+ "accept_value": false,
129
+ "is_value_required": false,
130
+ "is_multiple": false,
131
+ "description": "To output raw command list",
132
+ "default": false
133
+ },
134
+ "format": {
135
+ "name": "--format",
136
+ "shortcut": "",
137
+ "accept_value": true,
138
+ "is_value_required": true,
139
+ "is_multiple": false,
140
+ "description": "The output format (txt, xml, json, or md)",
141
+ "default": "txt"
142
+ }
143
+ }
144
+ }
145
+ }
146
+ ],
147
+ "namespaces": [
148
+ {
149
+ "id": "_global",
150
+ "commands": [
151
+ "help",
152
+ "list"
153
+ ]
154
+ }
155
+ ]
156
+ }
vendor/symfony/console/Tests/Fixtures/application_1.xml ADDED
@@ -0,0 +1,104 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <symfony>
3
+ <commands>
4
+ <command id="help" name="help" hidden="0">
5
+ <usages>
6
+ <usage>help [--format FORMAT] [--raw] [--] [&lt;command_name&gt;]</usage>
7
+ </usages>
8
+ <description>Displays help for a command</description>
9
+ <help>The &lt;info&gt;help&lt;/info&gt; command displays help for a given command:
10
+
11
+ &lt;info&gt;php app/console help list&lt;/info&gt;
12
+
13
+ You can also output the help in other formats by using the &lt;comment&gt;--format&lt;/comment&gt; option:
14
+
15
+ &lt;info&gt;php app/console help --format=xml list&lt;/info&gt;
16
+
17
+ To display the list of available commands, please use the &lt;info&gt;list&lt;/info&gt; command.</help>
18
+ <arguments>
19
+ <argument name="command_name" is_required="0" is_array="0">
20
+ <description>The command name</description>
21
+ <defaults>
22
+ <default>help</default>
23
+ </defaults>
24
+ </argument>
25
+ </arguments>
26
+ <options>
27
+ <option name="--format" shortcut="" accept_value="1" is_value_required="1" is_multiple="0">
28
+ <description>The output format (txt, xml, json, or md)</description>
29
+ <defaults>
30
+ <default>txt</default>
31
+ </defaults>
32
+ </option>
33
+ <option name="--raw" shortcut="" accept_value="0" is_value_required="0" is_multiple="0">
34
+ <description>To output raw command help</description>
35
+ </option>
36
+ <option name="--help" shortcut="-h" accept_value="0" is_value_required="0" is_multiple="0">
37
+ <description>Display this help message</description>
38
+ </option>
39
+ <option name="--quiet" shortcut="-q" accept_value="0" is_value_required="0" is_multiple="0">
40
+ <description>Do not output any message</description>
41
+ </option>
42
+ <option name="--verbose" shortcut="-v" shortcuts="-v|-vv|-vvv" accept_value="0" is_value_required="0" is_multiple="0">
43
+ <description>Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug</description>
44
+ </option>
45
+ <option name="--version" shortcut="-V" accept_value="0" is_value_required="0" is_multiple="0">
46
+ <description>Display this application version</description>
47
+ </option>
48
+ <option name="--ansi" shortcut="" accept_value="0" is_value_required="0" is_multiple="0">
49
+ <description>Force ANSI output</description>
50
+ </option>
51
+ <option name="--no-ansi" shortcut="" accept_value="0" is_value_required="0" is_multiple="0">
52
+ <description>Disable ANSI output</description>
53
+ </option>
54
+ <option name="--no-interaction" shortcut="-n" accept_value="0" is_value_required="0" is_multiple="0">
55
+ <description>Do not ask any interactive question</description>
56
+ </option>
57
+ </options>
58
+ </command>
59
+ <command id="list" name="list" hidden="0">
60
+ <usages>
61
+ <usage>list [--raw] [--format FORMAT] [--] [&lt;namespace&gt;]</usage>
62
+ </usages>
63
+ <description>Lists commands</description>
64
+ <help>The &lt;info&gt;list&lt;/info&gt; command lists all commands:
65
+
66
+ &lt;info&gt;php app/console list&lt;/info&gt;
67
+
68
+ You can also display the commands for a specific namespace:
69
+
70
+ &lt;info&gt;php app/console list test&lt;/info&gt;
71
+
72
+ You can also output the information in other formats by using the &lt;comment&gt;--format&lt;/comment&gt; option:
73
+
74
+ &lt;info&gt;php app/console list --format=xml&lt;/info&gt;
75
+
76
+ It's also possible to get raw list of commands (useful for embedding command runner):
77
+
78
+ &lt;info&gt;php app/console list --raw&lt;/info&gt;</help>
79
+ <arguments>
80
+ <argument name="namespace" is_required="0" is_array="0">
81
+ <description>The namespace name</description>
82
+ <defaults/>
83
+ </argument>
84
+ </arguments>
85
+ <options>
86
+ <option name="--raw" shortcut="" accept_value="0" is_value_required="0" is_multiple="0">
87
+ <description>To output raw command list</description>
88
+ </option>
89
+ <option name="--format" shortcut="" accept_value="1" is_value_required="1" is_multiple="0">
90
+ <description>The output format (txt, xml, json, or md)</description>
91
+ <defaults>
92
+ <default>txt</default>
93
+ </defaults>
94
+ </option>
95
+ </options>
96
+ </command>
97
+ </commands>
98
+ <namespaces>
99
+ <namespace id="_global">
100
+ <command>help</command>
101
+ <command>list</command>
102
+ </namespace>
103
+ </namespaces>
104
+ </symfony>
vendor/symfony/console/Tests/Fixtures/application_2.json ADDED
@@ -0,0 +1,509 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "application": {
3
+ "name": "My Symfony application",
4
+ "version": "v1.0"
5
+ },
6
+ "commands": [
7
+ {
8
+ "name": "help",
9
+ "hidden": false,
10
+ "usage": [
11
+ "help [--format FORMAT] [--raw] [--] [<command_name>]"
12
+ ],
13
+ "description": "Displays help for a command",
14
+ "help": "The <info>help<\/info> command displays help for a given command:\n\n <info>php app\/console help list<\/info>\n\nYou can also output the help in other formats by using the <comment>--format<\/comment> option:\n\n <info>php app\/console help --format=xml list<\/info>\n\nTo display the list of available commands, please use the <info>list<\/info> command.",
15
+ "definition": {
16
+ "arguments": {
17
+ "command_name": {
18
+ "name": "command_name",
19
+ "is_required": false,
20
+ "is_array": false,
21
+ "description": "The command name",
22
+ "default": "help"
23
+ }
24
+ },
25
+ "options": {
26
+ "format": {
27
+ "name": "--format",
28
+ "shortcut": "",
29
+ "accept_value": true,
30
+ "is_value_required": true,
31
+ "is_multiple": false,
32
+ "description": "The output format (txt, xml, json, or md)",
33
+ "default": "txt"
34
+ },
35
+ "raw": {
36
+ "name": "--raw",
37
+ "shortcut": "",
38
+ "accept_value": false,
39
+ "is_value_required": false,
40
+ "is_multiple": false,
41
+ "description": "To output raw command help",
42
+ "default": false
43
+ },
44
+ "help": {
45
+ "name": "--help",
46
+ "shortcut": "-h",
47
+ "accept_value": false,
48
+ "is_value_required": false,
49
+ "is_multiple": false,
50
+ "description": "Display this help message",
51
+ "default": false
52
+ },
53
+ "quiet": {
54
+ "name": "--quiet",
55
+ "shortcut": "-q",
56
+ "accept_value": false,
57
+ "is_value_required": false,
58
+ "is_multiple": false,
59
+ "description": "Do not output any message",
60
+ "default": false
61
+ },
62
+ "verbose": {
63
+ "name": "--verbose",
64
+ "shortcut": "-v|-vv|-vvv",
65
+ "accept_value": false,
66
+ "is_value_required": false,
67
+ "is_multiple": false,
68
+ "description": "Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug",
69
+ "default": false
70
+ },
71
+ "version": {
72
+ "name": "--version",
73
+ "shortcut": "-V",
74
+ "accept_value": false,
75
+ "is_value_required": false,
76
+ "is_multiple": false,
77
+ "description": "Display this application version",
78
+ "default": false
79
+ },
80
+ "ansi": {
81
+ "name": "--ansi",
82
+ "shortcut": "",
83
+ "accept_value": false,
84
+ "is_value_required": false,
85
+ "is_multiple": false,
86
+ "description": "Force ANSI output",
87
+ "default": false
88
+ },
89
+ "no-ansi": {
90
+ "name": "--no-ansi",
91
+ "shortcut": "",
92
+ "accept_value": false,
93
+ "is_value_required": false,
94
+ "is_multiple": false,
95
+ "description": "Disable ANSI output",
96
+ "default": false
97
+ },
98
+ "no-interaction": {
99
+ "name": "--no-interaction",
100
+ "shortcut": "-n",
101
+ "accept_value": false,
102
+ "is_value_required": false,
103
+ "is_multiple": false,
104
+ "description": "Do not ask any interactive question",
105
+ "default": false
106
+ }
107
+ }
108
+ }
109
+ },
110
+ {
111
+ "name": "list",
112
+ "hidden": false,
113
+ "usage": [
114
+ "list [--raw] [--format FORMAT] [--] [<namespace>]"
115
+ ],
116
+ "description": "Lists commands",
117
+ "help": "The <info>list<\/info> command lists all commands:\n\n <info>php app\/console list<\/info>\n\nYou can also display the commands for a specific namespace:\n\n <info>php app\/console list test<\/info>\n\nYou can also output the information in other formats by using the <comment>--format<\/comment> option:\n\n <info>php app\/console list --format=xml<\/info>\n\nIt's also possible to get raw list of commands (useful for embedding command runner):\n\n <info>php app\/console list --raw<\/info>",
118
+ "definition": {
119
+ "arguments": {
120
+ "namespace": {
121
+ "name": "namespace",
122
+ "is_required": false,
123
+ "is_array": false,
124
+ "description": "The namespace name",
125
+ "default": null
126
+ }
127
+ },
128
+ "options": {
129
+ "raw": {
130
+ "name": "--raw",
131
+ "shortcut": "",
132
+ "accept_value": false,
133
+ "is_value_required": false,
134
+ "is_multiple": false,
135
+ "description": "To output raw command list",
136
+ "default": false
137
+ },
138
+ "format": {
139
+ "name": "--format",
140
+ "shortcut": "",
141
+ "accept_value": true,
142
+ "is_value_required": true,
143
+ "is_multiple": false,
144
+ "description": "The output format (txt, xml, json, or md)",
145
+ "default": "txt"
146
+ }
147
+ }
148
+ }
149
+ },
150
+ {
151
+ "name": "descriptor:command1",
152
+ "hidden": false,
153
+ "usage": [
154
+ "descriptor:command1",
155
+ "alias1",
156
+ "alias2"
157
+ ],
158
+ "description": "command 1 description",
159
+ "help": "command 1 help",
160
+ "definition": {
161
+ "arguments": [],
162
+ "options": {
163
+ "help": {
164
+ "name": "--help",
165
+ "shortcut": "-h",
166
+ "accept_value": false,
167
+ "is_value_required": false,
168
+ "is_multiple": false,
169
+ "description": "Display this help message",
170
+ "default": false
171
+ },
172
+ "quiet": {
173
+ "name": "--quiet",
174
+ "shortcut": "-q",
175
+ "accept_value": false,
176
+ "is_value_required": false,
177
+ "is_multiple": false,
178
+ "description": "Do not output any message",
179
+ "default": false
180
+ },
181
+ "verbose": {
182
+ "name": "--verbose",
183
+ "shortcut": "-v|-vv|-vvv",
184
+ "accept_value": false,
185
+ "is_value_required": false,
186
+ "is_multiple": false,
187
+ "description": "Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug",
188
+ "default": false
189
+ },
190
+ "version": {
191
+ "name": "--version",
192
+ "shortcut": "-V",
193
+ "accept_value": false,
194
+ "is_value_required": false,
195
+ "is_multiple": false,
196
+ "description": "Display this application version",
197
+ "default": false
198
+ },
199
+ "ansi": {
200
+ "name": "--ansi",
201
+ "shortcut": "",
202
+ "accept_value": false,
203
+ "is_value_required": false,
204
+ "is_multiple": false,
205
+ "description": "Force ANSI output",
206
+ "default": false
207
+ },
208
+ "no-ansi": {
209
+ "name": "--no-ansi",
210
+ "shortcut": "",
211
+ "accept_value": false,
212
+ "is_value_required": false,
213
+ "is_multiple": false,
214
+ "description": "Disable ANSI output",
215
+ "default": false
216
+ },
217
+ "no-interaction": {
218
+ "name": "--no-interaction",
219
+ "shortcut": "-n",
220
+ "accept_value": false,
221
+ "is_value_required": false,
222
+ "is_multiple": false,
223
+ "description": "Do not ask any interactive question",
224
+ "default": false
225
+ }
226
+ }
227
+ }
228
+ },
229
+ {
230
+ "name": "descriptor:command2",
231
+ "hidden": false,
232
+ "usage": [
233
+ "descriptor:command2 [-o|--option_name] [--] <argument_name>",
234
+ "descriptor:command2 -o|--option_name <argument_name>",
235
+ "descriptor:command2 <argument_name>"
236
+ ],
237
+ "description": "command 2 description",
238
+ "help": "command 2 help",
239
+ "definition": {
240
+ "arguments": {
241
+ "argument_name": {
242
+ "name": "argument_name",
243
+ "is_required": true,
244
+ "is_array": false,
245
+ "description": "",
246
+ "default": null
247
+ }
248
+ },
249
+ "options": {
250
+ "option_name": {
251
+ "name": "--option_name",
252
+ "shortcut": "-o",
253
+ "accept_value": false,
254
+ "is_value_required": false,
255
+ "is_multiple": false,
256
+ "description": "",
257
+ "default": false
258
+ },
259
+ "help": {
260
+ "name": "--help",
261
+ "shortcut": "-h",
262
+ "accept_value": false,
263
+ "is_value_required": false,
264
+ "is_multiple": false,
265
+ "description": "Display this help message",
266
+ "default": false
267
+ },
268
+ "quiet": {
269
+ "name": "--quiet",
270
+ "shortcut": "-q",
271
+ "accept_value": false,
272
+ "is_value_required": false,
273
+ "is_multiple": false,
274
+ "description": "Do not output any message",
275
+ "default": false
276
+ },
277
+ "verbose": {
278
+ "name": "--verbose",
279
+ "shortcut": "-v|-vv|-vvv",
280
+ "accept_value": false,
281
+ "is_value_required": false,
282
+ "is_multiple": false,
283
+ "description": "Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug",
284
+ "default": false
285
+ },
286
+ "version": {
287
+ "name": "--version",
288
+ "shortcut": "-V",
289
+ "accept_value": false,
290
+ "is_value_required": false,
291
+ "is_multiple": false,
292
+ "description": "Display this application version",
293
+ "default": false
294
+ },
295
+ "ansi": {
296
+ "name": "--ansi",
297
+ "shortcut": "",
298
+ "accept_value": false,
299
+ "is_value_required": false,
300
+ "is_multiple": false,
301
+ "description": "Force ANSI output",
302
+ "default": false
303
+ },
304
+ "no-ansi": {
305
+ "name": "--no-ansi",
306
+ "shortcut": "",
307
+ "accept_value": false,
308
+ "is_value_required": false,
309
+ "is_multiple": false,
310
+ "description": "Disable ANSI output",
311
+ "default": false
312
+ },
313
+ "no-interaction": {
314
+ "name": "--no-interaction",
315
+ "shortcut": "-n",
316
+ "accept_value": false,
317
+ "is_value_required": false,
318
+ "is_multiple": false,
319
+ "description": "Do not ask any interactive question",
320
+ "default": false
321
+ }
322
+ }
323
+ }
324
+ },
325
+ {
326
+ "name": "descriptor:command3",
327
+ "hidden": true,
328
+ "usage": [
329
+ "descriptor:command3"
330
+ ],
331
+ "description": "command 3 description",
332
+ "help": "command 3 help",
333
+ "definition": {
334
+ "arguments": {},
335
+ "options": {
336
+ "help": {
337
+ "name": "--help",
338
+ "shortcut": "-h",
339
+ "accept_value": false,
340
+ "is_value_required": false,
341
+ "is_multiple": false,
342
+ "description": "Display this help message",
343
+ "default": false
344
+ },
345
+ "quiet": {
346
+ "name": "--quiet",
347
+ "shortcut": "-q",
348
+ "accept_value": false,
349
+ "is_value_required": false,
350
+ "is_multiple": false,
351
+ "description": "Do not output any message",
352
+ "default": false
353
+ },
354
+ "verbose": {
355
+ "name": "--verbose",
356
+ "shortcut": "-v|-vv|-vvv",
357
+ "accept_value": false,
358
+ "is_value_required": false,
359
+ "is_multiple": false,
360
+ "description": "Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug",
361
+ "default": false
362
+ },
363
+ "version": {
364
+ "name": "--version",
365
+ "shortcut": "-V",
366
+ "accept_value": false,
367
+ "is_value_required": false,
368
+ "is_multiple": false,
369
+ "description": "Display this application version",
370
+ "default": false
371
+ },
372
+ "ansi": {
373
+ "name": "--ansi",
374
+ "shortcut": "",
375
+ "accept_value": false,
376
+ "is_value_required": false,
377
+ "is_multiple": false,
378
+ "description": "Force ANSI output",
379
+ "default": false
380
+ },
381
+ "no-ansi": {
382
+ "name": "--no-ansi",
383
+ "shortcut": "",
384
+ "accept_value": false,
385
+ "is_value_required": false,
386
+ "is_multiple": false,
387
+ "description": "Disable ANSI output",
388
+ "default": false
389
+ },
390
+ "no-interaction": {
391
+ "name": "--no-interaction",
392
+ "shortcut": "-n",
393
+ "accept_value": false,
394
+ "is_value_required": false,
395
+ "is_multiple": false,
396
+ "description": "Do not ask any interactive question",
397
+ "default": false
398
+ }
399
+ }
400
+ }
401
+ },
402
+ {
403
+ "name": "descriptor:command4",
404
+ "hidden": false,
405
+ "usage": [
406
+ "descriptor:command4",
407
+ "descriptor:alias_command4",
408
+ "command4:descriptor"
409
+ ],
410
+ "description": null,
411
+ "help": "",
412
+ "definition": {
413
+ "arguments": {},
414
+ "options": {
415
+ "help": {
416
+ "name": "--help",
417
+ "shortcut": "-h",
418
+ "accept_value": false,
419
+ "is_value_required": false,
420
+ "is_multiple": false,
421
+ "description": "Display this help message",
422
+ "default": false
423
+ },
424
+ "quiet": {
425
+ "name": "--quiet",
426
+ "shortcut": "-q",
427
+ "accept_value": false,
428
+ "is_value_required": false,
429
+ "is_multiple": false,
430
+ "description": "Do not output any message",
431
+ "default": false
432
+ },
433
+ "verbose": {
434
+ "name": "--verbose",
435
+ "shortcut": "-v|-vv|-vvv",
436
+ "accept_value": false,
437
+ "is_value_required": false,
438
+ "is_multiple": false,
439
+ "description": "Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug",
440
+ "default": false
441
+ },
442
+ "version": {
443
+ "name": "--version",
444
+ "shortcut": "-V",
445
+ "accept_value": false,
446
+ "is_value_required": false,
447
+ "is_multiple": false,
448
+ "description": "Display this application version",
449
+ "default": false
450
+ },
451
+ "ansi": {
452
+ "name": "--ansi",
453
+ "shortcut": "",
454
+ "accept_value": false,
455
+ "is_value_required": false,
456
+ "is_multiple": false,
457
+ "description": "Force ANSI output",
458
+ "default": false
459
+ },
460
+ "no-ansi": {
461
+ "name": "--no-ansi",
462
+ "shortcut": "",
463
+ "accept_value": false,
464
+ "is_value_required": false,
465
+ "is_multiple": false,
466
+ "description": "Disable ANSI output",
467
+ "default": false
468
+ },
469
+ "no-interaction": {
470
+ "name": "--no-interaction",
471
+ "shortcut": "-n",
472
+ "accept_value": false,
473
+ "is_value_required": false,
474
+ "is_multiple": false,
475
+ "description": "Do not ask any interactive question",
476
+ "default": false
477
+ }
478
+ }
479
+ }
480
+ }
481
+ ],
482
+ "namespaces": [
483
+ {
484
+ "id": "_global",
485
+ "commands": [
486
+ "alias1",
487
+ "alias2",
488
+ "help",
489
+ "list"
490
+ ]
491
+ },
492
+ {
493
+ "id": "command4",
494
+ "commands": [
495
+ "command4:descriptor"
496
+ ]
497
+ },
498
+ {
499
+ "id": "descriptor",
500
+ "commands": [
501
+ "descriptor:alias_command4",
502
+ "descriptor:command1",
503
+ "descriptor:command2",
504
+ "descriptor:command3",
505
+ "descriptor:command4"
506
+ ]
507
+ }
508
+ ]
509
+ }
vendor/symfony/console/Tests/Fixtures/application_2.xml ADDED
@@ -0,0 +1,254 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <symfony name="My Symfony application" version="v1.0">
3
+ <commands>
4
+ <command id="help" name="help" hidden="0">
5
+ <usages>
6
+ <usage>help [--format FORMAT] [--raw] [--] [&lt;command_name&gt;]</usage>
7
+ </usages>
8
+ <description>Displays help for a command</description>
9
+ <help>The &lt;info&gt;help&lt;/info&gt; command displays help for a given command:
10
+
11
+ &lt;info&gt;php app/console help list&lt;/info&gt;
12
+
13
+ You can also output the help in other formats by using the &lt;comment&gt;--format&lt;/comment&gt; option:
14
+
15
+ &lt;info&gt;php app/console help --format=xml list&lt;/info&gt;
16
+
17
+ To display the list of available commands, please use the &lt;info&gt;list&lt;/info&gt; command.</help>
18
+ <arguments>
19
+ <argument name="command_name" is_required="0" is_array="0">
20
+ <description>The command name</description>
21
+ <defaults>
22
+ <default>help</default>
23
+ </defaults>
24
+ </argument>
25
+ </arguments>
26
+ <options>
27
+ <option name="--format" shortcut="" accept_value="1" is_value_required="1" is_multiple="0">
28
+ <description>The output format (txt, xml, json, or md)</description>
29
+ <defaults>
30
+ <default>txt</default>
31
+ </defaults>
32
+ </option>
33
+ <option name="--raw" shortcut="" accept_value="0" is_value_required="0" is_multiple="0">
34
+ <description>To output raw command help</description>
35
+ </option>
36
+ <option name="--help" shortcut="-h" accept_value="0" is_value_required="0" is_multiple="0">
37
+ <description>Display this help message</description>
38
+ </option>
39
+ <option name="--quiet" shortcut="-q" accept_value="0" is_value_required="0" is_multiple="0">
40
+ <description>Do not output any message</description>
41
+ </option>
42
+ <option name="--verbose" shortcut="-v" shortcuts="-v|-vv|-vvv" accept_value="0" is_value_required="0" is_multiple="0">
43
+ <description>Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug</description>
44
+ </option>
45
+ <option name="--version" shortcut="-V" accept_value="0" is_value_required="0" is_multiple="0">
46
+ <description>Display this application version</description>
47
+ </option>
48
+ <option name="--ansi" shortcut="" accept_value="0" is_value_required="0" is_multiple="0">
49
+ <description>Force ANSI output</description>
50
+ </option>
51
+ <option name="--no-ansi" shortcut="" accept_value="0" is_value_required="0" is_multiple="0">
52
+ <description>Disable ANSI output</description>
53
+ </option>
54
+ <option name="--no-interaction" shortcut="-n" accept_value="0" is_value_required="0" is_multiple="0">
55
+ <description>Do not ask any interactive question</description>
56
+ </option>
57
+ </options>
58
+ </command>
59
+ <command id="list" name="list" hidden="0">
60
+ <usages>
61
+ <usage>list [--raw] [--format FORMAT] [--] [&lt;namespace&gt;]</usage>
62
+ </usages>
63
+ <description>Lists commands</description>
64
+ <help>The &lt;info&gt;list&lt;/info&gt; command lists all commands:
65
+
66
+ &lt;info&gt;php app/console list&lt;/info&gt;
67
+
68
+ You can also display the commands for a specific namespace:
69
+
70
+ &lt;info&gt;php app/console list test&lt;/info&gt;
71
+
72
+ You can also output the information in other formats by using the &lt;comment&gt;--format&lt;/comment&gt; option:
73
+
74
+ &lt;info&gt;php app/console list --format=xml&lt;/info&gt;
75
+
76
+ It's also possible to get raw list of commands (useful for embedding command runner):
77
+
78
+ &lt;info&gt;php app/console list --raw&lt;/info&gt;</help>
79
+ <arguments>
80
+ <argument name="namespace" is_required="0" is_array="0">
81
+ <description>The namespace name</description>
82
+ <defaults/>
83
+ </argument>
84
+ </arguments>
85
+ <options>
86
+ <option name="--raw" shortcut="" accept_value="0" is_value_required="0" is_multiple="0">
87
+ <description>To output raw command list</description>
88
+ </option>
89
+ <option name="--format" shortcut="" accept_value="1" is_value_required="1" is_multiple="0">
90
+ <description>The output format (txt, xml, json, or md)</description>
91
+ <defaults>
92
+ <default>txt</default>
93
+ </defaults>
94
+ </option>
95
+ </options>
96
+ </command>
97
+ <command id="descriptor:command1" name="descriptor:command1" hidden="0">
98
+ <usages>
99
+ <usage>descriptor:command1</usage>
100
+ <usage>alias1</usage>
101
+ <usage>alias2</usage>
102
+ </usages>
103
+ <description>command 1 description</description>
104
+ <help>command 1 help</help>
105
+ <arguments/>
106
+ <options>
107
+ <option name="--help" shortcut="-h" accept_value="0" is_value_required="0" is_multiple="0">
108
+ <description>Display this help message</description>
109
+ </option>
110
+ <option name="--quiet" shortcut="-q" accept_value="0" is_value_required="0" is_multiple="0">
111
+ <description>Do not output any message</description>
112
+ </option>
113
+ <option name="--verbose" shortcut="-v" shortcuts="-v|-vv|-vvv" accept_value="0" is_value_required="0" is_multiple="0">
114
+ <description>Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug</description>
115
+ </option>
116
+ <option name="--version" shortcut="-V" accept_value="0" is_value_required="0" is_multiple="0">
117
+ <description>Display this application version</description>
118
+ </option>
119
+ <option name="--ansi" shortcut="" accept_value="0" is_value_required="0" is_multiple="0">
120
+ <description>Force ANSI output</description>
121
+ </option>
122
+ <option name="--no-ansi" shortcut="" accept_value="0" is_value_required="0" is_multiple="0">
123
+ <description>Disable ANSI output</description>
124
+ </option>
125
+ <option name="--no-interaction" shortcut="-n" accept_value="0" is_value_required="0" is_multiple="0">
126
+ <description>Do not ask any interactive question</description>
127
+ </option>
128
+ </options>
129
+ </command>
130
+ <command id="descriptor:command2" name="descriptor:command2" hidden="0">
131
+ <usages>
132
+ <usage>descriptor:command2 [-o|--option_name] [--] &lt;argument_name&gt;</usage>
133
+ <usage>descriptor:command2 -o|--option_name &lt;argument_name&gt;</usage>
134
+ <usage>descriptor:command2 &lt;argument_name&gt;</usage>
135
+ </usages>
136
+ <description>command 2 description</description>
137
+ <help>command 2 help</help>
138
+ <arguments>
139
+ <argument name="argument_name" is_required="1" is_array="0">
140
+ <description></description>
141
+ <defaults/>
142
+ </argument>
143
+ </arguments>
144
+ <options>
145
+ <option name="--option_name" shortcut="-o" accept_value="0" is_value_required="0" is_multiple="0">
146
+ <description></description>
147
+ </option>
148
+ <option name="--help" shortcut="-h" accept_value="0" is_value_required="0" is_multiple="0">
149
+ <description>Display this help message</description>
150
+ </option>
151
+ <option name="--quiet" shortcut="-q" accept_value="0" is_value_required="0" is_multiple="0">
152
+ <description>Do not output any message</description>
153
+ </option>
154
+ <option name="--verbose" shortcut="-v" shortcuts="-v|-vv|-vvv" accept_value="0" is_value_required="0" is_multiple="0">
155
+ <description>Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug</description>
156
+ </option>
157
+ <option name="--version" shortcut="-V" accept_value="0" is_value_required="0" is_multiple="0">
158
+ <description>Display this application version</description>
159
+ </option>
160
+ <option name="--ansi" shortcut="" accept_value="0" is_value_required="0" is_multiple="0">
161
+ <description>Force ANSI output</description>
162
+ </option>
163
+ <option name="--no-ansi" shortcut="" accept_value="0" is_value_required="0" is_multiple="0">
164
+ <description>Disable ANSI output</description>
165
+ </option>
166
+ <option name="--no-interaction" shortcut="-n" accept_value="0" is_value_required="0" is_multiple="0">
167
+ <description>Do not ask any interactive question</description>
168
+ </option>
169
+ </options>
170
+ </command>
171
+ <command id="descriptor:command3" name="descriptor:command3" hidden="1">
172
+ <usages>
173
+ <usage>descriptor:command3</usage>
174
+ </usages>
175
+ <description>command 3 description</description>
176
+ <help>command 3 help</help>
177
+ <arguments/>
178
+ <options>
179
+ <option name="--help" shortcut="-h" accept_value="0" is_value_required="0" is_multiple="0">
180
+ <description>Display this help message</description>
181
+ </option>
182
+ <option name="--quiet" shortcut="-q" accept_value="0" is_value_required="0" is_multiple="0">
183
+ <description>Do not output any message</description>
184
+ </option>
185
+ <option name="--verbose" shortcut="-v" shortcuts="-v|-vv|-vvv" accept_value="0" is_value_required="0" is_multiple="0">
186
+ <description>Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug</description>
187
+ </option>
188
+ <option name="--version" shortcut="-V" accept_value="0" is_value_required="0" is_multiple="0">
189
+ <description>Display this application version</description>
190
+ </option>
191
+ <option name="--ansi" shortcut="" accept_value="0" is_value_required="0" is_multiple="0">
192
+ <description>Force ANSI output</description>
193
+ </option>
194
+ <option name="--no-ansi" shortcut="" accept_value="0" is_value_required="0" is_multiple="0">
195
+ <description>Disable ANSI output</description>
196
+ </option>
197
+ <option name="--no-interaction" shortcut="-n" accept_value="0" is_value_required="0" is_multiple="0">
198
+ <description>Do not ask any interactive question</description>
199
+ </option>
200
+ </options>
201
+ </command>
202
+ <command id="descriptor:command4" name="descriptor:command4" hidden="0">
203
+ <usages>
204
+ <usage>descriptor:command4</usage>
205
+ <usage>descriptor:alias_command4</usage>
206
+ <usage>command4:descriptor</usage>
207
+ </usages>
208
+ <description></description>
209
+ <help></help>
210
+ <arguments/>
211
+ <options>
212
+ <option name="--help" shortcut="-h" accept_value="0" is_value_required="0" is_multiple="0">
213
+ <description>Display this help message</description>
214
+ </option>
215
+ <option name="--quiet" shortcut="-q" accept_value="0" is_value_required="0" is_multiple="0">
216
+ <description>Do not output any message</description>
217
+ </option>
218
+ <option name="--verbose" shortcut="-v" shortcuts="-v|-vv|-vvv" accept_value="0" is_value_required="0" is_multiple="0">
219
+ <description>Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug</description>
220
+ </option>
221
+ <option name="--version" shortcut="-V" accept_value="0" is_value_required="0" is_multiple="0">
222
+ <description>Display this application version</description>
223
+ </option>
224
+ <option name="--ansi" shortcut="" accept_value="0" is_value_required="0" is_multiple="0">
225
+ <description>Force ANSI output</description>
226
+ </option>
227
+ <option name="--no-ansi" shortcut="" accept_value="0" is_value_required="0" is_multiple="0">
228
+ <description>Disable ANSI output</description>
229
+ </option>
230
+ <option name="--no-interaction" shortcut="-n" accept_value="0" is_value_required="0" is_multiple="0">
231
+ <description>Do not ask any interactive question</description>
232
+ </option>
233
+ </options>
234
+ </command>
235
+ </commands>
236
+ <namespaces>
237
+ <namespace id="_global">
238
+ <command>alias1</command>
239
+ <command>alias2</command>
240
+ <command>help</command>
241
+ <command>list</command>
242
+ </namespace>
243
+ <namespace id="command4">
244
+ <command>command4:descriptor</command>
245
+ </namespace>
246
+ <namespace id="descriptor">
247
+ <command>descriptor:alias_command4</command>
248
+ <command>descriptor:command1</command>
249
+ <command>descriptor:command2</command>
250
+ <command>descriptor:command3</command>
251
+ <command>descriptor:command4</command>
252
+ </namespace>
253
+ </namespaces>
254
+ </symfony>
vendor/symfony/console/Tests/Fixtures/command_1.json CHANGED
File without changes