MailPoet Newsletters (New) - Version 3.11.4

Version Description

  • 2018-10-16 =
  • Added: email notifications to administrators when new subscribers subscribe
Download this release

Release Info

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

Code changes from version 3.11.3 to 3.11.4

Files changed (188) hide show
  1. assets/css/{admin.90fe3283.css → admin.e15169a5.css} +31 -0
  2. assets/css/manifest.json +1 -1
  3. assets/img/in_app_announcements/new-subscriber-notification.png +0 -0
  4. assets/js/{admin.eaab3da3.js → admin.f5731029.js} +122 -26
  5. assets/js/{admin_vendor.eaab3da3.js → admin_vendor.f5731029.js} +267 -267
  6. assets/js/{form_editor.eaab3da3.js → form_editor.f5731029.js} +10 -10
  7. assets/js/{mailpoet.eaab3da3.js → mailpoet.f5731029.js} +25 -25
  8. assets/js/manifest.json +7 -7
  9. assets/js/{mp2migrator.8768b2f6.js → mp2migrator.3d80df09.js} +2 -2
  10. assets/js/{newsletter_editor.eaab3da3.js → newsletter_editor.f5731029.js} +58 -58
  11. assets/js/{vendor.eaab3da3.js → vendor.f5731029.js} +0 -0
  12. lang/mailpoet-ca.mo +0 -0
  13. lang/mailpoet-da_DK.mo +0 -0
  14. lang/mailpoet-de_DE.mo +0 -0
  15. lang/mailpoet-es_ES.mo +0 -0
  16. lang/mailpoet-fa_IR.mo +0 -0
  17. lang/mailpoet-fr_CA.mo +0 -0
  18. lang/mailpoet-fr_FR.mo +0 -0
  19. lang/mailpoet-it_IT.mo +0 -0
  20. lang/mailpoet-ja.mo +0 -0
  21. lang/mailpoet-nl_NL.mo +0 -0
  22. lang/mailpoet-pl_PL.mo +0 -0
  23. lang/mailpoet-pt_BR.mo +0 -0
  24. lang/mailpoet-pt_PT.mo +0 -0
  25. lang/mailpoet-ru_RU.mo +0 -0
  26. lang/mailpoet-sq.mo +0 -0
  27. lang/mailpoet-sv_SE.mo +0 -0
  28. lang/mailpoet-tr_TR.mo +0 -0
  29. lang/mailpoet-zh_CN.mo +0 -0
  30. lang/mailpoet.pot +203 -128
  31. lib/API/MP/v1/API.php +14 -1
  32. lib/Analytics/Reporter.php +2 -0
  33. lib/Config/Capabilities.php +11 -7
  34. lib/Config/Menu.php +2 -1
  35. lib/Config/Migrator.php +1 -1
  36. lib/Config/Populator.php +11 -1
  37. lib/Form/Widget.php +1 -1
  38. lib/Models/Setting.php +2 -0
  39. lib/Models/Subscriber.php +7 -68
  40. lib/Subscribers/ConfirmationEmailMailer.php +91 -0
  41. lib/Subscribers/NewSubscriberNotificationMailer.php +121 -0
  42. lib/Subscription/Pages.php +16 -4
  43. lib/Util/ConflictResolver.php +3 -1
  44. lib/Util/Helpers.php +8 -0
  45. lib/Util/Notices/DiscountsAnnouncement.php +44 -0
  46. lib/Util/Notices/PHPVersionWarnings.php +1 -2
  47. lib/Util/Notices/PermanentNotices.php +7 -0
  48. mailpoet.php +2 -2
  49. readme.txt +4 -1
  50. vendor/autoload.php +1 -1
  51. vendor/bin/security-checker +2 -1
  52. vendor/cerdic/css-tidy/class.csstidy.php +42 -12
  53. vendor/cerdic/css-tidy/class.csstidy_optimise.php +363 -28
  54. vendor/cerdic/css-tidy/class.csstidy_print.php +7 -0
  55. vendor/cerdic/css-tidy/data.inc.php +5 -2
  56. vendor/cerdic/css-tidy/lang.inc.php +4 -2
  57. vendor/composer/ClassLoader.php +3 -3
  58. vendor/composer/autoload_classmap.php +8 -9
  59. vendor/composer/autoload_namespaces.php +0 -1
  60. vendor/composer/autoload_psr4.php +1 -0
  61. vendor/composer/autoload_real.php +7 -7
  62. vendor/composer/autoload_static.php +19 -19
  63. vendor/composer/installed.json +412 -410
  64. vendor/nesbot/carbon/src/Carbon/Lang/ru.php +7 -7
  65. vendor/nesbot/carbon/src/JsonSerializable.php +15 -13
  66. vendor/sensiolabs/security-checker/SensioLabs/Security/Command/SecurityCheckerCommand.php +11 -27
  67. vendor/sensiolabs/security-checker/SensioLabs/Security/Crawler.php +180 -0
  68. vendor/sensiolabs/security-checker/SensioLabs/Security/Crawler/BaseCrawler.php +0 -106
  69. vendor/sensiolabs/security-checker/SensioLabs/Security/Crawler/CrawlerInterface.php +0 -31
  70. vendor/sensiolabs/security-checker/SensioLabs/Security/Crawler/CurlCrawler.php +0 -98
  71. vendor/sensiolabs/security-checker/SensioLabs/Security/Crawler/DefaultCrawler.php +0 -49
  72. vendor/sensiolabs/security-checker/SensioLabs/Security/Crawler/FileGetContentsCrawler.php +0 -89
  73. vendor/sensiolabs/security-checker/SensioLabs/Security/Formatters/FormatterInterface.php +0 -26
  74. vendor/sensiolabs/security-checker/SensioLabs/Security/Formatters/JsonFormatter.php +0 -33
  75. vendor/sensiolabs/security-checker/SensioLabs/Security/Formatters/SimpleFormatter.php +0 -68
  76. vendor/sensiolabs/security-checker/SensioLabs/Security/Formatters/TextFormatter.php +0 -60
  77. vendor/sensiolabs/security-checker/SensioLabs/Security/Resources/security.sensiolabs.org.crt +0 -25
  78. vendor/sensiolabs/security-checker/SensioLabs/Security/Result.php +41 -0
  79. vendor/sensiolabs/security-checker/SensioLabs/Security/SecurityChecker.php +21 -25
  80. vendor/sensiolabs/security-checker/box.json +1 -1
  81. vendor/sensiolabs/security-checker/composer.json +3 -2
  82. vendor/sensiolabs/security-checker/security-checker +2 -1
  83. vendor/symfony/console/Application.php +166 -78
  84. vendor/symfony/console/Command/Command.php +36 -21
  85. vendor/symfony/console/Command/HelpCommand.php +1 -1
  86. vendor/symfony/console/Command/ListCommand.php +2 -2
  87. vendor/symfony/console/Command/LockableTrait.php +20 -11
  88. vendor/symfony/console/CommandLoader/CommandLoaderInterface.php +37 -0
  89. vendor/symfony/console/CommandLoader/ContainerCommandLoader.php +55 -0
  90. vendor/symfony/console/CommandLoader/FactoryCommandLoader.php +62 -0
  91. vendor/{sensiolabs/security-checker/SensioLabs/Security/Crawler → symfony/console/CommandLoader}/index.php +0 -0
  92. vendor/symfony/console/DependencyInjection/AddConsoleCommandPass.php +63 -13
  93. vendor/symfony/console/Descriptor/Descriptor.php +2 -2
  94. vendor/symfony/console/Descriptor/DescriptorInterface.php +1 -1
  95. vendor/symfony/console/Descriptor/JsonDescriptor.php +1 -1
  96. vendor/symfony/console/Descriptor/MarkdownDescriptor.php +3 -3
  97. vendor/symfony/console/Descriptor/TextDescriptor.php +8 -8
  98. vendor/symfony/console/Descriptor/XmlDescriptor.php +3 -3
  99. vendor/symfony/console/Event/ConsoleErrorEvent.php +2 -2
  100. vendor/symfony/console/EventListener/ErrorListener.php +2 -2
  101. vendor/symfony/console/Formatter/OutputFormatter.php +4 -4
  102. vendor/symfony/console/Formatter/OutputFormatterStyle.php +8 -24
  103. vendor/symfony/console/Formatter/OutputFormatterStyleStack.php +2 -2
  104. vendor/symfony/console/Helper/DebugFormatterHelper.php +1 -1
  105. vendor/symfony/console/Helper/DescriptorHelper.php +1 -1
  106. vendor/symfony/console/Helper/FormatterHelper.php +1 -1
  107. vendor/symfony/console/Helper/Helper.php +3 -3
  108. vendor/symfony/console/Helper/HelperSet.php +1 -1
  109. vendor/symfony/console/Helper/InputAwareHelper.php +1 -1
  110. vendor/symfony/console/Helper/ProcessHelper.php +2 -5
  111. vendor/symfony/console/Helper/ProgressBar.php +2 -2
  112. vendor/symfony/console/Helper/ProgressIndicator.php +3 -3
  113. vendor/symfony/console/Helper/QuestionHelper.php +13 -13
  114. vendor/symfony/console/Helper/SymfonyQuestionHelper.php +7 -3
  115. vendor/symfony/console/Helper/Table.php +29 -21
  116. vendor/symfony/console/Helper/TableCell.php +1 -1
  117. vendor/symfony/console/Helper/TableStyle.php +1 -1
  118. vendor/symfony/console/Input/ArgvInput.php +24 -16
  119. vendor/symfony/console/Input/ArrayInput.php +9 -9
  120. vendor/symfony/console/Input/Input.php +1 -1
  121. vendor/symfony/console/Input/InputArgument.php +8 -8
  122. vendor/symfony/console/Input/InputDefinition.php +7 -7
  123. vendor/symfony/console/Input/InputInterface.php +12 -6
  124. vendor/symfony/console/Input/InputOption.php +11 -11
  125. vendor/symfony/console/Input/StringInput.php +4 -4
  126. vendor/symfony/console/Logger/ConsoleLogger.php +17 -7
  127. vendor/symfony/console/Output/ConsoleOutput.php +1 -1
  128. vendor/symfony/console/Output/Output.php +1 -1
  129. vendor/symfony/console/Output/OutputInterface.php +2 -2
  130. vendor/symfony/console/Output/StreamOutput.php +26 -9
  131. vendor/symfony/console/Question/ChoiceQuestion.php +1 -1
  132. vendor/symfony/console/Question/ConfirmationQuestion.php +1 -1
  133. vendor/symfony/console/Question/Question.php +9 -9
  134. vendor/symfony/console/Style/OutputStyle.php +1 -1
  135. vendor/symfony/console/Style/SymfonyStyle.php +6 -6
  136. vendor/symfony/console/Terminal.php +5 -5
  137. vendor/symfony/console/Tester/CommandTester.php +1 -1
  138. vendor/symfony/console/Tests/ApplicationTest.php +237 -14
  139. vendor/symfony/console/Tests/Command/CommandTest.php +6 -6
  140. vendor/symfony/console/Tests/Command/HelpCommandTest.php +2 -2
  141. vendor/symfony/console/Tests/Command/ListCommandTest.php +1 -1
  142. vendor/symfony/console/Tests/Command/LockableTraitTest.php +11 -3
  143. vendor/symfony/console/Tests/CommandLoader/ContainerCommandLoaderTest.php +61 -0
  144. vendor/symfony/console/Tests/CommandLoader/FactoryCommandLoaderTest.php +60 -0
  145. vendor/{sensiolabs/security-checker/SensioLabs/Security/Formatters → symfony/console/Tests/CommandLoader}/index.php +0 -0
  146. vendor/symfony/console/Tests/DependencyInjection/AddConsoleCommandPassTest.php +143 -4
  147. vendor/symfony/console/Tests/EventListener/ErrorListenerTest.php +3 -3
  148. vendor/symfony/console/Tests/Fixtures/Foo6Command.php +0 -1
  149. vendor/symfony/console/Tests/Fixtures/FooSameCaseLowercaseCommand.php +11 -0
  150. vendor/symfony/console/Tests/Fixtures/FooSameCaseUppercaseCommand.php +11 -0
  151. vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/command/command_8.php +1 -1
  152. vendor/symfony/console/Tests/Formatter/OutputFormatterStyleStackTest.php +1 -1
  153. vendor/symfony/console/Tests/Helper/HelperSetTest.php +1 -1
  154. vendor/symfony/console/Tests/Helper/ProcessHelperTest.php +3 -4
  155. vendor/symfony/console/Tests/Helper/ProgressBarTest.php +1 -1
  156. vendor/symfony/console/Tests/Helper/QuestionHelperTest.php +29 -6
  157. vendor/symfony/console/Tests/Helper/SymfonyQuestionHelperTest.php +13 -1
  158. vendor/symfony/console/Tests/Helper/TableTest.php +56 -4
  159. vendor/symfony/console/Tests/Input/ArgvInputTest.php +63 -13
  160. vendor/symfony/console/Tests/Input/ArrayInputTest.php +6 -3
  161. vendor/symfony/console/Tests/Input/InputDefinitionTest.php +1 -1
  162. vendor/symfony/console/Tests/Input/InputTest.php +1 -1
  163. vendor/symfony/console/Tests/Logger/ConsoleLoggerTest.php +2 -4
  164. vendor/symfony/console/Tests/Output/OutputTest.php +1 -1
  165. vendor/symfony/console/Tests/Style/SymfonyStyleTest.php +3 -3
  166. vendor/symfony/console/Tests/Tester/CommandTesterTest.php +3 -3
  167. vendor/symfony/console/composer.json +11 -10
  168. vendor/symfony/debug/DebugClassLoader.php +184 -159
  169. vendor/symfony/debug/Tests/DebugClassLoaderTest.php +24 -11
  170. vendor/symfony/debug/Tests/FatalErrorHandler/UndefinedMethodFatalErrorHandlerTest.php +4 -4
  171. vendor/symfony/debug/Tests/Fixtures/ExtendedFinalMethod.php +2 -0
  172. vendor/symfony/debug/Tests/Fixtures/FinalMethod.php +7 -0
  173. vendor/symfony/debug/Tests/Fixtures/FinalMethod2Trait.php +10 -0
  174. vendor/symfony/debug/Tests/Fixtures/TraitWithInternalMethod.php +13 -0
  175. vendor/symfony/debug/Tests/phpt/debug_class_loader.phpt +1 -0
  176. vendor/symfony/debug/Tests/phpt/decorate_exception_hander.phpt +3 -3
  177. vendor/symfony/polyfill-mbstring/Mbstring.php +8 -10
  178. vendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php +5 -0
  179. vendor/symfony/polyfill-mbstring/composer.json +1 -1
  180. vendor/symfony/translation/Catalogue/AbstractOperation.php +14 -15
  181. vendor/symfony/translation/Dumper/CsvFileDumper.php +1 -1
  182. {vendor/sensiolabs/security-checker/SensioLabs/Security/Resources → views/emails}/index.php +0 -0
  183. views/emails/newSubscriberNotification.html +24 -0
  184. views/emails/newSubscriberNotification.txt +18 -0
  185. views/form/editor.html +7 -0
  186. views/premium.html +10 -1
  187. views/settings.html +19 -1
  188. views/settings/basics.html +42 -0
assets/css/{admin.90fe3283.css → admin.e15169a5.css} RENAMED
@@ -4459,6 +4459,12 @@ tr.introjs-showElement > th {
4459
  .mailpoet_drag_and_drop_tutorial video {
4460
  margin-top: 20px;
4461
  }
 
 
 
 
 
 
4462
  @-moz-keyframes mailpoet_in_app_dot_pulse {
4463
  0% {
4464
  -moz-box-shadow: 0 0 0 0 rgba(255,83,1,0.4);
@@ -4527,3 +4533,28 @@ tr.introjs-showElement > th {
4527
  box-shadow: 0 0 0 0 rgba(255,83,1,0);
4528
  }
4529
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4459
  .mailpoet_drag_and_drop_tutorial video {
4460
  margin-top: 20px;
4461
  }
4462
+ .new_subscriber_notification_announcement {
4463
+ text-align: center;
4464
+ }
4465
+ .new_subscriber_notification_announcement h2 {
4466
+ font-size: 28px;
4467
+ }
4468
  @-moz-keyframes mailpoet_in_app_dot_pulse {
4469
  0% {
4470
  -moz-box-shadow: 0 0 0 0 rgba(255,83,1,0.4);
4533
  box-shadow: 0 0 0 0 rgba(255,83,1,0);
4534
  }
4535
  }
4536
+ .mailpoet-discount-container {
4537
+ margin: 15px;
4538
+ padding: 20px;
4539
+ background: #fff;
4540
+ border: 1px solid #ff5301;
4541
+ text-align: center;
4542
+ }
4543
+ .mailpoet-discount-container h1 {
4544
+ margin: 0;
4545
+ line-height: 1.2em;
4546
+ font-size: 2.8em;
4547
+ font-weight: 400;
4548
+ }
4549
+ .mailpoet-discount-container p {
4550
+ line-height: 1.2em;
4551
+ font-size: 1.2em;
4552
+ }
4553
+ .mailpoet-discount-container a {
4554
+ display: inline-block;
4555
+ padding: 10px 30px;
4556
+ background: #ff5301;
4557
+ border: 1px solid #cc4200;
4558
+ color: #fff;
4559
+ text-decoration: none;
4560
+ }
assets/css/manifest.json CHANGED
@@ -1,6 +1,6 @@
1
  {
2
  "admin-global.css": "admin-global.673373a1.css",
3
- "admin.css": "admin.90fe3283.css",
4
  "importExport.css": "importExport.b3745466.css",
5
  "newsletter_editor.css": "newsletter_editor.4555a028.css",
6
  "public.css": "public.cae357df.css",
1
  {
2
  "admin-global.css": "admin-global.673373a1.css",
3
+ "admin.css": "admin.e15169a5.css",
4
  "importExport.css": "importExport.b3745466.css",
5
  "newsletter_editor.css": "newsletter_editor.4555a028.css",
6
  "public.css": "public.cae357df.css",
assets/img/in_app_announcements/new-subscriber-notification.png ADDED
Binary file
assets/js/{admin.eaab3da3.js → admin.f5731029.js} RENAMED
@@ -3154,7 +3154,7 @@ module.exports = {
3154
  /***/ 39:
3155
  /***/ (function(module, exports, __webpack_require__) {
3156
 
3157
- /* WEBPACK VAR INJECTION */(function(global) {module.exports = global["Backbone"] = __webpack_require__(474);
3158
  /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(8)))
3159
 
3160
  /***/ }),
@@ -5935,7 +5935,7 @@ function objectToString(o) {
5935
 
5936
  /***/ }),
5937
 
5938
- /***/ 471:
5939
  /***/ (function(module, exports, __webpack_require__) {
5940
 
5941
  "use strict";
@@ -5954,7 +5954,7 @@ var _mailpoet = __webpack_require__(3);
5954
 
5955
  var _mailpoet2 = _interopRequireDefault(_mailpoet);
5956
 
5957
- var _html2canvas = __webpack_require__(472);
5958
 
5959
  var _html2canvas2 = _interopRequireDefault(_html2canvas);
5960
 
@@ -6038,15 +6038,15 @@ var fromNewsletter = exports.fromNewsletter = function fromNewsletter(data) {
6038
 
6039
  /***/ }),
6040
 
6041
- /***/ 472:
6042
  /***/ (function(module, exports, __webpack_require__) {
6043
 
6044
- /* WEBPACK VAR INJECTION */(function(global) {module.exports = global["html2canvas"] = __webpack_require__(473);
6045
  /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(8)))
6046
 
6047
  /***/ }),
6048
 
6049
- /***/ 473:
6050
  /***/ (function(module, exports, __webpack_require__) {
6051
 
6052
  /*!
@@ -13326,7 +13326,7 @@ var formatCounterValue = function formatCounterValue(counter, glue, format) {
13326
 
13327
  /***/ }),
13328
 
13329
- /***/ 474:
13330
  /***/ (function(module, exports, __webpack_require__) {
13331
 
13332
  /* WEBPACK VAR INJECTION */(function(global) {var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;// Backbone.js 1.3.3
@@ -15255,7 +15255,7 @@ var formatCounterValue = function formatCounterValue(counter, glue, format) {
15255
 
15256
  /***/ }),
15257
 
15258
- /***/ 475:
15259
  /***/ (function(module, exports, __webpack_require__) {
15260
 
15261
  "use strict";
@@ -15346,7 +15346,7 @@ var _propTypes = __webpack_require__(12);
15346
 
15347
  var _propTypes2 = _interopRequireDefault(_propTypes);
15348
 
15349
- var _reactDom = __webpack_require__(30);
15350
 
15351
  var ReactConfirmAlert = (function (_Component) {
15352
  _inherits(ReactConfirmAlert, _Component);
@@ -15516,7 +15516,7 @@ var _select = __webpack_require__(466);
15516
 
15517
  var _select2 = _interopRequireDefault(_select);
15518
 
15519
- var _common = __webpack_require__(468);
15520
 
15521
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
15522
 
@@ -16237,7 +16237,8 @@ __webpack_require__(665);
16237
  __webpack_require__(666);
16238
  __webpack_require__(669);
16239
  __webpack_require__(670);
16240
- module.exports = __webpack_require__(679);
 
16241
 
16242
 
16243
  /***/ }),
@@ -16252,7 +16253,7 @@ var _react = __webpack_require__(2);
16252
 
16253
  var _react2 = _interopRequireDefault(_react);
16254
 
16255
- var _reactDom = __webpack_require__(30);
16256
 
16257
  var _reactDom2 = _interopRequireDefault(_reactDom);
16258
 
@@ -16326,7 +16327,7 @@ var _listing = __webpack_require__(62);
16326
 
16327
  var _listing2 = _interopRequireDefault(_listing);
16328
 
16329
- var _selection = __webpack_require__(498);
16330
 
16331
  var _selection2 = _interopRequireDefault(_selection);
16332
 
@@ -16936,7 +16937,7 @@ var _react = __webpack_require__(2);
16936
 
16937
  var _react2 = _interopRequireDefault(_react);
16938
 
16939
- var _reactDom = __webpack_require__(30);
16940
 
16941
  var _reactDom2 = _interopRequireDefault(_reactDom);
16942
 
@@ -18330,7 +18331,7 @@ var _jquery = __webpack_require__(9);
18330
 
18331
  var _jquery2 = _interopRequireDefault(_jquery);
18332
 
18333
- var _thumbnail = __webpack_require__(471);
18334
 
18335
  var _wpJsHooks = __webpack_require__(33);
18336
 
@@ -19271,7 +19272,7 @@ var _wpJsHooks = __webpack_require__(33);
19271
 
19272
  var _wpJsHooks2 = _interopRequireDefault(_wpJsHooks);
19273
 
19274
- var _scheduling = __webpack_require__(467);
19275
 
19276
  var _scheduling2 = _interopRequireDefault(_scheduling);
19277
 
@@ -19563,7 +19564,7 @@ var _breadcrumb = __webpack_require__(58);
19563
 
19564
  var _breadcrumb2 = _interopRequireDefault(_breadcrumb);
19565
 
19566
- var _scheduling = __webpack_require__(467);
19567
 
19568
  var _scheduling2 = _interopRequireDefault(_scheduling);
19569
 
@@ -20363,7 +20364,7 @@ var _mailpoet = __webpack_require__(3);
20363
 
20364
  var _mailpoet2 = _interopRequireDefault(_mailpoet);
20365
 
20366
- var _common = __webpack_require__(468);
20367
 
20368
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
20369
 
@@ -20854,7 +20855,7 @@ var _react = __webpack_require__(2);
20854
 
20855
  var _react2 = _interopRequireDefault(_react);
20856
 
20857
- var _reactDom = __webpack_require__(30);
20858
 
20859
  var _reactDom2 = _interopRequireDefault(_reactDom);
20860
 
@@ -21331,7 +21332,7 @@ var _react = __webpack_require__(2);
21331
 
21332
  var _react2 = _interopRequireDefault(_react);
21333
 
21334
- var _reactDom = __webpack_require__(30);
21335
 
21336
  var _reactDom2 = _interopRequireDefault(_reactDom);
21337
 
@@ -21709,7 +21710,7 @@ var _react = __webpack_require__(2);
21709
 
21710
  var _react2 = _interopRequireDefault(_react);
21711
 
21712
- var _reactDom = __webpack_require__(30);
21713
 
21714
  var _reactDom2 = _interopRequireDefault(_reactDom);
21715
 
@@ -21785,7 +21786,7 @@ var _queue_status = __webpack_require__(659);
21785
 
21786
  var _queue_status2 = _interopRequireDefault(_queue_status);
21787
 
21788
- var _tabs = __webpack_require__(475);
21789
 
21790
  var _tabs2 = _interopRequireDefault(_tabs);
21791
 
@@ -22310,7 +22311,7 @@ var _underscore = __webpack_require__(7);
22310
 
22311
  var _underscore2 = _interopRequireDefault(_underscore);
22312
 
22313
- var _tabs = __webpack_require__(475);
22314
 
22315
  var _tabs2 = _interopRequireDefault(_tabs);
22316
 
@@ -22380,7 +22381,7 @@ var _mailpoet = __webpack_require__(3);
22380
 
22381
  var _mailpoet2 = _interopRequireDefault(_mailpoet);
22382
 
22383
- var _tabs = __webpack_require__(475);
22384
 
22385
  var _tabs2 = _interopRequireDefault(_tabs);
22386
 
@@ -22490,7 +22491,7 @@ module.exports = KnowledgeBase;
22490
  "use strict";
22491
 
22492
 
22493
- var _intro = __webpack_require__(499);
22494
 
22495
  var _intro2 = _interopRequireDefault(_intro);
22496
 
@@ -24081,7 +24082,7 @@ var _react = __webpack_require__(2);
24081
 
24082
  var _react2 = _interopRequireDefault(_react);
24083
 
24084
- var _reactDom = __webpack_require__(30);
24085
 
24086
  var _reactDom2 = _interopRequireDefault(_reactDom);
24087
 
@@ -24817,6 +24818,101 @@ WelcomeWizardWooCommerceStep.propTypes = {
24817
  /***/ 679:
24818
  /***/ (function(module, exports, __webpack_require__) {
24819
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
24820
  "use strict";
24821
  /* WEBPACK VAR INJECTION */(function(setImmediate) {
24822
 
3154
  /***/ 39:
3155
  /***/ (function(module, exports, __webpack_require__) {
3156
 
3157
+ /* WEBPACK VAR INJECTION */(function(global) {module.exports = global["Backbone"] = __webpack_require__(475);
3158
  /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(8)))
3159
 
3160
  /***/ }),
5935
 
5936
  /***/ }),
5937
 
5938
+ /***/ 472:
5939
  /***/ (function(module, exports, __webpack_require__) {
5940
 
5941
  "use strict";
5954
 
5955
  var _mailpoet2 = _interopRequireDefault(_mailpoet);
5956
 
5957
+ var _html2canvas = __webpack_require__(473);
5958
 
5959
  var _html2canvas2 = _interopRequireDefault(_html2canvas);
5960
 
6038
 
6039
  /***/ }),
6040
 
6041
+ /***/ 473:
6042
  /***/ (function(module, exports, __webpack_require__) {
6043
 
6044
+ /* WEBPACK VAR INJECTION */(function(global) {module.exports = global["html2canvas"] = __webpack_require__(474);
6045
  /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(8)))
6046
 
6047
  /***/ }),
6048
 
6049
+ /***/ 474:
6050
  /***/ (function(module, exports, __webpack_require__) {
6051
 
6052
  /*!
13326
 
13327
  /***/ }),
13328
 
13329
+ /***/ 475:
13330
  /***/ (function(module, exports, __webpack_require__) {
13331
 
13332
  /* WEBPACK VAR INJECTION */(function(global) {var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;// Backbone.js 1.3.3
15255
 
15256
  /***/ }),
15257
 
15258
+ /***/ 476:
15259
  /***/ (function(module, exports, __webpack_require__) {
15260
 
15261
  "use strict";
15346
 
15347
  var _propTypes2 = _interopRequireDefault(_propTypes);
15348
 
15349
+ var _reactDom = __webpack_require__(28);
15350
 
15351
  var ReactConfirmAlert = (function (_Component) {
15352
  _inherits(ReactConfirmAlert, _Component);
15516
 
15517
  var _select2 = _interopRequireDefault(_select);
15518
 
15519
+ var _common = __webpack_require__(469);
15520
 
15521
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
15522
 
16237
  __webpack_require__(666);
16238
  __webpack_require__(669);
16239
  __webpack_require__(670);
16240
+ __webpack_require__(679);
16241
+ module.exports = __webpack_require__(681);
16242
 
16243
 
16244
  /***/ }),
16253
 
16254
  var _react2 = _interopRequireDefault(_react);
16255
 
16256
+ var _reactDom = __webpack_require__(28);
16257
 
16258
  var _reactDom2 = _interopRequireDefault(_reactDom);
16259
 
16327
 
16328
  var _listing2 = _interopRequireDefault(_listing);
16329
 
16330
+ var _selection = __webpack_require__(499);
16331
 
16332
  var _selection2 = _interopRequireDefault(_selection);
16333
 
16937
 
16938
  var _react2 = _interopRequireDefault(_react);
16939
 
16940
+ var _reactDom = __webpack_require__(28);
16941
 
16942
  var _reactDom2 = _interopRequireDefault(_reactDom);
16943
 
18331
 
18332
  var _jquery2 = _interopRequireDefault(_jquery);
18333
 
18334
+ var _thumbnail = __webpack_require__(472);
18335
 
18336
  var _wpJsHooks = __webpack_require__(33);
18337
 
19272
 
19273
  var _wpJsHooks2 = _interopRequireDefault(_wpJsHooks);
19274
 
19275
+ var _scheduling = __webpack_require__(468);
19276
 
19277
  var _scheduling2 = _interopRequireDefault(_scheduling);
19278
 
19564
 
19565
  var _breadcrumb2 = _interopRequireDefault(_breadcrumb);
19566
 
19567
+ var _scheduling = __webpack_require__(468);
19568
 
19569
  var _scheduling2 = _interopRequireDefault(_scheduling);
19570
 
20364
 
20365
  var _mailpoet2 = _interopRequireDefault(_mailpoet);
20366
 
20367
+ var _common = __webpack_require__(469);
20368
 
20369
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
20370
 
20855
 
20856
  var _react2 = _interopRequireDefault(_react);
20857
 
20858
+ var _reactDom = __webpack_require__(28);
20859
 
20860
  var _reactDom2 = _interopRequireDefault(_reactDom);
20861
 
21332
 
21333
  var _react2 = _interopRequireDefault(_react);
21334
 
21335
+ var _reactDom = __webpack_require__(28);
21336
 
21337
  var _reactDom2 = _interopRequireDefault(_reactDom);
21338
 
21710
 
21711
  var _react2 = _interopRequireDefault(_react);
21712
 
21713
+ var _reactDom = __webpack_require__(28);
21714
 
21715
  var _reactDom2 = _interopRequireDefault(_reactDom);
21716
 
21786
 
21787
  var _queue_status2 = _interopRequireDefault(_queue_status);
21788
 
21789
+ var _tabs = __webpack_require__(476);
21790
 
21791
  var _tabs2 = _interopRequireDefault(_tabs);
21792
 
22311
 
22312
  var _underscore2 = _interopRequireDefault(_underscore);
22313
 
22314
+ var _tabs = __webpack_require__(476);
22315
 
22316
  var _tabs2 = _interopRequireDefault(_tabs);
22317
 
22381
 
22382
  var _mailpoet2 = _interopRequireDefault(_mailpoet);
22383
 
22384
+ var _tabs = __webpack_require__(476);
22385
 
22386
  var _tabs2 = _interopRequireDefault(_tabs);
22387
 
22491
  "use strict";
22492
 
22493
 
22494
+ var _intro = __webpack_require__(500);
22495
 
22496
  var _intro2 = _interopRequireDefault(_intro);
22497
 
24082
 
24083
  var _react2 = _interopRequireDefault(_react);
24084
 
24085
+ var _reactDom = __webpack_require__(28);
24086
 
24087
  var _reactDom2 = _interopRequireDefault(_reactDom);
24088
 
24818
  /***/ 679:
24819
  /***/ (function(module, exports, __webpack_require__) {
24820
 
24821
+ "use strict";
24822
+
24823
+
24824
+ var _reactDom = __webpack_require__(28);
24825
+
24826
+ var _reactDom2 = _interopRequireDefault(_reactDom);
24827
+
24828
+ var _react = __webpack_require__(2);
24829
+
24830
+ var _react2 = _interopRequireDefault(_react);
24831
+
24832
+ var _new_subscriber_announcement = __webpack_require__(680);
24833
+
24834
+ var _new_subscriber_announcement2 = _interopRequireDefault(_new_subscriber_announcement);
24835
+
24836
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
24837
+
24838
+ var container = document.getElementById('new_subscriber_announcement');
24839
+
24840
+ _reactDom2.default.render(_react2.default.createElement(_new_subscriber_announcement2.default, {
24841
+ installedAt: window.mailpoet_installed_at,
24842
+ imageUrl: window.mailpoet_new_subscriber_announcement_image
24843
+ }), container);
24844
+
24845
+ /***/ }),
24846
+
24847
+ /***/ 680:
24848
+ /***/ (function(module, exports, __webpack_require__) {
24849
+
24850
+ "use strict";
24851
+
24852
+
24853
+ var _react = __webpack_require__(2);
24854
+
24855
+ var _react2 = _interopRequireDefault(_react);
24856
+
24857
+ var _propTypes = __webpack_require__(12);
24858
+
24859
+ var _propTypes2 = _interopRequireDefault(_propTypes);
24860
+
24861
+ var _mailpoet = __webpack_require__(3);
24862
+
24863
+ var _mailpoet2 = _interopRequireDefault(_mailpoet);
24864
+
24865
+ var _moment = __webpack_require__(0);
24866
+
24867
+ var _moment2 = _interopRequireDefault(_moment);
24868
+
24869
+ var _in_app_announcement = __webpack_require__(467);
24870
+
24871
+ var _in_app_announcement2 = _interopRequireDefault(_in_app_announcement);
24872
+
24873
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
24874
+
24875
+ var NewSubscriberNotificationAnnouncement = function NewSubscriberNotificationAnnouncement(props) {
24876
+ return _react2.default.createElement(
24877
+ _in_app_announcement2.default,
24878
+ {
24879
+ validUntil: (0, _moment2.default)(props.installedAt).add(3, 'months').toDate(),
24880
+ height: '700px',
24881
+ showOnlyOnceSlug: 'new_subscriber_notification',
24882
+ showToNewUser: false
24883
+ },
24884
+ _react2.default.createElement(
24885
+ 'div',
24886
+ { className: 'new_subscriber_notification_announcement' },
24887
+ _react2.default.createElement(
24888
+ 'h1',
24889
+ null,
24890
+ _mailpoet2.default.I18n.t('announcementHeader')
24891
+ ),
24892
+ _react2.default.createElement('img', { src: props.imageUrl, width: '600px', height: '460px', alt: '' }),
24893
+ _react2.default.createElement(
24894
+ 'p',
24895
+ null,
24896
+ _mailpoet2.default.I18n.t('announcementParagraph1'),
24897
+ _react2.default.createElement('br', null),
24898
+ _mailpoet2.default.I18n.t('announcementParagraph2')
24899
+ )
24900
+ )
24901
+ );
24902
+ };
24903
+
24904
+ NewSubscriberNotificationAnnouncement.propTypes = {
24905
+ installedAt: _propTypes2.default.string.isRequired,
24906
+ imageUrl: _propTypes2.default.string.isRequired
24907
+ };
24908
+
24909
+ module.exports = NewSubscriberNotificationAnnouncement;
24910
+
24911
+ /***/ }),
24912
+
24913
+ /***/ 681:
24914
+ /***/ (function(module, exports, __webpack_require__) {
24915
+
24916
  "use strict";
24917
  /* WEBPACK VAR INJECTION */(function(setImmediate) {
24918
 
assets/js/{admin_vendor.eaab3da3.js → admin_vendor.f5731029.js} RENAMED
@@ -5403,7 +5403,7 @@ module.exports = emptyFunction;
5403
 
5404
 
5405
 
5406
- var _prodInvariant = __webpack_require__(28);
5407
 
5408
  var ReactCurrentOwner = __webpack_require__(20);
5409
 
@@ -6341,7 +6341,7 @@ function getPooledWarningPropertyDefinition(propName, getVal) {
6341
  Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
6342
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__Router__ = __webpack_require__(563);
6343
  /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "Router", function() { return __WEBPACK_IMPORTED_MODULE_0__Router__["a"]; });
6344
- /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Link__ = __webpack_require__(492);
6345
  /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "Link", function() { return __WEBPACK_IMPORTED_MODULE_1__Link__["a"]; });
6346
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__IndexLink__ = __webpack_require__(570);
6347
  /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "IndexLink", function() { return __WEBPACK_IMPORTED_MODULE_2__IndexLink__["a"]; });
@@ -6351,7 +6351,7 @@ Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
6351
  /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "IndexRedirect", function() { return __WEBPACK_IMPORTED_MODULE_4__IndexRedirect__["a"]; });
6352
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__IndexRoute__ = __webpack_require__(573);
6353
  /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "IndexRoute", function() { return __WEBPACK_IMPORTED_MODULE_5__IndexRoute__["a"]; });
6354
- /* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__Redirect__ = __webpack_require__(493);
6355
  /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "Redirect", function() { return __WEBPACK_IMPORTED_MODULE_6__Redirect__["a"]; });
6356
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__Route__ = __webpack_require__(574);
6357
  /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "Route", function() { return __WEBPACK_IMPORTED_MODULE_7__Route__["a"]; });
@@ -6364,7 +6364,7 @@ Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
6364
  /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "routerShape", function() { return __WEBPACK_IMPORTED_MODULE_10__PropTypes__["b"]; });
6365
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_11__match__ = __webpack_require__(575);
6366
  /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "match", function() { return __WEBPACK_IMPORTED_MODULE_11__match__["a"]; });
6367
- /* harmony import */ var __WEBPACK_IMPORTED_MODULE_12__useRouterHistory__ = __webpack_require__(495);
6368
  /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "useRouterHistory", function() { return __WEBPACK_IMPORTED_MODULE_12__useRouterHistory__["a"]; });
6369
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_13__PatternUtils__ = __webpack_require__(100);
6370
  /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "formatPattern", function() { return __WEBPACK_IMPORTED_MODULE_13__PatternUtils__["a"]; });
@@ -6374,7 +6374,7 @@ Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
6374
  /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "browserHistory", function() { return __WEBPACK_IMPORTED_MODULE_15__browserHistory__["a"]; });
6375
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_16__hashHistory__ = __webpack_require__(578);
6376
  /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "hashHistory", function() { return __WEBPACK_IMPORTED_MODULE_16__hashHistory__["a"]; });
6377
- /* harmony import */ var __WEBPACK_IMPORTED_MODULE_17__createMemoryHistory__ = __webpack_require__(494);
6378
  /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "createMemoryHistory", function() { return __WEBPACK_IMPORTED_MODULE_17__createMemoryHistory__["a"]; });
6379
  /* components */
6380
 
@@ -6677,6 +6677,14 @@ module.exports = DOMProperty;
6677
  /* 28 */
6678
  /***/ (function(module, exports, __webpack_require__) {
6679
 
 
 
 
 
 
 
 
 
6680
  "use strict";
6681
  /**
6682
  * Copyright (c) 2013-present, Facebook, Inc.
@@ -6718,7 +6726,7 @@ function reactProdInvariant(code) {
6718
  module.exports = reactProdInvariant;
6719
 
6720
  /***/ }),
6721
- /* 29 */
6722
  /***/ (function(module, exports, __webpack_require__) {
6723
 
6724
  "use strict";
@@ -7064,14 +7072,6 @@ ReactElement.isValidElement = function (object) {
7064
  module.exports = ReactElement;
7065
  /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(1)))
7066
 
7067
- /***/ }),
7068
- /* 30 */
7069
- /***/ (function(module, exports, __webpack_require__) {
7070
-
7071
- /* WEBPACK VAR INJECTION */(function(global) {if(!global["MailPoetLib"]) global["MailPoetLib"] = {};
7072
- module.exports = global["MailPoetLib"]["ReactDOM"] = __webpack_require__(317);
7073
- /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(8)))
7074
-
7075
  /***/ }),
7076
  /* 31 */
7077
  /***/ (function(module, exports, __webpack_require__) {
@@ -7216,7 +7216,7 @@ var ReactComponent = __webpack_require__(66);
7216
  var ReactPureComponent = __webpack_require__(306);
7217
  var ReactClass = __webpack_require__(307);
7218
  var ReactDOMFactories = __webpack_require__(308);
7219
- var ReactElement = __webpack_require__(29);
7220
  var ReactPropTypes = __webpack_require__(310);
7221
  var ReactVersion = __webpack_require__(311);
7222
 
@@ -9771,7 +9771,7 @@ module.exports = getIteratorFn;
9771
 
9772
 
9773
 
9774
- var _prodInvariant = __webpack_require__(28);
9775
 
9776
  var ReactNoopUpdateQueue = __webpack_require__(67);
9777
 
@@ -26237,7 +26237,7 @@ module.exports = REACT_ELEMENT_TYPE;
26237
 
26238
  var ReactCurrentOwner = __webpack_require__(20);
26239
  var ReactComponentTreeHook = __webpack_require__(16);
26240
- var ReactElement = __webpack_require__(29);
26241
 
26242
  var checkReactTypeSpec = __webpack_require__(309);
26243
 
@@ -35874,7 +35874,7 @@ module.exports = __webpack_require__(34);
35874
 
35875
 
35876
  var PooledClass = __webpack_require__(303);
35877
- var ReactElement = __webpack_require__(29);
35878
 
35879
  var emptyFunction = __webpack_require__(15);
35880
  var traverseAllChildren = __webpack_require__(304);
@@ -36070,7 +36070,7 @@ module.exports = ReactChildren;
36070
 
36071
 
36072
 
36073
- var _prodInvariant = __webpack_require__(28);
36074
 
36075
  var invariant = __webpack_require__(4);
36076
 
@@ -36187,7 +36187,7 @@ module.exports = PooledClass;
36187
 
36188
 
36189
 
36190
- var _prodInvariant = __webpack_require__(28);
36191
 
36192
  var ReactCurrentOwner = __webpack_require__(20);
36193
  var REACT_ELEMENT_TYPE = __webpack_require__(229);
@@ -36480,11 +36480,11 @@ module.exports = ReactPureComponent;
36480
 
36481
 
36482
 
36483
- var _prodInvariant = __webpack_require__(28),
36484
  _assign = __webpack_require__(10);
36485
 
36486
  var ReactComponent = __webpack_require__(66);
36487
- var ReactElement = __webpack_require__(29);
36488
  var ReactPropTypeLocationNames = __webpack_require__(68);
36489
  var ReactNoopUpdateQueue = __webpack_require__(67);
36490
 
@@ -37203,7 +37203,7 @@ module.exports = ReactClass;
37203
 
37204
 
37205
 
37206
- var ReactElement = __webpack_require__(29);
37207
 
37208
  /**
37209
  * Create a factory that creates HTML tag elements.
@@ -37379,7 +37379,7 @@ module.exports = ReactDOMFactories;
37379
 
37380
 
37381
 
37382
- var _prodInvariant = __webpack_require__(28);
37383
 
37384
  var ReactPropTypeLocationNames = __webpack_require__(68);
37385
  var ReactPropTypesSecret = __webpack_require__(231);
@@ -37472,7 +37472,7 @@ module.exports = checkReactTypeSpec;
37472
 
37473
 
37474
 
37475
- var ReactElement = __webpack_require__(29);
37476
  var ReactPropTypeLocationNames = __webpack_require__(68);
37477
  var ReactPropTypesSecret = __webpack_require__(231);
37478
 
@@ -37930,9 +37930,9 @@ module.exports = '15.4.2';
37930
  */
37931
 
37932
 
37933
- var _prodInvariant = __webpack_require__(28);
37934
 
37935
- var ReactElement = __webpack_require__(29);
37936
 
37937
  var invariant = __webpack_require__(4);
37938
 
@@ -37988,7 +37988,7 @@ var _propTypes = __webpack_require__(12);
37988
 
37989
  var _propTypes2 = _interopRequireDefault(_propTypes);
37990
 
37991
- var _reactDom = __webpack_require__(30);
37992
 
37993
  var _reactDom2 = _interopRequireDefault(_reactDom);
37994
 
@@ -50707,7 +50707,7 @@ var _LocationUtils = __webpack_require__(98);
50707
 
50708
  var _DOMUtils = __webpack_require__(288);
50709
 
50710
- var _DOMStateStorage = __webpack_require__(486);
50711
 
50712
  var _PathUtils = __webpack_require__(61);
50713
 
@@ -51272,6 +51272,159 @@ module.exports = FormFieldSelect;
51272
  "use strict";
51273
 
51274
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
51275
  var _underscore = __webpack_require__(7);
51276
 
51277
  var _underscore2 = _interopRequireDefault(_underscore);
@@ -51288,11 +51441,11 @@ var _select = __webpack_require__(466);
51288
 
51289
  var _select2 = _interopRequireDefault(_select);
51290
 
51291
- var _text = __webpack_require__(497);
51292
 
51293
  var _text2 = _interopRequireDefault(_text);
51294
 
51295
- var _common = __webpack_require__(468);
51296
 
51297
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
51298
 
@@ -51445,7 +51598,7 @@ var WelcomeScheduling = _react2.default.createClass({
51445
  module.exports = WelcomeScheduling;
51446
 
51447
  /***/ }),
51448
- /* 468 */
51449
  /***/ (function(module, exports, __webpack_require__) {
51450
 
51451
  "use strict";
@@ -51456,7 +51609,7 @@ module.exports = global["MailPoetLib"]["NewsletterSchedulingCommonOptions"] = __
51456
  /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(8)))
51457
 
51458
  /***/ }),
51459
- /* 469 */
51460
  /***/ (function(module, exports, __webpack_require__) {
51461
 
51462
  "use strict";
@@ -51507,7 +51660,7 @@ module.exports = exports['default'];
51507
  /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(1)))
51508
 
51509
  /***/ }),
51510
- /* 470 */
51511
  /***/ (function(module, exports, __webpack_require__) {
51512
 
51513
  "use strict";
@@ -51538,12 +51691,12 @@ module.exports = exports['default'];
51538
  /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(1)))
51539
 
51540
  /***/ }),
51541
- /* 471 */,
51542
  /* 472 */,
51543
  /* 473 */,
51544
  /* 474 */,
51545
  /* 475 */,
51546
- /* 476 */
 
51547
  /***/ (function(module, exports, __webpack_require__) {
51548
 
51549
  "use strict";
@@ -51834,7 +51987,7 @@ module.exports = exports['default'];
51834
  /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(1)))
51835
 
51836
  /***/ }),
51837
- /* 477 */
51838
  /***/ (function(module, exports, __webpack_require__) {
51839
 
51840
  "use strict";
@@ -51847,7 +52000,7 @@ function isPromise(obj) {
51847
  }
51848
 
51849
  /***/ }),
51850
- /* 478 */
51851
  /***/ (function(module, exports, __webpack_require__) {
51852
 
51853
  "use strict";
@@ -51881,7 +52034,7 @@ function assignRouterState(router, _ref) {
51881
  }
51882
 
51883
  /***/ }),
51884
- /* 479 */
51885
  /***/ (function(module, exports, __webpack_require__) {
51886
 
51887
  "use strict";
@@ -52035,7 +52188,7 @@ module.exports = exports['default'];
52035
  /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(1)))
52036
 
52037
  /***/ }),
52038
- /* 480 */
52039
  /***/ (function(module, exports, __webpack_require__) {
52040
 
52041
  "use strict";
@@ -52092,7 +52245,7 @@ module.exports = function hoistNonReactStatics(targetComponent, sourceComponent,
52092
 
52093
 
52094
  /***/ }),
52095
- /* 481 */
52096
  /***/ (function(module, exports, __webpack_require__) {
52097
 
52098
  "use strict";
@@ -52198,7 +52351,7 @@ module.exports = exports['default'];
52198
  /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(1)))
52199
 
52200
  /***/ }),
52201
- /* 482 */
52202
  /***/ (function(module, exports, __webpack_require__) {
52203
 
52204
  "use strict";
@@ -52215,7 +52368,7 @@ var _useBasename = __webpack_require__(287);
52215
 
52216
  var _useBasename2 = _interopRequireDefault(_useBasename);
52217
 
52218
- var _createMemoryHistory = __webpack_require__(483);
52219
 
52220
  var _createMemoryHistory2 = _interopRequireDefault(_createMemoryHistory);
52221
 
@@ -52235,7 +52388,7 @@ function createMemoryHistory(options) {
52235
  module.exports = exports['default'];
52236
 
52237
  /***/ }),
52238
- /* 483 */
52239
  /***/ (function(module, exports, __webpack_require__) {
52240
 
52241
  "use strict";
@@ -52382,7 +52535,7 @@ exports.default = createMemoryHistory;
52382
  /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(1)))
52383
 
52384
  /***/ }),
52385
- /* 484 */
52386
  /***/ (function(module, exports, __webpack_require__) {
52387
 
52388
  "use strict";
@@ -52410,7 +52563,7 @@ function useRouterHistory(createHistory) {
52410
  module.exports = exports['default'];
52411
 
52412
  /***/ }),
52413
- /* 485 */
52414
  /***/ (function(module, exports, __webpack_require__) {
52415
 
52416
  "use strict";
@@ -52510,7 +52663,7 @@ exports.default = createBrowserHistory;
52510
  /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(1)))
52511
 
52512
  /***/ }),
52513
- /* 486 */
52514
  /***/ (function(module, exports, __webpack_require__) {
52515
 
52516
  "use strict";
@@ -52602,7 +52755,7 @@ var readState = exports.readState = function readState(key) {
52602
  /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(1)))
52603
 
52604
  /***/ }),
52605
- /* 487 */
52606
  /***/ (function(module, exports, __webpack_require__) {
52607
 
52608
  "use strict";
@@ -52611,7 +52764,7 @@ var readState = exports.readState = function readState(key) {
52611
  exports.__esModule = true;
52612
  exports.default = createRouterHistory;
52613
 
52614
- var _useRouterHistory = __webpack_require__(484);
52615
 
52616
  var _useRouterHistory2 = _interopRequireDefault(_useRouterHistory);
52617
 
@@ -52627,7 +52780,7 @@ function createRouterHistory(createHistory) {
52627
  module.exports = exports['default'];
52628
 
52629
  /***/ }),
52630
- /* 488 */
52631
  /***/ (function(module, exports, __webpack_require__) {
52632
 
52633
  "use strict";
@@ -52781,7 +52934,7 @@ exports.default = createHashHistory;
52781
  /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(1)))
52782
 
52783
  /***/ }),
52784
- /* 489 */
52785
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
52786
 
52787
  "use strict";
@@ -53053,7 +53206,7 @@ function createTransitionManager(history, routes) {
53053
  /* WEBPACK VAR INJECTION */}.call(__webpack_exports__, __webpack_require__(1)))
53054
 
53055
  /***/ }),
53056
- /* 490 */
53057
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
53058
 
53059
  "use strict";
@@ -53063,7 +53216,7 @@ function isPromise(obj) {
53063
  }
53064
 
53065
  /***/ }),
53066
- /* 491 */
53067
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
53068
 
53069
  "use strict";
@@ -53093,7 +53246,7 @@ function assignRouterState(router, _ref) {
53093
  }
53094
 
53095
  /***/ }),
53096
- /* 492 */
53097
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
53098
 
53099
  "use strict";
@@ -53239,7 +53392,7 @@ var Link = __WEBPACK_IMPORTED_MODULE_1_create_react_class___default()({
53239
  /* WEBPACK VAR INJECTION */}.call(__webpack_exports__, __webpack_require__(1)))
53240
 
53241
  /***/ }),
53242
- /* 493 */
53243
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
53244
 
53245
  "use strict";
@@ -53338,7 +53491,7 @@ var Redirect = __WEBPACK_IMPORTED_MODULE_0_create_react_class___default()({
53338
  /* WEBPACK VAR INJECTION */}.call(__webpack_exports__, __webpack_require__(1)))
53339
 
53340
  /***/ }),
53341
- /* 494 */
53342
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
53343
 
53344
  "use strict";
@@ -53347,7 +53500,7 @@ var Redirect = __WEBPACK_IMPORTED_MODULE_0_create_react_class___default()({
53347
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_history_lib_useQueries___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_history_lib_useQueries__);
53348
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_history_lib_useBasename__ = __webpack_require__(287);
53349
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_history_lib_useBasename___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_history_lib_useBasename__);
53350
- /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_history_lib_createMemoryHistory__ = __webpack_require__(483);
53351
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_history_lib_createMemoryHistory___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_history_lib_createMemoryHistory__);
53352
 
53353
 
@@ -53366,7 +53519,7 @@ function createMemoryHistory(options) {
53366
  }
53367
 
53368
  /***/ }),
53369
- /* 495 */
53370
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
53371
 
53372
  "use strict";
@@ -53386,12 +53539,12 @@ function useRouterHistory(createHistory) {
53386
  }
53387
 
53388
  /***/ }),
53389
- /* 496 */
53390
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
53391
 
53392
  "use strict";
53393
  /* harmony export (immutable) */ __webpack_exports__["a"] = createRouterHistory;
53394
- /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__useRouterHistory__ = __webpack_require__(495);
53395
 
53396
 
53397
  var canUseDOM = !!(typeof window !== 'undefined' && window.document && window.document.createElement);
@@ -53403,7 +53556,7 @@ function createRouterHistory(createHistory) {
53403
  }
53404
 
53405
  /***/ }),
53406
- /* 497 */
53407
  /***/ (function(module, exports, __webpack_require__) {
53408
 
53409
  "use strict";
@@ -53414,7 +53567,7 @@ module.exports = global["MailPoetLib"]["FormFieldText"] = __webpack_require__(58
53414
  /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(8)))
53415
 
53416
  /***/ }),
53417
- /* 498 */
53418
  /***/ (function(module, exports, __webpack_require__) {
53419
 
53420
  "use strict";
@@ -53425,7 +53578,7 @@ module.exports = global["MailPoetLib"]["FormFieldSelection"] = __webpack_require
53425
  /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(8)))
53426
 
53427
  /***/ }),
53428
- /* 499 */
53429
  /***/ (function(module, exports, __webpack_require__) {
53430
 
53431
  /**
@@ -55955,7 +56108,7 @@ module.exports = global["MailPoetLib"]["FormFieldSelection"] = __webpack_require
55955
 
55956
 
55957
  /***/ }),
55958
- /* 500 */
55959
  /***/ (function(module, exports, __webpack_require__) {
55960
 
55961
  "use strict";
@@ -55965,159 +56118,6 @@ if (!global["MailPoetLib"]) global["MailPoetLib"] = {};
55965
  module.exports = global["MailPoetLib"]["StatsBadge"] = __webpack_require__(593);
55966
  /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(8)))
55967
 
55968
- /***/ }),
55969
- /* 501 */
55970
- /***/ (function(module, exports, __webpack_require__) {
55971
-
55972
- "use strict";
55973
-
55974
-
55975
- var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
55976
-
55977
- var _react = __webpack_require__(2);
55978
-
55979
- var _react2 = _interopRequireDefault(_react);
55980
-
55981
- var _mailpoet = __webpack_require__(3);
55982
-
55983
- var _mailpoet2 = _interopRequireDefault(_mailpoet);
55984
-
55985
- var _in_app_announcement_dot = __webpack_require__(599);
55986
-
55987
- var _in_app_announcement_dot2 = _interopRequireDefault(_in_app_announcement_dot);
55988
-
55989
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
55990
-
55991
- function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
55992
-
55993
- function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
55994
-
55995
- function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
55996
-
55997
- var InAppAnnouncement = function (_React$Component) {
55998
- _inherits(InAppAnnouncement, _React$Component);
55999
-
56000
- function InAppAnnouncement(props) {
56001
- _classCallCheck(this, InAppAnnouncement);
56002
-
56003
- var _this = _possibleConstructorReturn(this, (InAppAnnouncement.__proto__ || Object.getPrototypeOf(InAppAnnouncement)).call(this, props));
56004
-
56005
- _this.saveDisplayed = _this.saveDisplayed.bind(_this);
56006
-
56007
- _this.state = {
56008
- announcementsSettings: window.mailpoet_in_app_announcements || null
56009
- };
56010
- return _this;
56011
- }
56012
-
56013
- _createClass(InAppAnnouncement, [{
56014
- key: 'saveDisplayed',
56015
- value: function saveDisplayed() {
56016
- var _this2 = this;
56017
-
56018
- var settings = Object.assign({}, this.state.announcementsSettings);
56019
- settings.displayed.push(this.props.showOnlyOnceSlug);
56020
- return _mailpoet2.default.Ajax.post({
56021
- api_version: window.mailpoet_api_version,
56022
- endpoint: 'settings',
56023
- action: 'set',
56024
- data: { in_app_announcements: settings }
56025
- }).always(function () {
56026
- return _this2.setState({ announcementsSettings: settings });
56027
- });
56028
- }
56029
- }, {
56030
- key: 'render',
56031
- value: function render() {
56032
- var _this3 = this;
56033
-
56034
- if (this.props.showToNewUser !== null && window.mailpoet_is_new_user !== this.props.showToNewUser) {
56035
- return null;
56036
- }
56037
-
56038
- if (this.props.validUntil !== null && this.props.validUntil < new Date()) {
56039
- return null;
56040
- }
56041
-
56042
- if (this.props.showToPremiumUser !== null && window.mailpoet_premium_active !== this.props.showToPremiumUser) {
56043
- return null;
56044
- }
56045
-
56046
- if (this.props.showOnlyOnceSlug && this.state.announcementsSettings.displayed.includes(this.props.showOnlyOnceSlug)) {
56047
- return null;
56048
- }
56049
-
56050
- return _react2.default.createElement(
56051
- _in_app_announcement_dot2.default,
56052
- {
56053
- className: this.props.className,
56054
- width: this.props.width,
56055
- height: this.props.height,
56056
- onUserTrigger: function onUserTrigger() {
56057
- if (!_this3.props.showOnlyOnceSlug) {
56058
- return;
56059
- }
56060
- _this3.saveDisplayed();
56061
- }
56062
- },
56063
- this.props.children
56064
- );
56065
- }
56066
- }]);
56067
-
56068
- return InAppAnnouncement;
56069
- }(_react2.default.Component);
56070
-
56071
- var validateBooleanWithWindowDependency = function validateBooleanWithWindowDependency(props, propName, componentName, windowProperty) {
56072
- var propValue = props[propName];
56073
- if (propValue !== null && propValue !== true && propValue !== false) {
56074
- return new Error('Invalid property in ' + componentName + '. newUser must be of type boolean');
56075
- }
56076
- if (propValue !== null && typeof window[windowProperty] === 'undefined') {
56077
- return new Error('Missing data for evaluation of ' + componentName + ' display condition. ' + propName + ' requires window.' + windowProperty);
56078
- }
56079
- return null;
56080
- };
56081
-
56082
- InAppAnnouncement.propTypes = {
56083
- width: _react2.default.PropTypes.string,
56084
- height: _react2.default.PropTypes.string,
56085
- className: _react2.default.PropTypes.string,
56086
- children: _react2.default.PropTypes.element.isRequired,
56087
- validUntil: _react2.default.PropTypes.instanceOf(Date),
56088
- showToNewUser: function showToNewUser(props, propName, componentName) {
56089
- return validateBooleanWithWindowDependency(props, propName, componentName, 'mailpoet_is_new_user');
56090
- },
56091
- showToPremiumUser: function showToPremiumUser(props, propName, componentName) {
56092
- return validateBooleanWithWindowDependency(props, propName, componentName, 'mailpoet_premium_active');
56093
- },
56094
- showOnlyOnceSlug: function showOnlyOnceSlug(props, propName, componentName) {
56095
- var propValue = props[propName];
56096
- if (propValue !== null && typeof propValue !== 'string') {
56097
- return new Error('Invalid property in ' + componentName + '. ' + propName + ' must be of type string');
56098
- }
56099
- if (propValue === null) {
56100
- return null;
56101
- }
56102
- if (typeof window.mailpoet_in_app_announcements === 'undefined') {
56103
- return new Error('Missing data for evaluation of ' + componentName + ' display condition. ' + propName + ' requires window.mailpoet_in_app_announcements');
56104
- }
56105
- return null;
56106
- }
56107
- };
56108
-
56109
- InAppAnnouncement.defaultProps = {
56110
- width: '900px',
56111
- height: '600px',
56112
- className: null,
56113
- validUntil: null,
56114
- showToNewUser: null,
56115
- showToPremiumUser: null,
56116
- showOnlyOnceSlug: null
56117
- };
56118
-
56119
- module.exports = InAppAnnouncement;
56120
-
56121
  /***/ }),
56122
  /* 502 */
56123
  /***/ (function(module, exports, __webpack_require__) {
@@ -56287,7 +56287,7 @@ var _createLocation2 = __webpack_require__(507);
56287
 
56288
  var _createLocation3 = _interopRequireDefault(_createLocation2);
56289
 
56290
- var _runTransitionHook = __webpack_require__(470);
56291
 
56292
  var _runTransitionHook2 = _interopRequireDefault(_runTransitionHook);
56293
 
@@ -56551,7 +56551,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'd
56551
 
56552
  var _Actions = __webpack_require__(101);
56553
 
56554
- var _parsePath = __webpack_require__(469);
56555
 
56556
  var _parsePath2 = _interopRequireDefault(_parsePath);
56557
 
@@ -56736,11 +56736,11 @@ var _qs = __webpack_require__(620);
56736
 
56737
  var _qs2 = _interopRequireDefault(_qs);
56738
 
56739
- var _runTransitionHook = __webpack_require__(470);
56740
 
56741
  var _runTransitionHook2 = _interopRequireDefault(_runTransitionHook);
56742
 
56743
- var _parsePath = __webpack_require__(469);
56744
 
56745
  var _parsePath2 = _interopRequireDefault(_parsePath);
56746
 
@@ -57059,20 +57059,20 @@ exports.isBuffer = function (obj) {
57059
  /***/ (function(module, exports, __webpack_require__) {
57060
 
57061
  __webpack_require__(2);
57062
- __webpack_require__(30);
57063
  __webpack_require__(533);
57064
  __webpack_require__(93);
57065
  __webpack_require__(62);
57066
  __webpack_require__(289);
57067
- __webpack_require__(499);
57068
  __webpack_require__(500);
 
57069
  __webpack_require__(58);
57070
  __webpack_require__(274);
57071
  __webpack_require__(275);
57072
  __webpack_require__(276);
57073
  __webpack_require__(502);
57074
  __webpack_require__(503);
57075
- __webpack_require__(467);
57076
  __webpack_require__(608);
57077
  __webpack_require__(94);
57078
  module.exports = __webpack_require__(19);
@@ -57133,7 +57133,7 @@ var _Router2 = __webpack_require__(535);
57133
 
57134
  var _Router3 = _interopRequireDefault(_Router2);
57135
 
57136
- var _Link2 = __webpack_require__(479);
57137
 
57138
  var _Link3 = _interopRequireDefault(_Link2);
57139
 
@@ -57153,7 +57153,7 @@ var _IndexRoute2 = __webpack_require__(546);
57153
 
57154
  var _IndexRoute3 = _interopRequireDefault(_IndexRoute2);
57155
 
57156
- var _Redirect2 = __webpack_require__(481);
57157
 
57158
  var _Redirect3 = _interopRequireDefault(_Redirect2);
57159
 
@@ -57169,7 +57169,7 @@ var _match2 = __webpack_require__(548);
57169
 
57170
  var _match3 = _interopRequireDefault(_match2);
57171
 
57172
- var _useRouterHistory2 = __webpack_require__(484);
57173
 
57174
  var _useRouterHistory3 = _interopRequireDefault(_useRouterHistory2);
57175
 
@@ -57185,7 +57185,7 @@ var _hashHistory2 = __webpack_require__(555);
57185
 
57186
  var _hashHistory3 = _interopRequireDefault(_hashHistory2);
57187
 
57188
- var _createMemoryHistory2 = __webpack_require__(482);
57189
 
57190
  var _createMemoryHistory3 = _interopRequireDefault(_createMemoryHistory2);
57191
 
@@ -57242,7 +57242,7 @@ var _createReactClass2 = _interopRequireDefault(_createReactClass);
57242
 
57243
  var _propTypes = __webpack_require__(12);
57244
 
57245
- var _createTransitionManager2 = __webpack_require__(476);
57246
 
57247
  var _createTransitionManager3 = _interopRequireDefault(_createTransitionManager2);
57248
 
@@ -57254,7 +57254,7 @@ var _RouterContext2 = _interopRequireDefault(_RouterContext);
57254
 
57255
  var _RouteUtils = __webpack_require__(60);
57256
 
57257
- var _RouterUtils = __webpack_require__(478);
57258
 
57259
  var _routerWarning = __webpack_require__(97);
57260
 
@@ -58697,7 +58697,7 @@ exports.__esModule = true;
58697
 
58698
  var _AsyncUtils = __webpack_require__(455);
58699
 
58700
- var _PromiseUtils = __webpack_require__(477);
58701
 
58702
  function getComponentsForRoute(nextState, route, callback) {
58703
  if (route.component || route.components) {
@@ -58747,7 +58747,7 @@ exports.default = matchRoutes;
58747
 
58748
  var _AsyncUtils = __webpack_require__(455);
58749
 
58750
- var _PromiseUtils = __webpack_require__(477);
58751
 
58752
  var _PatternUtils = __webpack_require__(96);
58753
 
@@ -59045,7 +59045,7 @@ var _createReactClass = __webpack_require__(26);
59045
 
59046
  var _createReactClass2 = _interopRequireDefault(_createReactClass);
59047
 
59048
- var _Link = __webpack_require__(479);
59049
 
59050
  var _Link2 = _interopRequireDefault(_Link);
59051
 
@@ -59090,7 +59090,7 @@ var _createReactClass = __webpack_require__(26);
59090
 
59091
  var _createReactClass2 = _interopRequireDefault(_createReactClass);
59092
 
59093
- var _hoistNonReactStatics = __webpack_require__(480);
59094
 
59095
  var _hoistNonReactStatics2 = _interopRequireDefault(_hoistNonReactStatics);
59096
 
@@ -59175,7 +59175,7 @@ var _invariant = __webpack_require__(14);
59175
 
59176
  var _invariant2 = _interopRequireDefault(_invariant);
59177
 
59178
- var _Redirect = __webpack_require__(481);
59179
 
59180
  var _Redirect2 = _interopRequireDefault(_Redirect);
59181
 
@@ -59363,17 +59363,17 @@ var _invariant = __webpack_require__(14);
59363
 
59364
  var _invariant2 = _interopRequireDefault(_invariant);
59365
 
59366
- var _createMemoryHistory = __webpack_require__(482);
59367
 
59368
  var _createMemoryHistory2 = _interopRequireDefault(_createMemoryHistory);
59369
 
59370
- var _createTransitionManager = __webpack_require__(476);
59371
 
59372
  var _createTransitionManager2 = _interopRequireDefault(_createTransitionManager);
59373
 
59374
  var _RouteUtils = __webpack_require__(60);
59375
 
59376
- var _RouterUtils = __webpack_require__(478);
59377
 
59378
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
59379
 
@@ -59785,11 +59785,11 @@ module.exports = exports['default'];
59785
 
59786
  exports.__esModule = true;
59787
 
59788
- var _createBrowserHistory = __webpack_require__(485);
59789
 
59790
  var _createBrowserHistory2 = _interopRequireDefault(_createBrowserHistory);
59791
 
59792
- var _createRouterHistory = __webpack_require__(487);
59793
 
59794
  var _createRouterHistory2 = _interopRequireDefault(_createRouterHistory);
59795
 
@@ -59850,11 +59850,11 @@ var replaceLocation = exports.replaceLocation = function replaceLocation(locatio
59850
 
59851
  exports.__esModule = true;
59852
 
59853
- var _createHashHistory = __webpack_require__(488);
59854
 
59855
  var _createHashHistory2 = _interopRequireDefault(_createHashHistory);
59856
 
59857
- var _createRouterHistory = __webpack_require__(487);
59858
 
59859
  var _createRouterHistory2 = _interopRequireDefault(_createRouterHistory);
59860
 
@@ -59896,7 +59896,7 @@ var _LocationUtils = __webpack_require__(98);
59896
 
59897
  var _DOMUtils = __webpack_require__(288);
59898
 
59899
- var _DOMStateStorage = __webpack_require__(486);
59900
 
59901
  var _PathUtils = __webpack_require__(61);
59902
 
@@ -61851,11 +61851,11 @@ module.exports = Listing;
61851
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_create_react_class___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_create_react_class__);
61852
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_prop_types__ = __webpack_require__(12);
61853
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_prop_types__);
61854
- /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__createTransitionManager__ = __webpack_require__(489);
61855
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__InternalPropTypes__ = __webpack_require__(273);
61856
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__RouterContext__ = __webpack_require__(463);
61857
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__RouteUtils__ = __webpack_require__(63);
61858
- /* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__RouterUtils__ = __webpack_require__(491);
61859
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__routerWarning__ = __webpack_require__(99);
61860
  var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
61861
 
@@ -62409,7 +62409,7 @@ function isActive(_ref, indexOnly, currentLocation, routes, params) {
62409
 
62410
  "use strict";
62411
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__AsyncUtils__ = __webpack_require__(462);
62412
- /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__PromiseUtils__ = __webpack_require__(490);
62413
 
62414
 
62415
 
@@ -62452,7 +62452,7 @@ function getComponents(nextState, callback) {
62452
  "use strict";
62453
  /* WEBPACK VAR INJECTION */(function(process) {/* harmony export (immutable) */ __webpack_exports__["a"] = matchRoutes;
62454
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__AsyncUtils__ = __webpack_require__(462);
62455
- /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__PromiseUtils__ = __webpack_require__(490);
62456
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__PatternUtils__ = __webpack_require__(100);
62457
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__routerWarning__ = __webpack_require__(99);
62458
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__RouteUtils__ = __webpack_require__(63);
@@ -62735,7 +62735,7 @@ function getRouteParams(route, params) {
62735
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_react__);
62736
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_create_react_class__ = __webpack_require__(26);
62737
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_create_react_class___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_create_react_class__);
62738
- /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__Link__ = __webpack_require__(492);
62739
  var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
62740
 
62741
 
@@ -62767,7 +62767,7 @@ var IndexLink = __WEBPACK_IMPORTED_MODULE_1_create_react_class___default()({
62767
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
62768
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_create_react_class__ = __webpack_require__(26);
62769
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_create_react_class___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_create_react_class__);
62770
- /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_hoist_non_react_statics__ = __webpack_require__(480);
62771
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_hoist_non_react_statics___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_hoist_non_react_statics__);
62772
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__ContextUtils__ = __webpack_require__(464);
62773
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__PropTypes__ = __webpack_require__(465);
@@ -62843,7 +62843,7 @@ function withRouter(WrappedComponent, options) {
62843
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__routerWarning__ = __webpack_require__(99);
62844
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_invariant__ = __webpack_require__(14);
62845
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_invariant___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_invariant__);
62846
- /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__Redirect__ = __webpack_require__(493);
62847
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__InternalPropTypes__ = __webpack_require__(273);
62848
 
62849
 
@@ -63007,10 +63007,10 @@ var Route = __WEBPACK_IMPORTED_MODULE_0_create_react_class___default()({
63007
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_history_lib_Actions___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_history_lib_Actions__);
63008
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_invariant__ = __webpack_require__(14);
63009
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_invariant___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_invariant__);
63010
- /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__createMemoryHistory__ = __webpack_require__(494);
63011
- /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__createTransitionManager__ = __webpack_require__(489);
63012
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__RouteUtils__ = __webpack_require__(63);
63013
- /* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__RouterUtils__ = __webpack_require__(491);
63014
  var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
63015
 
63016
  function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }
@@ -63125,9 +63125,9 @@ var _extends = Object.assign || function (target) { for (var i = 1; i < argument
63125
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
63126
 
63127
  "use strict";
63128
- /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_history_lib_createBrowserHistory__ = __webpack_require__(485);
63129
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_history_lib_createBrowserHistory___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_history_lib_createBrowserHistory__);
63130
- /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__createRouterHistory__ = __webpack_require__(496);
63131
 
63132
 
63133
  /* harmony default export */ __webpack_exports__["a"] = (Object(__WEBPACK_IMPORTED_MODULE_1__createRouterHistory__["a" /* default */])(__WEBPACK_IMPORTED_MODULE_0_history_lib_createBrowserHistory___default.a));
@@ -63137,9 +63137,9 @@ var _extends = Object.assign || function (target) { for (var i = 1; i < argument
63137
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
63138
 
63139
  "use strict";
63140
- /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_history_lib_createHashHistory__ = __webpack_require__(488);
63141
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_history_lib_createHashHistory___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_history_lib_createHashHistory__);
63142
- /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__createRouterHistory__ = __webpack_require__(496);
63143
 
63144
 
63145
  /* harmony default export */ __webpack_exports__["a"] = (Object(__WEBPACK_IMPORTED_MODULE_1__createRouterHistory__["a" /* default */])(__WEBPACK_IMPORTED_MODULE_0_history_lib_createHashHistory___default.a));
@@ -64296,7 +64296,7 @@ var _react = __webpack_require__(2);
64296
 
64297
  var _react2 = _interopRequireDefault(_react);
64298
 
64299
- var _text = __webpack_require__(497);
64300
 
64301
  var _text2 = _interopRequireDefault(_text);
64302
 
@@ -64316,7 +64316,7 @@ var _checkbox = __webpack_require__(590);
64316
 
64317
  var _checkbox2 = _interopRequireDefault(_checkbox);
64318
 
64319
- var _selection = __webpack_require__(498);
64320
 
64321
  var _selection2 = _interopRequireDefault(_selection);
64322
 
@@ -64717,7 +64717,7 @@ var _underscore = __webpack_require__(7);
64717
 
64718
  var _underscore2 = _interopRequireDefault(_underscore);
64719
 
64720
- __webpack_require__(30);
64721
 
64722
  __webpack_require__(290);
64723
 
@@ -65719,7 +65719,7 @@ var _react = __webpack_require__(2);
65719
 
65720
  var _react2 = _interopRequireDefault(_react);
65721
 
65722
- var _reactDom = __webpack_require__(30);
65723
 
65724
  var _reactDom2 = _interopRequireDefault(_reactDom);
65725
 
@@ -65753,7 +65753,7 @@ var _wpJsHooks = __webpack_require__(33);
65753
 
65754
  var _wpJsHooks2 = _interopRequireDefault(_wpJsHooks);
65755
 
65756
- var _stats = __webpack_require__(500);
65757
 
65758
  var _stats2 = _interopRequireDefault(_stats);
65759
 
@@ -66291,7 +66291,7 @@ var _mailpoet = __webpack_require__(3);
66291
 
66292
  var _mailpoet2 = _interopRequireDefault(_mailpoet);
66293
 
66294
- var _in_app_announcement = __webpack_require__(501);
66295
 
66296
  var _in_app_announcement2 = _interopRequireDefault(_in_app_announcement);
66297
 
@@ -67021,7 +67021,7 @@ var _react = __webpack_require__(2);
67021
 
67022
  var _react2 = _interopRequireDefault(_react);
67023
 
67024
- var _reactDom = __webpack_require__(30);
67025
 
67026
  var _reactDom2 = _interopRequireDefault(_reactDom);
67027
 
@@ -67133,7 +67133,7 @@ var _mailpoet = __webpack_require__(3);
67133
 
67134
  var _mailpoet2 = _interopRequireDefault(_mailpoet);
67135
 
67136
- var _in_app_announcement = __webpack_require__(501);
67137
 
67138
  var _in_app_announcement2 = _interopRequireDefault(_in_app_announcement);
67139
 
@@ -68045,7 +68045,7 @@ function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in ob
68045
 
68046
  var _ExecutionEnvironment = __webpack_require__(277);
68047
 
68048
- var _runTransitionHook = __webpack_require__(470);
68049
 
68050
  var _runTransitionHook2 = _interopRequireDefault(_runTransitionHook);
68051
 
@@ -68053,7 +68053,7 @@ var _extractPath = __webpack_require__(508);
68053
 
68054
  var _extractPath2 = _interopRequireDefault(_extractPath);
68055
 
68056
- var _parsePath = __webpack_require__(469);
68057
 
68058
  var _parsePath2 = _interopRequireDefault(_parsePath);
68059
 
5403
 
5404
 
5405
 
5406
+ var _prodInvariant = __webpack_require__(29);
5407
 
5408
  var ReactCurrentOwner = __webpack_require__(20);
5409
 
6341
  Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
6342
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__Router__ = __webpack_require__(563);
6343
  /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "Router", function() { return __WEBPACK_IMPORTED_MODULE_0__Router__["a"]; });
6344
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Link__ = __webpack_require__(493);
6345
  /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "Link", function() { return __WEBPACK_IMPORTED_MODULE_1__Link__["a"]; });
6346
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__IndexLink__ = __webpack_require__(570);
6347
  /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "IndexLink", function() { return __WEBPACK_IMPORTED_MODULE_2__IndexLink__["a"]; });
6351
  /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "IndexRedirect", function() { return __WEBPACK_IMPORTED_MODULE_4__IndexRedirect__["a"]; });
6352
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__IndexRoute__ = __webpack_require__(573);
6353
  /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "IndexRoute", function() { return __WEBPACK_IMPORTED_MODULE_5__IndexRoute__["a"]; });
6354
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__Redirect__ = __webpack_require__(494);
6355
  /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "Redirect", function() { return __WEBPACK_IMPORTED_MODULE_6__Redirect__["a"]; });
6356
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__Route__ = __webpack_require__(574);
6357
  /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "Route", function() { return __WEBPACK_IMPORTED_MODULE_7__Route__["a"]; });
6364
  /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "routerShape", function() { return __WEBPACK_IMPORTED_MODULE_10__PropTypes__["b"]; });
6365
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_11__match__ = __webpack_require__(575);
6366
  /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "match", function() { return __WEBPACK_IMPORTED_MODULE_11__match__["a"]; });
6367
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_12__useRouterHistory__ = __webpack_require__(496);
6368
  /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "useRouterHistory", function() { return __WEBPACK_IMPORTED_MODULE_12__useRouterHistory__["a"]; });
6369
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_13__PatternUtils__ = __webpack_require__(100);
6370
  /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "formatPattern", function() { return __WEBPACK_IMPORTED_MODULE_13__PatternUtils__["a"]; });
6374
  /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "browserHistory", function() { return __WEBPACK_IMPORTED_MODULE_15__browserHistory__["a"]; });
6375
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_16__hashHistory__ = __webpack_require__(578);
6376
  /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "hashHistory", function() { return __WEBPACK_IMPORTED_MODULE_16__hashHistory__["a"]; });
6377
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_17__createMemoryHistory__ = __webpack_require__(495);
6378
  /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "createMemoryHistory", function() { return __WEBPACK_IMPORTED_MODULE_17__createMemoryHistory__["a"]; });
6379
  /* components */
6380
 
6677
  /* 28 */
6678
  /***/ (function(module, exports, __webpack_require__) {
6679
 
6680
+ /* WEBPACK VAR INJECTION */(function(global) {if(!global["MailPoetLib"]) global["MailPoetLib"] = {};
6681
+ module.exports = global["MailPoetLib"]["ReactDOM"] = __webpack_require__(317);
6682
+ /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(8)))
6683
+
6684
+ /***/ }),
6685
+ /* 29 */
6686
+ /***/ (function(module, exports, __webpack_require__) {
6687
+
6688
  "use strict";
6689
  /**
6690
  * Copyright (c) 2013-present, Facebook, Inc.
6726
  module.exports = reactProdInvariant;
6727
 
6728
  /***/ }),
6729
+ /* 30 */
6730
  /***/ (function(module, exports, __webpack_require__) {
6731
 
6732
  "use strict";
7072
  module.exports = ReactElement;
7073
  /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(1)))
7074
 
 
 
 
 
 
 
 
 
7075
  /***/ }),
7076
  /* 31 */
7077
  /***/ (function(module, exports, __webpack_require__) {
7216
  var ReactPureComponent = __webpack_require__(306);
7217
  var ReactClass = __webpack_require__(307);
7218
  var ReactDOMFactories = __webpack_require__(308);
7219
+ var ReactElement = __webpack_require__(30);
7220
  var ReactPropTypes = __webpack_require__(310);
7221
  var ReactVersion = __webpack_require__(311);
7222
 
9771
 
9772
 
9773
 
9774
+ var _prodInvariant = __webpack_require__(29);
9775
 
9776
  var ReactNoopUpdateQueue = __webpack_require__(67);
9777
 
26237
 
26238
  var ReactCurrentOwner = __webpack_require__(20);
26239
  var ReactComponentTreeHook = __webpack_require__(16);
26240
+ var ReactElement = __webpack_require__(30);
26241
 
26242
  var checkReactTypeSpec = __webpack_require__(309);
26243
 
35874
 
35875
 
35876
  var PooledClass = __webpack_require__(303);
35877
+ var ReactElement = __webpack_require__(30);
35878
 
35879
  var emptyFunction = __webpack_require__(15);
35880
  var traverseAllChildren = __webpack_require__(304);
36070
 
36071
 
36072
 
36073
+ var _prodInvariant = __webpack_require__(29);
36074
 
36075
  var invariant = __webpack_require__(4);
36076
 
36187
 
36188
 
36189
 
36190
+ var _prodInvariant = __webpack_require__(29);
36191
 
36192
  var ReactCurrentOwner = __webpack_require__(20);
36193
  var REACT_ELEMENT_TYPE = __webpack_require__(229);
36480
 
36481
 
36482
 
36483
+ var _prodInvariant = __webpack_require__(29),
36484
  _assign = __webpack_require__(10);
36485
 
36486
  var ReactComponent = __webpack_require__(66);
36487
+ var ReactElement = __webpack_require__(30);
36488
  var ReactPropTypeLocationNames = __webpack_require__(68);
36489
  var ReactNoopUpdateQueue = __webpack_require__(67);
36490
 
37203
 
37204
 
37205
 
37206
+ var ReactElement = __webpack_require__(30);
37207
 
37208
  /**
37209
  * Create a factory that creates HTML tag elements.
37379
 
37380
 
37381
 
37382
+ var _prodInvariant = __webpack_require__(29);
37383
 
37384
  var ReactPropTypeLocationNames = __webpack_require__(68);
37385
  var ReactPropTypesSecret = __webpack_require__(231);
37472
 
37473
 
37474
 
37475
+ var ReactElement = __webpack_require__(30);
37476
  var ReactPropTypeLocationNames = __webpack_require__(68);
37477
  var ReactPropTypesSecret = __webpack_require__(231);
37478
 
37930
  */
37931
 
37932
 
37933
+ var _prodInvariant = __webpack_require__(29);
37934
 
37935
+ var ReactElement = __webpack_require__(30);
37936
 
37937
  var invariant = __webpack_require__(4);
37938
 
37988
 
37989
  var _propTypes2 = _interopRequireDefault(_propTypes);
37990
 
37991
+ var _reactDom = __webpack_require__(28);
37992
 
37993
  var _reactDom2 = _interopRequireDefault(_reactDom);
37994
 
50707
 
50708
  var _DOMUtils = __webpack_require__(288);
50709
 
50710
+ var _DOMStateStorage = __webpack_require__(487);
50711
 
50712
  var _PathUtils = __webpack_require__(61);
50713
 
51272
  "use strict";
51273
 
51274
 
51275
+ var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
51276
+
51277
+ var _react = __webpack_require__(2);
51278
+
51279
+ var _react2 = _interopRequireDefault(_react);
51280
+
51281
+ var _mailpoet = __webpack_require__(3);
51282
+
51283
+ var _mailpoet2 = _interopRequireDefault(_mailpoet);
51284
+
51285
+ var _in_app_announcement_dot = __webpack_require__(599);
51286
+
51287
+ var _in_app_announcement_dot2 = _interopRequireDefault(_in_app_announcement_dot);
51288
+
51289
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
51290
+
51291
+ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
51292
+
51293
+ function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
51294
+
51295
+ function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
51296
+
51297
+ var InAppAnnouncement = function (_React$Component) {
51298
+ _inherits(InAppAnnouncement, _React$Component);
51299
+
51300
+ function InAppAnnouncement(props) {
51301
+ _classCallCheck(this, InAppAnnouncement);
51302
+
51303
+ var _this = _possibleConstructorReturn(this, (InAppAnnouncement.__proto__ || Object.getPrototypeOf(InAppAnnouncement)).call(this, props));
51304
+
51305
+ _this.saveDisplayed = _this.saveDisplayed.bind(_this);
51306
+
51307
+ _this.state = {
51308
+ announcementsSettings: window.mailpoet_in_app_announcements || null
51309
+ };
51310
+ return _this;
51311
+ }
51312
+
51313
+ _createClass(InAppAnnouncement, [{
51314
+ key: 'saveDisplayed',
51315
+ value: function saveDisplayed() {
51316
+ var _this2 = this;
51317
+
51318
+ var settings = Object.assign({}, this.state.announcementsSettings);
51319
+ settings.displayed.push(this.props.showOnlyOnceSlug);
51320
+ return _mailpoet2.default.Ajax.post({
51321
+ api_version: window.mailpoet_api_version,
51322
+ endpoint: 'settings',
51323
+ action: 'set',
51324
+ data: { in_app_announcements: settings }
51325
+ }).always(function () {
51326
+ return _this2.setState({ announcementsSettings: settings });
51327
+ });
51328
+ }
51329
+ }, {
51330
+ key: 'render',
51331
+ value: function render() {
51332
+ var _this3 = this;
51333
+
51334
+ if (this.props.showToNewUser !== null && window.mailpoet_is_new_user !== this.props.showToNewUser) {
51335
+ return null;
51336
+ }
51337
+
51338
+ if (this.props.validUntil !== null && this.props.validUntil < new Date()) {
51339
+ return null;
51340
+ }
51341
+
51342
+ if (this.props.showToPremiumUser !== null && window.mailpoet_premium_active !== this.props.showToPremiumUser) {
51343
+ return null;
51344
+ }
51345
+
51346
+ if (this.props.showOnlyOnceSlug && this.state.announcementsSettings.displayed.includes(this.props.showOnlyOnceSlug)) {
51347
+ return null;
51348
+ }
51349
+
51350
+ return _react2.default.createElement(
51351
+ _in_app_announcement_dot2.default,
51352
+ {
51353
+ className: this.props.className,
51354
+ width: this.props.width,
51355
+ height: this.props.height,
51356
+ onUserTrigger: function onUserTrigger() {
51357
+ if (!_this3.props.showOnlyOnceSlug) {
51358
+ return;
51359
+ }
51360
+ _this3.saveDisplayed();
51361
+ }
51362
+ },
51363
+ this.props.children
51364
+ );
51365
+ }
51366
+ }]);
51367
+
51368
+ return InAppAnnouncement;
51369
+ }(_react2.default.Component);
51370
+
51371
+ var validateBooleanWithWindowDependency = function validateBooleanWithWindowDependency(props, propName, componentName, windowProperty) {
51372
+ var propValue = props[propName];
51373
+ if (propValue !== null && propValue !== true && propValue !== false) {
51374
+ return new Error('Invalid property in ' + componentName + '. newUser must be of type boolean');
51375
+ }
51376
+ if (propValue !== null && typeof window[windowProperty] === 'undefined') {
51377
+ return new Error('Missing data for evaluation of ' + componentName + ' display condition. ' + propName + ' requires window.' + windowProperty);
51378
+ }
51379
+ return null;
51380
+ };
51381
+
51382
+ InAppAnnouncement.propTypes = {
51383
+ width: _react2.default.PropTypes.string,
51384
+ height: _react2.default.PropTypes.string,
51385
+ className: _react2.default.PropTypes.string,
51386
+ children: _react2.default.PropTypes.element.isRequired,
51387
+ validUntil: _react2.default.PropTypes.instanceOf(Date),
51388
+ showToNewUser: function showToNewUser(props, propName, componentName) {
51389
+ return validateBooleanWithWindowDependency(props, propName, componentName, 'mailpoet_is_new_user');
51390
+ },
51391
+ showToPremiumUser: function showToPremiumUser(props, propName, componentName) {
51392
+ return validateBooleanWithWindowDependency(props, propName, componentName, 'mailpoet_premium_active');
51393
+ },
51394
+ showOnlyOnceSlug: function showOnlyOnceSlug(props, propName, componentName) {
51395
+ var propValue = props[propName];
51396
+ if (propValue !== null && typeof propValue !== 'string') {
51397
+ return new Error('Invalid property in ' + componentName + '. ' + propName + ' must be of type string');
51398
+ }
51399
+ if (propValue === null) {
51400
+ return null;
51401
+ }
51402
+ if (typeof window.mailpoet_in_app_announcements === 'undefined') {
51403
+ return new Error('Missing data for evaluation of ' + componentName + ' display condition. ' + propName + ' requires window.mailpoet_in_app_announcements');
51404
+ }
51405
+ return null;
51406
+ }
51407
+ };
51408
+
51409
+ InAppAnnouncement.defaultProps = {
51410
+ width: '900px',
51411
+ height: '600px',
51412
+ className: null,
51413
+ validUntil: null,
51414
+ showToNewUser: null,
51415
+ showToPremiumUser: null,
51416
+ showOnlyOnceSlug: null
51417
+ };
51418
+
51419
+ module.exports = InAppAnnouncement;
51420
+
51421
+ /***/ }),
51422
+ /* 468 */
51423
+ /***/ (function(module, exports, __webpack_require__) {
51424
+
51425
+ "use strict";
51426
+
51427
+
51428
  var _underscore = __webpack_require__(7);
51429
 
51430
  var _underscore2 = _interopRequireDefault(_underscore);
51441
 
51442
  var _select2 = _interopRequireDefault(_select);
51443
 
51444
+ var _text = __webpack_require__(498);
51445
 
51446
  var _text2 = _interopRequireDefault(_text);
51447
 
51448
+ var _common = __webpack_require__(469);
51449
 
51450
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
51451
 
51598
  module.exports = WelcomeScheduling;
51599
 
51600
  /***/ }),
51601
+ /* 469 */
51602
  /***/ (function(module, exports, __webpack_require__) {
51603
 
51604
  "use strict";
51609
  /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(8)))
51610
 
51611
  /***/ }),
51612
+ /* 470 */
51613
  /***/ (function(module, exports, __webpack_require__) {
51614
 
51615
  "use strict";
51660
  /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(1)))
51661
 
51662
  /***/ }),
51663
+ /* 471 */
51664
  /***/ (function(module, exports, __webpack_require__) {
51665
 
51666
  "use strict";
51691
  /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(1)))
51692
 
51693
  /***/ }),
 
51694
  /* 472 */,
51695
  /* 473 */,
51696
  /* 474 */,
51697
  /* 475 */,
51698
+ /* 476 */,
51699
+ /* 477 */
51700
  /***/ (function(module, exports, __webpack_require__) {
51701
 
51702
  "use strict";
51987
  /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(1)))
51988
 
51989
  /***/ }),
51990
+ /* 478 */
51991
  /***/ (function(module, exports, __webpack_require__) {
51992
 
51993
  "use strict";
52000
  }
52001
 
52002
  /***/ }),
52003
+ /* 479 */
52004
  /***/ (function(module, exports, __webpack_require__) {
52005
 
52006
  "use strict";
52034
  }
52035
 
52036
  /***/ }),
52037
+ /* 480 */
52038
  /***/ (function(module, exports, __webpack_require__) {
52039
 
52040
  "use strict";
52188
  /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(1)))
52189
 
52190
  /***/ }),
52191
+ /* 481 */
52192
  /***/ (function(module, exports, __webpack_require__) {
52193
 
52194
  "use strict";
52245
 
52246
 
52247
  /***/ }),
52248
+ /* 482 */
52249
  /***/ (function(module, exports, __webpack_require__) {
52250
 
52251
  "use strict";
52351
  /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(1)))
52352
 
52353
  /***/ }),
52354
+ /* 483 */
52355
  /***/ (function(module, exports, __webpack_require__) {
52356
 
52357
  "use strict";
52368
 
52369
  var _useBasename2 = _interopRequireDefault(_useBasename);
52370
 
52371
+ var _createMemoryHistory = __webpack_require__(484);
52372
 
52373
  var _createMemoryHistory2 = _interopRequireDefault(_createMemoryHistory);
52374
 
52388
  module.exports = exports['default'];
52389
 
52390
  /***/ }),
52391
+ /* 484 */
52392
  /***/ (function(module, exports, __webpack_require__) {
52393
 
52394
  "use strict";
52535
  /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(1)))
52536
 
52537
  /***/ }),
52538
+ /* 485 */
52539
  /***/ (function(module, exports, __webpack_require__) {
52540
 
52541
  "use strict";
52563
  module.exports = exports['default'];
52564
 
52565
  /***/ }),
52566
+ /* 486 */
52567
  /***/ (function(module, exports, __webpack_require__) {
52568
 
52569
  "use strict";
52663
  /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(1)))
52664
 
52665
  /***/ }),
52666
+ /* 487 */
52667
  /***/ (function(module, exports, __webpack_require__) {
52668
 
52669
  "use strict";
52755
  /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(1)))
52756
 
52757
  /***/ }),
52758
+ /* 488 */
52759
  /***/ (function(module, exports, __webpack_require__) {
52760
 
52761
  "use strict";
52764
  exports.__esModule = true;
52765
  exports.default = createRouterHistory;
52766
 
52767
+ var _useRouterHistory = __webpack_require__(485);
52768
 
52769
  var _useRouterHistory2 = _interopRequireDefault(_useRouterHistory);
52770
 
52780
  module.exports = exports['default'];
52781
 
52782
  /***/ }),
52783
+ /* 489 */
52784
  /***/ (function(module, exports, __webpack_require__) {
52785
 
52786
  "use strict";
52934
  /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(1)))
52935
 
52936
  /***/ }),
52937
+ /* 490 */
52938
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
52939
 
52940
  "use strict";
53206
  /* WEBPACK VAR INJECTION */}.call(__webpack_exports__, __webpack_require__(1)))
53207
 
53208
  /***/ }),
53209
+ /* 491 */
53210
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
53211
 
53212
  "use strict";
53216
  }
53217
 
53218
  /***/ }),
53219
+ /* 492 */
53220
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
53221
 
53222
  "use strict";
53246
  }
53247
 
53248
  /***/ }),
53249
+ /* 493 */
53250
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
53251
 
53252
  "use strict";
53392
  /* WEBPACK VAR INJECTION */}.call(__webpack_exports__, __webpack_require__(1)))
53393
 
53394
  /***/ }),
53395
+ /* 494 */
53396
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
53397
 
53398
  "use strict";
53491
  /* WEBPACK VAR INJECTION */}.call(__webpack_exports__, __webpack_require__(1)))
53492
 
53493
  /***/ }),
53494
+ /* 495 */
53495
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
53496
 
53497
  "use strict";
53500
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_history_lib_useQueries___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_history_lib_useQueries__);
53501
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_history_lib_useBasename__ = __webpack_require__(287);
53502
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_history_lib_useBasename___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_history_lib_useBasename__);
53503
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_history_lib_createMemoryHistory__ = __webpack_require__(484);
53504
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_history_lib_createMemoryHistory___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_history_lib_createMemoryHistory__);
53505
 
53506
 
53519
  }
53520
 
53521
  /***/ }),
53522
+ /* 496 */
53523
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
53524
 
53525
  "use strict";
53539
  }
53540
 
53541
  /***/ }),
53542
+ /* 497 */
53543
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
53544
 
53545
  "use strict";
53546
  /* harmony export (immutable) */ __webpack_exports__["a"] = createRouterHistory;
53547
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__useRouterHistory__ = __webpack_require__(496);
53548
 
53549
 
53550
  var canUseDOM = !!(typeof window !== 'undefined' && window.document && window.document.createElement);
53556
  }
53557
 
53558
  /***/ }),
53559
+ /* 498 */
53560
  /***/ (function(module, exports, __webpack_require__) {
53561
 
53562
  "use strict";
53567
  /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(8)))
53568
 
53569
  /***/ }),
53570
+ /* 499 */
53571
  /***/ (function(module, exports, __webpack_require__) {
53572
 
53573
  "use strict";
53578
  /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(8)))
53579
 
53580
  /***/ }),
53581
+ /* 500 */
53582
  /***/ (function(module, exports, __webpack_require__) {
53583
 
53584
  /**
56108
 
56109
 
56110
  /***/ }),
56111
+ /* 501 */
56112
  /***/ (function(module, exports, __webpack_require__) {
56113
 
56114
  "use strict";
56118
  module.exports = global["MailPoetLib"]["StatsBadge"] = __webpack_require__(593);
56119
  /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(8)))
56120
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
56121
  /***/ }),
56122
  /* 502 */
56123
  /***/ (function(module, exports, __webpack_require__) {
56287
 
56288
  var _createLocation3 = _interopRequireDefault(_createLocation2);
56289
 
56290
+ var _runTransitionHook = __webpack_require__(471);
56291
 
56292
  var _runTransitionHook2 = _interopRequireDefault(_runTransitionHook);
56293
 
56551
 
56552
  var _Actions = __webpack_require__(101);
56553
 
56554
+ var _parsePath = __webpack_require__(470);
56555
 
56556
  var _parsePath2 = _interopRequireDefault(_parsePath);
56557
 
56736
 
56737
  var _qs2 = _interopRequireDefault(_qs);
56738
 
56739
+ var _runTransitionHook = __webpack_require__(471);
56740
 
56741
  var _runTransitionHook2 = _interopRequireDefault(_runTransitionHook);
56742
 
56743
+ var _parsePath = __webpack_require__(470);
56744
 
56745
  var _parsePath2 = _interopRequireDefault(_parsePath);
56746
 
57059
  /***/ (function(module, exports, __webpack_require__) {
57060
 
57061
  __webpack_require__(2);
57062
+ __webpack_require__(28);
57063
  __webpack_require__(533);
57064
  __webpack_require__(93);
57065
  __webpack_require__(62);
57066
  __webpack_require__(289);
 
57067
  __webpack_require__(500);
57068
+ __webpack_require__(501);
57069
  __webpack_require__(58);
57070
  __webpack_require__(274);
57071
  __webpack_require__(275);
57072
  __webpack_require__(276);
57073
  __webpack_require__(502);
57074
  __webpack_require__(503);
57075
+ __webpack_require__(468);
57076
  __webpack_require__(608);
57077
  __webpack_require__(94);
57078
  module.exports = __webpack_require__(19);
57133
 
57134
  var _Router3 = _interopRequireDefault(_Router2);
57135
 
57136
+ var _Link2 = __webpack_require__(480);
57137
 
57138
  var _Link3 = _interopRequireDefault(_Link2);
57139
 
57153
 
57154
  var _IndexRoute3 = _interopRequireDefault(_IndexRoute2);
57155
 
57156
+ var _Redirect2 = __webpack_require__(482);
57157
 
57158
  var _Redirect3 = _interopRequireDefault(_Redirect2);
57159
 
57169
 
57170
  var _match3 = _interopRequireDefault(_match2);
57171
 
57172
+ var _useRouterHistory2 = __webpack_require__(485);
57173
 
57174
  var _useRouterHistory3 = _interopRequireDefault(_useRouterHistory2);
57175
 
57185
 
57186
  var _hashHistory3 = _interopRequireDefault(_hashHistory2);
57187
 
57188
+ var _createMemoryHistory2 = __webpack_require__(483);
57189
 
57190
  var _createMemoryHistory3 = _interopRequireDefault(_createMemoryHistory2);
57191
 
57242
 
57243
  var _propTypes = __webpack_require__(12);
57244
 
57245
+ var _createTransitionManager2 = __webpack_require__(477);
57246
 
57247
  var _createTransitionManager3 = _interopRequireDefault(_createTransitionManager2);
57248
 
57254
 
57255
  var _RouteUtils = __webpack_require__(60);
57256
 
57257
+ var _RouterUtils = __webpack_require__(479);
57258
 
57259
  var _routerWarning = __webpack_require__(97);
57260
 
58697
 
58698
  var _AsyncUtils = __webpack_require__(455);
58699
 
58700
+ var _PromiseUtils = __webpack_require__(478);
58701
 
58702
  function getComponentsForRoute(nextState, route, callback) {
58703
  if (route.component || route.components) {
58747
 
58748
  var _AsyncUtils = __webpack_require__(455);
58749
 
58750
+ var _PromiseUtils = __webpack_require__(478);
58751
 
58752
  var _PatternUtils = __webpack_require__(96);
58753
 
59045
 
59046
  var _createReactClass2 = _interopRequireDefault(_createReactClass);
59047
 
59048
+ var _Link = __webpack_require__(480);
59049
 
59050
  var _Link2 = _interopRequireDefault(_Link);
59051
 
59090
 
59091
  var _createReactClass2 = _interopRequireDefault(_createReactClass);
59092
 
59093
+ var _hoistNonReactStatics = __webpack_require__(481);
59094
 
59095
  var _hoistNonReactStatics2 = _interopRequireDefault(_hoistNonReactStatics);
59096
 
59175
 
59176
  var _invariant2 = _interopRequireDefault(_invariant);
59177
 
59178
+ var _Redirect = __webpack_require__(482);
59179
 
59180
  var _Redirect2 = _interopRequireDefault(_Redirect);
59181
 
59363
 
59364
  var _invariant2 = _interopRequireDefault(_invariant);
59365
 
59366
+ var _createMemoryHistory = __webpack_require__(483);
59367
 
59368
  var _createMemoryHistory2 = _interopRequireDefault(_createMemoryHistory);
59369
 
59370
+ var _createTransitionManager = __webpack_require__(477);
59371
 
59372
  var _createTransitionManager2 = _interopRequireDefault(_createTransitionManager);
59373
 
59374
  var _RouteUtils = __webpack_require__(60);
59375
 
59376
+ var _RouterUtils = __webpack_require__(479);
59377
 
59378
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
59379
 
59785
 
59786
  exports.__esModule = true;
59787
 
59788
+ var _createBrowserHistory = __webpack_require__(486);
59789
 
59790
  var _createBrowserHistory2 = _interopRequireDefault(_createBrowserHistory);
59791
 
59792
+ var _createRouterHistory = __webpack_require__(488);
59793
 
59794
  var _createRouterHistory2 = _interopRequireDefault(_createRouterHistory);
59795
 
59850
 
59851
  exports.__esModule = true;
59852
 
59853
+ var _createHashHistory = __webpack_require__(489);
59854
 
59855
  var _createHashHistory2 = _interopRequireDefault(_createHashHistory);
59856
 
59857
+ var _createRouterHistory = __webpack_require__(488);
59858
 
59859
  var _createRouterHistory2 = _interopRequireDefault(_createRouterHistory);
59860
 
59896
 
59897
  var _DOMUtils = __webpack_require__(288);
59898
 
59899
+ var _DOMStateStorage = __webpack_require__(487);
59900
 
59901
  var _PathUtils = __webpack_require__(61);
59902
 
61851
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_create_react_class___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_create_react_class__);
61852
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_prop_types__ = __webpack_require__(12);
61853
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_prop_types__);
61854
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__createTransitionManager__ = __webpack_require__(490);
61855
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__InternalPropTypes__ = __webpack_require__(273);
61856
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__RouterContext__ = __webpack_require__(463);
61857
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__RouteUtils__ = __webpack_require__(63);
61858
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__RouterUtils__ = __webpack_require__(492);
61859
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__routerWarning__ = __webpack_require__(99);
61860
  var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
61861
 
62409
 
62410
  "use strict";
62411
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__AsyncUtils__ = __webpack_require__(462);
62412
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__PromiseUtils__ = __webpack_require__(491);
62413
 
62414
 
62415
 
62452
  "use strict";
62453
  /* WEBPACK VAR INJECTION */(function(process) {/* harmony export (immutable) */ __webpack_exports__["a"] = matchRoutes;
62454
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__AsyncUtils__ = __webpack_require__(462);
62455
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__PromiseUtils__ = __webpack_require__(491);
62456
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__PatternUtils__ = __webpack_require__(100);
62457
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__routerWarning__ = __webpack_require__(99);
62458
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__RouteUtils__ = __webpack_require__(63);
62735
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_react__);
62736
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_create_react_class__ = __webpack_require__(26);
62737
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_create_react_class___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_create_react_class__);
62738
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__Link__ = __webpack_require__(493);
62739
  var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
62740
 
62741
 
62767
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
62768
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_create_react_class__ = __webpack_require__(26);
62769
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_create_react_class___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_create_react_class__);
62770
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_hoist_non_react_statics__ = __webpack_require__(481);
62771
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_hoist_non_react_statics___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_hoist_non_react_statics__);
62772
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__ContextUtils__ = __webpack_require__(464);
62773
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__PropTypes__ = __webpack_require__(465);
62843
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__routerWarning__ = __webpack_require__(99);
62844
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_invariant__ = __webpack_require__(14);
62845
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_invariant___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_invariant__);
62846
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__Redirect__ = __webpack_require__(494);
62847
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__InternalPropTypes__ = __webpack_require__(273);
62848
 
62849
 
63007
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_history_lib_Actions___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_history_lib_Actions__);
63008
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_invariant__ = __webpack_require__(14);
63009
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_invariant___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_invariant__);
63010
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__createMemoryHistory__ = __webpack_require__(495);
63011
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__createTransitionManager__ = __webpack_require__(490);
63012
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__RouteUtils__ = __webpack_require__(63);
63013
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__RouterUtils__ = __webpack_require__(492);
63014
  var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
63015
 
63016
  function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }
63125
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
63126
 
63127
  "use strict";
63128
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_history_lib_createBrowserHistory__ = __webpack_require__(486);
63129
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_history_lib_createBrowserHistory___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_history_lib_createBrowserHistory__);
63130
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__createRouterHistory__ = __webpack_require__(497);
63131
 
63132
 
63133
  /* harmony default export */ __webpack_exports__["a"] = (Object(__WEBPACK_IMPORTED_MODULE_1__createRouterHistory__["a" /* default */])(__WEBPACK_IMPORTED_MODULE_0_history_lib_createBrowserHistory___default.a));
63137
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
63138
 
63139
  "use strict";
63140
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_history_lib_createHashHistory__ = __webpack_require__(489);
63141
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_history_lib_createHashHistory___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_history_lib_createHashHistory__);
63142
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__createRouterHistory__ = __webpack_require__(497);
63143
 
63144
 
63145
  /* harmony default export */ __webpack_exports__["a"] = (Object(__WEBPACK_IMPORTED_MODULE_1__createRouterHistory__["a" /* default */])(__WEBPACK_IMPORTED_MODULE_0_history_lib_createHashHistory___default.a));
64296
 
64297
  var _react2 = _interopRequireDefault(_react);
64298
 
64299
+ var _text = __webpack_require__(498);
64300
 
64301
  var _text2 = _interopRequireDefault(_text);
64302
 
64316
 
64317
  var _checkbox2 = _interopRequireDefault(_checkbox);
64318
 
64319
+ var _selection = __webpack_require__(499);
64320
 
64321
  var _selection2 = _interopRequireDefault(_selection);
64322
 
64717
 
64718
  var _underscore2 = _interopRequireDefault(_underscore);
64719
 
64720
+ __webpack_require__(28);
64721
 
64722
  __webpack_require__(290);
64723
 
65719
 
65720
  var _react2 = _interopRequireDefault(_react);
65721
 
65722
+ var _reactDom = __webpack_require__(28);
65723
 
65724
  var _reactDom2 = _interopRequireDefault(_reactDom);
65725
 
65753
 
65754
  var _wpJsHooks2 = _interopRequireDefault(_wpJsHooks);
65755
 
65756
+ var _stats = __webpack_require__(501);
65757
 
65758
  var _stats2 = _interopRequireDefault(_stats);
65759
 
66291
 
66292
  var _mailpoet2 = _interopRequireDefault(_mailpoet);
66293
 
66294
+ var _in_app_announcement = __webpack_require__(467);
66295
 
66296
  var _in_app_announcement2 = _interopRequireDefault(_in_app_announcement);
66297
 
67021
 
67022
  var _react2 = _interopRequireDefault(_react);
67023
 
67024
+ var _reactDom = __webpack_require__(28);
67025
 
67026
  var _reactDom2 = _interopRequireDefault(_reactDom);
67027
 
67133
 
67134
  var _mailpoet2 = _interopRequireDefault(_mailpoet);
67135
 
67136
+ var _in_app_announcement = __webpack_require__(467);
67137
 
67138
  var _in_app_announcement2 = _interopRequireDefault(_in_app_announcement);
67139
 
68045
 
68046
  var _ExecutionEnvironment = __webpack_require__(277);
68047
 
68048
+ var _runTransitionHook = __webpack_require__(471);
68049
 
68050
  var _runTransitionHook2 = _interopRequireDefault(_runTransitionHook);
68051
 
68053
 
68054
  var _extractPath2 = _interopRequireDefault(_extractPath);
68055
 
68056
+ var _parsePath = __webpack_require__(470);
68057
 
68058
  var _parsePath2 = _interopRequireDefault(_parsePath);
68059
 
assets/js/{form_editor.eaab3da3.js → form_editor.f5731029.js} RENAMED
@@ -3,30 +3,30 @@ webpackJsonp([4],{
3
  /***/ 516:
4
  /***/ (function(module, exports, __webpack_require__) {
5
 
6
- /* WEBPACK VAR INJECTION */(function(global) {module.exports = global["CodeMirror"] = __webpack_require__(683);
7
  /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(8)))
8
 
9
  /***/ }),
10
 
11
- /***/ 680:
12
  /***/ (function(module, exports, __webpack_require__) {
13
 
14
- __webpack_require__(681);
15
  __webpack_require__(516);
16
- module.exports = __webpack_require__(684);
17
 
18
 
19
  /***/ }),
20
 
21
- /***/ 681:
22
  /***/ (function(module, exports, __webpack_require__) {
23
 
24
- /* WEBPACK VAR INJECTION */(function(global) {module.exports = global["WysijaForm"] = __webpack_require__(682);
25
  /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(8)))
26
 
27
  /***/ }),
28
 
29
- /***/ 682:
30
  /***/ (function(module, exports, __webpack_require__) {
31
 
32
  "use strict";
@@ -1188,7 +1188,7 @@ module.exports = WysijaForm;
1188
 
1189
  /***/ }),
1190
 
1191
- /***/ 683:
1192
  /***/ (function(module, exports, __webpack_require__) {
1193
 
1194
  // CodeMirror, copyright (c) by Marijn Haverbeke and others
@@ -10872,7 +10872,7 @@ return CodeMirror$1;
10872
 
10873
  /***/ }),
10874
 
10875
- /***/ 684:
10876
  /***/ (function(module, exports, __webpack_require__) {
10877
 
10878
  // CodeMirror, copyright (c) by Marijn Haverbeke and others
@@ -11711,4 +11711,4 @@ CodeMirror.defineMode("css", function(config, parserConfig) {
11711
 
11712
  /***/ })
11713
 
11714
- },[680]);
3
  /***/ 516:
4
  /***/ (function(module, exports, __webpack_require__) {
5
 
6
+ /* WEBPACK VAR INJECTION */(function(global) {module.exports = global["CodeMirror"] = __webpack_require__(685);
7
  /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(8)))
8
 
9
  /***/ }),
10
 
11
+ /***/ 682:
12
  /***/ (function(module, exports, __webpack_require__) {
13
 
14
+ __webpack_require__(683);
15
  __webpack_require__(516);
16
+ module.exports = __webpack_require__(686);
17
 
18
 
19
  /***/ }),
20
 
21
+ /***/ 683:
22
  /***/ (function(module, exports, __webpack_require__) {
23
 
24
+ /* WEBPACK VAR INJECTION */(function(global) {module.exports = global["WysijaForm"] = __webpack_require__(684);
25
  /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(8)))
26
 
27
  /***/ }),
28
 
29
+ /***/ 684:
30
  /***/ (function(module, exports, __webpack_require__) {
31
 
32
  "use strict";
1188
 
1189
  /***/ }),
1190
 
1191
+ /***/ 685:
1192
  /***/ (function(module, exports, __webpack_require__) {
1193
 
1194
  // CodeMirror, copyright (c) by Marijn Haverbeke and others
10872
 
10873
  /***/ }),
10874
 
10875
+ /***/ 686:
10876
  /***/ (function(module, exports, __webpack_require__) {
10877
 
10878
  // CodeMirror, copyright (c) by Marijn Haverbeke and others
11711
 
11712
  /***/ })
11713
 
11714
+ },[682]);
assets/js/{mailpoet.eaab3da3.js → mailpoet.f5731029.js} RENAMED
@@ -5345,7 +5345,7 @@ module.exports = emptyFunction;
5345
 
5346
 
5347
 
5348
- var _prodInvariant = __webpack_require__(28);
5349
 
5350
  var ReactCurrentOwner = __webpack_require__(20);
5351
 
@@ -6525,6 +6525,14 @@ module.exports = DOMProperty;
6525
  /* 28 */
6526
  /***/ (function(module, exports, __webpack_require__) {
6527
 
 
 
 
 
 
 
 
 
6528
  "use strict";
6529
  /**
6530
  * Copyright (c) 2013-present, Facebook, Inc.
@@ -6566,7 +6574,7 @@ function reactProdInvariant(code) {
6566
  module.exports = reactProdInvariant;
6567
 
6568
  /***/ }),
6569
- /* 29 */
6570
  /***/ (function(module, exports, __webpack_require__) {
6571
 
6572
  "use strict";
@@ -6912,14 +6920,6 @@ ReactElement.isValidElement = function (object) {
6912
  module.exports = ReactElement;
6913
  /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(1)))
6914
 
6915
- /***/ }),
6916
- /* 30 */
6917
- /***/ (function(module, exports, __webpack_require__) {
6918
-
6919
- /* WEBPACK VAR INJECTION */(function(global) {if(!global["MailPoetLib"]) global["MailPoetLib"] = {};
6920
- module.exports = global["MailPoetLib"]["ReactDOM"] = __webpack_require__(317);
6921
- /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(8)))
6922
-
6923
  /***/ }),
6924
  /* 31 */
6925
  /***/ (function(module, exports, __webpack_require__) {
@@ -7193,7 +7193,7 @@ var ReactComponent = __webpack_require__(66);
7193
  var ReactPureComponent = __webpack_require__(306);
7194
  var ReactClass = __webpack_require__(307);
7195
  var ReactDOMFactories = __webpack_require__(308);
7196
- var ReactElement = __webpack_require__(29);
7197
  var ReactPropTypes = __webpack_require__(310);
7198
  var ReactVersion = __webpack_require__(311);
7199
 
@@ -10000,7 +10000,7 @@ module.exports = getIteratorFn;
10000
 
10001
 
10002
 
10003
- var _prodInvariant = __webpack_require__(28);
10004
 
10005
  var ReactNoopUpdateQueue = __webpack_require__(67);
10006
 
@@ -28529,7 +28529,7 @@ module.exports = REACT_ELEMENT_TYPE;
28529
 
28530
  var ReactCurrentOwner = __webpack_require__(20);
28531
  var ReactComponentTreeHook = __webpack_require__(16);
28532
- var ReactElement = __webpack_require__(29);
28533
 
28534
  var checkReactTypeSpec = __webpack_require__(309);
28535
 
@@ -35648,7 +35648,7 @@ module.exports = __webpack_require__(34);
35648
 
35649
 
35650
  var PooledClass = __webpack_require__(303);
35651
- var ReactElement = __webpack_require__(29);
35652
 
35653
  var emptyFunction = __webpack_require__(15);
35654
  var traverseAllChildren = __webpack_require__(304);
@@ -35844,7 +35844,7 @@ module.exports = ReactChildren;
35844
 
35845
 
35846
 
35847
- var _prodInvariant = __webpack_require__(28);
35848
 
35849
  var invariant = __webpack_require__(4);
35850
 
@@ -35961,7 +35961,7 @@ module.exports = PooledClass;
35961
 
35962
 
35963
 
35964
- var _prodInvariant = __webpack_require__(28);
35965
 
35966
  var ReactCurrentOwner = __webpack_require__(20);
35967
  var REACT_ELEMENT_TYPE = __webpack_require__(229);
@@ -36254,11 +36254,11 @@ module.exports = ReactPureComponent;
36254
 
36255
 
36256
 
36257
- var _prodInvariant = __webpack_require__(28),
36258
  _assign = __webpack_require__(10);
36259
 
36260
  var ReactComponent = __webpack_require__(66);
36261
- var ReactElement = __webpack_require__(29);
36262
  var ReactPropTypeLocationNames = __webpack_require__(68);
36263
  var ReactNoopUpdateQueue = __webpack_require__(67);
36264
 
@@ -36977,7 +36977,7 @@ module.exports = ReactClass;
36977
 
36978
 
36979
 
36980
- var ReactElement = __webpack_require__(29);
36981
 
36982
  /**
36983
  * Create a factory that creates HTML tag elements.
@@ -37153,7 +37153,7 @@ module.exports = ReactDOMFactories;
37153
 
37154
 
37155
 
37156
- var _prodInvariant = __webpack_require__(28);
37157
 
37158
  var ReactPropTypeLocationNames = __webpack_require__(68);
37159
  var ReactPropTypesSecret = __webpack_require__(231);
@@ -37246,7 +37246,7 @@ module.exports = checkReactTypeSpec;
37246
 
37247
 
37248
 
37249
- var ReactElement = __webpack_require__(29);
37250
  var ReactPropTypeLocationNames = __webpack_require__(68);
37251
  var ReactPropTypesSecret = __webpack_require__(231);
37252
 
@@ -37704,9 +37704,9 @@ module.exports = '15.4.2';
37704
  */
37705
 
37706
 
37707
- var _prodInvariant = __webpack_require__(28);
37708
 
37709
- var ReactElement = __webpack_require__(29);
37710
 
37711
  var invariant = __webpack_require__(4);
37712
 
@@ -37762,7 +37762,7 @@ var _propTypes = __webpack_require__(12);
37762
 
37763
  var _propTypes2 = _interopRequireDefault(_propTypes);
37764
 
37765
- var _reactDom = __webpack_require__(30);
37766
 
37767
  var _reactDom2 = _interopRequireDefault(_reactDom);
37768
 
@@ -55414,7 +55414,7 @@ function cacheEvent(forced, name, data) {
55414
  /* 530 */
55415
  /***/ (function(module, exports, __webpack_require__) {
55416
 
55417
- var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(3), __webpack_require__(2), __webpack_require__(30), __webpack_require__(228)], __WEBPACK_AMD_DEFINE_RESULT__ = (function helpTooltip(mp, React, ReactDOM, TooltipComponent) {
55418
  'use strict';
55419
 
55420
  var MailPoet = mp;
5345
 
5346
 
5347
 
5348
+ var _prodInvariant = __webpack_require__(29);
5349
 
5350
  var ReactCurrentOwner = __webpack_require__(20);
5351
 
6525
  /* 28 */
6526
  /***/ (function(module, exports, __webpack_require__) {
6527
 
6528
+ /* WEBPACK VAR INJECTION */(function(global) {if(!global["MailPoetLib"]) global["MailPoetLib"] = {};
6529
+ module.exports = global["MailPoetLib"]["ReactDOM"] = __webpack_require__(317);
6530
+ /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(8)))
6531
+
6532
+ /***/ }),
6533
+ /* 29 */
6534
+ /***/ (function(module, exports, __webpack_require__) {
6535
+
6536
  "use strict";
6537
  /**
6538
  * Copyright (c) 2013-present, Facebook, Inc.
6574
  module.exports = reactProdInvariant;
6575
 
6576
  /***/ }),
6577
+ /* 30 */
6578
  /***/ (function(module, exports, __webpack_require__) {
6579
 
6580
  "use strict";
6920
  module.exports = ReactElement;
6921
  /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(1)))
6922
 
 
 
 
 
 
 
 
 
6923
  /***/ }),
6924
  /* 31 */
6925
  /***/ (function(module, exports, __webpack_require__) {
7193
  var ReactPureComponent = __webpack_require__(306);
7194
  var ReactClass = __webpack_require__(307);
7195
  var ReactDOMFactories = __webpack_require__(308);
7196
+ var ReactElement = __webpack_require__(30);
7197
  var ReactPropTypes = __webpack_require__(310);
7198
  var ReactVersion = __webpack_require__(311);
7199
 
10000
 
10001
 
10002
 
10003
+ var _prodInvariant = __webpack_require__(29);
10004
 
10005
  var ReactNoopUpdateQueue = __webpack_require__(67);
10006
 
28529
 
28530
  var ReactCurrentOwner = __webpack_require__(20);
28531
  var ReactComponentTreeHook = __webpack_require__(16);
28532
+ var ReactElement = __webpack_require__(30);
28533
 
28534
  var checkReactTypeSpec = __webpack_require__(309);
28535
 
35648
 
35649
 
35650
  var PooledClass = __webpack_require__(303);
35651
+ var ReactElement = __webpack_require__(30);
35652
 
35653
  var emptyFunction = __webpack_require__(15);
35654
  var traverseAllChildren = __webpack_require__(304);
35844
 
35845
 
35846
 
35847
+ var _prodInvariant = __webpack_require__(29);
35848
 
35849
  var invariant = __webpack_require__(4);
35850
 
35961
 
35962
 
35963
 
35964
+ var _prodInvariant = __webpack_require__(29);
35965
 
35966
  var ReactCurrentOwner = __webpack_require__(20);
35967
  var REACT_ELEMENT_TYPE = __webpack_require__(229);
36254
 
36255
 
36256
 
36257
+ var _prodInvariant = __webpack_require__(29),
36258
  _assign = __webpack_require__(10);
36259
 
36260
  var ReactComponent = __webpack_require__(66);
36261
+ var ReactElement = __webpack_require__(30);
36262
  var ReactPropTypeLocationNames = __webpack_require__(68);
36263
  var ReactNoopUpdateQueue = __webpack_require__(67);
36264
 
36977
 
36978
 
36979
 
36980
+ var ReactElement = __webpack_require__(30);
36981
 
36982
  /**
36983
  * Create a factory that creates HTML tag elements.
37153
 
37154
 
37155
 
37156
+ var _prodInvariant = __webpack_require__(29);
37157
 
37158
  var ReactPropTypeLocationNames = __webpack_require__(68);
37159
  var ReactPropTypesSecret = __webpack_require__(231);
37246
 
37247
 
37248
 
37249
+ var ReactElement = __webpack_require__(30);
37250
  var ReactPropTypeLocationNames = __webpack_require__(68);
37251
  var ReactPropTypesSecret = __webpack_require__(231);
37252
 
37704
  */
37705
 
37706
 
37707
+ var _prodInvariant = __webpack_require__(29);
37708
 
37709
+ var ReactElement = __webpack_require__(30);
37710
 
37711
  var invariant = __webpack_require__(4);
37712
 
37762
 
37763
  var _propTypes2 = _interopRequireDefault(_propTypes);
37764
 
37765
+ var _reactDom = __webpack_require__(28);
37766
 
37767
  var _reactDom2 = _interopRequireDefault(_reactDom);
37768
 
55414
  /* 530 */
55415
  /***/ (function(module, exports, __webpack_require__) {
55416
 
55417
+ var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(3), __webpack_require__(2), __webpack_require__(28), __webpack_require__(228)], __WEBPACK_AMD_DEFINE_RESULT__ = (function helpTooltip(mp, React, ReactDOM, TooltipComponent) {
55418
  'use strict';
55419
 
55420
  var MailPoet = mp;
assets/js/manifest.json CHANGED
@@ -1,10 +1,10 @@
1
  {
2
- "mp2migrator.js": "mp2migrator.8768b2f6.js",
3
  "public.js": "public.8a5f8230.js",
4
- "admin.js": "admin.eaab3da3.js",
5
- "admin_vendor.js": "admin_vendor.eaab3da3.js",
6
- "form_editor.js": "form_editor.eaab3da3.js",
7
- "mailpoet.js": "mailpoet.eaab3da3.js",
8
- "newsletter_editor.js": "newsletter_editor.eaab3da3.js",
9
- "vendor.js": "vendor.eaab3da3.js"
10
  }
1
  {
2
+ "mp2migrator.js": "mp2migrator.3d80df09.js",
3
  "public.js": "public.8a5f8230.js",
4
+ "admin.js": "admin.f5731029.js",
5
+ "admin_vendor.js": "admin_vendor.f5731029.js",
6
+ "form_editor.js": "form_editor.f5731029.js",
7
+ "mailpoet.js": "mailpoet.f5731029.js",
8
+ "newsletter_editor.js": "newsletter_editor.f5731029.js",
9
+ "vendor.js": "vendor.f5731029.js"
10
  }
assets/js/{mp2migrator.8768b2f6.js → mp2migrator.3d80df09.js} RENAMED
@@ -109,9 +109,9 @@ var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* eslint-disabl
109
  jQuery('#logger').html('');
110
  result.split('\n').forEach(function (resultRow) {
111
  var row = resultRow;
112
- if (row.substr(0, 7) === '[ERROR]' || row.substr(0, 9) === '[WARNING]' || row === MailPoet.I18n.t('import_stopped_by_user')) {
113
  row = '<span class="error_msg">' + row + '</span>'; // Mark the errors in red
114
- } else if (row === MailPoet.I18n.t('import_complete')) { // Test if the import is complete
115
  jQuery('#import-actions').hide();
116
  jQuery('#upgrade-completed').show();
117
  }
109
  jQuery('#logger').html('');
110
  result.split('\n').forEach(function (resultRow) {
111
  var row = resultRow;
112
+ if (row.substr(0, 7) === '[ERROR]' || row.substr(0, 9) === '[WARNING]' || row.toLowerCase() === MailPoet.I18n.t('import_stopped_by_user').toLowerCase()) {
113
  row = '<span class="error_msg">' + row + '</span>'; // Mark the errors in red
114
+ } else if (row.toLowerCase() === MailPoet.I18n.t('import_complete').toLowerCase()) { // Test if the import is complete
115
  jQuery('#import-actions').hide();
116
  jQuery('#upgrade-completed').show();
117
  }
assets/js/{newsletter_editor.eaab3da3.js → newsletter_editor.f5731029.js} RENAMED
@@ -18628,7 +18628,7 @@ var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;
18628
  /***/ 39:
18629
  /***/ (function(module, exports, __webpack_require__) {
18630
 
18631
- /* WEBPACK VAR INJECTION */(function(global) {module.exports = global["Backbone"] = __webpack_require__(474);
18632
  /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(8)))
18633
 
18634
  /***/ }),
@@ -19000,7 +19000,7 @@ var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
19000
 
19001
  /***/ }),
19002
 
19003
- /***/ 471:
19004
  /***/ (function(module, exports, __webpack_require__) {
19005
 
19006
  "use strict";
@@ -19019,7 +19019,7 @@ var _mailpoet = __webpack_require__(3);
19019
 
19020
  var _mailpoet2 = _interopRequireDefault(_mailpoet);
19021
 
19022
- var _html2canvas = __webpack_require__(472);
19023
 
19024
  var _html2canvas2 = _interopRequireDefault(_html2canvas);
19025
 
@@ -19103,15 +19103,15 @@ var fromNewsletter = exports.fromNewsletter = function fromNewsletter(data) {
19103
 
19104
  /***/ }),
19105
 
19106
- /***/ 472:
19107
  /***/ (function(module, exports, __webpack_require__) {
19108
 
19109
- /* WEBPACK VAR INJECTION */(function(global) {module.exports = global["html2canvas"] = __webpack_require__(473);
19110
  /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(8)))
19111
 
19112
  /***/ }),
19113
 
19114
- /***/ 473:
19115
  /***/ (function(module, exports, __webpack_require__) {
19116
 
19117
  /*!
@@ -26391,7 +26391,7 @@ var formatCounterValue = function formatCounterValue(counter, glue, format) {
26391
 
26392
  /***/ }),
26393
 
26394
- /***/ 474:
26395
  /***/ (function(module, exports, __webpack_require__) {
26396
 
26397
  /* WEBPACK VAR INJECTION */(function(global) {var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;// Backbone.js 1.3.3
@@ -31060,7 +31060,7 @@ var saveAs = saveAs || (function(view) {
31060
 
31061
  if (typeof module !== "undefined" && module.exports) {
31062
  module.exports.saveAs = saveAs;
31063
- } else if (("function" !== "undefined" && __webpack_require__(687) !== null) && (__webpack_require__(86) !== null)) {
31064
  !(__WEBPACK_AMD_DEFINE_RESULT__ = (function() {
31065
  return saveAs;
31066
  }).call(exports, __webpack_require__, exports, module),
@@ -31493,7 +31493,7 @@ module.exports = Backbone.SuperModel;
31493
 
31494
  /***/ }),
31495
 
31496
- /***/ 685:
31497
  /***/ (function(module, exports, __webpack_require__) {
31498
 
31499
  __webpack_require__(7);
@@ -31504,21 +31504,19 @@ __webpack_require__(294);
31504
  __webpack_require__(293);
31505
  __webpack_require__(290);
31506
  __webpack_require__(517);
31507
- __webpack_require__(686);
31508
  __webpack_require__(518);
31509
  __webpack_require__(519);
31510
- __webpack_require__(688);
31511
- __webpack_require__(23);
31512
- __webpack_require__(689);
31513
  __webpack_require__(690);
 
31514
  __webpack_require__(691);
31515
  __webpack_require__(692);
31516
  __webpack_require__(693);
31517
  __webpack_require__(694);
31518
- __webpack_require__(103);
31519
- __webpack_require__(47);
31520
  __webpack_require__(695);
31521
  __webpack_require__(696);
 
 
31522
  __webpack_require__(697);
31523
  __webpack_require__(698);
31524
  __webpack_require__(699);
@@ -31527,24 +31525,26 @@ __webpack_require__(701);
31527
  __webpack_require__(702);
31528
  __webpack_require__(703);
31529
  __webpack_require__(704);
31530
- __webpack_require__(40);
31531
  __webpack_require__(705);
31532
- __webpack_require__(295);
31533
  __webpack_require__(706);
31534
- __webpack_require__(296);
31535
  __webpack_require__(707);
 
31536
  __webpack_require__(708);
 
31537
  __webpack_require__(709);
31538
  __webpack_require__(710);
31539
  __webpack_require__(711);
31540
  __webpack_require__(712);
31541
  __webpack_require__(713);
31542
- module.exports = __webpack_require__(714);
 
 
31543
 
31544
 
31545
  /***/ }),
31546
 
31547
- /***/ 686:
31548
  /***/ (function(module, exports) {
31549
 
31550
  // Generated by CoffeeScript 1.9.2
@@ -31815,7 +31815,7 @@ module.exports = __webpack_require__(714);
31815
 
31816
  /***/ }),
31817
 
31818
- /***/ 687:
31819
  /***/ (function(module, exports) {
31820
 
31821
  module.exports = function() {
@@ -31825,7 +31825,7 @@ module.exports = function() {
31825
 
31826
  /***/ }),
31827
 
31828
- /***/ 688:
31829
  /***/ (function(module, exports, __webpack_require__) {
31830
 
31831
  var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;/*** IMPORTS FROM imports-loader ***/
@@ -35725,7 +35725,7 @@ will produce an inaccurate conversion value. The same issue exists with the cx/c
35725
 
35726
  /***/ }),
35727
 
35728
- /***/ 689:
35729
  /***/ (function(module, exports, __webpack_require__) {
35730
 
35731
  var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [
@@ -35776,7 +35776,7 @@ var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_
35776
 
35777
  /***/ }),
35778
 
35779
- /***/ 690:
35780
  /***/ (function(module, exports, __webpack_require__) {
35781
 
35782
  "use strict";
@@ -35877,7 +35877,7 @@ var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;
35877
 
35878
  /***/ }),
35879
 
35880
- /***/ 691:
35881
  /***/ (function(module, exports, __webpack_require__) {
35882
 
35883
  var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* eslint-disable func-names */
@@ -36274,7 +36274,7 @@ var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* eslint-disabl
36274
 
36275
  /***/ }),
36276
 
36277
- /***/ 692:
36278
  /***/ (function(module, exports, __webpack_require__) {
36279
 
36280
  "use strict";
@@ -36389,7 +36389,7 @@ var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;
36389
 
36390
  /***/ }),
36391
 
36392
- /***/ 693:
36393
  /***/ (function(module, exports, __webpack_require__) {
36394
 
36395
  "use strict";
@@ -36443,7 +36443,7 @@ var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;
36443
 
36444
  /***/ }),
36445
 
36446
- /***/ 694:
36447
  /***/ (function(module, exports, __webpack_require__) {
36448
 
36449
  var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* eslint-disable func-names */
@@ -36457,7 +36457,7 @@ var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* eslint-disabl
36457
  __webpack_require__(9),
36458
  __webpack_require__(518),
36459
  __webpack_require__(519),
36460
- __webpack_require__(471),
36461
  __webpack_require__(7),
36462
  __webpack_require__(9)
36463
  ], __WEBPACK_AMD_DEFINE_RESULT__ = (function (
@@ -36816,7 +36816,7 @@ var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* eslint-disabl
36816
 
36817
  /***/ }),
36818
 
36819
- /***/ 695:
36820
  /***/ (function(module, exports, __webpack_require__) {
36821
 
36822
  var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
@@ -36871,7 +36871,7 @@ var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
36871
 
36872
  /***/ }),
36873
 
36874
- /***/ 696:
36875
  /***/ (function(module, exports, __webpack_require__) {
36876
 
36877
  var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* eslint-disable func-names */
@@ -37364,7 +37364,7 @@ var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* eslint-disabl
37364
 
37365
  /***/ }),
37366
 
37367
- /***/ 697:
37368
  /***/ (function(module, exports, __webpack_require__) {
37369
 
37370
  var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
@@ -37521,7 +37521,15 @@ var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
37521
 
37522
  /***/ }),
37523
 
37524
- /***/ 698:
 
 
 
 
 
 
 
 
37525
  /***/ (function(module, exports, __webpack_require__) {
37526
 
37527
  var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
@@ -37555,7 +37563,7 @@ var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
37555
 
37556
  /***/ }),
37557
 
37558
- /***/ 699:
37559
  /***/ (function(module, exports, __webpack_require__) {
37560
 
37561
  var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
@@ -37589,15 +37597,7 @@ var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
37589
 
37590
  /***/ }),
37591
 
37592
- /***/ 7:
37593
- /***/ (function(module, exports, __webpack_require__) {
37594
-
37595
- /* WEBPACK VAR INJECTION */(function(global) {module.exports = global["_"] = __webpack_require__(104);
37596
- /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(8)))
37597
-
37598
- /***/ }),
37599
-
37600
- /***/ 700:
37601
  /***/ (function(module, exports, __webpack_require__) {
37602
 
37603
  var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* eslint-disable func-names */
@@ -37918,7 +37918,7 @@ var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* eslint-disabl
37918
 
37919
  /***/ }),
37920
 
37921
- /***/ 701:
37922
  /***/ (function(module, exports, __webpack_require__) {
37923
 
37924
  var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
@@ -38006,7 +38006,7 @@ var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
38006
 
38007
  /***/ }),
38008
 
38009
- /***/ 702:
38010
  /***/ (function(module, exports, __webpack_require__) {
38011
 
38012
  var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
@@ -38055,7 +38055,7 @@ var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
38055
 
38056
  /***/ }),
38057
 
38058
- /***/ 703:
38059
  /***/ (function(module, exports, __webpack_require__) {
38060
 
38061
  var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
@@ -38095,7 +38095,7 @@ var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
38095
 
38096
  /***/ }),
38097
 
38098
- /***/ 704:
38099
  /***/ (function(module, exports, __webpack_require__) {
38100
 
38101
  var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
@@ -38193,7 +38193,7 @@ var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
38193
 
38194
  /***/ }),
38195
 
38196
- /***/ 705:
38197
  /***/ (function(module, exports, __webpack_require__) {
38198
 
38199
  var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* eslint-disable func-names */
@@ -38583,7 +38583,7 @@ var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* eslint-disabl
38583
 
38584
  /***/ }),
38585
 
38586
- /***/ 706:
38587
  /***/ (function(module, exports, __webpack_require__) {
38588
 
38589
  var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* eslint-disable func-names */
@@ -38758,7 +38758,7 @@ var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* eslint-disabl
38758
 
38759
  /***/ }),
38760
 
38761
- /***/ 707:
38762
  /***/ (function(module, exports, __webpack_require__) {
38763
 
38764
  "use strict";
@@ -38879,7 +38879,7 @@ var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;
38879
 
38880
  /***/ }),
38881
 
38882
- /***/ 708:
38883
  /***/ (function(module, exports, __webpack_require__) {
38884
 
38885
  "use strict";
@@ -38991,7 +38991,7 @@ var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;
38991
 
38992
  /***/ }),
38993
 
38994
- /***/ 709:
38995
  /***/ (function(module, exports, __webpack_require__) {
38996
 
38997
  "use strict";
@@ -39129,7 +39129,7 @@ var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;
39129
 
39130
  /***/ }),
39131
 
39132
- /***/ 710:
39133
  /***/ (function(module, exports, __webpack_require__) {
39134
 
39135
  "use strict";
@@ -39267,7 +39267,7 @@ var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;
39267
 
39268
  /***/ }),
39269
 
39270
- /***/ 711:
39271
  /***/ (function(module, exports, __webpack_require__) {
39272
 
39273
  var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* eslint-disable func-names */
@@ -39673,7 +39673,7 @@ var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* eslint-disabl
39673
 
39674
  /***/ }),
39675
 
39676
- /***/ 712:
39677
  /***/ (function(module, exports, __webpack_require__) {
39678
 
39679
  var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* eslint-disable func-names */
@@ -40081,7 +40081,7 @@ var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* eslint-disabl
40081
 
40082
  /***/ }),
40083
 
40084
- /***/ 713:
40085
  /***/ (function(module, exports, __webpack_require__) {
40086
 
40087
  var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* eslint-disable func-names */
@@ -40702,7 +40702,7 @@ var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* eslint-disabl
40702
 
40703
  /***/ }),
40704
 
40705
- /***/ 714:
40706
  /***/ (function(module, exports, __webpack_require__) {
40707
 
40708
  var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* eslint-disable func-names */
@@ -41022,4 +41022,4 @@ module.exports = jQuery;
41022
 
41023
  /***/ })
41024
 
41025
- },[685]);
18628
  /***/ 39:
18629
  /***/ (function(module, exports, __webpack_require__) {
18630
 
18631
+ /* WEBPACK VAR INJECTION */(function(global) {module.exports = global["Backbone"] = __webpack_require__(475);
18632
  /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(8)))
18633
 
18634
  /***/ }),
19000
 
19001
  /***/ }),
19002
 
19003
+ /***/ 472:
19004
  /***/ (function(module, exports, __webpack_require__) {
19005
 
19006
  "use strict";
19019
 
19020
  var _mailpoet2 = _interopRequireDefault(_mailpoet);
19021
 
19022
+ var _html2canvas = __webpack_require__(473);
19023
 
19024
  var _html2canvas2 = _interopRequireDefault(_html2canvas);
19025
 
19103
 
19104
  /***/ }),
19105
 
19106
+ /***/ 473:
19107
  /***/ (function(module, exports, __webpack_require__) {
19108
 
19109
+ /* WEBPACK VAR INJECTION */(function(global) {module.exports = global["html2canvas"] = __webpack_require__(474);
19110
  /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(8)))
19111
 
19112
  /***/ }),
19113
 
19114
+ /***/ 474:
19115
  /***/ (function(module, exports, __webpack_require__) {
19116
 
19117
  /*!
26391
 
26392
  /***/ }),
26393
 
26394
+ /***/ 475:
26395
  /***/ (function(module, exports, __webpack_require__) {
26396
 
26397
  /* WEBPACK VAR INJECTION */(function(global) {var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;// Backbone.js 1.3.3
31060
 
31061
  if (typeof module !== "undefined" && module.exports) {
31062
  module.exports.saveAs = saveAs;
31063
+ } else if (("function" !== "undefined" && __webpack_require__(689) !== null) && (__webpack_require__(86) !== null)) {
31064
  !(__WEBPACK_AMD_DEFINE_RESULT__ = (function() {
31065
  return saveAs;
31066
  }).call(exports, __webpack_require__, exports, module),
31493
 
31494
  /***/ }),
31495
 
31496
+ /***/ 687:
31497
  /***/ (function(module, exports, __webpack_require__) {
31498
 
31499
  __webpack_require__(7);
31504
  __webpack_require__(293);
31505
  __webpack_require__(290);
31506
  __webpack_require__(517);
31507
+ __webpack_require__(688);
31508
  __webpack_require__(518);
31509
  __webpack_require__(519);
 
 
 
31510
  __webpack_require__(690);
31511
+ __webpack_require__(23);
31512
  __webpack_require__(691);
31513
  __webpack_require__(692);
31514
  __webpack_require__(693);
31515
  __webpack_require__(694);
 
 
31516
  __webpack_require__(695);
31517
  __webpack_require__(696);
31518
+ __webpack_require__(103);
31519
+ __webpack_require__(47);
31520
  __webpack_require__(697);
31521
  __webpack_require__(698);
31522
  __webpack_require__(699);
31525
  __webpack_require__(702);
31526
  __webpack_require__(703);
31527
  __webpack_require__(704);
 
31528
  __webpack_require__(705);
 
31529
  __webpack_require__(706);
31530
+ __webpack_require__(40);
31531
  __webpack_require__(707);
31532
+ __webpack_require__(295);
31533
  __webpack_require__(708);
31534
+ __webpack_require__(296);
31535
  __webpack_require__(709);
31536
  __webpack_require__(710);
31537
  __webpack_require__(711);
31538
  __webpack_require__(712);
31539
  __webpack_require__(713);
31540
+ __webpack_require__(714);
31541
+ __webpack_require__(715);
31542
+ module.exports = __webpack_require__(716);
31543
 
31544
 
31545
  /***/ }),
31546
 
31547
+ /***/ 688:
31548
  /***/ (function(module, exports) {
31549
 
31550
  // Generated by CoffeeScript 1.9.2
31815
 
31816
  /***/ }),
31817
 
31818
+ /***/ 689:
31819
  /***/ (function(module, exports) {
31820
 
31821
  module.exports = function() {
31825
 
31826
  /***/ }),
31827
 
31828
+ /***/ 690:
31829
  /***/ (function(module, exports, __webpack_require__) {
31830
 
31831
  var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;/*** IMPORTS FROM imports-loader ***/
35725
 
35726
  /***/ }),
35727
 
35728
+ /***/ 691:
35729
  /***/ (function(module, exports, __webpack_require__) {
35730
 
35731
  var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [
35776
 
35777
  /***/ }),
35778
 
35779
+ /***/ 692:
35780
  /***/ (function(module, exports, __webpack_require__) {
35781
 
35782
  "use strict";
35877
 
35878
  /***/ }),
35879
 
35880
+ /***/ 693:
35881
  /***/ (function(module, exports, __webpack_require__) {
35882
 
35883
  var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* eslint-disable func-names */
36274
 
36275
  /***/ }),
36276
 
36277
+ /***/ 694:
36278
  /***/ (function(module, exports, __webpack_require__) {
36279
 
36280
  "use strict";
36389
 
36390
  /***/ }),
36391
 
36392
+ /***/ 695:
36393
  /***/ (function(module, exports, __webpack_require__) {
36394
 
36395
  "use strict";
36443
 
36444
  /***/ }),
36445
 
36446
+ /***/ 696:
36447
  /***/ (function(module, exports, __webpack_require__) {
36448
 
36449
  var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* eslint-disable func-names */
36457
  __webpack_require__(9),
36458
  __webpack_require__(518),
36459
  __webpack_require__(519),
36460
+ __webpack_require__(472),
36461
  __webpack_require__(7),
36462
  __webpack_require__(9)
36463
  ], __WEBPACK_AMD_DEFINE_RESULT__ = (function (
36816
 
36817
  /***/ }),
36818
 
36819
+ /***/ 697:
36820
  /***/ (function(module, exports, __webpack_require__) {
36821
 
36822
  var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
36871
 
36872
  /***/ }),
36873
 
36874
+ /***/ 698:
36875
  /***/ (function(module, exports, __webpack_require__) {
36876
 
36877
  var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* eslint-disable func-names */
37364
 
37365
  /***/ }),
37366
 
37367
+ /***/ 699:
37368
  /***/ (function(module, exports, __webpack_require__) {
37369
 
37370
  var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
37521
 
37522
  /***/ }),
37523
 
37524
+ /***/ 7:
37525
+ /***/ (function(module, exports, __webpack_require__) {
37526
+
37527
+ /* WEBPACK VAR INJECTION */(function(global) {module.exports = global["_"] = __webpack_require__(104);
37528
+ /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(8)))
37529
+
37530
+ /***/ }),
37531
+
37532
+ /***/ 700:
37533
  /***/ (function(module, exports, __webpack_require__) {
37534
 
37535
  var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
37563
 
37564
  /***/ }),
37565
 
37566
+ /***/ 701:
37567
  /***/ (function(module, exports, __webpack_require__) {
37568
 
37569
  var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
37597
 
37598
  /***/ }),
37599
 
37600
+ /***/ 702:
 
 
 
 
 
 
 
 
37601
  /***/ (function(module, exports, __webpack_require__) {
37602
 
37603
  var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* eslint-disable func-names */
37918
 
37919
  /***/ }),
37920
 
37921
+ /***/ 703:
37922
  /***/ (function(module, exports, __webpack_require__) {
37923
 
37924
  var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
38006
 
38007
  /***/ }),
38008
 
38009
+ /***/ 704:
38010
  /***/ (function(module, exports, __webpack_require__) {
38011
 
38012
  var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
38055
 
38056
  /***/ }),
38057
 
38058
+ /***/ 705:
38059
  /***/ (function(module, exports, __webpack_require__) {
38060
 
38061
  var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
38095
 
38096
  /***/ }),
38097
 
38098
+ /***/ 706:
38099
  /***/ (function(module, exports, __webpack_require__) {
38100
 
38101
  var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
38193
 
38194
  /***/ }),
38195
 
38196
+ /***/ 707:
38197
  /***/ (function(module, exports, __webpack_require__) {
38198
 
38199
  var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* eslint-disable func-names */
38583
 
38584
  /***/ }),
38585
 
38586
+ /***/ 708:
38587
  /***/ (function(module, exports, __webpack_require__) {
38588
 
38589
  var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* eslint-disable func-names */
38758
 
38759
  /***/ }),
38760
 
38761
+ /***/ 709:
38762
  /***/ (function(module, exports, __webpack_require__) {
38763
 
38764
  "use strict";
38879
 
38880
  /***/ }),
38881
 
38882
+ /***/ 710:
38883
  /***/ (function(module, exports, __webpack_require__) {
38884
 
38885
  "use strict";
38991
 
38992
  /***/ }),
38993
 
38994
+ /***/ 711:
38995
  /***/ (function(module, exports, __webpack_require__) {
38996
 
38997
  "use strict";
39129
 
39130
  /***/ }),
39131
 
39132
+ /***/ 712:
39133
  /***/ (function(module, exports, __webpack_require__) {
39134
 
39135
  "use strict";
39267
 
39268
  /***/ }),
39269
 
39270
+ /***/ 713:
39271
  /***/ (function(module, exports, __webpack_require__) {
39272
 
39273
  var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* eslint-disable func-names */
39673
 
39674
  /***/ }),
39675
 
39676
+ /***/ 714:
39677
  /***/ (function(module, exports, __webpack_require__) {
39678
 
39679
  var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* eslint-disable func-names */
40081
 
40082
  /***/ }),
40083
 
40084
+ /***/ 715:
40085
  /***/ (function(module, exports, __webpack_require__) {
40086
 
40087
  var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* eslint-disable func-names */
40702
 
40703
  /***/ }),
40704
 
40705
+ /***/ 716:
40706
  /***/ (function(module, exports, __webpack_require__) {
40707
 
40708
  var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* eslint-disable func-names */
41022
 
41023
  /***/ })
41024
 
41025
+ },[687]);
assets/js/{vendor.eaab3da3.js → vendor.f5731029.js} RENAMED
File without changes
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-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-zh_CN.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: 2018-10-09 15:30:52+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=utf-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
@@ -75,7 +75,7 @@ msgid "New form"
75
  msgstr ""
76
 
77
  #: lib/API/JSON/v1/Forms.php:70 lib/API/JSON/v1/Forms.php:74
78
- #: lib/API/MP/v1/API.php:20
79
  #: lib/Subscribers/ImportExport/ImportExportFactory.php:44
80
  #: lib/Subscribers/ImportExport/PersonalDataExporters/SubscriberExporter.php:40
81
  #: views/help.html:64 views/newsletter/editor.html:963
@@ -132,8 +132,8 @@ msgstr ""
132
 
133
  #: lib/API/JSON/v1/Segments.php:24 lib/API/JSON/v1/Segments.php:75
134
  #: lib/API/JSON/v1/Segments.php:91 lib/API/JSON/v1/Segments.php:107
135
- #: lib/API/JSON/v1/Segments.php:121 lib/API/MP/v1/API.php:63
136
- #: lib/API/MP/v1/API.php:114
137
  msgid "This list does not exist."
138
  msgstr ""
139
 
@@ -213,7 +213,7 @@ msgstr ""
213
 
214
  #: lib/API/JSON/v1/Subscribers.php:37 lib/API/JSON/v1/Subscribers.php:222
215
  #: lib/API/JSON/v1/Subscribers.php:238 lib/API/JSON/v1/Subscribers.php:254
216
- #: lib/API/MP/v1/API.php:57 lib/API/MP/v1/API.php:108 lib/API/MP/v1/API.php:245
217
  msgid "This subscriber does not exist."
218
  msgstr ""
219
 
@@ -241,43 +241,43 @@ msgstr ""
241
  msgid "You need to wait %d seconds before subscribing again."
242
  msgstr ""
243
 
244
- #: lib/API/MP/v1/API.php:24
245
  #: lib/Subscribers/ImportExport/ImportExportFactory.php:45
246
- #: lib/Subscription/Pages.php:283 views/form/editor.html:225
247
- #: views/form/editor.html:228 views/subscribers/subscribers.html:53
248
  msgid "First name"
249
  msgstr ""
250
 
251
- #: lib/API/MP/v1/API.php:28
252
  #: lib/Subscribers/ImportExport/ImportExportFactory.php:46
253
- #: lib/Subscription/Pages.php:292 views/form/editor.html:234
254
- #: views/form/editor.html:237 views/subscribers/subscribers.html:54
255
  msgid "Last name"
256
  msgstr ""
257
 
258
- #: lib/API/MP/v1/API.php:51 lib/API/MP/v1/API.php:102
259
  msgid "At least one segment ID is required."
260
  msgstr ""
261
 
262
- #: lib/API/MP/v1/API.php:80 lib/API/MP/v1/API.php:131
263
  msgid "List with ID %s does not exist."
264
  msgid_plural "Lists with IDs %s do not exist."
265
  msgstr[0] ""
266
  msgstr[1] ""
267
 
268
- #: lib/API/MP/v1/API.php:152
269
  msgid "Subscriber email address is required."
270
  msgstr ""
271
 
272
- #: lib/API/MP/v1/API.php:159
273
  msgid "This subscriber already exists."
274
  msgstr ""
275
 
276
- #: lib/API/MP/v1/API.php:214
277
  msgid "List name is required."
278
  msgstr ""
279
 
280
- #: lib/API/MP/v1/API.php:221
281
  msgid "This list already exists."
282
  msgstr ""
283
 
@@ -305,8 +305,8 @@ msgstr ""
305
  msgid "Manage segments"
306
  msgstr ""
307
 
308
- #: lib/Config/Capabilities.php:67 lib/Config/Menu.php:703
309
- #: lib/Config/PrivacyPolicy.php:11 views/premium.html:41
310
  msgid "MailPoet"
311
  msgstr ""
312
 
@@ -478,72 +478,72 @@ msgstr ""
478
  msgid "Migration"
479
  msgstr ""
480
 
481
- #: lib/Config/Menu.php:566
482
  msgid "In any WordPress role"
483
  msgstr ""
484
 
485
- #: lib/Config/Menu.php:585
486
  msgid "WooCommerce"
487
  msgstr ""
488
 
489
- #: lib/Config/Menu.php:586
490
  msgid ""
491
  "Automatically send an email when there is a new WooCommerce product, order "
492
  "and some other action takes place."
493
  msgstr ""
494
 
495
- #: lib/Config/Menu.php:590
496
  msgid "Abandoned Shopping Cart"
497
  msgstr ""
498
 
499
- #: lib/Config/Menu.php:591
500
  msgid ""
501
  "Send an email to logged-in visitors who have items in their shopping carts "
502
  "but left your website without checking out. Can convert up to 5% of "
503
  "abandoned carts."
504
  msgstr ""
505
 
506
- #: lib/Config/Menu.php:594 lib/Config/Menu.php:613
507
  msgid "Must-have"
508
  msgstr ""
509
 
510
- #: lib/Config/Menu.php:600
511
  msgid "Big Spender"
512
  msgstr ""
513
 
514
- #: lib/Config/Menu.php:601
515
  msgid ""
516
  "Let MailPoet send an email to customers who have spent a certain amount to "
517
  "thank them, possibly with a coupon."
518
  msgstr ""
519
 
520
- #: lib/Config/Menu.php:604
521
  msgid "Smart to have"
522
  msgstr ""
523
 
524
- #: lib/Config/Menu.php:610
525
  msgid "First Purchase"
526
  msgstr ""
527
 
528
- #: lib/Config/Menu.php:611
529
  msgid "Let MailPoet send an email to customers who make their first purchase."
530
  msgstr ""
531
 
532
- #: lib/Config/Menu.php:619
533
  msgid "Purchased In This Category"
534
  msgstr ""
535
 
536
- #: lib/Config/Menu.php:620
537
  msgid ""
538
  "Let MailPoet send an email to customers who purchase a product from a "
539
  "specific category."
540
  msgstr ""
541
 
542
- #: lib/Config/Menu.php:625
543
  msgid "Purchased This Product"
544
  msgstr ""
545
 
546
- #: lib/Config/Menu.php:626
547
  msgid "Let MailPoet send an email to customers who purchase a specific product."
548
  msgstr ""
549
 
@@ -574,11 +574,11 @@ msgid ""
574
  "might work within a MultiSite environment, we don’t support it."
575
  msgstr ""
576
 
577
- #: lib/Config/Populator.php:188
578
  msgid "My First List"
579
  msgstr ""
580
 
581
- #: lib/Config/Populator.php:190
582
  msgid "This list is automatically created when you install MailPoet."
583
  msgstr ""
584
 
@@ -1432,7 +1432,7 @@ msgstr ""
1432
 
1433
  #: lib/Models/CustomField.php:20 lib/Models/Form.php:13
1434
  #: lib/Models/NewsletterOptionField.php:12 lib/Models/NewsletterTemplate.php:16
1435
- #: lib/Models/Segment.php:15 lib/Models/Setting.php:22
1436
  #: views/form/templates/settings/field_form.hbs:53
1437
  #: views/subscribers/importExport/import/step2.html:134
1438
  msgid "Please specify a name."
@@ -1444,12 +1444,12 @@ msgid "Please specify a type."
1444
  msgstr ""
1445
 
1446
  #: lib/Models/Form.php:93 lib/Models/Newsletter.php:732
1447
- #: lib/Models/Segment.php:133 lib/Models/Subscriber.php:337
1448
  msgid "All"
1449
  msgstr ""
1450
 
1451
  #: lib/Models/Form.php:98 lib/Models/Newsletter.php:803
1452
- #: lib/Models/Segment.php:138 lib/Models/Subscriber.php:362 views/forms.html:71
1453
  #: views/newsletters.html:91 views/segments.html:50
1454
  #: views/subscribers/subscribers.html:38
1455
  msgid "Trash"
@@ -1464,7 +1464,7 @@ msgstr ""
1464
  msgid "Deleted list"
1465
  msgstr ""
1466
 
1467
- #: lib/Models/Newsletter.php:628 lib/Models/Subscriber.php:273
1468
  msgid "All Lists"
1469
  msgstr ""
1470
 
@@ -1518,11 +1518,11 @@ msgstr ""
1518
  msgid "Rendered newsletter body is invalid!"
1519
  msgstr ""
1520
 
1521
- #: lib/Models/Setting.php:48
1522
  msgid "Confirm your subscription to %1$s"
1523
  msgstr ""
1524
 
1525
- #: lib/Models/Setting.php:49
1526
  msgid ""
1527
  "Hello!\n"
1528
  "\n"
@@ -1538,34 +1538,34 @@ msgid ""
1538
  "The Team"
1539
  msgstr ""
1540
 
1541
- #: lib/Models/Subscriber.php:24
1542
  msgid "Please enter your email address"
1543
  msgstr ""
1544
 
1545
- #: lib/Models/Subscriber.php:25
1546
  msgid "Your email address is invalid!"
1547
  msgstr ""
1548
 
1549
- #: lib/Models/Subscriber.php:281
1550
  msgid "Subscribers without a list (%s)"
1551
  msgstr ""
1552
 
1553
- #: lib/Models/Subscriber.php:342 lib/Subscription/Pages.php:306
1554
  #: views/segments.html:30 views/subscribers/subscribers.html:57
1555
  msgid "Subscribed"
1556
  msgstr ""
1557
 
1558
- #: lib/Models/Subscriber.php:347 views/segments.html:31
1559
  #: views/subscribers/subscribers.html:56
1560
  msgid "Unconfirmed"
1561
  msgstr ""
1562
 
1563
- #: lib/Models/Subscriber.php:352 lib/Subscription/Pages.php:314
1564
  #: views/segments.html:32 views/subscribers/subscribers.html:58
1565
  msgid "Unsubscribed"
1566
  msgstr ""
1567
 
1568
- #: lib/Models/Subscriber.php:357 lib/Subscription/Pages.php:322
1569
  #: views/segments.html:33 views/subscribers/subscribers.html:59
1570
  msgid "Bounced"
1571
  msgstr ""
@@ -1690,7 +1690,7 @@ msgid "Invalid router endpoint action"
1690
  msgstr ""
1691
 
1692
  #: lib/Settings/Pages.php:12 lib/Settings/Pages.php:13
1693
- #: lib/Settings/Pages.php:37 lib/Subscription/Pages.php:112
1694
  msgid "MailPoet Page"
1695
  msgstr ""
1696
 
@@ -1832,10 +1832,10 @@ msgstr ""
1832
  #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:151
1833
  #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:177
1834
  #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:239
1835
- #: views/premium.html:62 views/premium.html:63 views/settings/advanced.html:153
1836
  #: views/settings/advanced.html:193 views/settings/advanced.html:233
1837
- #: views/settings/mta.html:539 views/settings/mta.html:593
1838
- #: views/settings/signup.html:46
1839
  #: views/subscribers/importExport/import/step2.html:67
1840
  msgid "No"
1841
  msgstr ""
@@ -1865,7 +1865,7 @@ msgid "MailPoet Mailing Lists"
1865
  msgstr ""
1866
 
1867
  #: lib/Subscribers/ImportExport/PersonalDataExporters/SubscriberExporter.php:44
1868
- #: lib/Subscription/Pages.php:302 views/help.html:44 views/newsletters.html:75
1869
  #: views/subscribers/subscribers.html:55 views/subscribers/subscribers.html:67
1870
  msgid "Status"
1871
  msgstr ""
@@ -1910,73 +1910,77 @@ msgstr ""
1910
  msgid "Unknown"
1911
  msgstr ""
1912
 
 
 
 
 
1913
  #: lib/Subscription/Comment.php:23 lib/Subscription/Registration.php:11
1914
  msgid "Yes, please add me to your mailing list."
1915
  msgstr ""
1916
 
1917
- #: lib/Subscription/Pages.php:108
1918
  msgid "Hmmm... we don't have a record of you."
1919
  msgstr ""
1920
 
1921
- #: lib/Subscription/Pages.php:138
1922
  msgid ""
1923
  "Your email address doesn't appear in our lists anymore. Sign up again or "
1924
  "contact us if this appears to be a mistake."
1925
  msgstr ""
1926
 
1927
- #: lib/Subscription/Pages.php:182 lib/Subscription/Pages.php:194
1928
  msgid "You have subscribed to: %s"
1929
  msgstr ""
1930
 
1931
- #: lib/Subscription/Pages.php:191
1932
  msgid "You are now subscribed!"
1933
  msgstr ""
1934
 
1935
- #: lib/Subscription/Pages.php:204 lib/Subscription/Pages.php:423
1936
  msgid "Manage your subscription"
1937
  msgstr ""
1938
 
1939
- #: lib/Subscription/Pages.php:210
1940
  msgid "You are now unsubscribed."
1941
  msgstr ""
1942
 
1943
- #: lib/Subscription/Pages.php:216
1944
  msgid "Yup, we've added you to our email list. You'll hear from us shortly."
1945
  msgstr ""
1946
 
1947
- #: lib/Subscription/Pages.php:233
1948
  msgid "Subscription management form is only available to mailing lists subscribers."
1949
  msgstr ""
1950
 
1951
- #: lib/Subscription/Pages.php:345
1952
  msgid "Your lists"
1953
  msgstr ""
1954
 
1955
- #: lib/Subscription/Pages.php:353 views/form/editor.html:35
1956
- #: views/form/editor.html:382 views/newsletter/templates/components/save.hbs:3
1957
  #: views/segments.html:56 views/subscribers/subscribers.html:98
1958
  msgid "Save"
1959
  msgstr ""
1960
 
1961
- #: lib/Subscription/Pages.php:383
1962
  msgid "[link]Edit your profile[/link] to update your email."
1963
  msgstr ""
1964
 
1965
- #: lib/Subscription/Pages.php:389
1966
  msgid "[link]Log in to your account[/link] to update your email."
1967
  msgstr ""
1968
 
1969
- #: lib/Subscription/Pages.php:395
1970
  msgid ""
1971
  "Need to change your email address? Unsubscribe here, then simply sign up "
1972
  "again."
1973
  msgstr ""
1974
 
1975
- #: lib/Subscription/Pages.php:409
1976
  msgid "Accidentally unsubscribed?"
1977
  msgstr ""
1978
 
1979
- #: lib/Subscription/Pages.php:417
1980
  msgid ""
1981
  "Link to subscription management page is only available to mailing lists "
1982
  "subscribers."
@@ -2004,7 +2008,15 @@ msgid ""
2004
  "this [link]checklist[/link]."
2005
  msgstr ""
2006
 
2007
- #: lib/Util/Notices/PHPVersionWarnings.php:25
 
 
 
 
 
 
 
 
2008
  msgid ""
2009
  "Your website is running on PHP %s. MailPoet requires version 5.6. Please "
2010
  "consider upgrading your site's PHP version. [link]Your host can help "
@@ -2044,6 +2056,22 @@ msgstr ""
2044
  msgid "Close this window and deactivate MailPoet"
2045
  msgstr ""
2046
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2047
  #: views/form/editor.html:5
2048
  msgid "Form"
2049
  msgstr ""
@@ -2115,66 +2143,72 @@ msgstr ""
2115
  msgid "Preview"
2116
  msgstr ""
2117
 
2118
- #: views/form/editor.html:218
 
 
 
 
 
 
2119
  #: views/newsletter/templates/blocks/divider/widget.hbs:4
2120
  msgid "Divider"
2121
  msgstr ""
2122
 
2123
- #: views/form/editor.html:243
2124
  msgid "List selection"
2125
  msgstr ""
2126
 
2127
- #: views/form/editor.html:246
2128
  msgid "Select list(s):"
2129
  msgstr ""
2130
 
2131
- #: views/form/editor.html:252
2132
  msgid "Custom text or HTML"
2133
  msgstr ""
2134
 
2135
- #: views/form/editor.html:255
2136
  msgid ""
2137
  "Subscribe to our newsletter and join [mailpoet_subscribers_count] other "
2138
  "subscribers."
2139
  msgstr ""
2140
 
2141
- #: views/form/editor.html:400
2142
  msgid "Edit name"
2143
  msgstr ""
2144
 
2145
- #: views/form/editor.html:414
2146
  msgid "The form name was successfully updated!"
2147
  msgstr ""
2148
 
2149
- #: views/form/editor.html:462
2150
  msgid "Form preview"
2151
  msgstr ""
2152
 
2153
- #: views/form/editor.html:509
2154
  msgid "Saved! The changes are now active in your widget."
2155
  msgstr ""
2156
 
2157
- #: views/form/editor.html:511
2158
  msgid "Saved! Add this form to %1$sa widget%2$s."
2159
  msgstr ""
2160
 
2161
- #: views/form/editor.html:593 views/subscribers/importExport/import.html:48
2162
  msgid "Add new field"
2163
  msgstr ""
2164
 
2165
- #: views/form/editor.html:613 views/form/templates/toolbar/fields.hbs:14
2166
  msgid "Edit field"
2167
  msgstr ""
2168
 
2169
- #: views/form/editor.html:635
2170
  msgid "This field will be deleted for all your subscribers. Are you sure?"
2171
  msgstr ""
2172
 
2173
- #: views/form/editor.html:653
2174
  msgid "Removed custom field %$1s"
2175
  msgstr ""
2176
 
2177
- #: views/form/editor.html:739
2178
  msgid "Edit field settings"
2179
  msgstr ""
2180
 
@@ -2212,9 +2246,10 @@ msgstr ""
2212
  #: views/newsletter/templates/blocks/automatedLatestContentLayout/settings.hbs:293
2213
  #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:79
2214
  #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:233
2215
- #: views/premium.html:56 views/settings/advanced.html:141
2216
  #: views/settings/advanced.html:182 views/settings/advanced.html:222
2217
- #: views/settings/mta.html:582 views/settings/signup.html:34
 
2218
  #: views/subscribers/importExport/import/step2.html:63
2219
  msgid "Yes"
2220
  msgstr ""
@@ -3211,7 +3246,7 @@ msgstr ""
3211
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:154
3212
  #: views/newsletter/templates/blocks/automatedLatestContentLayout/settings.hbs:166
3213
  #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:123
3214
- #: views/premium.html:55
3215
  msgid "None"
3216
  msgstr ""
3217
 
@@ -4415,30 +4450,42 @@ msgid ""
4415
  "the extra touch."
4416
  msgstr ""
4417
 
4418
- #: views/premium.html:6
 
 
 
 
 
 
 
 
 
 
 
 
4419
  msgid "What is MailPoet Premium?"
4420
  msgstr ""
4421
 
4422
- #: views/premium.html:8
4423
  msgid "Check out the brief video below. Or, keep reading!"
4424
  msgstr ""
4425
 
4426
- #: views/premium.html:20
4427
  msgid "Insightful Statistics"
4428
  msgstr ""
4429
 
4430
- #: views/premium.html:23
4431
  msgid ""
4432
  "Which links get the most clicks? Which subscribers opened your emails? With "
4433
  "MailPoet's stats program, it's easy to find out. Need even more details? "
4434
  "Integrating with Google Analytics is as easy as 1-2-3."
4435
  msgstr ""
4436
 
4437
- #: views/premium.html:33
4438
  msgid "Hello Inbox, Goodbye Spambox!"
4439
  msgstr ""
4440
 
4441
- #: views/premium.html:36
4442
  msgid ""
4443
  "Having issues with reaching your subscribers? Always ending up in the spam "
4444
  "box? Don't panic! You're not alone - over a quarter of our plugin users "
@@ -4446,75 +4493,75 @@ msgid ""
4446
  "host. Instead, try using the new MailPoet Sending Service."
4447
  msgstr ""
4448
 
4449
- #: views/premium.html:42
4450
  msgid "Web host"
4451
  msgstr ""
4452
 
4453
- #: views/premium.html:43
4454
  msgid "Third party"
4455
  msgstr ""
4456
 
4457
- #: views/premium.html:48
4458
  msgid "Speed"
4459
  msgstr ""
4460
 
4461
- #: views/premium.html:49
4462
  msgid "50,000 / hour"
4463
  msgstr ""
4464
 
4465
- #: views/premium.html:50
4466
  msgid "300 / hour"
4467
  msgstr ""
4468
 
4469
- #: views/premium.html:51
4470
  msgid "2,000 / hour"
4471
  msgstr ""
4472
 
4473
- #: views/premium.html:54
4474
  msgid "Daily email limits"
4475
  msgstr ""
4476
 
4477
- #: views/premium.html:57 views/premium.html:69 views/premium.html:75
4478
  msgid "Depends"
4479
  msgstr ""
4480
 
4481
- #: views/premium.html:60
4482
  msgid "Personal deliverability support"
4483
  msgstr ""
4484
 
4485
- #: views/premium.html:61
4486
  msgid "Yes!"
4487
  msgstr ""
4488
 
4489
- #: views/premium.html:66
4490
  msgid "SPF and DKIM Signatures"
4491
  msgstr ""
4492
 
4493
- #: views/premium.html:67
4494
  msgid "No need!"
4495
  msgstr ""
4496
 
4497
- #: views/premium.html:68
4498
  msgid "Update your DNS"
4499
  msgstr ""
4500
 
4501
- #: views/premium.html:72
4502
  msgid "Double opt-in"
4503
  msgstr ""
4504
 
4505
- #: views/premium.html:73
4506
  msgid "Enforced"
4507
  msgstr ""
4508
 
4509
- #: views/premium.html:74
4510
  msgid "Not enforced"
4511
  msgstr ""
4512
 
4513
- #: views/premium.html:84
4514
  msgid "View full comparison table"
4515
  msgstr ""
4516
 
4517
- #: views/premium.html:91
4518
  msgid ""
4519
  "Spammers are ineligible to use the MailPoet Sending Service. We reserve the "
4520
  "right to cancel any sending plan if we detect more than 5% hard bounces. "
@@ -4522,36 +4569,36 @@ msgid ""
4522
  "MailPoet[/link]."
4523
  msgstr ""
4524
 
4525
- #: views/premium.html:100
4526
  msgid "We’re Here to Help!"
4527
  msgstr ""
4528
 
4529
- #: views/premium.html:106
4530
  msgid ""
4531
  "We pride ourselves on giving nearly round-the-clock support. Our remote "
4532
  "team spans several continents, hemispheres, and time-zones! If you’ve got a "
4533
  "problem, we will help you fix it!"
4534
  msgstr ""
4535
 
4536
- #: views/premium.html:111
4537
  msgid "Get Started for Just $10"
4538
  msgstr ""
4539
 
4540
- #: views/premium.html:114
4541
  msgid ""
4542
  "Our plans start at just $10 per month. Plus, if you pay annually, you’ll "
4543
  "get two months for free!"
4544
  msgstr ""
4545
 
4546
- #: views/premium.html:122
4547
  msgid "Purchase Now"
4548
  msgstr ""
4549
 
4550
- #: views/premium.html:126
4551
  msgid "Already a Premium customer? [link]Add your Key in the Settings page[/link]."
4552
  msgstr ""
4553
 
4554
- #: views/premium.html:130
4555
  msgid ""
4556
  "Don't need to use our sending service? Not a problem; we understand. You "
4557
  "can also [link]buy the Premium[/link] features separately. Prices start at "
@@ -4865,8 +4912,8 @@ msgstr ""
4865
  msgid "Subscribers can choose from these lists:"
4866
  msgstr ""
4867
 
4868
- #: views/settings/basics.html:250 views/settings/basics.html:328
4869
- #: views/settings/basics.html:364
4870
  msgid "Leave this field empty to display all lists"
4871
  msgstr ""
4872
 
@@ -4886,19 +4933,33 @@ msgid ""
4886
  "on to a WordPress page: [mailpoet_manage text=\"Manage your subscription\"]"
4887
  msgstr ""
4888
 
4889
- #: views/settings/basics.html:306
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4890
  msgid "Archive page shortcode"
4891
  msgstr ""
4892
 
4893
- #: views/settings/basics.html:309
4894
  msgid "Paste this shortcode on a page to display a list of past newsletters."
4895
  msgstr ""
4896
 
4897
- #: views/settings/basics.html:342
4898
  msgid "Shortcode to display total number of subscribers"
4899
  msgstr ""
4900
 
4901
- #: views/settings/basics.html:345
4902
  msgid ""
4903
  "Paste this shortcode on a post or page to display the total number of "
4904
  "confirmed subscribers."
@@ -5292,16 +5353,30 @@ msgstr ""
5292
  msgid "Invalid email addresses: "
5293
  msgstr ""
5294
 
5295
- #: views/settings.html:120
5296
  msgid "Settings saved"
5297
  msgstr ""
5298
 
5299
- #: views/settings.html:197
5300
  msgid ""
5301
  "Are you sure? All of your MailPoet data will be permanently erased "
5302
  "(newsletters, statistics, subscribers, etc.)."
5303
  msgstr ""
5304
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5305
  #: views/subscribers/importExport/export.html:7
5306
  #: views/subscribers/importExport/import.html:8
5307
  msgid "Back to Subscribers"
4
  msgstr ""
5
  "Project-Id-Version: \n"
6
  "Report-Msgid-Bugs-To: http://support.mailpoet.com/\n"
7
+ "POT-Creation-Date: 2018-10-16 10:18:43+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=utf-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
75
  msgstr ""
76
 
77
  #: lib/API/JSON/v1/Forms.php:70 lib/API/JSON/v1/Forms.php:74
78
+ #: lib/API/MP/v1/API.php:22
79
  #: lib/Subscribers/ImportExport/ImportExportFactory.php:44
80
  #: lib/Subscribers/ImportExport/PersonalDataExporters/SubscriberExporter.php:40
81
  #: views/help.html:64 views/newsletter/editor.html:963
132
 
133
  #: lib/API/JSON/v1/Segments.php:24 lib/API/JSON/v1/Segments.php:75
134
  #: lib/API/JSON/v1/Segments.php:91 lib/API/JSON/v1/Segments.php:107
135
+ #: lib/API/JSON/v1/Segments.php:121 lib/API/MP/v1/API.php:65
136
+ #: lib/API/MP/v1/API.php:116
137
  msgid "This list does not exist."
138
  msgstr ""
139
 
213
 
214
  #: lib/API/JSON/v1/Subscribers.php:37 lib/API/JSON/v1/Subscribers.php:222
215
  #: lib/API/JSON/v1/Subscribers.php:238 lib/API/JSON/v1/Subscribers.php:254
216
+ #: lib/API/MP/v1/API.php:59 lib/API/MP/v1/API.php:110 lib/API/MP/v1/API.php:252
217
  msgid "This subscriber does not exist."
218
  msgstr ""
219
 
241
  msgid "You need to wait %d seconds before subscribing again."
242
  msgstr ""
243
 
244
+ #: lib/API/MP/v1/API.php:26
245
  #: lib/Subscribers/ImportExport/ImportExportFactory.php:45
246
+ #: lib/Subscription/Pages.php:295 views/form/editor.html:232
247
+ #: views/form/editor.html:235 views/subscribers/subscribers.html:53
248
  msgid "First name"
249
  msgstr ""
250
 
251
+ #: lib/API/MP/v1/API.php:30
252
  #: lib/Subscribers/ImportExport/ImportExportFactory.php:46
253
+ #: lib/Subscription/Pages.php:304 views/form/editor.html:241
254
+ #: views/form/editor.html:244 views/subscribers/subscribers.html:54
255
  msgid "Last name"
256
  msgstr ""
257
 
258
+ #: lib/API/MP/v1/API.php:53 lib/API/MP/v1/API.php:104
259
  msgid "At least one segment ID is required."
260
  msgstr ""
261
 
262
+ #: lib/API/MP/v1/API.php:82 lib/API/MP/v1/API.php:133
263
  msgid "List with ID %s does not exist."
264
  msgid_plural "Lists with IDs %s do not exist."
265
  msgstr[0] ""
266
  msgstr[1] ""
267
 
268
+ #: lib/API/MP/v1/API.php:155
269
  msgid "Subscriber email address is required."
270
  msgstr ""
271
 
272
+ #: lib/API/MP/v1/API.php:162
273
  msgid "This subscriber already exists."
274
  msgstr ""
275
 
276
+ #: lib/API/MP/v1/API.php:221
277
  msgid "List name is required."
278
  msgstr ""
279
 
280
+ #: lib/API/MP/v1/API.php:228
281
  msgid "This list already exists."
282
  msgstr ""
283
 
305
  msgid "Manage segments"
306
  msgstr ""
307
 
308
+ #: lib/Config/Capabilities.php:67 lib/Config/Menu.php:704
309
+ #: lib/Config/PrivacyPolicy.php:11 views/premium.html:50
310
  msgid "MailPoet"
311
  msgstr ""
312
 
478
  msgid "Migration"
479
  msgstr ""
480
 
481
+ #: lib/Config/Menu.php:567
482
  msgid "In any WordPress role"
483
  msgstr ""
484
 
485
+ #: lib/Config/Menu.php:586
486
  msgid "WooCommerce"
487
  msgstr ""
488
 
489
+ #: lib/Config/Menu.php:587
490
  msgid ""
491
  "Automatically send an email when there is a new WooCommerce product, order "
492
  "and some other action takes place."
493
  msgstr ""
494
 
495
+ #: lib/Config/Menu.php:591
496
  msgid "Abandoned Shopping Cart"
497
  msgstr ""
498
 
499
+ #: lib/Config/Menu.php:592
500
  msgid ""
501
  "Send an email to logged-in visitors who have items in their shopping carts "
502
  "but left your website without checking out. Can convert up to 5% of "
503
  "abandoned carts."
504
  msgstr ""
505
 
506
+ #: lib/Config/Menu.php:595 lib/Config/Menu.php:614
507
  msgid "Must-have"
508
  msgstr ""
509
 
510
+ #: lib/Config/Menu.php:601
511
  msgid "Big Spender"
512
  msgstr ""
513
 
514
+ #: lib/Config/Menu.php:602
515
  msgid ""
516
  "Let MailPoet send an email to customers who have spent a certain amount to "
517
  "thank them, possibly with a coupon."
518
  msgstr ""
519
 
520
+ #: lib/Config/Menu.php:605
521
  msgid "Smart to have"
522
  msgstr ""
523
 
524
+ #: lib/Config/Menu.php:611
525
  msgid "First Purchase"
526
  msgstr ""
527
 
528
+ #: lib/Config/Menu.php:612
529
  msgid "Let MailPoet send an email to customers who make their first purchase."
530
  msgstr ""
531
 
532
+ #: lib/Config/Menu.php:620
533
  msgid "Purchased In This Category"
534
  msgstr ""
535
 
536
+ #: lib/Config/Menu.php:621
537
  msgid ""
538
  "Let MailPoet send an email to customers who purchase a product from a "
539
  "specific category."
540
  msgstr ""
541
 
542
+ #: lib/Config/Menu.php:626
543
  msgid "Purchased This Product"
544
  msgstr ""
545
 
546
+ #: lib/Config/Menu.php:627
547
  msgid "Let MailPoet send an email to customers who purchase a specific product."
548
  msgstr ""
549
 
574
  "might work within a MultiSite environment, we don’t support it."
575
  msgstr ""
576
 
577
+ #: lib/Config/Populator.php:198
578
  msgid "My First List"
579
  msgstr ""
580
 
581
+ #: lib/Config/Populator.php:200
582
  msgid "This list is automatically created when you install MailPoet."
583
  msgstr ""
584
 
1432
 
1433
  #: lib/Models/CustomField.php:20 lib/Models/Form.php:13
1434
  #: lib/Models/NewsletterOptionField.php:12 lib/Models/NewsletterTemplate.php:16
1435
+ #: lib/Models/Segment.php:15 lib/Models/Setting.php:23
1436
  #: views/form/templates/settings/field_form.hbs:53
1437
  #: views/subscribers/importExport/import/step2.html:134
1438
  msgid "Please specify a name."
1444
  msgstr ""
1445
 
1446
  #: lib/Models/Form.php:93 lib/Models/Newsletter.php:732
1447
+ #: lib/Models/Segment.php:133 lib/Models/Subscriber.php:276
1448
  msgid "All"
1449
  msgstr ""
1450
 
1451
  #: lib/Models/Form.php:98 lib/Models/Newsletter.php:803
1452
+ #: lib/Models/Segment.php:138 lib/Models/Subscriber.php:301 views/forms.html:71
1453
  #: views/newsletters.html:91 views/segments.html:50
1454
  #: views/subscribers/subscribers.html:38
1455
  msgid "Trash"
1464
  msgid "Deleted list"
1465
  msgstr ""
1466
 
1467
+ #: lib/Models/Newsletter.php:628 lib/Models/Subscriber.php:212
1468
  msgid "All Lists"
1469
  msgstr ""
1470
 
1518
  msgid "Rendered newsletter body is invalid!"
1519
  msgstr ""
1520
 
1521
+ #: lib/Models/Setting.php:49
1522
  msgid "Confirm your subscription to %1$s"
1523
  msgstr ""
1524
 
1525
+ #: lib/Models/Setting.php:50
1526
  msgid ""
1527
  "Hello!\n"
1528
  "\n"
1538
  "The Team"
1539
  msgstr ""
1540
 
1541
+ #: lib/Models/Subscriber.php:26
1542
  msgid "Please enter your email address"
1543
  msgstr ""
1544
 
1545
+ #: lib/Models/Subscriber.php:27
1546
  msgid "Your email address is invalid!"
1547
  msgstr ""
1548
 
1549
+ #: lib/Models/Subscriber.php:220
1550
  msgid "Subscribers without a list (%s)"
1551
  msgstr ""
1552
 
1553
+ #: lib/Models/Subscriber.php:281 lib/Subscription/Pages.php:318
1554
  #: views/segments.html:30 views/subscribers/subscribers.html:57
1555
  msgid "Subscribed"
1556
  msgstr ""
1557
 
1558
+ #: lib/Models/Subscriber.php:286 views/segments.html:31
1559
  #: views/subscribers/subscribers.html:56
1560
  msgid "Unconfirmed"
1561
  msgstr ""
1562
 
1563
+ #: lib/Models/Subscriber.php:291 lib/Subscription/Pages.php:326
1564
  #: views/segments.html:32 views/subscribers/subscribers.html:58
1565
  msgid "Unsubscribed"
1566
  msgstr ""
1567
 
1568
+ #: lib/Models/Subscriber.php:296 lib/Subscription/Pages.php:334
1569
  #: views/segments.html:33 views/subscribers/subscribers.html:59
1570
  msgid "Bounced"
1571
  msgstr ""
1690
  msgstr ""
1691
 
1692
  #: lib/Settings/Pages.php:12 lib/Settings/Pages.php:13
1693
+ #: lib/Settings/Pages.php:37 lib/Subscription/Pages.php:124
1694
  msgid "MailPoet Page"
1695
  msgstr ""
1696
 
1832
  #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:151
1833
  #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:177
1834
  #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:239
1835
+ #: views/premium.html:71 views/premium.html:72 views/settings/advanced.html:153
1836
  #: views/settings/advanced.html:193 views/settings/advanced.html:233
1837
+ #: views/settings/basics.html:332 views/settings/mta.html:539
1838
+ #: views/settings/mta.html:593 views/settings/signup.html:46
1839
  #: views/subscribers/importExport/import/step2.html:67
1840
  msgid "No"
1841
  msgstr ""
1865
  msgstr ""
1866
 
1867
  #: lib/Subscribers/ImportExport/PersonalDataExporters/SubscriberExporter.php:44
1868
+ #: lib/Subscription/Pages.php:314 views/help.html:44 views/newsletters.html:75
1869
  #: views/subscribers/subscribers.html:55 views/subscribers/subscribers.html:67
1870
  msgid "Status"
1871
  msgstr ""
1910
  msgid "Unknown"
1911
  msgstr ""
1912
 
1913
+ #: lib/Subscribers/NewSubscriberNotificationMailer.php:101
1914
+ msgid "New subscriber to %s"
1915
+ msgstr ""
1916
+
1917
  #: lib/Subscription/Comment.php:23 lib/Subscription/Registration.php:11
1918
  msgid "Yes, please add me to your mailing list."
1919
  msgstr ""
1920
 
1921
+ #: lib/Subscription/Pages.php:120
1922
  msgid "Hmmm... we don't have a record of you."
1923
  msgstr ""
1924
 
1925
+ #: lib/Subscription/Pages.php:150
1926
  msgid ""
1927
  "Your email address doesn't appear in our lists anymore. Sign up again or "
1928
  "contact us if this appears to be a mistake."
1929
  msgstr ""
1930
 
1931
+ #: lib/Subscription/Pages.php:194 lib/Subscription/Pages.php:206
1932
  msgid "You have subscribed to: %s"
1933
  msgstr ""
1934
 
1935
+ #: lib/Subscription/Pages.php:203
1936
  msgid "You are now subscribed!"
1937
  msgstr ""
1938
 
1939
+ #: lib/Subscription/Pages.php:216 lib/Subscription/Pages.php:435
1940
  msgid "Manage your subscription"
1941
  msgstr ""
1942
 
1943
+ #: lib/Subscription/Pages.php:222
1944
  msgid "You are now unsubscribed."
1945
  msgstr ""
1946
 
1947
+ #: lib/Subscription/Pages.php:228
1948
  msgid "Yup, we've added you to our email list. You'll hear from us shortly."
1949
  msgstr ""
1950
 
1951
+ #: lib/Subscription/Pages.php:245
1952
  msgid "Subscription management form is only available to mailing lists subscribers."
1953
  msgstr ""
1954
 
1955
+ #: lib/Subscription/Pages.php:357
1956
  msgid "Your lists"
1957
  msgstr ""
1958
 
1959
+ #: lib/Subscription/Pages.php:365 views/form/editor.html:35
1960
+ #: views/form/editor.html:389 views/newsletter/templates/components/save.hbs:3
1961
  #: views/segments.html:56 views/subscribers/subscribers.html:98
1962
  msgid "Save"
1963
  msgstr ""
1964
 
1965
+ #: lib/Subscription/Pages.php:395
1966
  msgid "[link]Edit your profile[/link] to update your email."
1967
  msgstr ""
1968
 
1969
+ #: lib/Subscription/Pages.php:401
1970
  msgid "[link]Log in to your account[/link] to update your email."
1971
  msgstr ""
1972
 
1973
+ #: lib/Subscription/Pages.php:407
1974
  msgid ""
1975
  "Need to change your email address? Unsubscribe here, then simply sign up "
1976
  "again."
1977
  msgstr ""
1978
 
1979
+ #: lib/Subscription/Pages.php:421
1980
  msgid "Accidentally unsubscribed?"
1981
  msgstr ""
1982
 
1983
+ #: lib/Subscription/Pages.php:429
1984
  msgid ""
1985
  "Link to subscription management page is only available to mailing lists "
1986
  "subscribers."
2008
  "this [link]checklist[/link]."
2009
  msgstr ""
2010
 
2011
+ #: lib/Util/Notices/DiscountsAnnouncement.php:29
2012
+ msgid ""
2013
+ "<h3>Save on MailPoet Premium for a limited time. Discounts up to 40%</h3>\n"
2014
+ " <p>Our annual sale is a good opportunity to get more detailed "
2015
+ "stats & great email deliverability. Don’t miss out!</p>\n"
2016
+ " [link]Visit the MailPoet Premium page[/link]."
2017
+ msgstr ""
2018
+
2019
+ #: lib/Util/Notices/PHPVersionWarnings.php:24
2020
  msgid ""
2021
  "Your website is running on PHP %s. MailPoet requires version 5.6. Please "
2022
  "consider upgrading your site's PHP version. [link]Your host can help "
2056
  msgid "Close this window and deactivate MailPoet"
2057
  msgstr ""
2058
 
2059
+ #: views/emails/newSubscriberNotification.html:1
2060
+ msgid "Howdy,"
2061
+ msgstr ""
2062
+
2063
+ #: views/emails/newSubscriberNotification.html:3
2064
+ msgid "The subscriber %$1s has just subscribed to your list %$2s!"
2065
+ msgstr ""
2066
+
2067
+ #: views/emails/newSubscriberNotification.html:7
2068
+ msgid "Cheers,"
2069
+ msgstr ""
2070
+
2071
+ #: views/emails/newSubscriberNotification.html:9
2072
+ msgid "The MailPoet Plugin"
2073
+ msgstr ""
2074
+
2075
  #: views/form/editor.html:5
2076
  msgid "Form"
2077
  msgstr ""
2143
  msgid "Preview"
2144
  msgstr ""
2145
 
2146
+ #: views/form/editor.html:199
2147
+ msgid ""
2148
+ "<strong>Tip:</strong> read our [link]GDPR guide[/link] to make sure your "
2149
+ "form follows the privacy directive of the European Union."
2150
+ msgstr ""
2151
+
2152
+ #: views/form/editor.html:225
2153
  #: views/newsletter/templates/blocks/divider/widget.hbs:4
2154
  msgid "Divider"
2155
  msgstr ""
2156
 
2157
+ #: views/form/editor.html:250
2158
  msgid "List selection"
2159
  msgstr ""
2160
 
2161
+ #: views/form/editor.html:253
2162
  msgid "Select list(s):"
2163
  msgstr ""
2164
 
2165
+ #: views/form/editor.html:259
2166
  msgid "Custom text or HTML"
2167
  msgstr ""
2168
 
2169
+ #: views/form/editor.html:262
2170
  msgid ""
2171
  "Subscribe to our newsletter and join [mailpoet_subscribers_count] other "
2172
  "subscribers."
2173
  msgstr ""
2174
 
2175
+ #: views/form/editor.html:407
2176
  msgid "Edit name"
2177
  msgstr ""
2178
 
2179
+ #: views/form/editor.html:421
2180
  msgid "The form name was successfully updated!"
2181
  msgstr ""
2182
 
2183
+ #: views/form/editor.html:469
2184
  msgid "Form preview"
2185
  msgstr ""
2186
 
2187
+ #: views/form/editor.html:516
2188
  msgid "Saved! The changes are now active in your widget."
2189
  msgstr ""
2190
 
2191
+ #: views/form/editor.html:518
2192
  msgid "Saved! Add this form to %1$sa widget%2$s."
2193
  msgstr ""
2194
 
2195
+ #: views/form/editor.html:600 views/subscribers/importExport/import.html:48
2196
  msgid "Add new field"
2197
  msgstr ""
2198
 
2199
+ #: views/form/editor.html:620 views/form/templates/toolbar/fields.hbs:14
2200
  msgid "Edit field"
2201
  msgstr ""
2202
 
2203
+ #: views/form/editor.html:642
2204
  msgid "This field will be deleted for all your subscribers. Are you sure?"
2205
  msgstr ""
2206
 
2207
+ #: views/form/editor.html:660
2208
  msgid "Removed custom field %$1s"
2209
  msgstr ""
2210
 
2211
+ #: views/form/editor.html:746
2212
  msgid "Edit field settings"
2213
  msgstr ""
2214
 
2246
  #: views/newsletter/templates/blocks/automatedLatestContentLayout/settings.hbs:293
2247
  #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:79
2248
  #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:233
2249
+ #: views/premium.html:65 views/settings/advanced.html:141
2250
  #: views/settings/advanced.html:182 views/settings/advanced.html:222
2251
+ #: views/settings/basics.html:321 views/settings/mta.html:582
2252
+ #: views/settings/signup.html:34
2253
  #: views/subscribers/importExport/import/step2.html:63
2254
  msgid "Yes"
2255
  msgstr ""
3246
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:154
3247
  #: views/newsletter/templates/blocks/automatedLatestContentLayout/settings.hbs:166
3248
  #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:123
3249
+ #: views/premium.html:64
3250
  msgid "None"
3251
  msgstr ""
3252
 
4450
  "the extra touch."
4451
  msgstr ""
4452
 
4453
+ #: views/premium.html:8
4454
+ msgid "Discounts up to 40% for a limited time"
4455
+ msgstr ""
4456
+
4457
+ #: views/premium.html:9
4458
+ msgid "Don’t miss out on our only sale of the year which ends on November 30."
4459
+ msgstr ""
4460
+
4461
+ #: views/premium.html:10
4462
+ msgid "There’s never been a better time to change gears."
4463
+ msgstr ""
4464
+
4465
+ #: views/premium.html:15
4466
  msgid "What is MailPoet Premium?"
4467
  msgstr ""
4468
 
4469
+ #: views/premium.html:17
4470
  msgid "Check out the brief video below. Or, keep reading!"
4471
  msgstr ""
4472
 
4473
+ #: views/premium.html:29
4474
  msgid "Insightful Statistics"
4475
  msgstr ""
4476
 
4477
+ #: views/premium.html:32
4478
  msgid ""
4479
  "Which links get the most clicks? Which subscribers opened your emails? With "
4480
  "MailPoet's stats program, it's easy to find out. Need even more details? "
4481
  "Integrating with Google Analytics is as easy as 1-2-3."
4482
  msgstr ""
4483
 
4484
+ #: views/premium.html:42
4485
  msgid "Hello Inbox, Goodbye Spambox!"
4486
  msgstr ""
4487
 
4488
+ #: views/premium.html:45
4489
  msgid ""
4490
  "Having issues with reaching your subscribers? Always ending up in the spam "
4491
  "box? Don't panic! You're not alone - over a quarter of our plugin users "
4493
  "host. Instead, try using the new MailPoet Sending Service."
4494
  msgstr ""
4495
 
4496
+ #: views/premium.html:51
4497
  msgid "Web host"
4498
  msgstr ""
4499
 
4500
+ #: views/premium.html:52
4501
  msgid "Third party"
4502
  msgstr ""
4503
 
4504
+ #: views/premium.html:57
4505
  msgid "Speed"
4506
  msgstr ""
4507
 
4508
+ #: views/premium.html:58
4509
  msgid "50,000 / hour"
4510
  msgstr ""
4511
 
4512
+ #: views/premium.html:59
4513
  msgid "300 / hour"
4514
  msgstr ""
4515
 
4516
+ #: views/premium.html:60
4517
  msgid "2,000 / hour"
4518
  msgstr ""
4519
 
4520
+ #: views/premium.html:63
4521
  msgid "Daily email limits"
4522
  msgstr ""
4523
 
4524
+ #: views/premium.html:66 views/premium.html:78 views/premium.html:84
4525
  msgid "Depends"
4526
  msgstr ""
4527
 
4528
+ #: views/premium.html:69
4529
  msgid "Personal deliverability support"
4530
  msgstr ""
4531
 
4532
+ #: views/premium.html:70
4533
  msgid "Yes!"
4534
  msgstr ""
4535
 
4536
+ #: views/premium.html:75
4537
  msgid "SPF and DKIM Signatures"
4538
  msgstr ""
4539
 
4540
+ #: views/premium.html:76
4541
  msgid "No need!"
4542
  msgstr ""
4543
 
4544
+ #: views/premium.html:77
4545
  msgid "Update your DNS"
4546
  msgstr ""
4547
 
4548
+ #: views/premium.html:81
4549
  msgid "Double opt-in"
4550
  msgstr ""
4551
 
4552
+ #: views/premium.html:82
4553
  msgid "Enforced"
4554
  msgstr ""
4555
 
4556
+ #: views/premium.html:83
4557
  msgid "Not enforced"
4558
  msgstr ""
4559
 
4560
+ #: views/premium.html:93
4561
  msgid "View full comparison table"
4562
  msgstr ""
4563
 
4564
+ #: views/premium.html:100
4565
  msgid ""
4566
  "Spammers are ineligible to use the MailPoet Sending Service. We reserve the "
4567
  "right to cancel any sending plan if we detect more than 5% hard bounces. "
4569
  "MailPoet[/link]."
4570
  msgstr ""
4571
 
4572
+ #: views/premium.html:109
4573
  msgid "We’re Here to Help!"
4574
  msgstr ""
4575
 
4576
+ #: views/premium.html:115
4577
  msgid ""
4578
  "We pride ourselves on giving nearly round-the-clock support. Our remote "
4579
  "team spans several continents, hemispheres, and time-zones! If you’ve got a "
4580
  "problem, we will help you fix it!"
4581
  msgstr ""
4582
 
4583
+ #: views/premium.html:120
4584
  msgid "Get Started for Just $10"
4585
  msgstr ""
4586
 
4587
+ #: views/premium.html:123
4588
  msgid ""
4589
  "Our plans start at just $10 per month. Plus, if you pay annually, you’ll "
4590
  "get two months for free!"
4591
  msgstr ""
4592
 
4593
+ #: views/premium.html:131
4594
  msgid "Purchase Now"
4595
  msgstr ""
4596
 
4597
+ #: views/premium.html:135
4598
  msgid "Already a Premium customer? [link]Add your Key in the Settings page[/link]."
4599
  msgstr ""
4600
 
4601
+ #: views/premium.html:139
4602
  msgid ""
4603
  "Don't need to use our sending service? Not a problem; we understand. You "
4604
  "can also [link]buy the Premium[/link] features separately. Prices start at "
4912
  msgid "Subscribers can choose from these lists:"
4913
  msgstr ""
4914
 
4915
+ #: views/settings/basics.html:250 views/settings/basics.html:370
4916
+ #: views/settings/basics.html:406
4917
  msgid "Leave this field empty to display all lists"
4918
  msgstr ""
4919
 
4933
  "on to a WordPress page: [mailpoet_manage text=\"Manage your subscription\"]"
4934
  msgstr ""
4935
 
4936
+ #: views/settings/basics.html:307
4937
+ msgid "New subscriber notifications"
4938
+ msgstr ""
4939
+
4940
+ #: views/settings/basics.html:310
4941
+ msgid ""
4942
+ "Enter the email address that should receive notifications when someone "
4943
+ "subscribes."
4944
+ msgstr ""
4945
+
4946
+ #: views/settings/basics.html:342
4947
+ msgid "Please fill the email address."
4948
+ msgstr ""
4949
+
4950
+ #: views/settings/basics.html:348
4951
  msgid "Archive page shortcode"
4952
  msgstr ""
4953
 
4954
+ #: views/settings/basics.html:351
4955
  msgid "Paste this shortcode on a page to display a list of past newsletters."
4956
  msgstr ""
4957
 
4958
+ #: views/settings/basics.html:384
4959
  msgid "Shortcode to display total number of subscribers"
4960
  msgstr ""
4961
 
4962
+ #: views/settings/basics.html:387
4963
  msgid ""
4964
  "Paste this shortcode on a post or page to display the total number of "
4965
  "confirmed subscribers."
5353
  msgid "Invalid email addresses: "
5354
  msgstr ""
5355
 
5356
+ #: views/settings.html:130
5357
  msgid "Settings saved"
5358
  msgstr ""
5359
 
5360
+ #: views/settings.html:212
5361
  msgid ""
5362
  "Are you sure? All of your MailPoet data will be permanently erased "
5363
  "(newsletters, statistics, subscribers, etc.)."
5364
  msgstr ""
5365
 
5366
+ #: views/settings.html:213
5367
+ msgid "Get notified when someone subscribes"
5368
+ msgstr ""
5369
+
5370
+ #: views/settings.html:214
5371
+ msgid ""
5372
+ "It’s been a popular feature request from our users, we hope you get lots of "
5373
+ "emails about all your new subscribers!"
5374
+ msgstr ""
5375
+
5376
+ #: views/settings.html:215
5377
+ msgid "(You can turn this feature off if it’s too many emails.)"
5378
+ msgstr ""
5379
+
5380
  #: views/subscribers/importExport/export.html:7
5381
  #: views/subscribers/importExport/import.html:8
5382
  msgid "Back to Subscribers"
lib/API/MP/v1/API.php CHANGED
@@ -7,6 +7,8 @@ use MailPoet\Models\Subscriber;
7
  use MailPoet\Models\SubscriberSegment;
8
  use MailPoet\Newsletter\Scheduler\Scheduler;
9
  use MailPoet\Subscribers\RequiredCustomFieldValidator;
 
 
10
  use MailPoet\Subscribers\Source;
11
  use MailPoet\Tasks\Sending;
12
 
@@ -145,6 +147,7 @@ class API {
145
  function addSubscriber(array $subscriber, $segments = array(), $options = array()) {
146
  $send_confirmation_email = (isset($options['send_confirmation_email']) && $options['send_confirmation_email'] === false) ? false : true;
147
  $schedule_welcome_email = (isset($options['schedule_welcome_email']) && $options['schedule_welcome_email'] === false) ? false : true;
 
148
 
149
  // throw exception when subscriber email is missing
150
  if(empty($subscriber['email'])) {
@@ -203,6 +206,10 @@ class API {
203
  if($schedule_welcome_email && $new_subscriber->status === Subscriber::STATUS_SUBSCRIBED) {
204
  $this->_scheduleWelcomeNotification($new_subscriber, $segments);
205
  }
 
 
 
 
206
  }
207
  return $new_subscriber->withCustomFields()->withSubscriptions()->asArray();
208
  }
@@ -248,7 +255,8 @@ class API {
248
  }
249
 
250
  protected function _sendConfirmationEmail(Subscriber $subscriber) {
251
- return $subscriber->sendConfirmationEmail();
 
252
  }
253
 
254
  protected function _scheduleWelcomeNotification(Subscriber $subscriber, array $segments) {
@@ -264,4 +272,9 @@ class API {
264
  }
265
  return $result;
266
  }
 
 
 
 
 
267
  }
7
  use MailPoet\Models\SubscriberSegment;
8
  use MailPoet\Newsletter\Scheduler\Scheduler;
9
  use MailPoet\Subscribers\RequiredCustomFieldValidator;
10
+ use MailPoet\Subscribers\ConfirmationEmailMailer;
11
+ use MailPoet\Subscribers\NewSubscriberNotificationMailer;
12
  use MailPoet\Subscribers\Source;
13
  use MailPoet\Tasks\Sending;
14
 
147
  function addSubscriber(array $subscriber, $segments = array(), $options = array()) {
148
  $send_confirmation_email = (isset($options['send_confirmation_email']) && $options['send_confirmation_email'] === false) ? false : true;
149
  $schedule_welcome_email = (isset($options['schedule_welcome_email']) && $options['schedule_welcome_email'] === false) ? false : true;
150
+ $skip_subscriber_notification = (isset($options['skip_subscriber_notification']) && $options['skip_subscriber_notification'] === true) ? true : false;
151
 
152
  // throw exception when subscriber email is missing
153
  if(empty($subscriber['email'])) {
206
  if($schedule_welcome_email && $new_subscriber->status === Subscriber::STATUS_SUBSCRIBED) {
207
  $this->_scheduleWelcomeNotification($new_subscriber, $segments);
208
  }
209
+
210
+ if(!$skip_subscriber_notification) {
211
+ $this->sendSubscriberNotification($new_subscriber, $segments);
212
+ }
213
  }
214
  return $new_subscriber->withCustomFields()->withSubscriptions()->asArray();
215
  }
255
  }
256
 
257
  protected function _sendConfirmationEmail(Subscriber $subscriber) {
258
+ $sender = new ConfirmationEmailMailer();
259
+ return $sender->sendConfirmationEmail($subscriber);
260
  }
261
 
262
  protected function _scheduleWelcomeNotification(Subscriber $subscriber, array $segments) {
272
  }
273
  return $result;
274
  }
275
+
276
+ private function sendSubscriberNotification(Subscriber $subscriber, array $segment_ids) {
277
+ $sender = new NewSubscriberNotificationMailer();
278
+ $sender->send($subscriber, Segment::whereIn('id', $segment_ids)->findMany());
279
+ }
280
  }
lib/Analytics/Reporter.php CHANGED
@@ -9,6 +9,7 @@ use MailPoet\Models\Segment;
9
  use MailPoet\Models\Setting;
10
  use MailPoet\Models\Subscriber;
11
  use MailPoet\Settings\Pages;
 
12
 
13
  class Reporter {
14
 
@@ -47,6 +48,7 @@ class Reporter {
47
  'Newsletter task scheduler (cron)' => $isCronTriggerMethodWP ? 'visitors' : 'script',
48
  'Open and click tracking' => (boolean)Setting::getValue('tracking.enabled', false),
49
  'Premium key valid' => $checker->isPremiumKeyValid(),
 
50
  'Number of standard newsletters sent in last 3 months' => $newsletters['sent_newsletters'],
51
  'Number of active post notifications' => $newsletters['notifications_count'],
52
  'Number of active welcome emails' => $newsletters['welcome_newsletters_count'],
9
  use MailPoet\Models\Setting;
10
  use MailPoet\Models\Subscriber;
11
  use MailPoet\Settings\Pages;
12
+ use MailPoet\Subscribers\NewSubscriberNotificationMailer;
13
 
14
  class Reporter {
15
 
48
  'Newsletter task scheduler (cron)' => $isCronTriggerMethodWP ? 'visitors' : 'script',
49
  'Open and click tracking' => (boolean)Setting::getValue('tracking.enabled', false),
50
  'Premium key valid' => $checker->isPremiumKeyValid(),
51
+ 'New subscriber notifications' => NewSubscriberNotificationMailer::isDisabled(Setting::getValue(NewSubscriberNotificationMailer::SETTINGS_KEY)),
52
  'Number of standard newsletters sent in last 3 months' => $newsletters['sent_newsletters'],
53
  'Number of active post notifications' => $newsletters['notifications_count'],
54
  'Number of active welcome emails' => $newsletters['welcome_newsletters_count'],
lib/Config/Capabilities.php CHANGED
@@ -75,13 +75,17 @@ class Capabilities {
75
  function registerMembersCapabilities() {
76
  $permissions = AccessControl::getPermissionLabels();
77
  foreach($permissions as $name => $label) {
78
- members_register_cap(
79
- $name,
80
- array(
81
- 'label' => $label,
82
- 'group' => self::MEMBERS_CAP_GROUP_NAME
83
- )
84
- );
85
  }
86
  }
 
 
 
 
 
 
 
 
 
 
87
  }
75
  function registerMembersCapabilities() {
76
  $permissions = AccessControl::getPermissionLabels();
77
  foreach($permissions as $name => $label) {
78
+ $this->registerMembersCapability($name, $label);
 
 
 
 
 
 
79
  }
80
  }
81
+
82
+ function registerMembersCapability($name, $label) {
83
+ members_register_cap(
84
+ $name,
85
+ array(
86
+ 'label' => $label,
87
+ 'group' => self::MEMBERS_CAP_GROUP_NAME
88
+ )
89
+ );
90
+ }
91
  }
lib/Config/Menu.php CHANGED
@@ -391,7 +391,8 @@ class Menu {
391
  function premium() {
392
  $data = array(
393
  'subscriber_count' => Subscriber::getTotalSubscribers(),
394
- 'sub_menu' => self::MAIN_PAGE_SLUG
 
395
  );
396
 
397
  $this->displayPage('premium.html', $data);
391
  function premium() {
392
  $data = array(
393
  'subscriber_count' => Subscriber::getTotalSubscribers(),
394
+ 'sub_menu' => self::MAIN_PAGE_SLUG,
395
+ 'display_discount' => time() <= strtotime('2018-11-30 23:59:59')
396
  );
397
 
398
  $this->displayPage('premium.html', $data);
lib/Config/Migrator.php CHANGED
@@ -131,7 +131,7 @@ class Migrator {
131
  'task_id int(11) unsigned NOT NULL,',
132
  'subscriber_id int(11) unsigned NOT NULL,',
133
  'processed int(1) NOT NULL,',
134
- 'failed int(1) NOT NULL,',
135
  'error text NULL,',
136
  'created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,',
137
  'PRIMARY KEY (task_id, subscriber_id),',
131
  'task_id int(11) unsigned NOT NULL,',
132
  'subscriber_id int(11) unsigned NOT NULL,',
133
  'processed int(1) NOT NULL,',
134
+ 'failed int(1) NOT NULL DEFAULT 0,',
135
  'error text NULL,',
136
  'created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,',
137
  'PRIMARY KEY (task_id, subscriber_id),',
lib/Config/Populator.php CHANGED
@@ -11,6 +11,7 @@ use MailPoet\Models\Subscriber;
11
  use MailPoet\Segments\WP;
12
  use MailPoet\Models\Setting;
13
  use MailPoet\Settings\Pages;
 
14
  use MailPoet\Subscribers\Source;
15
  use MailPoet\Util\Helpers;
16
 
@@ -170,13 +171,22 @@ class Populator {
170
  ));
171
  }
172
 
 
 
 
 
 
 
 
 
 
173
  // reset mailer log
174
  MailerLog::resetMailerLog();
175
  }
176
 
177
  private function createDefaultSegments() {
178
  // WP Users segment
179
- $wp_segment = Segment::getWPSegment();
180
 
181
  // Synchronize WP Users
182
  WP::synchronizeUsers();
11
  use MailPoet\Segments\WP;
12
  use MailPoet\Models\Setting;
13
  use MailPoet\Settings\Pages;
14
+ use MailPoet\Subscribers\NewSubscriberNotificationMailer;
15
  use MailPoet\Subscribers\Source;
16
  use MailPoet\Util\Helpers;
17
 
171
  ));
172
  }
173
 
174
+ $subscriber_email_notification = Setting::getValue(NewSubscriberNotificationMailer::SETTINGS_KEY);
175
+ if(empty($subscriber_email_notification)) {
176
+ $sender = Setting::getValue('sender', []);
177
+ Setting::setValue('subscriber_email_notification', [
178
+ 'enabled' => true,
179
+ 'address' => isset($sender['address'])? $sender['address'] : null,
180
+ ]);
181
+ }
182
+
183
  // reset mailer log
184
  MailerLog::resetMailerLog();
185
  }
186
 
187
  private function createDefaultSegments() {
188
  // WP Users segment
189
+ Segment::getWPSegment();
190
 
191
  // Synchronize WP Users
192
  WP::synchronizeUsers();
lib/Form/Widget.php CHANGED
@@ -209,7 +209,7 @@ EOL;
209
  <?php
210
  foreach($forms as $form) {
211
  $is_selected = ($selected_form === (int)$form['id']) ? 'selected="selected"' : '';
212
- ?>
213
  <option value="<?php echo (int)$form['id']; ?>" <?php echo $is_selected; ?>><?php echo esc_html($form['name']); ?></option>
214
  <?php } ?>
215
  </select>
209
  <?php
210
  foreach($forms as $form) {
211
  $is_selected = ($selected_form === (int)$form['id']) ? 'selected="selected"' : '';
212
+ ?>
213
  <option value="<?php echo (int)$form['id']; ?>" <?php echo $is_selected; ?>><?php echo esc_html($form['name']); ?></option>
214
  <?php } ?>
215
  </select>
lib/Models/Setting.php CHANGED
@@ -2,6 +2,7 @@
2
  namespace MailPoet\Models;
3
 
4
  use MailPoet\Cron\CronTrigger;
 
5
 
6
  if(!defined('ABSPATH')) exit;
7
 
@@ -106,6 +107,7 @@ class Setting extends Model {
106
  }
107
 
108
  public static function setValue($key, $value) {
 
109
  $keys = explode('.', $key);
110
 
111
  if(count($keys) === 1) {
2
  namespace MailPoet\Models;
3
 
4
  use MailPoet\Cron\CronTrigger;
5
+ use MailPoet\Util\Helpers;
6
 
7
  if(!defined('ABSPATH')) exit;
8
 
107
  }
108
 
109
  public static function setValue($key, $value) {
110
+ $value = Helpers::recursiveTrim($value);
111
  $keys = explode('.', $key);
112
 
113
  if(count($keys) === 1) {
lib/Models/Subscriber.php CHANGED
@@ -2,6 +2,8 @@
2
  namespace MailPoet\Models;
3
  use MailPoet\Mailer\Mailer;
4
  use MailPoet\Newsletter\Scheduler\Scheduler;
 
 
5
  use MailPoet\Subscribers\Source;
6
  use MailPoet\Util\Helpers;
7
  use MailPoet\Subscription;
@@ -82,71 +84,6 @@ class Subscriber extends Model {
82
  return self::where('wp_user_id', $wp_user->ID)->findOne();
83
  }
84
 
85
- function sendConfirmationEmail() {
86
- $signup_confirmation = Setting::getValue('signup_confirmation');
87
-
88
- if((bool)$signup_confirmation['enabled'] === false) {
89
- return false;
90
- }
91
-
92
- $segments = $this->segments()->findMany();
93
- $segment_names = array_map(function($segment) {
94
- return $segment->name;
95
- }, $segments);
96
-
97
- $body = nl2br($signup_confirmation['body']);
98
-
99
- // replace list of segments shortcode
100
- $body = str_replace(
101
- '[lists_to_confirm]',
102
- '<strong>'.join(', ', $segment_names).'</strong>',
103
- $body
104
- );
105
-
106
- // replace activation link
107
- $body = Helpers::replaceLinkTags(
108
- $body,
109
- Subscription\Url::getConfirmationUrl($this),
110
- array('target' => '_blank'),
111
- 'activation_link'
112
- );
113
-
114
- // build email data
115
- $email = array(
116
- 'subject' => $signup_confirmation['subject'],
117
- 'body' => array(
118
- 'html' => $body,
119
- 'text' => $body
120
- )
121
- );
122
-
123
- // convert subscriber to array
124
- $subscriber = $this->asArray();
125
-
126
- // set from
127
- $from = (
128
- !empty($signup_confirmation['from'])
129
- && !empty($signup_confirmation['from']['address'])
130
- ) ? $signup_confirmation['from']
131
- : false;
132
-
133
- // set reply to
134
- $reply_to = (
135
- !empty($signup_confirmation['reply_to'])
136
- && !empty($signup_confirmation['reply_to']['address'])
137
- ) ? $signup_confirmation['reply_to']
138
- : false;
139
-
140
- // send email
141
- try {
142
- $mailer = new Mailer(false, $from, $reply_to);
143
- return $mailer->send($email, $subscriber);
144
- } catch(\Exception $e) {
145
- $this->setError($e->getMessage());
146
- return false;
147
- }
148
- }
149
-
150
  static function generateToken($email = null) {
151
  if($email !== null) {
152
  $auth_key = '';
@@ -215,11 +152,13 @@ class Subscriber extends Model {
215
  // link subscriber to segments
216
  SubscriberSegment::subscribeToSegments($subscriber, $segment_ids);
217
 
218
- // signup confirmation
219
- $subscriber->sendConfirmationEmail();
220
 
221
- // welcome email
222
  if($subscriber->status === self::STATUS_SUBSCRIBED) {
 
 
 
223
  Scheduler::scheduleSubscriberWelcomeNotification(
224
  $subscriber->id,
225
  $segment_ids
2
  namespace MailPoet\Models;
3
  use MailPoet\Mailer\Mailer;
4
  use MailPoet\Newsletter\Scheduler\Scheduler;
5
+ use MailPoet\Subscribers\ConfirmationEmailMailer;
6
+ use MailPoet\Subscribers\NewSubscriberNotificationMailer;
7
  use MailPoet\Subscribers\Source;
8
  use MailPoet\Util\Helpers;
9
  use MailPoet\Subscription;
84
  return self::where('wp_user_id', $wp_user->ID)->findOne();
85
  }
86
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
87
  static function generateToken($email = null) {
88
  if($email !== null) {
89
  $auth_key = '';
152
  // link subscriber to segments
153
  SubscriberSegment::subscribeToSegments($subscriber, $segment_ids);
154
 
155
+ $sender = new ConfirmationEmailMailer();
156
+ $sender->sendConfirmationEmail($subscriber);
157
 
 
158
  if($subscriber->status === self::STATUS_SUBSCRIBED) {
159
+ $sender = new NewSubscriberNotificationMailer();
160
+ $sender->send($subscriber, Segment::whereIn('id', $segment_ids)->findMany());
161
+
162
  Scheduler::scheduleSubscriberWelcomeNotification(
163
  $subscriber->id,
164
  $segment_ids
lib/Subscribers/ConfirmationEmailMailer.php ADDED
@@ -0,0 +1,91 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MailPoet\Subscribers;
4
+
5
+ use MailPoet\Mailer\Mailer;
6
+ use MailPoet\Models\Setting;
7
+ use MailPoet\Models\Subscriber;
8
+ use MailPoet\Subscription\Url;
9
+ use MailPoet\Util\Helpers;
10
+
11
+ class ConfirmationEmailMailer {
12
+
13
+ /** @var Mailer */
14
+ private $mailer;
15
+
16
+ /**
17
+ * @param Mailer|null $mailer
18
+ */
19
+ function __construct($mailer = null) {
20
+ if($mailer) {
21
+ $this->mailer = $mailer;
22
+ }
23
+ }
24
+
25
+ function sendConfirmationEmail(Subscriber $subscriber) {
26
+ $signup_confirmation = Setting::getValue('signup_confirmation');
27
+
28
+ if((bool)$signup_confirmation['enabled'] === false) {
29
+ return false;
30
+ }
31
+
32
+ $segments = $subscriber->segments()->findMany();
33
+ $segment_names = array_map(function($segment) {
34
+ return $segment->name;
35
+ }, $segments);
36
+
37
+ $body = nl2br($signup_confirmation['body']);
38
+
39
+ // replace list of segments shortcode
40
+ $body = str_replace(
41
+ '[lists_to_confirm]',
42
+ '<strong>'.join(', ', $segment_names).'</strong>',
43
+ $body
44
+ );
45
+
46
+ // replace activation link
47
+ $body = Helpers::replaceLinkTags(
48
+ $body,
49
+ Url::getConfirmationUrl($subscriber),
50
+ array('target' => '_blank'),
51
+ 'activation_link'
52
+ );
53
+
54
+ // build email data
55
+ $email = array(
56
+ 'subject' => $signup_confirmation['subject'],
57
+ 'body' => array(
58
+ 'html' => $body,
59
+ 'text' => $body
60
+ )
61
+ );
62
+
63
+ // set from
64
+ $from = (
65
+ !empty($signup_confirmation['from'])
66
+ && !empty($signup_confirmation['from']['address'])
67
+ ) ? $signup_confirmation['from']
68
+ : false;
69
+
70
+ // set reply to
71
+ $reply_to = (
72
+ !empty($signup_confirmation['reply_to'])
73
+ && !empty($signup_confirmation['reply_to']['address'])
74
+ ) ? $signup_confirmation['reply_to']
75
+ : false;
76
+
77
+ // send email
78
+ try {
79
+ if(!$this->mailer) {
80
+ $this->mailer = new Mailer(false, $from, $reply_to);
81
+ }
82
+ $this->mailer->getSenderNameAndAddress($from);
83
+ $this->mailer->getReplyToNameAndAddress($reply_to);
84
+ return $this->mailer->send($email, $subscriber);
85
+ } catch(\Exception $e) {
86
+ $subscriber->setError($e->getMessage());
87
+ return false;
88
+ }
89
+ }
90
+
91
+ }
lib/Subscribers/NewSubscriberNotificationMailer.php ADDED
@@ -0,0 +1,121 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MailPoet\Subscribers;
4
+
5
+ use MailPoet\Config\Renderer;
6
+ use MailPoet\Models\Segment;
7
+ use MailPoet\Models\Setting;
8
+ use MailPoet\Models\Subscriber;
9
+
10
+ class NewSubscriberNotificationMailer {
11
+
12
+ const SENDER_EMAIL_PREFIX = 'wordpress@';
13
+ const SETTINGS_KEY = 'subscriber_email_notification';
14
+
15
+ /** @var Renderer */
16
+ private $renderer;
17
+
18
+ /** @var \MailPoet\Mailer\Mailer */
19
+ private $mailer;
20
+
21
+ /**
22
+ * @param \MailPoet\Mailer\Mailer|null $mailer
23
+ * @param Renderer|null $renderer
24
+ */
25
+ function __construct($mailer = null, $renderer = null) {
26
+ if($renderer) {
27
+ $this->renderer = $renderer;
28
+ } else {
29
+ $caching = ! WP_DEBUG;
30
+ $debugging = WP_DEBUG;
31
+ $this->renderer = new Renderer($caching, $debugging);
32
+ }
33
+ if($mailer) {
34
+ $this->mailer = $mailer;
35
+ } else {
36
+ $this->mailer = new \MailPoet\Mailer\Mailer(false, $this->constructSenderEmail());
37
+ }
38
+ }
39
+
40
+ /**
41
+ * @param Subscriber $subscriber
42
+ * @param Segment[] $segments
43
+ *
44
+ * @throws \Exception
45
+ */
46
+ function send(Subscriber $subscriber, array $segments) {
47
+ $settings = Setting::getValue(NewSubscriberNotificationMailer::SETTINGS_KEY);
48
+ if($this->isDisabled($settings)) {
49
+ return;
50
+ }
51
+ try {
52
+ $this->mailer->getSenderNameAndAddress($this->constructSenderEmail());
53
+ $this->mailer->send($this->constructNewsletter($subscriber, $segments), $settings['address']);
54
+ } catch(\Exception $e) {
55
+ if(WP_DEBUG) {
56
+ throw $e;
57
+ }
58
+ }
59
+ }
60
+
61
+ public static function isDisabled($settings) {
62
+ if(!is_array($settings)) {
63
+ return true;
64
+ }
65
+ if(!isset($settings['enabled'])) {
66
+ return true;
67
+ }
68
+ if(!isset($settings['address'])) {
69
+ return true;
70
+ }
71
+ if(empty(trim($settings['address']))) {
72
+ return true;
73
+ }
74
+ return !(bool)$settings['enabled'];
75
+ }
76
+
77
+ private function constructSenderEmail() {
78
+ $url_parts = parse_url(home_url());
79
+ return [
80
+ 'address' => self::SENDER_EMAIL_PREFIX . $url_parts['host'],
81
+ 'name' => self::SENDER_EMAIL_PREFIX . $url_parts['host'],
82
+ ];
83
+ }
84
+
85
+ /**
86
+ * @param Subscriber $subscriber
87
+ * @param Segment[] $segments
88
+ *
89
+ * @return array
90
+ * @throws \Exception
91
+ */
92
+ private function constructNewsletter(Subscriber $subscriber, array $segments) {
93
+ $segment_names = $this->getSegmentNames($segments);
94
+ $context = [
95
+ 'subscriber_email' => $subscriber->get('email'),
96
+ 'segments_names' => $segment_names,
97
+ 'link_settings' => get_site_url(null, '/wp-admin/admin.php?page=mailpoet-settings'),
98
+ 'link_premium' => get_site_url(null, '/wp-admin/admin.php?page=mailpoet-premium'),
99
+ ];
100
+ return [
101
+ 'subject' => sprintf(__('New subscriber to %s', 'mailpoet'), $segment_names),
102
+ 'body' => [
103
+ 'html' => $this->renderer->render('emails/newSubscriberNotification.html', $context),
104
+ 'text' => $this->renderer->render('emails/newSubscriberNotification.txt', $context),
105
+ ],
106
+ ];
107
+ }
108
+
109
+ /**
110
+ * @param Segment[] $segments
111
+ * @return string
112
+ */
113
+ private function getSegmentNames($segments) {
114
+ $names = [];
115
+ foreach($segments as $segment) {
116
+ $names[] = $segment->get('name');
117
+ }
118
+ return implode(', ', $names);
119
+ }
120
+
121
+ }
lib/Subscription/Pages.php CHANGED
@@ -8,6 +8,7 @@ use MailPoet\Models\CustomField;
8
  use MailPoet\Models\Setting;
9
  use MailPoet\Models\Segment;
10
  use MailPoet\Newsletter\Scheduler\Scheduler;
 
11
  use MailPoet\Util\Helpers;
12
  use MailPoet\Util\Url as UrlHelper;
13
  use MailPoet\Form\Renderer as FormRenderer;
@@ -22,13 +23,20 @@ class Pages {
22
  private $action;
23
  private $data;
24
  private $subscriber;
 
 
25
 
26
- function __construct($action = false, $data = array(), $init_shortcodes = false, $init_page_filters = false) {
27
  $this->action = $action;
28
  $this->data = $data;
29
  $this->subscriber = $this->getSubscriber();
30
  if($init_page_filters) $this->initPageFilters();
31
  if($init_shortcodes) $this->initShortcodes();
 
 
 
 
 
32
  }
33
 
34
  private function isPreview() {
@@ -76,14 +84,18 @@ class Pages {
76
 
77
  if($this->subscriber->getErrors() === false) {
78
  // send welcome notification
79
- $subsciber_segments = $this->subscriber->segments()->findArray();
80
  if($subsciber_segments) {
81
  Scheduler::scheduleSubscriberWelcomeNotification(
82
  $this->subscriber->id,
83
- array_column($subsciber_segments, 'id')
 
 
84
  );
85
  }
86
 
 
 
87
  // update subscriber from stored data after confirmation
88
  if(!empty($subscriber_data)) {
89
  Subscriber::createOrUpdate($subscriber_data);
@@ -427,4 +439,4 @@ class Pages {
427
  $this->subscriber
428
  ).'">'.$text.'</a>';
429
  }
430
- }
8
  use MailPoet\Models\Setting;
9
  use MailPoet\Models\Segment;
10
  use MailPoet\Newsletter\Scheduler\Scheduler;
11
+ use MailPoet\Subscribers\NewSubscriberNotificationMailer;
12
  use MailPoet\Util\Helpers;
13
  use MailPoet\Util\Url as UrlHelper;
14
  use MailPoet\Form\Renderer as FormRenderer;
23
  private $action;
24
  private $data;
25
  private $subscriber;
26
+ /** @var NewSubscriberNotificationMailer */
27
+ private $new_subscriber_notification_sender;
28
 
29
+ function __construct($action = false, $data = array(), $init_shortcodes = false, $init_page_filters = false, $new_subscriber_notification_sender = null) {
30
  $this->action = $action;
31
  $this->data = $data;
32
  $this->subscriber = $this->getSubscriber();
33
  if($init_page_filters) $this->initPageFilters();
34
  if($init_shortcodes) $this->initShortcodes();
35
+ if($new_subscriber_notification_sender) {
36
+ $this->new_subscriber_notification_sender = $new_subscriber_notification_sender;
37
+ } else {
38
+ $this->new_subscriber_notification_sender = new NewSubscriberNotificationMailer();
39
+ }
40
  }
41
 
42
  private function isPreview() {
84
 
85
  if($this->subscriber->getErrors() === false) {
86
  // send welcome notification
87
+ $subsciber_segments = $this->subscriber->segments()->findMany();
88
  if($subsciber_segments) {
89
  Scheduler::scheduleSubscriberWelcomeNotification(
90
  $this->subscriber->id,
91
+ array_map(function ($segment) {
92
+ return $segment->get('id');
93
+ }, $subsciber_segments)
94
  );
95
  }
96
 
97
+ $this->new_subscriber_notification_sender->send($this->subscriber, $subsciber_segments);
98
+
99
  // update subscriber from stored data after confirmation
100
  if(!empty($subscriber_data)) {
101
  Subscriber::createOrUpdate($subscriber_data);
439
  $this->subscriber
440
  ).'">'.$text.'</a>';
441
  }
442
+ }
lib/Util/ConflictResolver.php CHANGED
@@ -15,7 +15,9 @@ class ConflictResolver {
15
  // WP default
16
  '^/wp-admin',
17
  '^/wp-includes',
 
18
  'googleapis.com/ajax/libs',
 
19
  // third-party
20
  'query-monitor',
21
  'wpt-tx-updater-network'
@@ -90,4 +92,4 @@ class ConflictResolver {
90
  add_action('admin_print_footer_scripts', $dequeue_scripts, PHP_INT_MAX);
91
  add_action('admin_footer', $dequeue_scripts, PHP_INT_MAX);
92
  }
93
- }
15
  // WP default
16
  '^/wp-admin',
17
  '^/wp-includes',
18
+ // CDN
19
  'googleapis.com/ajax/libs',
20
+ 'wp.com',
21
  // third-party
22
  'query-monitor',
23
  'wpt-tx-updater-network'
92
  add_action('admin_print_footer_scripts', $dequeue_scripts, PHP_INT_MAX);
93
  add_action('admin_footer', $dequeue_scripts, PHP_INT_MAX);
94
  }
95
+ }
lib/Util/Helpers.php CHANGED
@@ -87,4 +87,12 @@ class Helpers {
87
  : null;
88
  }
89
 
 
 
 
 
 
 
 
 
90
  }
87
  : null;
88
  }
89
 
90
+ static function recursiveTrim($value) {
91
+ if(is_array($value))
92
+ return array_map([__CLASS__, 'recursiveTrim'], $value);
93
+ if(is_string($value))
94
+ return trim($value);
95
+ return $value;
96
+ }
97
+
98
  }
lib/Util/Notices/DiscountsAnnouncement.php ADDED
@@ -0,0 +1,44 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace MailPoet\Util\Notices;
3
+
4
+ use MailPoet\Models\Setting;
5
+ use MailPoet\Util\Helpers;
6
+ use MailPoet\WP\Notice as WPNotice;
7
+
8
+ class DiscountsAnnouncement {
9
+
10
+ const OPTION_NAME = 'mailpoet_display_discounts_announcement_q4_2018';
11
+
12
+ function enable() {
13
+ Setting::setValue(self::OPTION_NAME, true);
14
+ }
15
+
16
+ function disable() {
17
+ Setting::setValue(self::OPTION_NAME, false);
18
+ }
19
+
20
+ function init($should_display) {
21
+ $should_display = $should_display && (time() <= strtotime('2018-11-30 23:59:59'));
22
+ if($should_display && Setting::getValue(self::OPTION_NAME, true)) {
23
+ return $this->display();
24
+ }
25
+ }
26
+
27
+ private function display() {
28
+ $message = Helpers::replaceLinkTags(
29
+ __('<h3>Save on MailPoet Premium for a limited time. Discounts up to 40%</h3>
30
+ <p>Our annual sale is a good opportunity to get more detailed stats & great email deliverability. Don’t miss out!</p>
31
+ [link]Visit the MailPoet Premium page[/link].', 'mailpoet'),
32
+ 'admin.php?page=mailpoet-premium',
33
+ array('target' => '_blank', 'class' => 'button button-primary')
34
+ );
35
+ $message .= '<script>jQuery(function($) {$(document).on("click", ".mailpoet-dismissible-notice .notice-dismiss",function dismiss() {const type = $(this).closest(".mailpoet-dismissible-notice").data("notice");$.ajax(window.ajaxurl,{type: "POST",data: {action: "dismissed_notice_handler",type,}});});});</script>';
36
+
37
+ $extra_classes = 'mailpoet-dismissible-notice is-dismissible';
38
+ $data_notice_name = self::OPTION_NAME;
39
+
40
+ WPNotice::displaySuccess($message, $extra_classes, $data_notice_name);
41
+ return $message;
42
+ }
43
+
44
+ }
lib/Util/Notices/PHPVersionWarnings.php CHANGED
@@ -3,7 +3,6 @@
3
  namespace MailPoet\Util\Notices;
4
 
5
  use MailPoet\Util\Helpers;
6
- use MailPoet\WP\Notice as WPNotice;
7
 
8
  class PHPVersionWarnings {
9
 
@@ -27,7 +26,7 @@ class PHPVersionWarnings {
27
  $error = Helpers::replaceLinkTags($error_string, 'https://beta.docs.mailpoet.com/article/251-upgrading-the-websites-php-version', array('target' => '_blank'));
28
  $extra_classes = 'mailpoet-dismissible-notice is-dismissible';
29
 
30
- return WPNotice::displayError($error, $extra_classes, self::OPTION_NAME);
31
  }
32
 
33
  function disable() {
3
  namespace MailPoet\Util\Notices;
4
 
5
  use MailPoet\Util\Helpers;
 
6
 
7
  class PHPVersionWarnings {
8
 
26
  $error = Helpers::replaceLinkTags($error_string, 'https://beta.docs.mailpoet.com/article/251-upgrading-the-websites-php-version', array('target' => '_blank'));
27
  $extra_classes = 'mailpoet-dismissible-notice is-dismissible';
28
 
29
+ return \MailPoet\WP\Notice::displayError($error, $extra_classes, self::OPTION_NAME);
30
  }
31
 
32
  function disable() {
lib/Util/Notices/PermanentNotices.php CHANGED
@@ -12,9 +12,12 @@ class PermanentNotices {
12
  /** @var AfterMigrationNotice */
13
  private $after_migration_notice;
14
 
 
 
15
  public function __construct() {
16
  $this->php_version_warnings = new PHPVersionWarnings();
17
  $this->after_migration_notice = new AfterMigrationNotice();
 
18
  }
19
 
20
  public function init() {
@@ -29,6 +32,7 @@ class PermanentNotices {
29
  Menu::isOnMailPoetAdminPage()
30
  && $_GET['page'] !== 'mailpoet-welcome-wizard'
31
  );
 
32
  }
33
 
34
  function ajaxDismissNoticeHandler() {
@@ -40,6 +44,9 @@ class PermanentNotices {
40
  case (AfterMigrationNotice::OPTION_NAME):
41
  $this->after_migration_notice->disable();
42
  break;
 
 
 
43
  }
44
  }
45
 
12
  /** @var AfterMigrationNotice */
13
  private $after_migration_notice;
14
 
15
+ private $discounts_announcement;
16
+
17
  public function __construct() {
18
  $this->php_version_warnings = new PHPVersionWarnings();
19
  $this->after_migration_notice = new AfterMigrationNotice();
20
+ $this->discounts_announcement = new DiscountsAnnouncement();
21
  }
22
 
23
  public function init() {
32
  Menu::isOnMailPoetAdminPage()
33
  && $_GET['page'] !== 'mailpoet-welcome-wizard'
34
  );
35
+ $this->discounts_announcement->init(empty($_GET['page']) && is_admin());
36
  }
37
 
38
  function ajaxDismissNoticeHandler() {
44
  case (AfterMigrationNotice::OPTION_NAME):
45
  $this->after_migration_notice->disable();
46
  break;
47
+ case (DiscountsAnnouncement::OPTION_NAME):
48
+ $this->discounts_announcement->disable();
49
+ break;
50
  }
51
  }
52
 
mailpoet.php CHANGED
@@ -4,7 +4,7 @@ if(!defined('ABSPATH')) exit;
4
 
5
  /*
6
  * Plugin Name: MailPoet 3 (New)
7
- * Version: 3.11.3
8
  * Plugin URI: http://www.mailpoet.com
9
  * Description: Create and send newsletters, post notifications and welcome emails from your WordPress.
10
  * Author: MailPoet
@@ -18,7 +18,7 @@ if(!defined('ABSPATH')) exit;
18
  */
19
 
20
  $mailpoet_plugin = array(
21
- 'version' => '3.11.3',
22
  'filename' => __FILE__,
23
  'path' => dirname(__FILE__),
24
  'autoloader' => dirname(__FILE__) . '/vendor/autoload.php',
4
 
5
  /*
6
  * Plugin Name: MailPoet 3 (New)
7
+ * Version: 3.11.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
18
  */
19
 
20
  $mailpoet_plugin = array(
21
+ 'version' => '3.11.4',
22
  'filename' => __FILE__,
23
  'path' => dirname(__FILE__),
24
  'autoloader' => dirname(__FILE__) . '/vendor/autoload.php',
readme.txt CHANGED
@@ -3,7 +3,7 @@ Contributors: mailpoet, wysija, kgjerstad
3
  Tags: newsletter, newsletter subscribers, email, welcome email, post notification, WooCommerce emails, newsletter builder, mailing list
4
  Requires at least: 4.7
5
  Tested up to: 4.9
6
- Stable tag: 3.11.3
7
  License: GPLv3
8
  License URI: https://www.gnu.org/licenses/gpl-3.0.html
9
 
@@ -161,6 +161,9 @@ Stop by our [support site](https://www.mailpoet.com/support).
161
 
162
  == Changelog ==
163
 
 
 
 
164
  = 3.11.3 - 2018-10-09 =
165
  * Fixed: Linux cron to work again.
166
 
3
  Tags: newsletter, newsletter subscribers, email, welcome email, post notification, WooCommerce emails, newsletter builder, mailing list
4
  Requires at least: 4.7
5
  Tested up to: 4.9
6
+ Stable tag: 3.11.4
7
  License: GPLv3
8
  License URI: https://www.gnu.org/licenses/gpl-3.0.html
9
 
161
 
162
  == Changelog ==
163
 
164
+ = 3.11.4 - 2018-10-16 =
165
+ * Added: email notifications to administrators when new subscribers subscribe
166
+
167
  = 3.11.3 - 2018-10-09 =
168
  * Fixed: Linux cron to work again.
169
 
vendor/autoload.php CHANGED
@@ -4,4 +4,4 @@
4
 
5
  require_once __DIR__ . '/composer/autoload_real.php';
6
 
7
- return ComposerAutoloaderInitf4c002f116b3d5948416331af9d158ad::getLoader();
4
 
5
  require_once __DIR__ . '/composer/autoload_real.php';
6
 
7
+ return ComposerAutoloaderInit2159ad40a248aa7256850bbda617bbb4::getLoader();
vendor/bin/security-checker CHANGED
@@ -26,7 +26,8 @@ if ((!$loader = includeIfExists(__DIR__.'/vendor/autoload.php')) && (!$loader =
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();
26
  use Symfony\Component\Console\Application;
27
  use SensioLabs\Security\Command\SecurityCheckerCommand;
28
  use SensioLabs\Security\SecurityChecker;
29
+ use SensioLabs\Security\Crawler;
30
 
31
  $console = new Application('SensioLabs Security Checker', SecurityChecker::VERSION);
32
+ $console->add(new SecurityCheckerCommand(new SecurityChecker(new Crawler())));
33
  $console->run();
vendor/cerdic/css-tidy/class.csstidy.php CHANGED
@@ -61,14 +61,15 @@ if (!function_exists('ctype_xdigit')){
61
  * Defines constants
62
  * @todo //TODO: make them class constants of csstidy
63
  */
64
- define('AT_START', 1);
65
- define('AT_END', 2);
66
- define('SEL_START', 3);
67
- define('SEL_END', 4);
68
- define('PROPERTY', 5);
69
- define('VALUE', 6);
70
- define('COMMENT', 7);
71
- define('DEFAULT_AT', 41);
 
72
 
73
  /**
74
  * Contains a class for printing CSS code
@@ -94,7 +95,7 @@ require('class.csstidy_optimise.php');
94
  * An online version should be available here: http://cdburnerxp.se/cssparse/css_optimiser.php
95
  * @package csstidy
96
  * @author Florian Schmitz (floele at gmail dot com) 2005-2006
97
- * @version 1.5.7
98
  */
99
  class csstidy {
100
 
@@ -147,7 +148,7 @@ class csstidy {
147
  * @var string
148
  * @access private
149
  */
150
- public $version = '1.5.7';
151
  /**
152
  * Stores the settings
153
  * @var array
@@ -318,6 +319,10 @@ class csstidy {
318
  /* is dangeroues to be used: CSS is broken sometimes */
319
  $this->settings['merge_selectors'] = 0;
320
  /* preserve or not browser hacks */
 
 
 
 
321
  $this->settings['discard_invalid_selectors'] = false;
322
  $this->settings['discard_invalid_properties'] = false;
323
  $this->settings['css_level'] = 'CSS3.0';
@@ -411,7 +416,7 @@ class csstidy {
411
  */
412
  public function _add_token($type, $data, $do = false) {
413
  if ($this->get_cfg('preserve_css') || $do) {
414
- $this->tokens[] = array($type, ($type == COMMENT) ? $data : trim($data));
415
  }
416
  }
417
 
@@ -947,7 +952,13 @@ class csstidy {
947
  if ($string{$i} === '*' && $string{$i + 1} === '/') {
948
  $this->status = array_pop($this->from);
949
  $i++;
950
- $this->_add_token(COMMENT, $cur_comment);
 
 
 
 
 
 
951
  $cur_comment = '';
952
  } else {
953
  $cur_comment .= $string{$i};
@@ -1036,6 +1047,25 @@ class csstidy {
1036
  return!(@($string{$pos - 1} !== '\\') || csstidy::escaped($string, $pos - 1));
1037
  }
1038
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1039
  /**
1040
  * Adds a property with value to the existing CSS code
1041
  * @param string $media
61
  * Defines constants
62
  * @todo //TODO: make them class constants of csstidy
63
  */
64
+ define('AT_START', 1);
65
+ define('AT_END', 2);
66
+ define('SEL_START', 3);
67
+ define('SEL_END', 4);
68
+ define('PROPERTY', 5);
69
+ define('VALUE', 6);
70
+ define('COMMENT', 7);
71
+ define('IMPORTANT_COMMENT',8);
72
+ define('DEFAULT_AT', 41);
73
 
74
  /**
75
  * Contains a class for printing CSS code
95
  * An online version should be available here: http://cdburnerxp.se/cssparse/css_optimiser.php
96
  * @package csstidy
97
  * @author Florian Schmitz (floele at gmail dot com) 2005-2006
98
+ * @version 1.6.4
99
  */
100
  class csstidy {
101
 
148
  * @var string
149
  * @access private
150
  */
151
+ public $version = '1.6.4';
152
  /**
153
  * Stores the settings
154
  * @var array
319
  /* is dangeroues to be used: CSS is broken sometimes */
320
  $this->settings['merge_selectors'] = 0;
321
  /* preserve or not browser hacks */
322
+
323
+ /* Useful to produce a rtl css from a ltr one (or the opposite) */
324
+ $this->settings['reverse_left_and_right'] = 0;
325
+
326
  $this->settings['discard_invalid_selectors'] = false;
327
  $this->settings['discard_invalid_properties'] = false;
328
  $this->settings['css_level'] = 'CSS3.0';
416
  */
417
  public function _add_token($type, $data, $do = false) {
418
  if ($this->get_cfg('preserve_css') || $do) {
419
+ $this->tokens[] = array($type, ($type == COMMENT or $type == IMPORTANT_COMMENT) ? $data : trim($data));
420
  }
421
  }
422
 
952
  if ($string{$i} === '*' && $string{$i + 1} === '/') {
953
  $this->status = array_pop($this->from);
954
  $i++;
955
+ if (strlen($cur_comment) > 1 and strncmp($cur_comment, '!', 1) === 0) {
956
+ $this->_add_token(IMPORTANT_COMMENT, $cur_comment);
957
+ $this->css_add_important_comment($cur_comment);
958
+ }
959
+ else {
960
+ $this->_add_token(COMMENT, $cur_comment);
961
+ }
962
  $cur_comment = '';
963
  } else {
964
  $cur_comment .= $string{$i};
1047
  return!(@($string{$pos - 1} !== '\\') || csstidy::escaped($string, $pos - 1));
1048
  }
1049
 
1050
+
1051
+ /**
1052
+ * Add an important comment to the css code
1053
+ * (one we want to keep)
1054
+ * @param $comment
1055
+ */
1056
+ public function css_add_important_comment($comment) {
1057
+ if ($this->get_cfg('preserve_css') || trim($comment) == '') {
1058
+ return;
1059
+ }
1060
+ if (!isset($this->css['!'])) {
1061
+ $this->css['!'] = '';
1062
+ }
1063
+ else {
1064
+ $this->css['!'] .= "\n";
1065
+ }
1066
+ $this->css['!'] .= $comment;
1067
+ }
1068
+
1069
  /**
1070
  * Adds a property with value to the existing CSS code
1071
  * @param string $media
vendor/cerdic/css-tidy/class.csstidy_optimise.php CHANGED
@@ -70,40 +70,60 @@ class csstidy_optimise {
70
  * @version 1.0
71
  */
72
  public function postparse() {
 
 
 
 
 
 
 
 
 
 
 
 
 
73
  if ($this->parser->get_cfg('preserve_css')) {
74
  return;
75
  }
76
 
77
  if ((int)$this->parser->get_cfg('merge_selectors') === 2) {
78
  foreach ($this->css as $medium => $value) {
79
- $this->merge_selectors($this->css[$medium]);
 
 
80
  }
81
  }
82
 
83
  if ($this->parser->get_cfg('discard_invalid_selectors')) {
84
  foreach ($this->css as $medium => $value) {
85
- $this->discard_invalid_selectors($this->css[$medium]);
 
 
86
  }
87
  }
88
 
89
  if ($this->parser->get_cfg('optimise_shorthands') > 0) {
90
  foreach ($this->css as $medium => $value) {
91
- foreach ($value as $selector => $value1) {
92
- $this->css[$medium][$selector] = $this->merge_4value_shorthands($this->css[$medium][$selector]);
 
 
93
 
94
- if ($this->parser->get_cfg('optimise_shorthands') < 2) {
95
- continue;
96
- }
97
 
98
- $this->css[$medium][$selector] = $this->merge_font($this->css[$medium][$selector]);
99
 
100
- if ($this->parser->get_cfg('optimise_shorthands') < 3) {
101
- continue;
102
- }
103
 
104
- $this->css[$medium][$selector] = $this->merge_bg($this->css[$medium][$selector]);
105
- if (empty($this->css[$medium][$selector])) {
106
- unset($this->css[$medium][$selector]);
 
107
  }
108
  }
109
  }
@@ -525,12 +545,15 @@ class csstidy_optimise {
525
  * Dissolves properties like padding:10px 10px 10px to padding-top:10px;padding-bottom:10px;...
526
  * @param string $property
527
  * @param string $value
 
528
  * @return array
529
  * @version 1.0
530
  * @see merge_4value_shorthands()
531
  */
532
- public function dissolve_4value_shorthands($property, $value) {
533
- $shorthands = & $this->parser->data['csstidy']['shorthands'];
 
 
534
  if (!is_array($shorthands[$property])) {
535
  $return[$property] = $value;
536
  return $return;
@@ -567,25 +590,66 @@ class csstidy_optimise {
567
  return $return;
568
  }
569
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
570
  /**
571
  * Explodes a string as explode() does, however, not if $sep is escaped or within a string.
572
  * @param string $sep seperator
573
  * @param string $string
 
574
  * @return array
575
  * @version 1.0
576
  */
577
- public function explode_ws($sep, $string) {
578
  $status = 'st';
579
  $to = '';
580
 
581
- $output = array();
 
 
582
  $num = 0;
583
  for ($i = 0, $len = strlen($string); $i < $len; $i++) {
584
  switch ($status) {
585
  case 'st':
586
  if ($string{$i} == $sep && !$this->parser->escaped($string, $i)) {
587
  ++$num;
588
- } elseif ($string{$i} === '"' || $string{$i} === '\'' || $string{$i} === '(' && !$this->parser->escaped($string, $i)) {
589
  $status = 'str';
590
  $to = ($string{$i} === '(') ? ')' : $string{$i};
591
  (isset($output[$num])) ? $output[$num] .= $string{$i} : $output[$num] = $string{$i};
@@ -603,27 +667,26 @@ class csstidy_optimise {
603
  }
604
  }
605
 
606
- if (isset($output[0])) {
607
- return $output;
608
- } else {
609
- return array($output);
610
- }
611
  }
612
 
613
  /**
614
  * Merges Shorthand properties again, the opposite of dissolve_4value_shorthands()
615
  * @param array $array
 
616
  * @return array
617
  * @version 1.2
618
  * @see dissolve_4value_shorthands()
619
  */
620
- public function merge_4value_shorthands($array) {
621
  $return = $array;
622
- $shorthands = & $this->parser->data['csstidy']['shorthands'];
 
 
623
 
624
  foreach ($shorthands as $key => $value) {
625
- if (isset($array[$value[0]]) && isset($array[$value[1]])
626
- && isset($array[$value[2]]) && isset($array[$value[3]]) && $value !== 0) {
627
  $return[$key] = '';
628
 
629
  $important = '';
@@ -643,6 +706,45 @@ class csstidy_optimise {
643
  return $return;
644
  }
645
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
646
  /**
647
  * Dissolve background property
648
  * @param string $str_value
@@ -960,4 +1062,237 @@ class csstidy_optimise {
960
  return $input_css;
961
  }
962
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
963
  }
70
  * @version 1.0
71
  */
72
  public function postparse() {
73
+
74
+ if ($this->parser->get_cfg('reverse_left_and_right') > 0) {
75
+
76
+ foreach ($this->css as $medium => $selectors) {
77
+ if (is_array($selectors)) {
78
+ foreach ($selectors as $selector => $properties) {
79
+ $this->css[$medium][$selector] = $this->reverse_left_and_right($this->css[$medium][$selector]);
80
+ }
81
+ }
82
+ }
83
+
84
+ }
85
+
86
  if ($this->parser->get_cfg('preserve_css')) {
87
  return;
88
  }
89
 
90
  if ((int)$this->parser->get_cfg('merge_selectors') === 2) {
91
  foreach ($this->css as $medium => $value) {
92
+ if (is_array($value)) {
93
+ $this->merge_selectors($this->css[$medium]);
94
+ }
95
  }
96
  }
97
 
98
  if ($this->parser->get_cfg('discard_invalid_selectors')) {
99
  foreach ($this->css as $medium => $value) {
100
+ if (is_array($value)) {
101
+ $this->discard_invalid_selectors($this->css[$medium]);
102
+ }
103
  }
104
  }
105
 
106
  if ($this->parser->get_cfg('optimise_shorthands') > 0) {
107
  foreach ($this->css as $medium => $value) {
108
+ if (is_array($value)) {
109
+ foreach ($value as $selector => $value1) {
110
+ $this->css[$medium][$selector] = $this->merge_4value_shorthands($this->css[$medium][$selector]);
111
+ $this->css[$medium][$selector] = $this->merge_4value_radius_shorthands($this->css[$medium][$selector]);
112
 
113
+ if ($this->parser->get_cfg('optimise_shorthands') < 2) {
114
+ continue;
115
+ }
116
 
117
+ $this->css[$medium][$selector] = $this->merge_font($this->css[$medium][$selector]);
118
 
119
+ if ($this->parser->get_cfg('optimise_shorthands') < 3) {
120
+ continue;
121
+ }
122
 
123
+ $this->css[$medium][$selector] = $this->merge_bg($this->css[$medium][$selector]);
124
+ if (empty($this->css[$medium][$selector])) {
125
+ unset($this->css[$medium][$selector]);
126
+ }
127
  }
128
  }
129
  }
545
  * Dissolves properties like padding:10px 10px 10px to padding-top:10px;padding-bottom:10px;...
546
  * @param string $property
547
  * @param string $value
548
+ * @param array|null $shorthands
549
  * @return array
550
  * @version 1.0
551
  * @see merge_4value_shorthands()
552
  */
553
+ public function dissolve_4value_shorthands($property, $value, $shorthands = null) {
554
+ if (is_null($shorthands)) {
555
+ $shorthands = & $this->parser->data['csstidy']['shorthands'];
556
+ }
557
  if (!is_array($shorthands[$property])) {
558
  $return[$property] = $value;
559
  return $return;
590
  return $return;
591
  }
592
 
593
+ /**
594
+ * Dissolves radius properties like
595
+ * border-radius:10px 10px 10px / 1px 2px
596
+ * to border-top-left:10px 1px;border-top-right:10px 2x;...
597
+ * @param string $property
598
+ * @param string $value
599
+ * @return array
600
+ * @version 1.0
601
+ * @use dissolve_4value_shorthands()
602
+ * @see merge_4value_radius_shorthands()
603
+ */
604
+ public function dissolve_4value_radius_shorthands($property, $value) {
605
+ $shorthands = & $this->parser->data['csstidy']['radius_shorthands'];
606
+ if (!is_array($shorthands[$property])) {
607
+ $return[$property] = $value;
608
+ return $return;
609
+ }
610
+
611
+ if (strpos($value, '/') !== false) {
612
+ $values = $this->explode_ws('/', $value);
613
+ if (count($values) == 2) {
614
+ $r[0] = $this->dissolve_4value_shorthands($property, trim($values[0]), $shorthands);
615
+ $r[1] = $this->dissolve_4value_shorthands($property, trim($values[1]), $shorthands);
616
+ $return = array();
617
+ foreach ($r[0] as $p=>$v) {
618
+ $return[$p] = $v;
619
+ if ($r[1][$p] !== $v) {
620
+ $return[$p] .= ' ' . $r[1][$p];
621
+ }
622
+ }
623
+ return $return;
624
+ }
625
+ }
626
+
627
+ $return = $this->dissolve_4value_shorthands($property, $value, $shorthands);
628
+ return $return;
629
+ }
630
+
631
  /**
632
  * Explodes a string as explode() does, however, not if $sep is escaped or within a string.
633
  * @param string $sep seperator
634
  * @param string $string
635
+ * @param bool $explode_in_parenthesis
636
  * @return array
637
  * @version 1.0
638
  */
639
+ public function explode_ws($sep, $string, $explode_in_parenthesis = false) {
640
  $status = 'st';
641
  $to = '';
642
 
643
+ $output = array(
644
+ 0 => '',
645
+ );
646
  $num = 0;
647
  for ($i = 0, $len = strlen($string); $i < $len; $i++) {
648
  switch ($status) {
649
  case 'st':
650
  if ($string{$i} == $sep && !$this->parser->escaped($string, $i)) {
651
  ++$num;
652
+ } elseif ($string{$i} === '"' || $string{$i} === '\'' || (!$explode_in_parenthesis && $string{$i} === '(') && !$this->parser->escaped($string, $i)) {
653
  $status = 'str';
654
  $to = ($string{$i} === '(') ? ')' : $string{$i};
655
  (isset($output[$num])) ? $output[$num] .= $string{$i} : $output[$num] = $string{$i};
667
  }
668
  }
669
 
670
+ return $output;
 
 
 
 
671
  }
672
 
673
  /**
674
  * Merges Shorthand properties again, the opposite of dissolve_4value_shorthands()
675
  * @param array $array
676
+ * @param array|null $shorthands
677
  * @return array
678
  * @version 1.2
679
  * @see dissolve_4value_shorthands()
680
  */
681
+ public function merge_4value_shorthands($array, $shorthands = null) {
682
  $return = $array;
683
+ if (is_null($shorthands)) {
684
+ $shorthands = & $this->parser->data['csstidy']['shorthands'];
685
+ }
686
 
687
  foreach ($shorthands as $key => $value) {
688
+ if ($value !== 0 && isset($array[$value[0]]) && isset($array[$value[1]])
689
+ && isset($array[$value[2]]) && isset($array[$value[3]])) {
690
  $return[$key] = '';
691
 
692
  $important = '';
706
  return $return;
707
  }
708
 
709
+ /**
710
+ * Merges Shorthand properties again, the opposite of dissolve_4value_shorthands()
711
+ * @param array $array
712
+ * @return array
713
+ * @version 1.2
714
+ * @use merge_4value_shorthands()
715
+ * @see dissolve_4value_radius_shorthands()
716
+ */
717
+ public function merge_4value_radius_shorthands($array) {
718
+ $return = $array;
719
+ $shorthands = & $this->parser->data['csstidy']['radius_shorthands'];
720
+
721
+ foreach ($shorthands as $key => $value) {
722
+ if (isset($array[$value[0]]) && isset($array[$value[1]])
723
+ && isset($array[$value[2]]) && isset($array[$value[3]]) && $value !== 0) {
724
+ $return[$key] = '';
725
+ $a = array();
726
+ for ($i = 0; $i < 4; $i++) {
727
+ $v = $this->explode_ws(' ', trim($array[$value[$i]]));
728
+ $a[0][$value[$i]] = reset($v);
729
+ $a[1][$value[$i]] = end($v);
730
+ }
731
+ $r = array();
732
+ $r[0] = $this->merge_4value_shorthands($a[0], $shorthands);
733
+ $r[1] = $this->merge_4value_shorthands($a[1], $shorthands);
734
+
735
+ if (isset($r[0][$key]) and isset($r[1][$key])) {
736
+ $return[$key] = $r[0][$key];
737
+ if ($r[1][$key] !== $r[0][$key]) {
738
+ $return[$key] .= ' / ' . $r[1][$key];
739
+ }
740
+ for ($i = 0; $i < 4; $i++) {
741
+ unset($return[$value[$i]]);
742
+ }
743
+ }
744
+ }
745
+ }
746
+ return $return;
747
+ }
748
  /**
749
  * Dissolve background property
750
  * @param string $str_value
1062
  return $input_css;
1063
  }
1064
 
1065
+ /**
1066
+ * Reverse left vs right in a list of properties/values
1067
+ * @param array $array
1068
+ * @return array
1069
+ */
1070
+ public function reverse_left_and_right($array) {
1071
+ $return = array();
1072
+
1073
+ // change left <-> right in properties name and values
1074
+ foreach ($array as $propertie => $value) {
1075
+
1076
+ if (method_exists($this, $m = 'reverse_left_and_right_' . str_replace('-','_',trim($propertie)))) {
1077
+ $value = $this->$m($value);
1078
+ }
1079
+
1080
+ // simple replacement for properties
1081
+ $propertie = str_ireplace(array('left', 'right' ,"\x1"), array("\x1", 'left', 'right') , $propertie);
1082
+ // be careful for values, not modifying protected or quoted valued
1083
+ foreach (array('left' => "\x1", 'right' => 'left', "\x1" => 'right') as $v => $r) {
1084
+ if (strpos($value, $v) !== false) {
1085
+ // attraper les left et right separes du reste (pas au milieu d'un mot)
1086
+ if (in_array($v, array('left', 'right') )) {
1087
+ $value = preg_replace(",\\b$v\\b,", "\x0" , $value);
1088
+ }
1089
+ else {
1090
+ $value = str_replace($v, "\x0" , $value);
1091
+ }
1092
+ $value = $this->explode_ws("\x0", $value . ' ', true);
1093
+ $value = rtrim(implode($r, $value));
1094
+ $value = str_replace("\x0" , $v, $value);
1095
+ }
1096
+ }
1097
+ $return[$propertie] = $value;
1098
+ }
1099
+
1100
+ return $return;
1101
+ }
1102
+
1103
+ /**
1104
+ * Reversing 4 values shorthands properties
1105
+ * @param string $value
1106
+ * @return string
1107
+ */
1108
+ public function reverse_left_and_right_4value_shorthands($property, $value) {
1109
+ $shorthands = & $this->parser->data['csstidy']['shorthands'];
1110
+ if (isset($shorthands[$property])) {
1111
+ $property_right = $shorthands[$property][1];
1112
+ $property_left = $shorthands[$property][3];
1113
+ $v = $this->dissolve_4value_shorthands($property, $value);
1114
+ if ($v[$property_left] !== $v[$property_right]) {
1115
+ $r = $v[$property_right];
1116
+ $v[$property_right] = $v[$property_left];
1117
+ $v[$property_left] = $r;
1118
+ $v = $this->merge_4value_shorthands($v);
1119
+ if (isset($v[$property])) {
1120
+ return $v[$property];
1121
+ }
1122
+ }
1123
+ }
1124
+ return $value;
1125
+ }
1126
+
1127
+ /**
1128
+ * Reversing 4 values radius shorthands properties
1129
+ * @param string $value
1130
+ * @return string
1131
+ */
1132
+ public function reverse_left_and_right_4value_radius_shorthands($property, $value) {
1133
+ $shorthands = & $this->parser->data['csstidy']['radius_shorthands'];
1134
+ if (isset($shorthands[$property])) {
1135
+ $v = $this->dissolve_4value_radius_shorthands($property, $value);
1136
+ if ($v[$shorthands[$property][0]] !== $v[$shorthands[$property][1]]
1137
+ or $v[$shorthands[$property][2]] !== $v[$shorthands[$property][3]]) {
1138
+ $r = array(
1139
+ $shorthands[$property][0] => $v[$shorthands[$property][1]],
1140
+ $shorthands[$property][1] => $v[$shorthands[$property][0]],
1141
+ $shorthands[$property][2] => $v[$shorthands[$property][3]],
1142
+ $shorthands[$property][3] => $v[$shorthands[$property][2]],
1143
+ );
1144
+ $v = $this->merge_4value_radius_shorthands($r);
1145
+ if (isset($v[$property])) {
1146
+ return $v[$property];
1147
+ }
1148
+ }
1149
+ }
1150
+ return $value;
1151
+ }
1152
+
1153
+ /**
1154
+ * Reversing margin shorthands
1155
+ * @param string $value
1156
+ * @return string
1157
+ */
1158
+ public function reverse_left_and_right_margin($value) {
1159
+ return $this->reverse_left_and_right_4value_shorthands('margin', $value);
1160
+ }
1161
+
1162
+ /**
1163
+ * Reversing padding shorthands
1164
+ * @param string $value
1165
+ * @return string
1166
+ */
1167
+ public function reverse_left_and_right_padding($value) {
1168
+ return $this->reverse_left_and_right_4value_shorthands('padding', $value);
1169
+ }
1170
+
1171
+ /**
1172
+ * Reversing border-color shorthands
1173
+ * @param string $value
1174
+ * @return string
1175
+ */
1176
+ public function reverse_left_and_right_border_color($value) {
1177
+ return $this->reverse_left_and_right_4value_shorthands('border-color', $value);
1178
+ }
1179
+
1180
+ /**
1181
+ * Reversing border-style shorthands
1182
+ * @param string $value
1183
+ * @return string
1184
+ */
1185
+ public function reverse_left_and_right_border_style($value) {
1186
+ return $this->reverse_left_and_right_4value_shorthands('border-style', $value);
1187
+ }
1188
+
1189
+ /**
1190
+ * Reversing border-width shorthands
1191
+ * @param string $value
1192
+ * @return string
1193
+ */
1194
+ public function reverse_left_and_right_border_width($value) {
1195
+ return $this->reverse_left_and_right_4value_shorthands('border-width', $value);
1196
+ }
1197
+
1198
+ /**
1199
+ * Reversing border-radius shorthands
1200
+ * @param string $value
1201
+ * @return string
1202
+ */
1203
+ public function reverse_left_and_right_border_radius($value) {
1204
+ return $this->reverse_left_and_right_4value_radius_shorthands('border-radius', $value);
1205
+ }
1206
+
1207
+ /**
1208
+ * Reversing border-radius shorthands
1209
+ * @param string $value
1210
+ * @return string
1211
+ */
1212
+ public function reverse_left_and_right__moz_border_radius($value) {
1213
+ return $this->reverse_left_and_right_4value_radius_shorthands('border-radius', $value);
1214
+ }
1215
+
1216
+ /**
1217
+ * Reversing border-radius shorthands
1218
+ * @param string $value
1219
+ * @return string
1220
+ */
1221
+ public function reverse_left_and_right__webkit_border_radius($value) {
1222
+ return $this->reverse_left_and_right_4value_radius_shorthands('border-radius', $value);
1223
+ }
1224
+
1225
+
1226
+ /**
1227
+ * Reversing background shorthands
1228
+ * @param string $value
1229
+ * @return string
1230
+ */
1231
+ public function reverse_left_and_right_background($value) {
1232
+ $values = $this->dissolve_short_bg($value);
1233
+ if (isset($values['background-position']) and $values['background-position']) {
1234
+ $v = $this->reverse_left_and_right_background_position($values['background-position']);
1235
+ if ($v !== $values['background-position']) {
1236
+ if ($value == $values['background-position']) {
1237
+ return $v;
1238
+ }
1239
+ else {
1240
+ $values['background-position'] = $v;
1241
+ $x = $this->merge_bg($values);
1242
+ if (isset($x['background'])) {
1243
+ return $x['background'];
1244
+ }
1245
+ }
1246
+ }
1247
+ }
1248
+ return $value;
1249
+ }
1250
+
1251
+ /**
1252
+ * Reversing background position shorthands
1253
+ * @param string $value
1254
+ * @return string
1255
+ */
1256
+ public function reverse_left_and_right_background_position_x($value) {
1257
+ return $this->reverse_left_and_right_background_position($value);
1258
+ }
1259
+
1260
+ /**
1261
+ * Reversing background position shorthands
1262
+ * @param string $value
1263
+ * @return string
1264
+ */
1265
+ public function reverse_left_and_right_background_position($value) {
1266
+ // multiple background case
1267
+ if (strpos($value, ',') !== false) {
1268
+ $values = $this->explode_ws(',', $value);
1269
+ if (count($values) > 1) {
1270
+ foreach ($values as $k=>$v) {
1271
+ $values[$k] = $this->reverse_left_and_right_background_position($v);
1272
+ }
1273
+ return implode(',', $values);
1274
+ }
1275
+ }
1276
+
1277
+ // if no explicit left or right value
1278
+ if (stripos($value, 'left') === false and stripos($value, 'right') === false) {
1279
+ $values = $this->explode_ws(' ', trim($value));
1280
+ $values = array_map('trim', $values);
1281
+ $values = array_filter($values);
1282
+ $values = array_values($values);
1283
+ if (count($values) == 1) {
1284
+ return "left $value";
1285
+ }
1286
+ if ($values[1] == 'top' or $values[1] == 'bottom') {
1287
+ return 'left ' . implode(' ', $values);
1288
+ }
1289
+ else {
1290
+ $last = array_pop($values);
1291
+ return implode(' ', $values) . ' left ' . $last;
1292
+ }
1293
+ }
1294
+
1295
+ return $value;
1296
+ }
1297
+
1298
  }
vendor/cerdic/css-tidy/class.csstidy_print.php CHANGED
@@ -269,6 +269,7 @@ class csstidy_print {
269
  $in_at_out = '';
270
  break;
271
 
 
272
  case COMMENT:
273
  $out .= $template[11] . '/*' . $this->_htmlsp($token[1], $plain) . '*/' . $template[12];
274
  break;
@@ -319,6 +320,12 @@ class csstidy_print {
319
  $sort_selectors = $this->parser->get_cfg('sort_selectors');
320
  $sort_properties = $this->parser->get_cfg('sort_properties');
321
 
 
 
 
 
 
 
322
  foreach ($this->css as $medium => $val) {
323
  if ($sort_selectors)
324
  ksort($val);
269
  $in_at_out = '';
270
  break;
271
 
272
+ case IMPORTANT_COMMENT:
273
  case COMMENT:
274
  $out .= $template[11] . '/*' . $this->_htmlsp($token[1], $plain) . '*/' . $template[12];
275
  break;
320
  $sort_selectors = $this->parser->get_cfg('sort_selectors');
321
  $sort_properties = $this->parser->get_cfg('sort_properties');
322
 
323
+ // important comment section ?
324
+ if (isset($this->css['!'])) {
325
+ $this->parser->_add_token(IMPORTANT_COMMENT, rtrim($this->css['!']), true);
326
+ unset($this->css['!']);
327
+ }
328
+
329
  foreach ($this->css as $medium => $val) {
330
  if ($sort_selectors)
331
  ksort($val);
vendor/cerdic/css-tidy/data.inc.php CHANGED
@@ -274,7 +274,10 @@ $data['csstidy']['shorthands']['border-style'] = array('border-top-style','borde
274
  $data['csstidy']['shorthands']['border-width'] = array('border-top-width','border-right-width','border-bottom-width','border-left-width');
275
  $data['csstidy']['shorthands']['margin'] = array('margin-top','margin-right','margin-bottom','margin-left');
276
  $data['csstidy']['shorthands']['padding'] = array('padding-top','padding-right','padding-bottom','padding-left');
277
- $data['csstidy']['shorthands']['-moz-border-radius'] = 0;
 
 
 
278
 
279
  /**
280
  * All CSS Properties. Needed for csstidy::property_is_next()
@@ -612,7 +615,7 @@ $data['csstidy']['predefined_templates']['high_compression'][] = "\n";
612
  $data['csstidy']['predefined_templates']['high_compression'][] = "\n". '<span class="format">}'."\n".'</span>';
613
  $data['csstidy']['predefined_templates']['high_compression'][] = '';
614
  $data['csstidy']['predefined_templates']['high_compression'][] = '<span class="comment">'; // before comment
615
- $data['csstidy']['predefined_templates']['high_compression'][] = '</span>'; // after comment
616
  $data['csstidy']['predefined_templates']['high_compression'][] = "\n";
617
 
618
  $data['csstidy']['predefined_templates']['highest_compression'][] = '<span class="at">';
274
  $data['csstidy']['shorthands']['border-width'] = array('border-top-width','border-right-width','border-bottom-width','border-left-width');
275
  $data['csstidy']['shorthands']['margin'] = array('margin-top','margin-right','margin-bottom','margin-left');
276
  $data['csstidy']['shorthands']['padding'] = array('padding-top','padding-right','padding-bottom','padding-left');
277
+
278
+ $data['csstidy']['radius_shorthands']['border-radius'] = array('border-top-left-radius','border-top-right-radius','border-bottom-right-radius','border-bottom-left-radius');
279
+ $data['csstidy']['radius_shorthands']['-webkit-border-radius'] = array('-webkit-border-top-left-radius','-webkit-border-top-right-radius','-webkit-border-bottom-right-radius','-webkit-border-bottom-left-radius');
280
+ $data['csstidy']['radius_shorthands']['-moz-border-radius'] = array('-moz-border-radius-topleft','-moz-border-radius-topright','-moz-border-radius-bottomright','-moz-border-radius-bottomleft');
281
 
282
  /**
283
  * All CSS Properties. Needed for csstidy::property_is_next()
615
  $data['csstidy']['predefined_templates']['high_compression'][] = "\n". '<span class="format">}'."\n".'</span>';
616
  $data['csstidy']['predefined_templates']['high_compression'][] = '';
617
  $data['csstidy']['predefined_templates']['high_compression'][] = '<span class="comment">'; // before comment
618
+ $data['csstidy']['predefined_templates']['high_compression'][] = '</span>'."\n"; // after comment
619
  $data['csstidy']['predefined_templates']['high_compression'][] = "\n";
620
 
621
  $data['csstidy']['predefined_templates']['highest_compression'][] = '<span class="at">';
vendor/cerdic/css-tidy/lang.inc.php CHANGED
@@ -38,7 +38,7 @@ if (isset($_GET['lang'])) {
38
 
39
  $l = (in_array($l, array('de', 'fr', 'zh'))) ? $l : 'en';
40
 
41
- // note 5 in all but French, and 40 in all are orphaned
42
 
43
  $lang = array();
44
  $lang['en'][0] = 'CSS Formatter and Optimiser/Optimizer (based on CSSTidy ';
@@ -106,7 +106,7 @@ $lang['en'][63] = 'Output CSS code as complete HTML document';
106
  $lang['en'][64] = 'Code';
107
  $lang['en'][65] = 'CSS to style CSS output';
108
  $lang['en'][66] = 'You need to go to about:config in your URL bar, select \'signed.applets.codebase_principal_support\' in the filter field, and set its value to true in order to use this feature; however, be aware that doing so increases security risks.';
109
-
110
 
111
  $lang['de'][0] = 'CSS Formatierer und Optimierer (basierend auf CSSTidy ';
112
  $lang['de'][1] = 'CSS Formatierer und Optimierer';
@@ -240,6 +240,8 @@ $lang['fr'][63] = 'Sauver le code CSS comme document complet HTML';
240
  $lang['fr'][64] = 'Code';
241
  $lang['fr'][65] = 'CSS pour colorier la sortie CSS';
242
  $lang['fr'][66] = 'Vous devez aller dans about:config dans votre barre d’adresse, sélectionner \'signed.applets.codebase_principal_support\' dans le champ Filtre et attribuez-lui la valeur \'true\' pour utiliser cette fonctionnalité; toutefois, soyez conscient que cela augmente les risques de sécurité.';
 
 
243
 
244
 
245
  $lang['zh'][0] = 'CSS整形與最佳化工具(使用 CSSTidy ';
38
 
39
  $l = (in_array($l, array('de', 'fr', 'zh'))) ? $l : 'en';
40
 
41
+ // note 67 in all but English&French, and 5 and 40 in all are orphaned
42
 
43
  $lang = array();
44
  $lang['en'][0] = 'CSS Formatter and Optimiser/Optimizer (based on CSSTidy ';
106
  $lang['en'][64] = 'Code';
107
  $lang['en'][65] = 'CSS to style CSS output';
108
  $lang['en'][66] = 'You need to go to about:config in your URL bar, select \'signed.applets.codebase_principal_support\' in the filter field, and set its value to true in order to use this feature; however, be aware that doing so increases security risks.';
109
+ $lang['en'][67] = 'Reverse left and right directions';
110
 
111
  $lang['de'][0] = 'CSS Formatierer und Optimierer (basierend auf CSSTidy ';
112
  $lang['de'][1] = 'CSS Formatierer und Optimierer';
240
  $lang['fr'][64] = 'Code';
241
  $lang['fr'][65] = 'CSS pour colorier la sortie CSS';
242
  $lang['fr'][66] = 'Vous devez aller dans about:config dans votre barre d’adresse, sélectionner \'signed.applets.codebase_principal_support\' dans le champ Filtre et attribuez-lui la valeur \'true\' pour utiliser cette fonctionnalité; toutefois, soyez conscient que cela augmente les risques de sécurité.';
243
+ $lang['fr'][67] = 'Inverser gauche et droite';
244
+
245
 
246
 
247
  $lang['zh'][0] = 'CSS整形與最佳化工具(使用 CSSTidy ';
vendor/composer/ClassLoader.php CHANGED
@@ -377,11 +377,11 @@ class ClassLoader
377
  $subPath = $class;
378
  while (false !== $lastPos = strrpos($subPath, '\\')) {
379
  $subPath = substr($subPath, 0, $lastPos);
380
- $search = $subPath . '\\';
381
  if (isset($this->prefixDirsPsr4[$search])) {
382
- $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1);
383
  foreach ($this->prefixDirsPsr4[$search] as $dir) {
384
- if (file_exists($file = $dir . $pathEnd)) {
 
385
  return $file;
386
  }
387
  }
377
  $subPath = $class;
378
  while (false !== $lastPos = strrpos($subPath, '\\')) {
379
  $subPath = substr($subPath, 0, $lastPos);
380
+ $search = $subPath.'\\';
381
  if (isset($this->prefixDirsPsr4[$search])) {
 
382
  foreach ($this->prefixDirsPsr4[$search] as $dir) {
383
+ $length = $this->prefixLengthsPsr4[$first][$search];
384
+ if (file_exists($file = $dir . DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $length))) {
385
  return $file;
386
  }
387
  }
vendor/composer/autoload_classmap.php CHANGED
@@ -343,6 +343,7 @@ return array(
343
  'MailPoet\\Statistics\\Track\\Clicks' => $baseDir . '/lib/Statistics/Track/Clicks.php',
344
  'MailPoet\\Statistics\\Track\\Opens' => $baseDir . '/lib/Statistics/Track/Opens.php',
345
  'MailPoet\\Statistics\\Track\\Unsubscribes' => $baseDir . '/lib/Statistics/Track/Unsubscribes.php',
 
346
  'MailPoet\\Subscribers\\ImportExport\\Export\\DefaultSubscribersGetter' => $baseDir . '/lib/Subscribers/ImportExport/Export/DefaultSubscribersGetter.php',
347
  'MailPoet\\Subscribers\\ImportExport\\Export\\DynamicSubscribersGetter' => $baseDir . '/lib/Subscribers/ImportExport/Export/DynamicSubscribersGetter.php',
348
  'MailPoet\\Subscribers\\ImportExport\\Export\\Export' => $baseDir . '/lib/Subscribers/ImportExport/Export/Export.php',
@@ -354,6 +355,7 @@ return array(
354
  'MailPoet\\Subscribers\\ImportExport\\PersonalDataExporters\\NewslettersExporter' => $baseDir . '/lib/Subscribers/ImportExport/PersonalDataExporters/NewslettersExporter.php',
355
  'MailPoet\\Subscribers\\ImportExport\\PersonalDataExporters\\SegmentsExporter' => $baseDir . '/lib/Subscribers/ImportExport/PersonalDataExporters/SegmentsExporter.php',
356
  'MailPoet\\Subscribers\\ImportExport\\PersonalDataExporters\\SubscriberExporter' => $baseDir . '/lib/Subscribers/ImportExport/PersonalDataExporters/SubscriberExporter.php',
 
357
  'MailPoet\\Subscribers\\RequiredCustomFieldValidator' => $baseDir . '/lib/Subscribers/RequiredCustomFieldValidator.php',
358
  'MailPoet\\Subscribers\\Source' => $baseDir . '/lib/Subscribers/Source.php',
359
  'MailPoet\\Subscribers\\SubscriberPersonalDataEraser' => $baseDir . '/lib/Subscribers/SubscriberPersonalDataEraser.php',
@@ -383,6 +385,7 @@ return array(
383
  'MailPoet\\Util\\License\\Features\\Subscribers' => $baseDir . '/lib/Util/License/Features/Subscribers.php',
384
  'MailPoet\\Util\\License\\License' => $baseDir . '/lib/Util/License/License.php',
385
  'MailPoet\\Util\\Notices\\AfterMigrationNotice' => $baseDir . '/lib/Util/Notices/AfterMigrationNotice.php',
 
386
  'MailPoet\\Util\\Notices\\PHPVersionWarnings' => $baseDir . '/lib/Util/Notices/PHPVersionWarnings.php',
387
  'MailPoet\\Util\\Notices\\PermanentNotices' => $baseDir . '/lib/Util/Notices/PermanentNotices.php',
388
  'MailPoet\\Util\\ProgressBar' => $baseDir . '/lib/Util/ProgressBar.php',
@@ -539,23 +542,19 @@ return array(
539
  'Sabberworm\\CSS\\Value\\Value' => $vendorDir . '/sabberworm/php-css-parser/lib/Sabberworm/CSS/Value/Value.php',
540
  'Sabberworm\\CSS\\Value\\ValueList' => $vendorDir . '/sabberworm/php-css-parser/lib/Sabberworm/CSS/Value/ValueList.php',
541
  'SensioLabs\\Security\\Command\\SecurityCheckerCommand' => $vendorDir . '/sensiolabs/security-checker/SensioLabs/Security/Command/SecurityCheckerCommand.php',
542
- 'SensioLabs\\Security\\Crawler\\BaseCrawler' => $vendorDir . '/sensiolabs/security-checker/SensioLabs/Security/Crawler/BaseCrawler.php',
543
- 'SensioLabs\\Security\\Crawler\\CrawlerInterface' => $vendorDir . '/sensiolabs/security-checker/SensioLabs/Security/Crawler/CrawlerInterface.php',
544
- 'SensioLabs\\Security\\Crawler\\CurlCrawler' => $vendorDir . '/sensiolabs/security-checker/SensioLabs/Security/Crawler/CurlCrawler.php',
545
- 'SensioLabs\\Security\\Crawler\\DefaultCrawler' => $vendorDir . '/sensiolabs/security-checker/SensioLabs/Security/Crawler/DefaultCrawler.php',
546
- 'SensioLabs\\Security\\Crawler\\FileGetContentsCrawler' => $vendorDir . '/sensiolabs/security-checker/SensioLabs/Security/Crawler/FileGetContentsCrawler.php',
547
  'SensioLabs\\Security\\Exception\\ExceptionInterface' => $vendorDir . '/sensiolabs/security-checker/SensioLabs/Security/Exception/ExceptionInterface.php',
548
  'SensioLabs\\Security\\Exception\\HttpException' => $vendorDir . '/sensiolabs/security-checker/SensioLabs/Security/Exception/HttpException.php',
549
  'SensioLabs\\Security\\Exception\\RuntimeException' => $vendorDir . '/sensiolabs/security-checker/SensioLabs/Security/Exception/RuntimeException.php',
550
- 'SensioLabs\\Security\\Formatters\\FormatterInterface' => $vendorDir . '/sensiolabs/security-checker/SensioLabs/Security/Formatters/FormatterInterface.php',
551
- 'SensioLabs\\Security\\Formatters\\JsonFormatter' => $vendorDir . '/sensiolabs/security-checker/SensioLabs/Security/Formatters/JsonFormatter.php',
552
- 'SensioLabs\\Security\\Formatters\\SimpleFormatter' => $vendorDir . '/sensiolabs/security-checker/SensioLabs/Security/Formatters/SimpleFormatter.php',
553
- 'SensioLabs\\Security\\Formatters\\TextFormatter' => $vendorDir . '/sensiolabs/security-checker/SensioLabs/Security/Formatters/TextFormatter.php',
554
  'SensioLabs\\Security\\SecurityChecker' => $vendorDir . '/sensiolabs/security-checker/SensioLabs/Security/SecurityChecker.php',
555
  'Sudzy\\Engine' => $baseDir . '/lib/Util/Sudzy/Engine.php',
556
  'Sudzy\\ValidModel' => $baseDir . '/lib/Util/Sudzy/ValidModel.php',
557
  'Sudzy\\ValidationException' => $baseDir . '/lib/Util/Sudzy/ValidationException.php',
558
  'Symfony\\Component\\Console\\Application' => $vendorDir . '/symfony/console/Application.php',
 
 
 
559
  'Symfony\\Component\\Console\\Command\\Command' => $vendorDir . '/symfony/console/Command/Command.php',
560
  'Symfony\\Component\\Console\\Command\\HelpCommand' => $vendorDir . '/symfony/console/Command/HelpCommand.php',
561
  'Symfony\\Component\\Console\\Command\\ListCommand' => $vendorDir . '/symfony/console/Command/ListCommand.php',
343
  'MailPoet\\Statistics\\Track\\Clicks' => $baseDir . '/lib/Statistics/Track/Clicks.php',
344
  'MailPoet\\Statistics\\Track\\Opens' => $baseDir . '/lib/Statistics/Track/Opens.php',
345
  'MailPoet\\Statistics\\Track\\Unsubscribes' => $baseDir . '/lib/Statistics/Track/Unsubscribes.php',
346
+ 'MailPoet\\Subscribers\\ConfirmationEmailMailer' => $baseDir . '/lib/Subscribers/ConfirmationEmailMailer.php',
347
  'MailPoet\\Subscribers\\ImportExport\\Export\\DefaultSubscribersGetter' => $baseDir . '/lib/Subscribers/ImportExport/Export/DefaultSubscribersGetter.php',
348
  'MailPoet\\Subscribers\\ImportExport\\Export\\DynamicSubscribersGetter' => $baseDir . '/lib/Subscribers/ImportExport/Export/DynamicSubscribersGetter.php',
349
  'MailPoet\\Subscribers\\ImportExport\\Export\\Export' => $baseDir . '/lib/Subscribers/ImportExport/Export/Export.php',
355
  'MailPoet\\Subscribers\\ImportExport\\PersonalDataExporters\\NewslettersExporter' => $baseDir . '/lib/Subscribers/ImportExport/PersonalDataExporters/NewslettersExporter.php',
356
  'MailPoet\\Subscribers\\ImportExport\\PersonalDataExporters\\SegmentsExporter' => $baseDir . '/lib/Subscribers/ImportExport/PersonalDataExporters/SegmentsExporter.php',
357
  'MailPoet\\Subscribers\\ImportExport\\PersonalDataExporters\\SubscriberExporter' => $baseDir . '/lib/Subscribers/ImportExport/PersonalDataExporters/SubscriberExporter.php',
358
+ 'MailPoet\\Subscribers\\NewSubscriberNotificationMailer' => $baseDir . '/lib/Subscribers/NewSubscriberNotificationMailer.php',
359
  'MailPoet\\Subscribers\\RequiredCustomFieldValidator' => $baseDir . '/lib/Subscribers/RequiredCustomFieldValidator.php',
360
  'MailPoet\\Subscribers\\Source' => $baseDir . '/lib/Subscribers/Source.php',
361
  'MailPoet\\Subscribers\\SubscriberPersonalDataEraser' => $baseDir . '/lib/Subscribers/SubscriberPersonalDataEraser.php',
385
  'MailPoet\\Util\\License\\Features\\Subscribers' => $baseDir . '/lib/Util/License/Features/Subscribers.php',
386
  'MailPoet\\Util\\License\\License' => $baseDir . '/lib/Util/License/License.php',
387
  'MailPoet\\Util\\Notices\\AfterMigrationNotice' => $baseDir . '/lib/Util/Notices/AfterMigrationNotice.php',
388
+ 'MailPoet\\Util\\Notices\\DiscountsAnnouncement' => $baseDir . '/lib/Util/Notices/DiscountsAnnouncement.php',
389
  'MailPoet\\Util\\Notices\\PHPVersionWarnings' => $baseDir . '/lib/Util/Notices/PHPVersionWarnings.php',
390
  'MailPoet\\Util\\Notices\\PermanentNotices' => $baseDir . '/lib/Util/Notices/PermanentNotices.php',
391
  'MailPoet\\Util\\ProgressBar' => $baseDir . '/lib/Util/ProgressBar.php',
542
  'Sabberworm\\CSS\\Value\\Value' => $vendorDir . '/sabberworm/php-css-parser/lib/Sabberworm/CSS/Value/Value.php',
543
  'Sabberworm\\CSS\\Value\\ValueList' => $vendorDir . '/sabberworm/php-css-parser/lib/Sabberworm/CSS/Value/ValueList.php',
544
  'SensioLabs\\Security\\Command\\SecurityCheckerCommand' => $vendorDir . '/sensiolabs/security-checker/SensioLabs/Security/Command/SecurityCheckerCommand.php',
545
+ 'SensioLabs\\Security\\Crawler' => $vendorDir . '/sensiolabs/security-checker/SensioLabs/Security/Crawler.php',
 
 
 
 
546
  'SensioLabs\\Security\\Exception\\ExceptionInterface' => $vendorDir . '/sensiolabs/security-checker/SensioLabs/Security/Exception/ExceptionInterface.php',
547
  'SensioLabs\\Security\\Exception\\HttpException' => $vendorDir . '/sensiolabs/security-checker/SensioLabs/Security/Exception/HttpException.php',
548
  'SensioLabs\\Security\\Exception\\RuntimeException' => $vendorDir . '/sensiolabs/security-checker/SensioLabs/Security/Exception/RuntimeException.php',
549
+ 'SensioLabs\\Security\\Result' => $vendorDir . '/sensiolabs/security-checker/SensioLabs/Security/Result.php',
 
 
 
550
  'SensioLabs\\Security\\SecurityChecker' => $vendorDir . '/sensiolabs/security-checker/SensioLabs/Security/SecurityChecker.php',
551
  'Sudzy\\Engine' => $baseDir . '/lib/Util/Sudzy/Engine.php',
552
  'Sudzy\\ValidModel' => $baseDir . '/lib/Util/Sudzy/ValidModel.php',
553
  'Sudzy\\ValidationException' => $baseDir . '/lib/Util/Sudzy/ValidationException.php',
554
  'Symfony\\Component\\Console\\Application' => $vendorDir . '/symfony/console/Application.php',
555
+ 'Symfony\\Component\\Console\\CommandLoader\\CommandLoaderInterface' => $vendorDir . '/symfony/console/CommandLoader/CommandLoaderInterface.php',
556
+ 'Symfony\\Component\\Console\\CommandLoader\\ContainerCommandLoader' => $vendorDir . '/symfony/console/CommandLoader/ContainerCommandLoader.php',
557
+ 'Symfony\\Component\\Console\\CommandLoader\\FactoryCommandLoader' => $vendorDir . '/symfony/console/CommandLoader/FactoryCommandLoader.php',
558
  'Symfony\\Component\\Console\\Command\\Command' => $vendorDir . '/symfony/console/Command/Command.php',
559
  'Symfony\\Component\\Console\\Command\\HelpCommand' => $vendorDir . '/symfony/console/Command/HelpCommand.php',
560
  'Symfony\\Component\\Console\\Command\\ListCommand' => $vendorDir . '/symfony/console/Command/ListCommand.php',
vendor/composer/autoload_namespaces.php CHANGED
@@ -7,6 +7,5 @@ $baseDir = dirname($vendorDir);
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
  );
7
 
8
  return array(
9
  'Twig_' => array($vendorDir . '/twig/twig/lib'),
 
10
  'Sabberworm\\CSS' => array($vendorDir . '/sabberworm/php-css-parser/lib'),
11
  );
vendor/composer/autoload_psr4.php CHANGED
@@ -14,6 +14,7 @@ return array(
14
  'Symfony\\Component\\Debug\\' => array($vendorDir . '/symfony/debug'),
15
  'Symfony\\Component\\Console\\' => array($vendorDir . '/symfony/console'),
16
  'Sudzy\\' => array($baseDir . '/lib/Util/Sudzy'),
 
17
  'Psr\\Log\\' => array($vendorDir . '/psr/log/Psr/Log'),
18
  'Monolog\\' => array($vendorDir . '/monolog/monolog/src/Monolog'),
19
  'MailPoet\\' => array($baseDir . '/lib'),
14
  'Symfony\\Component\\Debug\\' => array($vendorDir . '/symfony/debug'),
15
  'Symfony\\Component\\Console\\' => array($vendorDir . '/symfony/console'),
16
  'Sudzy\\' => array($baseDir . '/lib/Util/Sudzy'),
17
+ 'SensioLabs\\Security\\' => array($vendorDir . '/sensiolabs/security-checker/SensioLabs/Security'),
18
  'Psr\\Log\\' => array($vendorDir . '/psr/log/Psr/Log'),
19
  'Monolog\\' => array($vendorDir . '/monolog/monolog/src/Monolog'),
20
  'MailPoet\\' => array($baseDir . '/lib'),
vendor/composer/autoload_real.php CHANGED
@@ -2,7 +2,7 @@
2
 
3
  // autoload_real.php @generated by Composer
4
 
5
- class ComposerAutoloaderInitf4c002f116b3d5948416331af9d158ad
6
  {
7
  private static $loader;
8
 
@@ -19,15 +19,15 @@ class ComposerAutoloaderInitf4c002f116b3d5948416331af9d158ad
19
  return self::$loader;
20
  }
21
 
22
- spl_autoload_register(array('ComposerAutoloaderInitf4c002f116b3d5948416331af9d158ad', 'loadClassLoader'), true, true);
23
  self::$loader = $loader = new \Composer\Autoload\ClassLoader();
24
- spl_autoload_unregister(array('ComposerAutoloaderInitf4c002f116b3d5948416331af9d158ad', '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\ComposerStaticInitf4c002f116b3d5948416331af9d158ad::getInitializer($loader));
31
  } else {
32
  $map = require __DIR__ . '/autoload_namespaces.php';
33
  foreach ($map as $namespace => $path) {
@@ -48,19 +48,19 @@ class ComposerAutoloaderInitf4c002f116b3d5948416331af9d158ad
48
  $loader->register(true);
49
 
50
  if ($useStaticLoader) {
51
- $includeFiles = Composer\Autoload\ComposerStaticInitf4c002f116b3d5948416331af9d158ad::$files;
52
  } else {
53
  $includeFiles = require __DIR__ . '/autoload_files.php';
54
  }
55
  foreach ($includeFiles as $fileIdentifier => $file) {
56
- composerRequiref4c002f116b3d5948416331af9d158ad($fileIdentifier, $file);
57
  }
58
 
59
  return $loader;
60
  }
61
  }
62
 
63
- function composerRequiref4c002f116b3d5948416331af9d158ad($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 ComposerAutoloaderInit2159ad40a248aa7256850bbda617bbb4
6
  {
7
  private static $loader;
8
 
19
  return self::$loader;
20
  }
21
 
22
+ spl_autoload_register(array('ComposerAutoloaderInit2159ad40a248aa7256850bbda617bbb4', 'loadClassLoader'), true, true);
23
  self::$loader = $loader = new \Composer\Autoload\ClassLoader();
24
+ spl_autoload_unregister(array('ComposerAutoloaderInit2159ad40a248aa7256850bbda617bbb4', '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\ComposerStaticInit2159ad40a248aa7256850bbda617bbb4::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\ComposerStaticInit2159ad40a248aa7256850bbda617bbb4::$files;
52
  } else {
53
  $includeFiles = require __DIR__ . '/autoload_files.php';
54
  }
55
  foreach ($includeFiles as $fileIdentifier => $file) {
56
+ composerRequire2159ad40a248aa7256850bbda617bbb4($fileIdentifier, $file);
57
  }
58
 
59
  return $loader;
60
  }
61
  }
62
 
63
+ function composerRequire2159ad40a248aa7256850bbda617bbb4($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 ComposerStaticInitf4c002f116b3d5948416331af9d158ad
8
  {
9
  public static $files = array (
10
  '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php',
@@ -27,6 +27,7 @@ class ComposerStaticInitf4c002f116b3d5948416331af9d158ad
27
  'Symfony\\Component\\Debug\\' => 24,
28
  'Symfony\\Component\\Console\\' => 26,
29
  'Sudzy\\' => 6,
 
30
  ),
31
  'P' =>
32
  array (
@@ -81,6 +82,10 @@ class ComposerStaticInitf4c002f116b3d5948416331af9d158ad
81
  array (
82
  0 => __DIR__ . '/../..' . '/lib/Util/Sudzy',
83
  ),
 
 
 
 
84
  'Psr\\Log\\' =>
85
  array (
86
  0 => __DIR__ . '/..' . '/psr/log/Psr/Log',
@@ -121,10 +126,6 @@ class ComposerStaticInitf4c002f116b3d5948416331af9d158ad
121
  ),
122
  'S' =>
123
  array (
124
- 'SensioLabs\\Security' =>
125
- array (
126
- 0 => __DIR__ . '/..' . '/sensiolabs/security-checker',
127
- ),
128
  'Sabberworm\\CSS' =>
129
  array (
130
  0 => __DIR__ . '/..' . '/sabberworm/php-css-parser/lib',
@@ -470,6 +471,7 @@ class ComposerStaticInitf4c002f116b3d5948416331af9d158ad
470
  'MailPoet\\Statistics\\Track\\Clicks' => __DIR__ . '/../..' . '/lib/Statistics/Track/Clicks.php',
471
  'MailPoet\\Statistics\\Track\\Opens' => __DIR__ . '/../..' . '/lib/Statistics/Track/Opens.php',
472
  'MailPoet\\Statistics\\Track\\Unsubscribes' => __DIR__ . '/../..' . '/lib/Statistics/Track/Unsubscribes.php',
 
473
  'MailPoet\\Subscribers\\ImportExport\\Export\\DefaultSubscribersGetter' => __DIR__ . '/../..' . '/lib/Subscribers/ImportExport/Export/DefaultSubscribersGetter.php',
474
  'MailPoet\\Subscribers\\ImportExport\\Export\\DynamicSubscribersGetter' => __DIR__ . '/../..' . '/lib/Subscribers/ImportExport/Export/DynamicSubscribersGetter.php',
475
  'MailPoet\\Subscribers\\ImportExport\\Export\\Export' => __DIR__ . '/../..' . '/lib/Subscribers/ImportExport/Export/Export.php',
@@ -481,6 +483,7 @@ class ComposerStaticInitf4c002f116b3d5948416331af9d158ad
481
  'MailPoet\\Subscribers\\ImportExport\\PersonalDataExporters\\NewslettersExporter' => __DIR__ . '/../..' . '/lib/Subscribers/ImportExport/PersonalDataExporters/NewslettersExporter.php',
482
  'MailPoet\\Subscribers\\ImportExport\\PersonalDataExporters\\SegmentsExporter' => __DIR__ . '/../..' . '/lib/Subscribers/ImportExport/PersonalDataExporters/SegmentsExporter.php',
483
  'MailPoet\\Subscribers\\ImportExport\\PersonalDataExporters\\SubscriberExporter' => __DIR__ . '/../..' . '/lib/Subscribers/ImportExport/PersonalDataExporters/SubscriberExporter.php',
 
484
  'MailPoet\\Subscribers\\RequiredCustomFieldValidator' => __DIR__ . '/../..' . '/lib/Subscribers/RequiredCustomFieldValidator.php',
485
  'MailPoet\\Subscribers\\Source' => __DIR__ . '/../..' . '/lib/Subscribers/Source.php',
486
  'MailPoet\\Subscribers\\SubscriberPersonalDataEraser' => __DIR__ . '/../..' . '/lib/Subscribers/SubscriberPersonalDataEraser.php',
@@ -510,6 +513,7 @@ class ComposerStaticInitf4c002f116b3d5948416331af9d158ad
510
  'MailPoet\\Util\\License\\Features\\Subscribers' => __DIR__ . '/../..' . '/lib/Util/License/Features/Subscribers.php',
511
  'MailPoet\\Util\\License\\License' => __DIR__ . '/../..' . '/lib/Util/License/License.php',
512
  'MailPoet\\Util\\Notices\\AfterMigrationNotice' => __DIR__ . '/../..' . '/lib/Util/Notices/AfterMigrationNotice.php',
 
513
  'MailPoet\\Util\\Notices\\PHPVersionWarnings' => __DIR__ . '/../..' . '/lib/Util/Notices/PHPVersionWarnings.php',
514
  'MailPoet\\Util\\Notices\\PermanentNotices' => __DIR__ . '/../..' . '/lib/Util/Notices/PermanentNotices.php',
515
  'MailPoet\\Util\\ProgressBar' => __DIR__ . '/../..' . '/lib/Util/ProgressBar.php',
@@ -666,23 +670,19 @@ class ComposerStaticInitf4c002f116b3d5948416331af9d158ad
666
  'Sabberworm\\CSS\\Value\\Value' => __DIR__ . '/..' . '/sabberworm/php-css-parser/lib/Sabberworm/CSS/Value/Value.php',
667
  'Sabberworm\\CSS\\Value\\ValueList' => __DIR__ . '/..' . '/sabberworm/php-css-parser/lib/Sabberworm/CSS/Value/ValueList.php',
668
  'SensioLabs\\Security\\Command\\SecurityCheckerCommand' => __DIR__ . '/..' . '/sensiolabs/security-checker/SensioLabs/Security/Command/SecurityCheckerCommand.php',
669
- 'SensioLabs\\Security\\Crawler\\BaseCrawler' => __DIR__ . '/..' . '/sensiolabs/security-checker/SensioLabs/Security/Crawler/BaseCrawler.php',
670
- 'SensioLabs\\Security\\Crawler\\CrawlerInterface' => __DIR__ . '/..' . '/sensiolabs/security-checker/SensioLabs/Security/Crawler/CrawlerInterface.php',
671
- 'SensioLabs\\Security\\Crawler\\CurlCrawler' => __DIR__ . '/..' . '/sensiolabs/security-checker/SensioLabs/Security/Crawler/CurlCrawler.php',
672
- 'SensioLabs\\Security\\Crawler\\DefaultCrawler' => __DIR__ . '/..' . '/sensiolabs/security-checker/SensioLabs/Security/Crawler/DefaultCrawler.php',
673
- 'SensioLabs\\Security\\Crawler\\FileGetContentsCrawler' => __DIR__ . '/..' . '/sensiolabs/security-checker/SensioLabs/Security/Crawler/FileGetContentsCrawler.php',
674
  'SensioLabs\\Security\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/sensiolabs/security-checker/SensioLabs/Security/Exception/ExceptionInterface.php',
675
  'SensioLabs\\Security\\Exception\\HttpException' => __DIR__ . '/..' . '/sensiolabs/security-checker/SensioLabs/Security/Exception/HttpException.php',
676
  'SensioLabs\\Security\\Exception\\RuntimeException' => __DIR__ . '/..' . '/sensiolabs/security-checker/SensioLabs/Security/Exception/RuntimeException.php',
677
- 'SensioLabs\\Security\\Formatters\\FormatterInterface' => __DIR__ . '/..' . '/sensiolabs/security-checker/SensioLabs/Security/Formatters/FormatterInterface.php',
678
- 'SensioLabs\\Security\\Formatters\\JsonFormatter' => __DIR__ . '/..' . '/sensiolabs/security-checker/SensioLabs/Security/Formatters/JsonFormatter.php',
679
- 'SensioLabs\\Security\\Formatters\\SimpleFormatter' => __DIR__ . '/..' . '/sensiolabs/security-checker/SensioLabs/Security/Formatters/SimpleFormatter.php',
680
- 'SensioLabs\\Security\\Formatters\\TextFormatter' => __DIR__ . '/..' . '/sensiolabs/security-checker/SensioLabs/Security/Formatters/TextFormatter.php',
681
  'SensioLabs\\Security\\SecurityChecker' => __DIR__ . '/..' . '/sensiolabs/security-checker/SensioLabs/Security/SecurityChecker.php',
682
  'Sudzy\\Engine' => __DIR__ . '/../..' . '/lib/Util/Sudzy/Engine.php',
683
  'Sudzy\\ValidModel' => __DIR__ . '/../..' . '/lib/Util/Sudzy/ValidModel.php',
684
  'Sudzy\\ValidationException' => __DIR__ . '/../..' . '/lib/Util/Sudzy/ValidationException.php',
685
  'Symfony\\Component\\Console\\Application' => __DIR__ . '/..' . '/symfony/console/Application.php',
 
 
 
686
  'Symfony\\Component\\Console\\Command\\Command' => __DIR__ . '/..' . '/symfony/console/Command/Command.php',
687
  'Symfony\\Component\\Console\\Command\\HelpCommand' => __DIR__ . '/..' . '/symfony/console/Command/HelpCommand.php',
688
  'Symfony\\Component\\Console\\Command\\ListCommand' => __DIR__ . '/..' . '/symfony/console/Command/ListCommand.php',
@@ -1225,11 +1225,11 @@ class ComposerStaticInitf4c002f116b3d5948416331af9d158ad
1225
  public static function getInitializer(ClassLoader $loader)
1226
  {
1227
  return \Closure::bind(function () use ($loader) {
1228
- $loader->prefixLengthsPsr4 = ComposerStaticInitf4c002f116b3d5948416331af9d158ad::$prefixLengthsPsr4;
1229
- $loader->prefixDirsPsr4 = ComposerStaticInitf4c002f116b3d5948416331af9d158ad::$prefixDirsPsr4;
1230
- $loader->fallbackDirsPsr4 = ComposerStaticInitf4c002f116b3d5948416331af9d158ad::$fallbackDirsPsr4;
1231
- $loader->prefixesPsr0 = ComposerStaticInitf4c002f116b3d5948416331af9d158ad::$prefixesPsr0;
1232
- $loader->classMap = ComposerStaticInitf4c002f116b3d5948416331af9d158ad::$classMap;
1233
 
1234
  }, null, ClassLoader::class);
1235
  }
4
 
5
  namespace Composer\Autoload;
6
 
7
+ class ComposerStaticInit2159ad40a248aa7256850bbda617bbb4
8
  {
9
  public static $files = array (
10
  '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php',
27
  'Symfony\\Component\\Debug\\' => 24,
28
  'Symfony\\Component\\Console\\' => 26,
29
  'Sudzy\\' => 6,
30
+ 'SensioLabs\\Security\\' => 20,
31
  ),
32
  'P' =>
33
  array (
82
  array (
83
  0 => __DIR__ . '/../..' . '/lib/Util/Sudzy',
84
  ),
85
+ 'SensioLabs\\Security\\' =>
86
+ array (
87
+ 0 => __DIR__ . '/..' . '/sensiolabs/security-checker/SensioLabs/Security',
88
+ ),
89
  'Psr\\Log\\' =>
90
  array (
91
  0 => __DIR__ . '/..' . '/psr/log/Psr/Log',
126
  ),
127
  'S' =>
128
  array (
 
 
 
 
129
  'Sabberworm\\CSS' =>
130
  array (
131
  0 => __DIR__ . '/..' . '/sabberworm/php-css-parser/lib',
471
  'MailPoet\\Statistics\\Track\\Clicks' => __DIR__ . '/../..' . '/lib/Statistics/Track/Clicks.php',
472
  'MailPoet\\Statistics\\Track\\Opens' => __DIR__ . '/../..' . '/lib/Statistics/Track/Opens.php',
473
  'MailPoet\\Statistics\\Track\\Unsubscribes' => __DIR__ . '/../..' . '/lib/Statistics/Track/Unsubscribes.php',
474
+ 'MailPoet\\Subscribers\\ConfirmationEmailMailer' => __DIR__ . '/../..' . '/lib/Subscribers/ConfirmationEmailMailer.php',
475
  'MailPoet\\Subscribers\\ImportExport\\Export\\DefaultSubscribersGetter' => __DIR__ . '/../..' . '/lib/Subscribers/ImportExport/Export/DefaultSubscribersGetter.php',
476
  'MailPoet\\Subscribers\\ImportExport\\Export\\DynamicSubscribersGetter' => __DIR__ . '/../..' . '/lib/Subscribers/ImportExport/Export/DynamicSubscribersGetter.php',
477
  'MailPoet\\Subscribers\\ImportExport\\Export\\Export' => __DIR__ . '/../..' . '/lib/Subscribers/ImportExport/Export/Export.php',
483
  'MailPoet\\Subscribers\\ImportExport\\PersonalDataExporters\\NewslettersExporter' => __DIR__ . '/../..' . '/lib/Subscribers/ImportExport/PersonalDataExporters/NewslettersExporter.php',
484
  'MailPoet\\Subscribers\\ImportExport\\PersonalDataExporters\\SegmentsExporter' => __DIR__ . '/../..' . '/lib/Subscribers/ImportExport/PersonalDataExporters/SegmentsExporter.php',
485
  'MailPoet\\Subscribers\\ImportExport\\PersonalDataExporters\\SubscriberExporter' => __DIR__ . '/../..' . '/lib/Subscribers/ImportExport/PersonalDataExporters/SubscriberExporter.php',
486
+ 'MailPoet\\Subscribers\\NewSubscriberNotificationMailer' => __DIR__ . '/../..' . '/lib/Subscribers/NewSubscriberNotificationMailer.php',
487
  'MailPoet\\Subscribers\\RequiredCustomFieldValidator' => __DIR__ . '/../..' . '/lib/Subscribers/RequiredCustomFieldValidator.php',
488
  'MailPoet\\Subscribers\\Source' => __DIR__ . '/../..' . '/lib/Subscribers/Source.php',
489
  'MailPoet\\Subscribers\\SubscriberPersonalDataEraser' => __DIR__ . '/../..' . '/lib/Subscribers/SubscriberPersonalDataEraser.php',
513
  'MailPoet\\Util\\License\\Features\\Subscribers' => __DIR__ . '/../..' . '/lib/Util/License/Features/Subscribers.php',
514
  'MailPoet\\Util\\License\\License' => __DIR__ . '/../..' . '/lib/Util/License/License.php',
515
  'MailPoet\\Util\\Notices\\AfterMigrationNotice' => __DIR__ . '/../..' . '/lib/Util/Notices/AfterMigrationNotice.php',
516
+ 'MailPoet\\Util\\Notices\\DiscountsAnnouncement' => __DIR__ . '/../..' . '/lib/Util/Notices/DiscountsAnnouncement.php',
517
  'MailPoet\\Util\\Notices\\PHPVersionWarnings' => __DIR__ . '/../..' . '/lib/Util/Notices/PHPVersionWarnings.php',
518
  'MailPoet\\Util\\Notices\\PermanentNotices' => __DIR__ . '/../..' . '/lib/Util/Notices/PermanentNotices.php',
519
  'MailPoet\\Util\\ProgressBar' => __DIR__ . '/../..' . '/lib/Util/ProgressBar.php',
670
  'Sabberworm\\CSS\\Value\\Value' => __DIR__ . '/..' . '/sabberworm/php-css-parser/lib/Sabberworm/CSS/Value/Value.php',
671
  'Sabberworm\\CSS\\Value\\ValueList' => __DIR__ . '/..' . '/sabberworm/php-css-parser/lib/Sabberworm/CSS/Value/ValueList.php',
672
  'SensioLabs\\Security\\Command\\SecurityCheckerCommand' => __DIR__ . '/..' . '/sensiolabs/security-checker/SensioLabs/Security/Command/SecurityCheckerCommand.php',
673
+ 'SensioLabs\\Security\\Crawler' => __DIR__ . '/..' . '/sensiolabs/security-checker/SensioLabs/Security/Crawler.php',
 
 
 
 
674
  'SensioLabs\\Security\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/sensiolabs/security-checker/SensioLabs/Security/Exception/ExceptionInterface.php',
675
  'SensioLabs\\Security\\Exception\\HttpException' => __DIR__ . '/..' . '/sensiolabs/security-checker/SensioLabs/Security/Exception/HttpException.php',
676
  'SensioLabs\\Security\\Exception\\RuntimeException' => __DIR__ . '/..' . '/sensiolabs/security-checker/SensioLabs/Security/Exception/RuntimeException.php',
677
+ 'SensioLabs\\Security\\Result' => __DIR__ . '/..' . '/sensiolabs/security-checker/SensioLabs/Security/Result.php',
 
 
 
678
  'SensioLabs\\Security\\SecurityChecker' => __DIR__ . '/..' . '/sensiolabs/security-checker/SensioLabs/Security/SecurityChecker.php',
679
  'Sudzy\\Engine' => __DIR__ . '/../..' . '/lib/Util/Sudzy/Engine.php',
680
  'Sudzy\\ValidModel' => __DIR__ . '/../..' . '/lib/Util/Sudzy/ValidModel.php',
681
  'Sudzy\\ValidationException' => __DIR__ . '/../..' . '/lib/Util/Sudzy/ValidationException.php',
682
  'Symfony\\Component\\Console\\Application' => __DIR__ . '/..' . '/symfony/console/Application.php',
683
+ 'Symfony\\Component\\Console\\CommandLoader\\CommandLoaderInterface' => __DIR__ . '/..' . '/symfony/console/CommandLoader/CommandLoaderInterface.php',
684
+ 'Symfony\\Component\\Console\\CommandLoader\\ContainerCommandLoader' => __DIR__ . '/..' . '/symfony/console/CommandLoader/ContainerCommandLoader.php',
685
+ 'Symfony\\Component\\Console\\CommandLoader\\FactoryCommandLoader' => __DIR__ . '/..' . '/symfony/console/CommandLoader/FactoryCommandLoader.php',
686
  'Symfony\\Component\\Console\\Command\\Command' => __DIR__ . '/..' . '/symfony/console/Command/Command.php',
687
  'Symfony\\Component\\Console\\Command\\HelpCommand' => __DIR__ . '/..' . '/symfony/console/Command/HelpCommand.php',
688
  'Symfony\\Component\\Console\\Command\\ListCommand' => __DIR__ . '/..' . '/symfony/console/Command/ListCommand.php',
1225
  public static function getInitializer(ClassLoader $loader)
1226
  {
1227
  return \Closure::bind(function () use ($loader) {
1228
+ $loader->prefixLengthsPsr4 = ComposerStaticInit2159ad40a248aa7256850bbda617bbb4::$prefixLengthsPsr4;
1229
+ $loader->prefixDirsPsr4 = ComposerStaticInit2159ad40a248aa7256850bbda617bbb4::$prefixDirsPsr4;
1230
+ $loader->fallbackDirsPsr4 = ComposerStaticInit2159ad40a248aa7256850bbda617bbb4::$fallbackDirsPsr4;
1231
+ $loader->prefixesPsr0 = ComposerStaticInit2159ad40a248aa7256850bbda617bbb4::$prefixesPsr0;
1232
+ $loader->classMap = ComposerStaticInit2159ad40a248aa7256850bbda617bbb4::$classMap;
1233
 
1234
  }, null, ClassLoader::class);
1235
  }
vendor/composer/installed.json CHANGED
@@ -1,24 +1,24 @@
1
  [
2
  {
3
  "name": "cerdic/css-tidy",
4
- "version": "v1.5.7",
5
- "version_normalized": "1.5.7.0",
6
  "source": {
7
  "type": "git",
8
  "url": "https://github.com/Cerdic/CSSTidy.git",
9
- "reference": "226bca013a4dc58b6471931564c6b568af2b66e9"
10
  },
11
  "dist": {
12
  "type": "zip",
13
- "url": "https://api.github.com/repos/Cerdic/CSSTidy/zipball/226bca013a4dc58b6471931564c6b568af2b66e9",
14
- "reference": "226bca013a4dc58b6471931564c6b568af2b66e9",
15
  "shasum": ""
16
  },
17
  "require-dev": {
18
  "pear/text_diff": "^1.2",
19
  "simpletest/simpletest": "^1.1"
20
  },
21
- "time": "2018-04-10T09:09:46+00:00",
22
  "type": "library",
23
  "installation-source": "dist",
24
  "autoload": {
@@ -40,64 +40,6 @@
40
  ],
41
  "description": "CSSTidy is a CSS minifier"
42
  },
43
- {
44
- "name": "composer/ca-bundle",
45
- "version": "1.1.2",
46
- "version_normalized": "1.1.2.0",
47
- "source": {
48
- "type": "git",
49
- "url": "https://github.com/composer/ca-bundle.git",
50
- "reference": "46afded9720f40b9dc63542af4e3e43a1177acb0"
51
- },
52
- "dist": {
53
- "type": "zip",
54
- "url": "https://api.github.com/repos/composer/ca-bundle/zipball/46afded9720f40b9dc63542af4e3e43a1177acb0",
55
- "reference": "46afded9720f40b9dc63542af4e3e43a1177acb0",
56
- "shasum": ""
57
- },
58
- "require": {
59
- "ext-openssl": "*",
60
- "ext-pcre": "*",
61
- "php": "^5.3.2 || ^7.0"
62
- },
63
- "require-dev": {
64
- "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5",
65
- "psr/log": "^1.0",
66
- "symfony/process": "^2.5 || ^3.0 || ^4.0"
67
- },
68
- "time": "2018-08-08T08:57:40+00:00",
69
- "type": "library",
70
- "extra": {
71
- "branch-alias": {
72
- "dev-master": "1.x-dev"
73
- }
74
- },
75
- "installation-source": "dist",
76
- "autoload": {
77
- "psr-4": {
78
- "Composer\\CaBundle\\": "src"
79
- }
80
- },
81
- "notification-url": "https://packagist.org/downloads/",
82
- "license": [
83
- "MIT"
84
- ],
85
- "authors": [
86
- {
87
- "name": "Jordi Boggiano",
88
- "email": "j.boggiano@seld.be",
89
- "homepage": "http://seld.be"
90
- }
91
- ],
92
- "description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.",
93
- "keywords": [
94
- "cabundle",
95
- "cacert",
96
- "certificate",
97
- "ssl",
98
- "tls"
99
- ]
100
- },
101
  {
102
  "name": "j4mie/idiorm",
103
  "version": "v1.5.6",
@@ -227,6 +169,55 @@
227
  "paris"
228
  ]
229
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
230
  {
231
  "name": "monolog/monolog",
232
  "version": "1.23.0",
@@ -354,42 +345,41 @@
354
  ]
355
  },
356
  {
357
- "name": "nesbot/carbon",
358
- "version": "1.33.0",
359
- "version_normalized": "1.33.0.0",
360
  "source": {
361
  "type": "git",
362
- "url": "https://github.com/briannesbitt/Carbon.git",
363
- "reference": "55667c1007a99e82030874b1bb14d24d07108413"
364
  },
365
  "dist": {
366
  "type": "zip",
367
- "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/55667c1007a99e82030874b1bb14d24d07108413",
368
- "reference": "55667c1007a99e82030874b1bb14d24d07108413",
369
  "shasum": ""
370
  },
371
  "require": {
372
- "php": ">=5.3.9",
373
- "symfony/translation": "~2.6 || ~3.0 || ~4.0"
374
  },
375
- "require-dev": {
376
- "friendsofphp/php-cs-fixer": "~2",
377
- "phpunit/phpunit": "^4.8.35 || ^5.7"
378
  },
379
- "time": "2018-08-07T08:39:47+00:00",
380
  "type": "library",
381
  "extra": {
382
- "laravel": {
383
- "providers": [
384
- "Carbon\\Laravel\\ServiceProvider"
385
- ]
386
  }
387
  },
388
  "installation-source": "dist",
389
  "autoload": {
390
  "psr-4": {
391
- "": "src/"
392
- }
 
 
 
393
  },
394
  "notification-url": "https://packagist.org/downloads/",
395
  "license": [
@@ -397,48 +387,126 @@
397
  ],
398
  "authors": [
399
  {
400
- "name": "Brian Nesbitt",
401
- "email": "brian@nesbot.com",
402
- "homepage": "http://nesbot.com"
 
 
 
403
  }
404
  ],
405
- "description": "A simple API extension for DateTime.",
406
- "homepage": "http://carbon.nesbot.com",
407
  "keywords": [
408
- "date",
409
- "datetime",
410
- "time"
 
 
411
  ]
412
  },
413
  {
414
- "name": "psr/log",
415
- "version": "1.0.2",
416
- "version_normalized": "1.0.2.0",
417
  "source": {
418
  "type": "git",
419
- "url": "https://github.com/php-fig/log.git",
420
- "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d"
421
  },
422
  "dist": {
423
  "type": "zip",
424
- "url": "https://api.github.com/repos/php-fig/log/zipball/4ebe3a8bf773a19edfe0a84b6585ba3d401b724d",
425
- "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d",
426
  "shasum": ""
427
  },
428
  "require": {
429
- "php": ">=5.3.0"
 
430
  },
431
- "time": "2016-10-10T12:19:37+00:00",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
432
  "type": "library",
433
  "extra": {
434
  "branch-alias": {
435
- "dev-master": "1.0.x-dev"
436
  }
437
  },
438
  "installation-source": "dist",
439
  "autoload": {
440
  "psr-4": {
441
- "Psr\\Log\\": "Psr/Log/"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
442
  }
443
  },
444
  "notification-url": "https://packagist.org/downloads/",
@@ -447,16 +515,17 @@
447
  ],
448
  "authors": [
449
  {
450
- "name": "PHP-FIG",
451
- "homepage": "http://www.php-fig.org/"
 
452
  }
453
  ],
454
- "description": "Common interface for logging libraries",
455
- "homepage": "https://github.com/php-fig/log",
456
  "keywords": [
457
- "log",
458
- "psr",
459
- "psr-3"
460
  ]
461
  },
462
  {
@@ -506,212 +575,106 @@
506
  ]
507
  },
508
  {
509
- "name": "sensiolabs/security-checker",
510
- "version": "v4.1.8",
511
- "version_normalized": "4.1.8.0",
512
  "source": {
513
  "type": "git",
514
- "url": "https://github.com/sensiolabs/security-checker.git",
515
- "reference": "dc270d5fec418cc6ac983671dba5d80ffaffb142"
516
- },
517
- "dist": {
518
- "type": "zip",
519
- "url": "https://api.github.com/repos/sensiolabs/security-checker/zipball/dc270d5fec418cc6ac983671dba5d80ffaffb142",
520
- "reference": "dc270d5fec418cc6ac983671dba5d80ffaffb142",
521
- "shasum": ""
522
- },
523
- "require": {
524
- "composer/ca-bundle": "^1.0",
525
- "symfony/console": "~2.7|~3.0|~4.0"
526
- },
527
- "time": "2018-02-28T22:10:01+00:00",
528
- "bin": [
529
- "security-checker"
530
- ],
531
- "type": "library",
532
- "extra": {
533
- "branch-alias": {
534
- "dev-master": "4.1-dev"
535
- }
536
- },
537
- "installation-source": "dist",
538
- "autoload": {
539
- "psr-0": {
540
- "SensioLabs\\Security": ""
541
- }
542
- },
543
- "notification-url": "https://packagist.org/downloads/",
544
- "license": [
545
- "MIT"
546
- ],
547
- "authors": [
548
- {
549
- "name": "Fabien Potencier",
550
- "email": "fabien.potencier@gmail.com"
551
- }
552
- ],
553
- "description": "A security checker for your composer.lock"
554
- },
555
- {
556
- "name": "soundasleep/html2text",
557
- "version": "dev-master",
558
- "version_normalized": "9999999-dev",
559
- "source": {
560
- "type": "git",
561
- "url": "https://github.com/mailpoet/html2text.git",
562
- "reference": "95c5f266e7ea1a79b3879555cf27289985b1e4c7"
563
  },
564
  "dist": {
565
  "type": "zip",
566
- "url": "https://api.github.com/repos/mailpoet/html2text/zipball/95c5f266e7ea1a79b3879555cf27289985b1e4c7",
567
- "reference": "95c5f266e7ea1a79b3879555cf27289985b1e4c7",
568
  "shasum": ""
569
  },
570
  "require": {
571
- "ext-dom": "*",
572
- "ext-libxml": "*",
573
- "php": ">=5.3.2"
574
- },
575
- "require-dev": {
576
- "phpunit/phpunit": ">=4.0",
577
- "soundasleep/component-tests": "dev-master"
578
- },
579
- "time": "2018-04-08T14:18:46+00:00",
580
- "type": "library",
581
- "installation-source": "dist",
582
- "autoload": {
583
- "psr-4": {
584
- "Html2Text\\": "src"
585
- }
586
- },
587
- "license": [
588
- "EPL-1.0"
589
- ],
590
- "authors": [
591
- {
592
- "name": "Jevon Wright",
593
- "homepage": "https://jevon.org",
594
- "role": "Developer"
595
- }
596
- ],
597
- "description": "A PHP script to convert HTML into a plain text format",
598
- "homepage": "https://github.com/soundasleep/html2text",
599
- "keywords": [
600
- "email",
601
- "html",
602
- "php",
603
- "text"
604
- ],
605
- "support": {
606
- "email": "support@jevon.org",
607
- "source": "https://github.com/mailpoet/html2text/tree/master"
608
- }
609
- },
610
- {
611
- "name": "swiftmailer/swiftmailer",
612
- "version": "dev-tls",
613
- "version_normalized": "dev-tls",
614
- "source": {
615
- "type": "git",
616
- "url": "https://github.com/mailpoet/swiftmailer.git",
617
- "reference": "e6963324036afd178d3a8356e5c705ae4a442ef9"
618
- },
619
- "dist": {
620
- "type": "zip",
621
- "url": "https://api.github.com/repos/mailpoet/swiftmailer/zipball/e6963324036afd178d3a8356e5c705ae4a442ef9",
622
- "reference": "e6963324036afd178d3a8356e5c705ae4a442ef9",
623
- "shasum": ""
624
  },
625
- "require": {
626
- "php": ">=5.3.3"
627
  },
628
  "require-dev": {
629
- "mockery/mockery": "~0.9.1",
630
- "symfony/phpunit-bridge": "~3.2"
631
  },
632
- "time": "2018-07-09T16:02:27+00:00",
633
  "type": "library",
634
  "extra": {
635
  "branch-alias": {
636
- "dev-master": "5.4-dev"
637
  }
638
  },
639
  "installation-source": "dist",
640
  "autoload": {
641
- "files": [
642
- "lib/swift_required.php"
 
 
 
643
  ]
644
  },
645
- "autoload-dev": {
646
- "psr-0": {
647
- "Swift_": "tests/unit"
648
- }
649
- },
650
  "license": [
651
  "MIT"
652
  ],
653
  "authors": [
654
- {
655
- "name": "Chris Corbyn"
656
- },
657
  {
658
  "name": "Fabien Potencier",
659
  "email": "fabien@symfony.com"
 
 
 
 
660
  }
661
  ],
662
- "description": "Swiftmailer, free feature-rich PHP mailer",
663
- "homepage": "https://swiftmailer.symfony.com",
664
- "keywords": [
665
- "email",
666
- "mail",
667
- "mailer"
668
- ],
669
- "support": {
670
- "source": "https://github.com/mailpoet/swiftmailer/tree/tls"
671
- }
672
  },
673
  {
674
  "name": "symfony/console",
675
- "version": "v3.3.18",
676
- "version_normalized": "3.3.18.0",
677
  "source": {
678
  "type": "git",
679
  "url": "https://github.com/symfony/console.git",
680
- "reference": "af7ec995de93671c03cc1b4e3176c8588bc79dcc"
681
  },
682
  "dist": {
683
  "type": "zip",
684
- "url": "https://api.github.com/repos/symfony/console/zipball/af7ec995de93671c03cc1b4e3176c8588bc79dcc",
685
- "reference": "af7ec995de93671c03cc1b4e3176c8588bc79dcc",
686
  "shasum": ""
687
  },
688
  "require": {
689
  "php": "^5.5.9|>=7.0.8",
690
- "symfony/debug": "~2.8|~3.0",
691
  "symfony/polyfill-mbstring": "~1.0"
692
  },
693
  "conflict": {
694
- "symfony/dependency-injection": "<3.3"
 
695
  },
696
  "require-dev": {
697
  "psr/log": "~1.0",
698
- "symfony/config": "~3.3",
699
- "symfony/dependency-injection": "~3.3",
700
- "symfony/event-dispatcher": "~2.8|~3.0",
701
- "symfony/filesystem": "~2.8|~3.0",
702
- "symfony/process": "~2.8|~3.0"
703
  },
704
  "suggest": {
705
- "psr/log": "For using the console logger",
706
  "symfony/event-dispatcher": "",
707
- "symfony/filesystem": "",
708
  "symfony/process": ""
709
  },
710
- "time": "2018-01-29T09:02:23+00:00",
711
  "type": "library",
712
  "extra": {
713
  "branch-alias": {
714
- "dev-master": "3.3-dev"
715
  }
716
  },
717
  "installation-source": "dist",
@@ -741,45 +704,42 @@
741
  "homepage": "https://symfony.com"
742
  },
743
  {
744
- "name": "symfony/debug",
745
- "version": "v3.4.14",
746
- "version_normalized": "3.4.14.0",
747
  "source": {
748
  "type": "git",
749
- "url": "https://github.com/symfony/debug.git",
750
- "reference": "d5a058ff6ecad26b30c1ba452241306ea34c65cc"
751
  },
752
  "dist": {
753
  "type": "zip",
754
- "url": "https://api.github.com/repos/symfony/debug/zipball/d5a058ff6ecad26b30c1ba452241306ea34c65cc",
755
- "reference": "d5a058ff6ecad26b30c1ba452241306ea34c65cc",
756
  "shasum": ""
757
  },
758
  "require": {
759
- "php": "^5.5.9|>=7.0.8",
760
- "psr/log": "~1.0"
761
- },
762
- "conflict": {
763
- "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2"
764
  },
765
  "require-dev": {
766
- "symfony/http-kernel": "~2.8|~3.0|~4.0"
 
 
767
  },
768
- "time": "2018-07-26T11:19:56+00:00",
769
  "type": "library",
770
  "extra": {
771
  "branch-alias": {
772
- "dev-master": "3.4-dev"
773
  }
774
  },
775
  "installation-source": "dist",
776
  "autoload": {
777
  "psr-4": {
778
- "Symfony\\Component\\Debug\\": ""
779
- },
780
- "exclude-from-classmap": [
781
- "/Tests/"
782
- ]
783
  },
784
  "notification-url": "https://packagist.org/downloads/",
785
  "license": [
@@ -787,53 +747,55 @@
787
  ],
788
  "authors": [
789
  {
790
- "name": "Fabien Potencier",
791
- "email": "fabien@symfony.com"
792
- },
793
- {
794
- "name": "Symfony Community",
795
- "homepage": "https://symfony.com/contributors"
796
  }
797
  ],
798
- "description": "Symfony Debug Component",
799
- "homepage": "https://symfony.com"
 
 
 
 
 
 
800
  },
801
  {
802
- "name": "symfony/polyfill-ctype",
803
- "version": "v1.9.0",
804
- "version_normalized": "1.9.0.0",
805
  "source": {
806
  "type": "git",
807
- "url": "https://github.com/symfony/polyfill-ctype.git",
808
- "reference": "e3d826245268269cd66f8326bd8bc066687b4a19"
809
  },
810
  "dist": {
811
  "type": "zip",
812
- "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/e3d826245268269cd66f8326bd8bc066687b4a19",
813
- "reference": "e3d826245268269cd66f8326bd8bc066687b4a19",
814
  "shasum": ""
815
  },
816
  "require": {
817
- "php": ">=5.3.3"
818
- },
819
- "suggest": {
820
- "ext-ctype": "For best performance"
821
  },
822
- "time": "2018-08-06T14:22:27+00:00",
 
 
 
823
  "type": "library",
824
  "extra": {
825
  "branch-alias": {
826
- "dev-master": "1.9-dev"
827
  }
828
  },
829
  "installation-source": "dist",
830
  "autoload": {
831
  "psr-4": {
832
- "Symfony\\Polyfill\\Ctype\\": ""
833
- },
834
- "files": [
835
- "bootstrap.php"
836
- ]
837
  },
838
  "notification-url": "https://packagist.org/downloads/",
839
  "license": [
@@ -841,83 +803,129 @@
841
  ],
842
  "authors": [
843
  {
844
- "name": "Symfony Community",
845
- "homepage": "https://symfony.com/contributors"
846
- },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
847
  {
848
- "name": "Gert de Pagter",
849
- "email": "BackEndTea@gmail.com"
 
850
  }
851
  ],
852
- "description": "Symfony polyfill for ctype functions",
853
- "homepage": "https://symfony.com",
854
  "keywords": [
855
- "compatibility",
856
- "ctype",
857
- "polyfill",
858
- "portable"
859
- ]
 
 
 
 
860
  },
861
  {
862
- "name": "symfony/polyfill-mbstring",
863
- "version": "v1.8.0",
864
- "version_normalized": "1.8.0.0",
865
  "source": {
866
  "type": "git",
867
- "url": "https://github.com/symfony/polyfill-mbstring.git",
868
- "reference": "3296adf6a6454a050679cde90f95350ad604b171"
869
  },
870
  "dist": {
871
  "type": "zip",
872
- "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/3296adf6a6454a050679cde90f95350ad604b171",
873
- "reference": "3296adf6a6454a050679cde90f95350ad604b171",
874
  "shasum": ""
875
  },
876
  "require": {
877
  "php": ">=5.3.3"
878
  },
879
- "suggest": {
880
- "ext-mbstring": "For best performance"
 
881
  },
882
- "time": "2018-04-26T10:06:28+00:00",
883
  "type": "library",
884
  "extra": {
885
  "branch-alias": {
886
- "dev-master": "1.8-dev"
887
  }
888
  },
889
  "installation-source": "dist",
890
  "autoload": {
891
- "psr-4": {
892
- "Symfony\\Polyfill\\Mbstring\\": ""
893
- },
894
  "files": [
895
- "bootstrap.php"
896
  ]
897
  },
898
- "notification-url": "https://packagist.org/downloads/",
 
 
 
 
899
  "license": [
900
  "MIT"
901
  ],
902
  "authors": [
903
  {
904
- "name": "Nicolas Grekas",
905
- "email": "p@tchwork.com"
906
  },
907
  {
908
- "name": "Symfony Community",
909
- "homepage": "https://symfony.com/contributors"
910
  }
911
  ],
912
- "description": "Symfony polyfill for the Mbstring extension",
913
- "homepage": "https://symfony.com",
914
  "keywords": [
915
- "compatibility",
916
- "mbstring",
917
- "polyfill",
918
- "portable",
919
- "shim"
920
- ]
 
921
  },
922
  {
923
  "name": "symfony/polyfill-php72",
@@ -976,72 +984,6 @@
976
  "shim"
977
  ]
978
  },
979
- {
980
- "name": "symfony/translation",
981
- "version": "v2.8.44",
982
- "version_normalized": "2.8.44.0",
983
- "source": {
984
- "type": "git",
985
- "url": "https://github.com/symfony/translation.git",
986
- "reference": "12ad0a708ec55fb80cac9e809c5b56ddd5417d6a"
987
- },
988
- "dist": {
989
- "type": "zip",
990
- "url": "https://api.github.com/repos/symfony/translation/zipball/12ad0a708ec55fb80cac9e809c5b56ddd5417d6a",
991
- "reference": "12ad0a708ec55fb80cac9e809c5b56ddd5417d6a",
992
- "shasum": ""
993
- },
994
- "require": {
995
- "php": ">=5.3.9",
996
- "symfony/polyfill-mbstring": "~1.0"
997
- },
998
- "conflict": {
999
- "symfony/config": "<2.7"
1000
- },
1001
- "require-dev": {
1002
- "psr/log": "~1.0",
1003
- "symfony/config": "~2.8",
1004
- "symfony/intl": "~2.7.25|^2.8.18|~3.2.5",
1005
- "symfony/yaml": "~2.2|~3.0.0"
1006
- },
1007
- "suggest": {
1008
- "psr/log-implementation": "To use logging capability in translator",
1009
- "symfony/config": "",
1010
- "symfony/yaml": ""
1011
- },
1012
- "time": "2018-07-26T11:13:39+00:00",
1013
- "type": "library",
1014
- "extra": {
1015
- "branch-alias": {
1016
- "dev-master": "2.8-dev"
1017
- }
1018
- },
1019
- "installation-source": "dist",
1020
- "autoload": {
1021
- "psr-4": {
1022
- "Symfony\\Component\\Translation\\": ""
1023
- },
1024
- "exclude-from-classmap": [
1025
- "/Tests/"
1026
- ]
1027
- },
1028
- "notification-url": "https://packagist.org/downloads/",
1029
- "license": [
1030
- "MIT"
1031
- ],
1032
- "authors": [
1033
- {
1034
- "name": "Fabien Potencier",
1035
- "email": "fabien@symfony.com"
1036
- },
1037
- {
1038
- "name": "Symfony Community",
1039
- "homepage": "https://symfony.com/contributors"
1040
- }
1041
- ],
1042
- "description": "Symfony Translation Component",
1043
- "homepage": "https://symfony.com"
1044
- },
1045
  {
1046
  "name": "tburry/pquery",
1047
  "version": "v1.1.1",
@@ -1096,6 +1038,66 @@
1096
  "php"
1097
  ]
1098
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1099
  {
1100
  "name": "twig/twig",
1101
  "version": "v1.35.4",
1
  [
2
  {
3
  "name": "cerdic/css-tidy",
4
+ "version": "v1.6.4",
5
+ "version_normalized": "1.6.4.0",
6
  "source": {
7
  "type": "git",
8
  "url": "https://github.com/Cerdic/CSSTidy.git",
9
+ "reference": "ba7eae1ea2adeaf21e0e892ba3fc67dfb913f85d"
10
  },
11
  "dist": {
12
  "type": "zip",
13
+ "url": "https://api.github.com/repos/Cerdic/CSSTidy/zipball/ba7eae1ea2adeaf21e0e892ba3fc67dfb913f85d",
14
+ "reference": "ba7eae1ea2adeaf21e0e892ba3fc67dfb913f85d",
15
  "shasum": ""
16
  },
17
  "require-dev": {
18
  "pear/text_diff": "^1.2",
19
  "simpletest/simpletest": "^1.1"
20
  },
21
+ "time": "2018-09-29T12:26:47+00:00",
22
  "type": "library",
23
  "installation-source": "dist",
24
  "autoload": {
40
  ],
41
  "description": "CSSTidy is a CSS minifier"
42
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
43
  {
44
  "name": "j4mie/idiorm",
45
  "version": "v1.5.6",
169
  "paris"
170
  ]
171
  },
172
+ {
173
+ "name": "psr/log",
174
+ "version": "1.0.2",
175
+ "version_normalized": "1.0.2.0",
176
+ "source": {
177
+ "type": "git",
178
+ "url": "https://github.com/php-fig/log.git",
179
+ "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d"
180
+ },
181
+ "dist": {
182
+ "type": "zip",
183
+ "url": "https://api.github.com/repos/php-fig/log/zipball/4ebe3a8bf773a19edfe0a84b6585ba3d401b724d",
184
+ "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d",
185
+ "shasum": ""
186
+ },
187
+ "require": {
188
+ "php": ">=5.3.0"
189
+ },
190
+ "time": "2016-10-10T12:19:37+00:00",
191
+ "type": "library",
192
+ "extra": {
193
+ "branch-alias": {
194
+ "dev-master": "1.0.x-dev"
195
+ }
196
+ },
197
+ "installation-source": "dist",
198
+ "autoload": {
199
+ "psr-4": {
200
+ "Psr\\Log\\": "Psr/Log/"
201
+ }
202
+ },
203
+ "notification-url": "https://packagist.org/downloads/",
204
+ "license": [
205
+ "MIT"
206
+ ],
207
+ "authors": [
208
+ {
209
+ "name": "PHP-FIG",
210
+ "homepage": "http://www.php-fig.org/"
211
+ }
212
+ ],
213
+ "description": "Common interface for logging libraries",
214
+ "homepage": "https://github.com/php-fig/log",
215
+ "keywords": [
216
+ "log",
217
+ "psr",
218
+ "psr-3"
219
+ ]
220
+ },
221
  {
222
  "name": "monolog/monolog",
223
  "version": "1.23.0",
345
  ]
346
  },
347
  {
348
+ "name": "symfony/polyfill-mbstring",
349
+ "version": "v1.9.0",
350
+ "version_normalized": "1.9.0.0",
351
  "source": {
352
  "type": "git",
353
+ "url": "https://github.com/symfony/polyfill-mbstring.git",
354
+ "reference": "d0cd638f4634c16d8df4508e847f14e9e43168b8"
355
  },
356
  "dist": {
357
  "type": "zip",
358
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/d0cd638f4634c16d8df4508e847f14e9e43168b8",
359
+ "reference": "d0cd638f4634c16d8df4508e847f14e9e43168b8",
360
  "shasum": ""
361
  },
362
  "require": {
363
+ "php": ">=5.3.3"
 
364
  },
365
+ "suggest": {
366
+ "ext-mbstring": "For best performance"
 
367
  },
368
+ "time": "2018-08-06T14:22:27+00:00",
369
  "type": "library",
370
  "extra": {
371
+ "branch-alias": {
372
+ "dev-master": "1.9-dev"
 
 
373
  }
374
  },
375
  "installation-source": "dist",
376
  "autoload": {
377
  "psr-4": {
378
+ "Symfony\\Polyfill\\Mbstring\\": ""
379
+ },
380
+ "files": [
381
+ "bootstrap.php"
382
+ ]
383
  },
384
  "notification-url": "https://packagist.org/downloads/",
385
  "license": [
387
  ],
388
  "authors": [
389
  {
390
+ "name": "Nicolas Grekas",
391
+ "email": "p@tchwork.com"
392
+ },
393
+ {
394
+ "name": "Symfony Community",
395
+ "homepage": "https://symfony.com/contributors"
396
  }
397
  ],
398
+ "description": "Symfony polyfill for the Mbstring extension",
399
+ "homepage": "https://symfony.com",
400
  "keywords": [
401
+ "compatibility",
402
+ "mbstring",
403
+ "polyfill",
404
+ "portable",
405
+ "shim"
406
  ]
407
  },
408
  {
409
+ "name": "symfony/translation",
410
+ "version": "v2.8.46",
411
+ "version_normalized": "2.8.46.0",
412
  "source": {
413
  "type": "git",
414
+ "url": "https://github.com/symfony/translation.git",
415
+ "reference": "59b4debd89c156fd753343fcc1ca36aa5bc2d0f4"
416
  },
417
  "dist": {
418
  "type": "zip",
419
+ "url": "https://api.github.com/repos/symfony/translation/zipball/59b4debd89c156fd753343fcc1ca36aa5bc2d0f4",
420
+ "reference": "59b4debd89c156fd753343fcc1ca36aa5bc2d0f4",
421
  "shasum": ""
422
  },
423
  "require": {
424
+ "php": ">=5.3.9",
425
+ "symfony/polyfill-mbstring": "~1.0"
426
  },
427
+ "conflict": {
428
+ "symfony/config": "<2.7"
429
+ },
430
+ "require-dev": {
431
+ "psr/log": "~1.0",
432
+ "symfony/config": "~2.8",
433
+ "symfony/intl": "~2.7.25|^2.8.18|~3.2.5",
434
+ "symfony/yaml": "~2.2|~3.0.0"
435
+ },
436
+ "suggest": {
437
+ "psr/log-implementation": "To use logging capability in translator",
438
+ "symfony/config": "",
439
+ "symfony/yaml": ""
440
+ },
441
+ "time": "2018-09-21T12:46:38+00:00",
442
  "type": "library",
443
  "extra": {
444
  "branch-alias": {
445
+ "dev-master": "2.8-dev"
446
  }
447
  },
448
  "installation-source": "dist",
449
  "autoload": {
450
  "psr-4": {
451
+ "Symfony\\Component\\Translation\\": ""
452
+ },
453
+ "exclude-from-classmap": [
454
+ "/Tests/"
455
+ ]
456
+ },
457
+ "notification-url": "https://packagist.org/downloads/",
458
+ "license": [
459
+ "MIT"
460
+ ],
461
+ "authors": [
462
+ {
463
+ "name": "Fabien Potencier",
464
+ "email": "fabien@symfony.com"
465
+ },
466
+ {
467
+ "name": "Symfony Community",
468
+ "homepage": "https://symfony.com/contributors"
469
+ }
470
+ ],
471
+ "description": "Symfony Translation Component",
472
+ "homepage": "https://symfony.com"
473
+ },
474
+ {
475
+ "name": "nesbot/carbon",
476
+ "version": "1.34.0",
477
+ "version_normalized": "1.34.0.0",
478
+ "source": {
479
+ "type": "git",
480
+ "url": "https://github.com/briannesbitt/Carbon.git",
481
+ "reference": "1dbd3cb01c5645f3e7deda7aa46ef780d95fcc33"
482
+ },
483
+ "dist": {
484
+ "type": "zip",
485
+ "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/1dbd3cb01c5645f3e7deda7aa46ef780d95fcc33",
486
+ "reference": "1dbd3cb01c5645f3e7deda7aa46ef780d95fcc33",
487
+ "shasum": ""
488
+ },
489
+ "require": {
490
+ "php": ">=5.3.9",
491
+ "symfony/translation": "~2.6 || ~3.0 || ~4.0"
492
+ },
493
+ "require-dev": {
494
+ "friendsofphp/php-cs-fixer": "~2",
495
+ "phpunit/phpunit": "^4.8.35 || ^5.7"
496
+ },
497
+ "time": "2018-09-20T19:36:25+00:00",
498
+ "type": "library",
499
+ "extra": {
500
+ "laravel": {
501
+ "providers": [
502
+ "Carbon\\Laravel\\ServiceProvider"
503
+ ]
504
+ }
505
+ },
506
+ "installation-source": "dist",
507
+ "autoload": {
508
+ "psr-4": {
509
+ "": "src/"
510
  }
511
  },
512
  "notification-url": "https://packagist.org/downloads/",
515
  ],
516
  "authors": [
517
  {
518
+ "name": "Brian Nesbitt",
519
+ "email": "brian@nesbot.com",
520
+ "homepage": "http://nesbot.com"
521
  }
522
  ],
523
+ "description": "A simple API extension for DateTime.",
524
+ "homepage": "http://carbon.nesbot.com",
525
  "keywords": [
526
+ "date",
527
+ "datetime",
528
+ "time"
529
  ]
530
  },
531
  {
575
  ]
576
  },
577
  {
578
+ "name": "symfony/debug",
579
+ "version": "v3.4.17",
580
+ "version_normalized": "3.4.17.0",
581
  "source": {
582
  "type": "git",
583
+ "url": "https://github.com/symfony/debug.git",
584
+ "reference": "0a612e9dfbd2ccce03eb174365f31ecdca930ff6"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
585
  },
586
  "dist": {
587
  "type": "zip",
588
+ "url": "https://api.github.com/repos/symfony/debug/zipball/0a612e9dfbd2ccce03eb174365f31ecdca930ff6",
589
+ "reference": "0a612e9dfbd2ccce03eb174365f31ecdca930ff6",
590
  "shasum": ""
591
  },
592
  "require": {
593
+ "php": "^5.5.9|>=7.0.8",
594
+ "psr/log": "~1.0"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
595
  },
596
+ "conflict": {
597
+ "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2"
598
  },
599
  "require-dev": {
600
+ "symfony/http-kernel": "~2.8|~3.0|~4.0"
 
601
  },
602
+ "time": "2018-10-02T16:33:53+00:00",
603
  "type": "library",
604
  "extra": {
605
  "branch-alias": {
606
+ "dev-master": "3.4-dev"
607
  }
608
  },
609
  "installation-source": "dist",
610
  "autoload": {
611
+ "psr-4": {
612
+ "Symfony\\Component\\Debug\\": ""
613
+ },
614
+ "exclude-from-classmap": [
615
+ "/Tests/"
616
  ]
617
  },
618
+ "notification-url": "https://packagist.org/downloads/",
 
 
 
 
619
  "license": [
620
  "MIT"
621
  ],
622
  "authors": [
 
 
 
623
  {
624
  "name": "Fabien Potencier",
625
  "email": "fabien@symfony.com"
626
+ },
627
+ {
628
+ "name": "Symfony Community",
629
+ "homepage": "https://symfony.com/contributors"
630
  }
631
  ],
632
+ "description": "Symfony Debug Component",
633
+ "homepage": "https://symfony.com"
 
 
 
 
 
 
 
 
634
  },
635
  {
636
  "name": "symfony/console",
637
+ "version": "v3.4.17",
638
+ "version_normalized": "3.4.17.0",
639
  "source": {
640
  "type": "git",
641
  "url": "https://github.com/symfony/console.git",
642
+ "reference": "3b2b415d4c48fbefca7dc742aa0a0171bfae4e0b"
643
  },
644
  "dist": {
645
  "type": "zip",
646
+ "url": "https://api.github.com/repos/symfony/console/zipball/3b2b415d4c48fbefca7dc742aa0a0171bfae4e0b",
647
+ "reference": "3b2b415d4c48fbefca7dc742aa0a0171bfae4e0b",
648
  "shasum": ""
649
  },
650
  "require": {
651
  "php": "^5.5.9|>=7.0.8",
652
+ "symfony/debug": "~2.8|~3.0|~4.0",
653
  "symfony/polyfill-mbstring": "~1.0"
654
  },
655
  "conflict": {
656
+ "symfony/dependency-injection": "<3.4",
657
+ "symfony/process": "<3.3"
658
  },
659
  "require-dev": {
660
  "psr/log": "~1.0",
661
+ "symfony/config": "~3.3|~4.0",
662
+ "symfony/dependency-injection": "~3.4|~4.0",
663
+ "symfony/event-dispatcher": "~2.8|~3.0|~4.0",
664
+ "symfony/lock": "~3.4|~4.0",
665
+ "symfony/process": "~3.3|~4.0"
666
  },
667
  "suggest": {
668
+ "psr/log-implementation": "For using the console logger",
669
  "symfony/event-dispatcher": "",
670
+ "symfony/lock": "",
671
  "symfony/process": ""
672
  },
673
+ "time": "2018-10-02T16:33:53+00:00",
674
  "type": "library",
675
  "extra": {
676
  "branch-alias": {
677
+ "dev-master": "3.4-dev"
678
  }
679
  },
680
  "installation-source": "dist",
704
  "homepage": "https://symfony.com"
705
  },
706
  {
707
+ "name": "composer/ca-bundle",
708
+ "version": "1.1.2",
709
+ "version_normalized": "1.1.2.0",
710
  "source": {
711
  "type": "git",
712
+ "url": "https://github.com/composer/ca-bundle.git",
713
+ "reference": "46afded9720f40b9dc63542af4e3e43a1177acb0"
714
  },
715
  "dist": {
716
  "type": "zip",
717
+ "url": "https://api.github.com/repos/composer/ca-bundle/zipball/46afded9720f40b9dc63542af4e3e43a1177acb0",
718
+ "reference": "46afded9720f40b9dc63542af4e3e43a1177acb0",
719
  "shasum": ""
720
  },
721
  "require": {
722
+ "ext-openssl": "*",
723
+ "ext-pcre": "*",
724
+ "php": "^5.3.2 || ^7.0"
 
 
725
  },
726
  "require-dev": {
727
+ "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5",
728
+ "psr/log": "^1.0",
729
+ "symfony/process": "^2.5 || ^3.0 || ^4.0"
730
  },
731
+ "time": "2018-08-08T08:57:40+00:00",
732
  "type": "library",
733
  "extra": {
734
  "branch-alias": {
735
+ "dev-master": "1.x-dev"
736
  }
737
  },
738
  "installation-source": "dist",
739
  "autoload": {
740
  "psr-4": {
741
+ "Composer\\CaBundle\\": "src"
742
+ }
 
 
 
743
  },
744
  "notification-url": "https://packagist.org/downloads/",
745
  "license": [
747
  ],
748
  "authors": [
749
  {
750
+ "name": "Jordi Boggiano",
751
+ "email": "j.boggiano@seld.be",
752
+ "homepage": "http://seld.be"
 
 
 
753
  }
754
  ],
755
+ "description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.",
756
+ "keywords": [
757
+ "cabundle",
758
+ "cacert",
759
+ "certificate",
760
+ "ssl",
761
+ "tls"
762
+ ]
763
  },
764
  {
765
+ "name": "sensiolabs/security-checker",
766
+ "version": "v5.0.0",
767
+ "version_normalized": "5.0.0.0",
768
  "source": {
769
  "type": "git",
770
+ "url": "https://github.com/sensiolabs/security-checker.git",
771
+ "reference": "df4625e39868ecf4e868355caf45352f566791db"
772
  },
773
  "dist": {
774
  "type": "zip",
775
+ "url": "https://api.github.com/repos/sensiolabs/security-checker/zipball/df4625e39868ecf4e868355caf45352f566791db",
776
+ "reference": "df4625e39868ecf4e868355caf45352f566791db",
777
  "shasum": ""
778
  },
779
  "require": {
780
+ "composer/ca-bundle": "^1.0",
781
+ "php": ">=5.5.9",
782
+ "symfony/console": "~2.7|~3.0|~4.0"
 
783
  },
784
+ "time": "2018-09-04T07:02:17+00:00",
785
+ "bin": [
786
+ "security-checker"
787
+ ],
788
  "type": "library",
789
  "extra": {
790
  "branch-alias": {
791
+ "dev-master": "5.0-dev"
792
  }
793
  },
794
  "installation-source": "dist",
795
  "autoload": {
796
  "psr-4": {
797
+ "SensioLabs\\Security\\": "SensioLabs/Security"
798
+ }
 
 
 
799
  },
800
  "notification-url": "https://packagist.org/downloads/",
801
  "license": [
803
  ],
804
  "authors": [
805
  {
806
+ "name": "Fabien Potencier",
807
+ "email": "fabien.potencier@gmail.com"
808
+ }
809
+ ],
810
+ "description": "A security checker for your composer.lock"
811
+ },
812
+ {
813
+ "name": "soundasleep/html2text",
814
+ "version": "dev-master",
815
+ "version_normalized": "9999999-dev",
816
+ "source": {
817
+ "type": "git",
818
+ "url": "https://github.com/mailpoet/html2text.git",
819
+ "reference": "95c5f266e7ea1a79b3879555cf27289985b1e4c7"
820
+ },
821
+ "dist": {
822
+ "type": "zip",
823
+ "url": "https://api.github.com/repos/mailpoet/html2text/zipball/95c5f266e7ea1a79b3879555cf27289985b1e4c7",
824
+ "reference": "95c5f266e7ea1a79b3879555cf27289985b1e4c7",
825
+ "shasum": ""
826
+ },
827
+ "require": {
828
+ "ext-dom": "*",
829
+ "ext-libxml": "*",
830
+ "php": ">=5.3.2"
831
+ },
832
+ "require-dev": {
833
+ "phpunit/phpunit": ">=4.0",
834
+ "soundasleep/component-tests": "dev-master"
835
+ },
836
+ "time": "2018-04-08T14:18:46+00:00",
837
+ "type": "library",
838
+ "installation-source": "dist",
839
+ "autoload": {
840
+ "psr-4": {
841
+ "Html2Text\\": "src"
842
+ }
843
+ },
844
+ "license": [
845
+ "EPL-1.0"
846
+ ],
847
+ "authors": [
848
  {
849
+ "name": "Jevon Wright",
850
+ "homepage": "https://jevon.org",
851
+ "role": "Developer"
852
  }
853
  ],
854
+ "description": "A PHP script to convert HTML into a plain text format",
855
+ "homepage": "https://github.com/soundasleep/html2text",
856
  "keywords": [
857
+ "email",
858
+ "html",
859
+ "php",
860
+ "text"
861
+ ],
862
+ "support": {
863
+ "email": "support@jevon.org",
864
+ "source": "https://github.com/mailpoet/html2text/tree/master"
865
+ }
866
  },
867
  {
868
+ "name": "swiftmailer/swiftmailer",
869
+ "version": "dev-tls",
870
+ "version_normalized": "dev-tls",
871
  "source": {
872
  "type": "git",
873
+ "url": "https://github.com/mailpoet/swiftmailer.git",
874
+ "reference": "e6963324036afd178d3a8356e5c705ae4a442ef9"
875
  },
876
  "dist": {
877
  "type": "zip",
878
+ "url": "https://api.github.com/repos/mailpoet/swiftmailer/zipball/e6963324036afd178d3a8356e5c705ae4a442ef9",
879
+ "reference": "e6963324036afd178d3a8356e5c705ae4a442ef9",
880
  "shasum": ""
881
  },
882
  "require": {
883
  "php": ">=5.3.3"
884
  },
885
+ "require-dev": {
886
+ "mockery/mockery": "~0.9.1",
887
+ "symfony/phpunit-bridge": "~3.2"
888
  },
889
+ "time": "2018-07-09T16:02:27+00:00",
890
  "type": "library",
891
  "extra": {
892
  "branch-alias": {
893
+ "dev-master": "5.4-dev"
894
  }
895
  },
896
  "installation-source": "dist",
897
  "autoload": {
 
 
 
898
  "files": [
899
+ "lib/swift_required.php"
900
  ]
901
  },
902
+ "autoload-dev": {
903
+ "psr-0": {
904
+ "Swift_": "tests/unit"
905
+ }
906
+ },
907
  "license": [
908
  "MIT"
909
  ],
910
  "authors": [
911
  {
912
+ "name": "Chris Corbyn"
 
913
  },
914
  {
915
+ "name": "Fabien Potencier",
916
+ "email": "fabien@symfony.com"
917
  }
918
  ],
919
+ "description": "Swiftmailer, free feature-rich PHP mailer",
920
+ "homepage": "https://swiftmailer.symfony.com",
921
  "keywords": [
922
+ "email",
923
+ "mail",
924
+ "mailer"
925
+ ],
926
+ "support": {
927
+ "source": "https://github.com/mailpoet/swiftmailer/tree/tls"
928
+ }
929
  },
930
  {
931
  "name": "symfony/polyfill-php72",
984
  "shim"
985
  ]
986
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
987
  {
988
  "name": "tburry/pquery",
989
  "version": "v1.1.1",
1038
  "php"
1039
  ]
1040
  },
1041
+ {
1042
+ "name": "symfony/polyfill-ctype",
1043
+ "version": "v1.9.0",
1044
+ "version_normalized": "1.9.0.0",
1045
+ "source": {
1046
+ "type": "git",
1047
+ "url": "https://github.com/symfony/polyfill-ctype.git",
1048
+ "reference": "e3d826245268269cd66f8326bd8bc066687b4a19"
1049
+ },
1050
+ "dist": {
1051
+ "type": "zip",
1052
+ "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/e3d826245268269cd66f8326bd8bc066687b4a19",
1053
+ "reference": "e3d826245268269cd66f8326bd8bc066687b4a19",
1054
+ "shasum": ""
1055
+ },
1056
+ "require": {
1057
+ "php": ">=5.3.3"
1058
+ },
1059
+ "suggest": {
1060
+ "ext-ctype": "For best performance"
1061
+ },
1062
+ "time": "2018-08-06T14:22:27+00:00",
1063
+ "type": "library",
1064
+ "extra": {
1065
+ "branch-alias": {
1066
+ "dev-master": "1.9-dev"
1067
+ }
1068
+ },
1069
+ "installation-source": "dist",
1070
+ "autoload": {
1071
+ "psr-4": {
1072
+ "Symfony\\Polyfill\\Ctype\\": ""
1073
+ },
1074
+ "files": [
1075
+ "bootstrap.php"
1076
+ ]
1077
+ },
1078
+ "notification-url": "https://packagist.org/downloads/",
1079
+ "license": [
1080
+ "MIT"
1081
+ ],
1082
+ "authors": [
1083
+ {
1084
+ "name": "Symfony Community",
1085
+ "homepage": "https://symfony.com/contributors"
1086
+ },
1087
+ {
1088
+ "name": "Gert de Pagter",
1089
+ "email": "BackEndTea@gmail.com"
1090
+ }
1091
+ ],
1092
+ "description": "Symfony polyfill for ctype functions",
1093
+ "homepage": "https://symfony.com",
1094
+ "keywords": [
1095
+ "compatibility",
1096
+ "ctype",
1097
+ "polyfill",
1098
+ "portable"
1099
+ ]
1100
+ },
1101
  {
1102
  "name": "twig/twig",
1103
  "version": "v1.35.4",
vendor/nesbot/carbon/src/Carbon/Lang/ru.php CHANGED
@@ -11,19 +11,19 @@
11
 
12
  return array(
13
  'year' => ':count год|:count года|:count лет',
14
- 'y' => ':count год|:count года|:count лет',
15
  'month' => ':count месяц|:count месяца|:count месяцев',
16
- 'm' => ':count месяц|:count месяца|:count месяцев',
17
  'week' => ':count неделю|:count недели|:count недель',
18
- 'w' => ':count неделю|:count недели|:count недель',
19
  'day' => ':count день|:count дня|:count дней',
20
- 'd' => ':count день|:count дня|:count дней',
21
  'hour' => ':count час|:count часа|:count часов',
22
- 'h' => ':count час|:count часа|:count часов',
23
  'minute' => ':count минуту|:count минуты|:count минут',
24
- 'min' => ':count минуту|:count минуты|:count минут',
25
  'second' => ':count секунду|:count секунды|:count секунд',
26
- 's' => ':count секунду|:count секунды|:count секунд',
27
  'ago' => ':time назад',
28
  'from_now' => 'через :time',
29
  'after' => ':time после',
11
 
12
  return array(
13
  'year' => ':count год|:count года|:count лет',
14
+ 'y' => ':count г|:count г|:count л',
15
  'month' => ':count месяц|:count месяца|:count месяцев',
16
+ 'm' => ':count м|:count м|:count м',
17
  'week' => ':count неделю|:count недели|:count недель',
18
+ 'w' => ':count н|:count н|:count н',
19
  'day' => ':count день|:count дня|:count дней',
20
+ 'd' => ':count д|:count д|:count д',
21
  'hour' => ':count час|:count часа|:count часов',
22
+ 'h' => ':count ч|:count ч|:count ч',
23
  'minute' => ':count минуту|:count минуты|:count минут',
24
+ 'min' => ':count мин|:count мин|:count мин',
25
  'second' => ':count секунду|:count секунды|:count секунд',
26
+ 's' => ':count с|:count с|:count с',
27
  'ago' => ':time назад',
28
  'from_now' => 'через :time',
29
  'after' => ':time после',
vendor/nesbot/carbon/src/JsonSerializable.php CHANGED
@@ -1,16 +1,18 @@
1
  <?php
2
 
3
- interface JsonSerializable
4
- {
5
- /**
6
- * Specify data which should be serialized to JSON.
7
- *
8
- * @link http://php.net/manual/en/jsonserializable.jsonserialize.php
9
- *
10
- * @return mixed data which can be serialized by <b>json_encode</b>,
11
- * which is a value of any type other than a resource.
12
- *
13
- * @since 5.4.0
14
- */
15
- public function jsonSerialize();
 
 
16
  }
1
  <?php
2
 
3
+ if (!interface_exists('JsonSerializable')) {
4
+ interface JsonSerializable
5
+ {
6
+ /**
7
+ * Specify data which should be serialized to JSON.
8
+ *
9
+ * @link http://php.net/manual/en/jsonserializable.jsonserialize.php
10
+ *
11
+ * @return mixed data which can be serialized by <b>json_encode</b>,
12
+ * which is a value of any type other than a resource.
13
+ *
14
+ * @since 5.4.0
15
+ */
16
+ public function jsonSerialize();
17
+ }
18
  }
vendor/sensiolabs/security-checker/SensioLabs/Security/Command/SecurityCheckerCommand.php CHANGED
@@ -18,9 +18,6 @@ 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
  {
@@ -42,12 +39,13 @@ class SecurityCheckerCommand extends Command
42
  {
43
  $this
44
  ->setName('security:check')
45
- ->setDefinition(array(
46
  new InputArgument('lockfile', InputArgument::OPTIONAL, 'The path to the composer.lock file', 'composer.lock'),
47
- new InputOption('format', '', InputOption::VALUE_REQUIRED, 'The output format', 'text'),
48
  new InputOption('end-point', '', InputOption::VALUE_REQUIRED, 'The security checker server URL'),
49
  new InputOption('timeout', '', InputOption::VALUE_REQUIRED, 'The HTTP timeout in seconds'),
50
- ))
 
51
  ->setDescription('Checks security issues in your project dependencies')
52
  ->setHelp(<<<EOF
53
  The <info>%command.name%</info> command looks for security issues in the
@@ -81,35 +79,21 @@ EOF
81
  $this->checker->getCrawler()->setTimeout($timeout);
82
  }
83
 
 
 
 
 
84
  try {
85
- $vulnerabilities = $this->checker->check($input->getArgument('lockfile'));
86
  } catch (ExceptionInterface $e) {
87
  $output->writeln($this->getHelperSet()->get('formatter')->formatBlock($e->getMessage(), 'error', true));
88
 
89
  return 1;
90
  }
91
 
92
- switch ($input->getOption('format')) {
93
- case 'json':
94
- $formatter = new JsonFormatter();
95
- break;
96
- case 'simple':
97
- $formatter = new SimpleFormatter($this->getHelperSet()->get('formatter'));
98
- break;
99
- case 'text':
100
- default:
101
- $formatter = new TextFormatter($this->getHelperSet()->get('formatter'));
102
- }
103
-
104
- if (!is_array($vulnerabilities)) {
105
- $output->writeln($this->getHelperSet()->get('formatter')->formatBlock('Security Checker Server returned garbage.', 'error', true));
106
-
107
- return 127;
108
- }
109
-
110
- $formatter->displayResults($output, $input->getArgument('lockfile'), $vulnerabilities);
111
 
112
- if ($this->checker->getLastVulnerabilityCount() > 0) {
113
  return 1;
114
  }
115
  }
18
  use Symfony\Component\Console\Input\InputArgument;
19
  use Symfony\Component\Console\Input\InputOption;
20
  use SensioLabs\Security\Exception\ExceptionInterface;
 
 
 
21
 
22
  class SecurityCheckerCommand extends Command
23
  {
39
  {
40
  $this
41
  ->setName('security:check')
42
+ ->setDefinition([
43
  new InputArgument('lockfile', InputArgument::OPTIONAL, 'The path to the composer.lock file', 'composer.lock'),
44
+ new InputOption('format', '', InputOption::VALUE_REQUIRED, 'The output format', 'ansi'),
45
  new InputOption('end-point', '', InputOption::VALUE_REQUIRED, 'The security checker server URL'),
46
  new InputOption('timeout', '', InputOption::VALUE_REQUIRED, 'The HTTP timeout in seconds'),
47
+ new InputOption('token', '', InputOption::VALUE_REQUIRED, 'The server token', ''),
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
79
  $this->checker->getCrawler()->setTimeout($timeout);
80
  }
81
 
82
+ if ($token = $input->getOption('token')) {
83
+ $this->checker->getCrawler()->setToken($token);
84
+ }
85
+
86
  try {
87
+ $result = $this->checker->check($input->getArgument('lockfile'), $input->getOption('format'));
88
  } catch (ExceptionInterface $e) {
89
  $output->writeln($this->getHelperSet()->get('formatter')->formatBlock($e->getMessage(), 'error', true));
90
 
91
  return 1;
92
  }
93
 
94
+ $output->writeln((string) $result);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
95
 
96
+ if (count($result) > 0) {
97
  return 1;
98
  }
99
  }
vendor/sensiolabs/security-checker/SensioLabs/Security/Crawler.php ADDED
@@ -0,0 +1,180 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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 Composer\CaBundle\CaBundle;
15
+ use SensioLabs\Security\Exception\HttpException;
16
+ use SensioLabs\Security\Exception\RuntimeException;
17
+
18
+ /**
19
+ * @internal
20
+ */
21
+ class Crawler
22
+ {
23
+ private $endPoint = 'https://security.symfony.com/check_lock';
24
+ private $timeout = 20;
25
+ private $headers = [];
26
+
27
+ public function setTimeout($timeout)
28
+ {
29
+ $this->timeout = $timeout;
30
+ }
31
+
32
+ public function setEndPoint($endPoint)
33
+ {
34
+ $this->endPoint = $endPoint;
35
+ }
36
+
37
+ public function setToken($token)
38
+ {
39
+ $this->addHeader('Authorization', 'Token '.$token);
40
+ }
41
+
42
+ /**
43
+ * Adds a global header that will be sent with all requests to the server.
44
+ */
45
+ public function addHeader($key, $value)
46
+ {
47
+ $this->headers[] = $key.': '.$value;
48
+ }
49
+
50
+ /**
51
+ * Checks a Composer lock file.
52
+ *
53
+ * @param string $lock The path to the composer.lock file or a string able to be opened via file_get_contents
54
+ * @param string $format The format of the result
55
+ * @param array $headers An array of headers to add for this specific HTTP request
56
+ *
57
+ * @return Result
58
+ */
59
+ public function check($lock, $format = 'json', array $headers = [])
60
+ {
61
+ list($headers, $body) = $this->doCheck($lock, $format, $headers);
62
+
63
+ if (!(preg_match('/X-Alerts: (\d+)/', $headers, $matches) || 2 == count($matches))) {
64
+ throw new RuntimeException('The web service did not return alerts count.');
65
+ }
66
+
67
+ return new Result((int) $matches[1], $body, $format);
68
+ }
69
+
70
+ /**
71
+ * @return array An array where the first element is a headers string and second one the response body
72
+ */
73
+ private function doCheck($lock, $format = 'json', array $contextualHeaders = [])
74
+ {
75
+ $boundary = '------------------------'.md5(microtime(true));
76
+ $headers = "Content-Type: multipart/form-data; boundary=$boundary\r\nAccept: ".$this->getContentType($format);
77
+ foreach ($this->headers as $header) {
78
+ $headers .= "\r\n$header";
79
+ }
80
+ foreach ($contextualHeaders as $key => $value) {
81
+ $headers .= "\r\n$key: $value";
82
+ }
83
+ $opts = [
84
+ 'http' => [
85
+ 'method' => 'POST',
86
+ 'header' => $headers,
87
+ 'content' => "--$boundary\r\nContent-Disposition: form-data; name=\"lock\"; filename=\"composer.lock\"\r\nContent-Type: application/octet-stream\r\n\r\n".$this->getLockContents($lock)."\r\n--$boundary--\r\n",
88
+ 'ignore_errors' => true,
89
+ 'follow_location' => true,
90
+ 'max_redirects' => 3,
91
+ 'timeout' => $this->timeout,
92
+ 'user_agent' => sprintf('SecurityChecker-CLI/%s FGC PHP', SecurityChecker::VERSION),
93
+ ],
94
+ 'ssl' => [
95
+ 'verify_peer' => 1,
96
+ 'verify_host' => 2,
97
+ ],
98
+ ];
99
+
100
+ $caPathOrFile = CaBundle::getSystemCaRootBundlePath();
101
+ if (is_dir($caPathOrFile) || (is_link($caPathOrFile) && is_dir(readlink($caPathOrFile)))) {
102
+ $opts['ssl']['capath'] = $caPathOrFile;
103
+ } else {
104
+ $opts['ssl']['cafile'] = $caPathOrFile;
105
+ }
106
+
107
+ $context = stream_context_create($opts);
108
+ $level = error_reporting(0);
109
+ $body = file_get_contents($this->endPoint, 0, $context);
110
+ error_reporting($level);
111
+ if (false === $body) {
112
+ $error = error_get_last();
113
+
114
+ throw new RuntimeException(sprintf('An error occurred: %s.', $error['message']));
115
+ }
116
+
117
+ // status code
118
+ if (!preg_match('{HTTP/\d\.\d (\d+) }i', $http_response_header[0], $match)) {
119
+ throw new RuntimeException('An unknown error occurred.');
120
+ }
121
+
122
+ $statusCode = $match[1];
123
+ if (400 == $statusCode) {
124
+ $data = json_decode($body, true);
125
+
126
+ throw new RuntimeException($data['error']);
127
+ }
128
+
129
+ if (200 != $statusCode) {
130
+ throw new HttpException(sprintf('The web service failed for an unknown reason (HTTP %s).', $statusCode), $statusCode);
131
+ }
132
+
133
+ $headers = '';
134
+ foreach ($http_response_header as $header) {
135
+ if (false !== strpos($header, 'X-Alerts: ')) {
136
+ $headers = $header;
137
+ }
138
+ }
139
+
140
+ return [$headers, $body];
141
+ }
142
+
143
+ private function getContentType($format)
144
+ {
145
+ static $formats = [
146
+ 'text' => 'text/plain',
147
+ 'simple' => 'text/plain',
148
+ 'markdown' => 'text/markdown',
149
+ 'yaml' => 'text/yaml',
150
+ 'json' => 'application/json',
151
+ 'ansi' => 'text/plain+ansi',
152
+ ];
153
+
154
+ return isset($formats[$format]) ? $formats[$format] : 'text';
155
+ }
156
+
157
+ private function getLockContents($lock)
158
+ {
159
+ $contents = json_decode(file_get_contents($lock), true);
160
+ $hash = isset($contents['content-hash']) ? $contents['content-hash'] : (isset($contents['hash']) ? $contents['hash'] : '');
161
+ $packages = ['content-hash' => $hash, 'packages' => [], 'packages-dev' => []];
162
+ foreach (['packages', 'packages-dev'] as $key) {
163
+ if (!is_array($contents[$key])) {
164
+ continue;
165
+ }
166
+ foreach ($contents[$key] as $package) {
167
+ $data = [
168
+ 'name' => $package['name'],
169
+ 'version' => $package['version'],
170
+ ];
171
+ if (isset($package['time']) && false !== strpos($package['version'], 'dev')) {
172
+ $data['time'] = $package['time'];
173
+ }
174
+ $packages[$key][] = $data;
175
+ }
176
+ }
177
+
178
+ return json_encode($packages);
179
+ }
180
+ }
vendor/sensiolabs/security-checker/SensioLabs/Security/Crawler/BaseCrawler.php DELETED
@@ -1,106 +0,0 @@
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 DELETED
@@ -1,31 +0,0 @@
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 DELETED
@@ -1,98 +0,0 @@
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 DELETED
@@ -1,49 +0,0 @@
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 = ('stream' === getenv('SENSIOLABS_SECURITY_CHECKER_TRANSPORT') || !function_exists('curl_init')) ? new FileGetContentsCrawler() : new CurlCrawler();
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 DELETED
@@ -1,89 +0,0 @@
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/Formatters/FormatterInterface.php DELETED
@@ -1,26 +0,0 @@
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 DELETED
@@ -1,33 +0,0 @@
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 DELETED
@@ -1,68 +0,0 @@
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 DELETED
@@ -1,60 +0,0 @@
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/Resources/security.sensiolabs.org.crt DELETED
@@ -1,25 +0,0 @@
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/Result.php ADDED
@@ -0,0 +1,41 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
+ class Result implements \Countable
15
+ {
16
+ private $count;
17
+ private $vulnerabilities;
18
+ private $format;
19
+
20
+ public function __construct($count, $vulnerabilities, $format)
21
+ {
22
+ $this->count = $count;
23
+ $this->vulnerabilities = $vulnerabilities;
24
+ $this->format = $format;
25
+ }
26
+
27
+ public function getFormat()
28
+ {
29
+ return $this->format;
30
+ }
31
+
32
+ public function __toString()
33
+ {
34
+ return $this->vulnerabilities;
35
+ }
36
+
37
+ public function count()
38
+ {
39
+ return $this->count;
40
+ }
41
+ }
vendor/sensiolabs/security-checker/SensioLabs/Security/SecurityChecker.php CHANGED
@@ -12,55 +12,51 @@
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
  {
12
  namespace SensioLabs\Security;
13
 
14
  use SensioLabs\Security\Exception\RuntimeException;
 
 
15
 
16
  class SecurityChecker
17
  {
18
+ const VERSION = '5.0';
19
 
 
20
  private $crawler;
21
 
22
+ public function __construct(Crawler $crawler = null)
23
  {
24
+ $this->crawler = null === $crawler ? new Crawler() : $crawler;
25
  }
26
 
27
  /**
28
  * Checks a composer.lock file.
29
  *
30
+ * @param string $lock The path to the composer.lock file
31
+ * @param string $format The format of the result
32
+ * @param array $headers An array of headers to add for this specific HTTP request
33
  *
34
+ * @return Result
35
  *
36
  * @throws RuntimeException When the lock file does not exist
37
  * @throws RuntimeException When the certificate can not be copied
38
  */
39
+ public function check($lock, $format = 'json', array $headers = [])
40
  {
41
+ if (0 !== strpos($lock, 'data://text/plain;base64,')) {
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
 
53
+ return $this->crawler->check($lock, $format, $headers);
 
 
 
 
 
 
 
54
  }
55
 
56
  /**
57
+ * @internal
58
+ *
59
+ * @return Crawler
60
  */
61
  public function getCrawler()
62
  {
vendor/sensiolabs/security-checker/box.json CHANGED
@@ -16,7 +16,7 @@
16
  "in": "vendor"
17
  },
18
  {
19
- "name": ["*.*", "*.crt"],
20
  "in": "SensioLabs"
21
  }
22
  ],
16
  "in": "vendor"
17
  },
18
  {
19
+ "name": ["*.*"],
20
  "in": "SensioLabs"
21
  }
22
  ],
vendor/sensiolabs/security-checker/composer.json CHANGED
@@ -9,16 +9,17 @@
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
  }
9
  }
10
  ],
11
  "require": {
12
+ "php": ">=5.5.9",
13
  "symfony/console": "~2.7|~3.0|~4.0",
14
  "composer/ca-bundle": "^1.0"
15
  },
16
  "bin": ["security-checker"],
17
  "autoload": {
18
+ "psr-4": { "SensioLabs\\Security\\": "SensioLabs/Security" }
19
  },
20
  "extra": {
21
  "branch-alias": {
22
+ "dev-master": "5.0-dev"
23
  }
24
  }
25
  }
vendor/sensiolabs/security-checker/security-checker CHANGED
@@ -26,7 +26,8 @@ if ((!$loader = includeIfExists(__DIR__.'/vendor/autoload.php')) && (!$loader =
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();
26
  use Symfony\Component\Console\Application;
27
  use SensioLabs\Security\Command\SecurityCheckerCommand;
28
  use SensioLabs\Security\SecurityChecker;
29
+ use SensioLabs\Security\Crawler;
30
 
31
  $console = new Application('SensioLabs Security Checker', SecurityChecker::VERSION);
32
+ $console->add(new SecurityCheckerCommand(new SecurityChecker(new Crawler())));
33
  $console->run();
vendor/symfony/console/Application.php CHANGED
@@ -11,34 +11,36 @@
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
 
@@ -64,6 +66,7 @@ class Application
64
  private $runningCommand;
65
  private $name;
66
  private $version;
 
67
  private $catchExceptions = true;
68
  private $autoExit = true;
69
  private $definition;
@@ -91,6 +94,11 @@ class Application
91
  $this->dispatcher = $dispatcher;
92
  }
93
 
 
 
 
 
 
94
  /**
95
  * Runs the current application.
96
  *
@@ -111,6 +119,25 @@ class Application
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
  }
@@ -118,21 +145,13 @@ class Application
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)) {
@@ -143,6 +162,20 @@ class Application
143
  } else {
144
  $exitCode = 1;
145
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
146
  }
147
 
148
  if ($this->autoExit) {
@@ -418,7 +451,11 @@ class Application
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;
@@ -443,7 +480,7 @@ class Application
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
 
@@ -472,7 +509,7 @@ class Application
472
  {
473
  $this->init();
474
 
475
- return isset($this->commands[$name]);
476
  }
477
 
478
  /**
@@ -515,7 +552,7 @@ class Application
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 ";
@@ -527,8 +564,8 @@ class Application
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
 
@@ -550,12 +587,18 @@ class Application
550
  public function find($name)
551
  {
552
  $this->init();
 
553
  $aliases = array();
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));
@@ -564,7 +607,7 @@ class Application
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 ";
@@ -576,18 +619,18 @@ class Application
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, &$aliases) {
582
- $commandName = $commandList[$nameOrAlias]->getName();
583
  $aliases[$nameOrAlias] = $commandName;
584
 
585
- return $commandName === $nameOrAlias || !in_array($commandName, $commands);
586
- });
587
  }
588
 
589
- $exact = in_array($name, $commands, true) || isset($aliases[$name]);
590
- if (count($commands) > 1 && !$exact) {
591
  $usableWidth = $this->terminal->getWidth() - 10;
592
  $abbrevs = array_values($commands);
593
  $maxLen = 0;
@@ -595,6 +638,9 @@ class Application
595
  $maxLen = max(Helper::strlen($abbrev), $maxLen);
596
  }
597
  $abbrevs = array_map(function ($cmd) use ($commandList, $usableWidth, $maxLen) {
 
 
 
598
  $abbrev = str_pad($cmd, $maxLen, ' ').' '.$commandList[$cmd]->getDescription();
599
 
600
  return Helper::strlen($abbrev) > $usableWidth ? Helper::substr($abbrev, 0, $usableWidth - 3).'...' : $abbrev;
@@ -621,7 +667,18 @@ class Application
621
  $this->init();
622
 
623
  if (null === $namespace) {
624
- return $this->commands;
 
 
 
 
 
 
 
 
 
 
 
625
  }
626
 
627
  $commands = array();
@@ -631,6 +688,14 @@ class Application
631
  }
632
  }
633
 
 
 
 
 
 
 
 
 
634
  return $commands;
635
  }
636
 
@@ -645,7 +710,7 @@ class Application
645
  {
646
  $abbrevs = array();
647
  foreach ($names as $name) {
648
- for ($len = strlen($name); $len > 0; --$len) {
649
  $abbrev = substr($name, 0, $len);
650
  $abbrevs[$abbrev][] = $name;
651
  }
@@ -661,22 +726,32 @@ class Application
661
  {
662
  $output->writeln('', OutputInterface::VERBOSITY_QUIET);
663
 
664
- do {
665
- $title = sprintf(
666
- ' [%s%s] ',
667
- get_class($e),
668
- $output->isVerbose() && 0 !== ($code = $e->getCode()) ? ' ('.$code.')' : ''
669
- );
 
670
 
671
- $len = Helper::strlen($title);
 
 
 
 
 
 
 
 
 
672
 
673
  $width = $this->terminal->getWidth() ? $this->terminal->getWidth() - 1 : PHP_INT_MAX;
674
  // 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
675
- if (defined('HHVM_VERSION') && $width > 1 << 31) {
676
  $width = 1 << 31;
677
  }
678
  $lines = array();
679
- foreach (preg_split('/\r?\n/', trim($e->getMessage())) as $line) {
680
  foreach ($this->splitStringByWidth($line, $width - 4) as $line) {
681
  // pre-format lines to get the right string length
682
  $lineLength = Helper::strlen($line) + 4;
@@ -687,8 +762,13 @@ class Application
687
  }
688
 
689
  $messages = array();
 
 
 
690
  $messages[] = $emptyLine = sprintf('<error>%s</error>', str_repeat(' ', $len));
691
- $messages[] = sprintf('<error>%s%s</error>', $title, str_repeat(' ', max(0, $len - Helper::strlen($title))));
 
 
692
  foreach ($lines as $line) {
693
  $messages[] = sprintf('<error> %s %s</error>', OutputFormatter::escape($line[0]), str_repeat(' ', $len - $line[1]));
694
  }
@@ -702,14 +782,8 @@ class Application
702
 
703
  // exception related properties
704
  $trace = $e->getTrace();
705
- array_unshift($trace, array(
706
- 'function' => '',
707
- 'file' => null !== $e->getFile() ? $e->getFile() : 'n/a',
708
- 'line' => null !== $e->getLine() ? $e->getLine() : 'n/a',
709
- 'args' => array(),
710
- ));
711
-
712
- for ($i = 0, $count = count($trace); $i < $count; ++$i) {
713
  $class = isset($trace[$i]['class']) ? $trace[$i]['class'] : '';
714
  $type = isset($trace[$i]['type']) ? $trace[$i]['type'] : '';
715
  $function = $trace[$i]['function'];
@@ -722,11 +796,6 @@ class Application
722
  $output->writeln('', OutputInterface::VERBOSITY_QUIET);
723
  }
724
  } while ($e = $e->getPrevious());
725
-
726
- if (null !== $this->runningCommand) {
727
- $output->writeln(sprintf('<info>%s</info>', sprintf($this->runningCommand->getSynopsis(), $this->getName())), OutputInterface::VERBOSITY_QUIET);
728
- $output->writeln('', OutputInterface::VERBOSITY_QUIET);
729
- }
730
  }
731
 
732
  /**
@@ -738,7 +807,7 @@ class Application
738
  */
739
  protected function getTerminalWidth()
740
  {
741
- @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);
742
 
743
  return $this->terminal->getWidth();
744
  }
@@ -752,7 +821,7 @@ class Application
752
  */
753
  protected function getTerminalHeight()
754
  {
755
- @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);
756
 
757
  return $this->terminal->getHeight();
758
  }
@@ -766,7 +835,7 @@ class Application
766
  */
767
  public function getTerminalDimensions()
768
  {
769
- @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);
770
 
771
  return array($this->terminal->getWidth(), $this->terminal->getHeight());
772
  }
@@ -785,7 +854,7 @@ class Application
785
  */
786
  public function setTerminalDimensions($width, $height)
787
  {
788
- @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);
789
 
790
  putenv('COLUMNS='.$width);
791
  putenv('LINES='.$height);
@@ -806,7 +875,7 @@ class Application
806
 
807
  if (true === $input->hasParameterOption(array('--no-interaction', '-n'), true)) {
808
  $input->setInteractive(false);
809
- } elseif (function_exists('posix_isatty')) {
810
  $inputStream = null;
811
 
812
  if ($input instanceof StreamableInputInterface) {
@@ -824,18 +893,37 @@ class Application
824
  }
825
  }
826
 
 
 
 
 
 
 
 
 
827
  if (true === $input->hasParameterOption(array('--quiet', '-q'), true)) {
828
  $output->setVerbosity(OutputInterface::VERBOSITY_QUIET);
829
- $input->setInteractive(false);
830
  } else {
831
  if ($input->hasParameterOption('-vvv', true) || $input->hasParameterOption('--verbose=3', true) || 3 === $input->getParameterOption('--verbose', false, true)) {
832
  $output->setVerbosity(OutputInterface::VERBOSITY_DEBUG);
 
833
  } elseif ($input->hasParameterOption('-vv', true) || $input->hasParameterOption('--verbose=2', true) || 2 === $input->getParameterOption('--verbose', false, true)) {
834
  $output->setVerbosity(OutputInterface::VERBOSITY_VERY_VERBOSE);
 
835
  } elseif ($input->hasParameterOption('-v', true) || $input->hasParameterOption('--verbose=1', true) || $input->hasParameterOption('--verbose', true) || $input->getParameterOption('--verbose', false, true)) {
836
  $output->setVerbosity(OutputInterface::VERBOSITY_VERBOSE);
 
837
  }
838
  }
 
 
 
 
 
 
 
 
839
  }
840
 
841
  /**
@@ -991,7 +1079,7 @@ class Application
991
  $parts = explode(':', $name);
992
  array_pop($parts);
993
 
994
- return implode(':', null === $limit ? $parts : array_slice($parts, 0, $limit));
995
  }
996
 
997
  /**
@@ -1024,7 +1112,7 @@ class Application
1024
  }
1025
 
1026
  $lev = levenshtein($subname, $parts[$i]);
1027
- if ($lev <= strlen($subname) / 3 || '' !== $subname && false !== strpos($parts[$i], $subname)) {
1028
  $alternatives[$collectionName] = $exists ? $alternatives[$collectionName] + $lev : $lev;
1029
  } elseif ($exists) {
1030
  $alternatives[$collectionName] += $threshold;
@@ -1034,7 +1122,7 @@ class Application
1034
 
1035
  foreach ($collection as $item) {
1036
  $lev = levenshtein($name, $item);
1037
- if ($lev <= strlen($name) / 3 || false !== strpos($item, $name)) {
1038
  $alternatives[$item] = isset($alternatives[$item]) ? $alternatives[$item] - $lev : $lev;
1039
  }
1040
  }
@@ -1090,7 +1178,7 @@ class Application
1090
  $line = $char;
1091
  }
1092
 
1093
- $lines[] = count($lines) ? str_pad($line, $width) : $line;
1094
 
1095
  mb_convert_variables($encoding, 'utf8', $lines);
1096
 
@@ -1111,7 +1199,7 @@ class Application
1111
  $namespaces = array();
1112
 
1113
  foreach ($parts as $part) {
1114
- if (count($namespaces)) {
1115
  $namespaces[] = end($namespaces).':'.$part;
1116
  } else {
1117
  $namespaces[] = $part;
11
 
12
  namespace Symfony\Component\Console;
13
 
14
+ use Symfony\Component\Console\Command\Command;
15
+ use Symfony\Component\Console\Command\HelpCommand;
16
+ use Symfony\Component\Console\Command\ListCommand;
17
+ use Symfony\Component\Console\CommandLoader\CommandLoaderInterface;
18
+ use Symfony\Component\Console\Event\ConsoleCommandEvent;
19
+ use Symfony\Component\Console\Event\ConsoleErrorEvent;
20
+ use Symfony\Component\Console\Event\ConsoleExceptionEvent;
21
+ use Symfony\Component\Console\Event\ConsoleTerminateEvent;
22
+ use Symfony\Component\Console\Exception\CommandNotFoundException;
23
  use Symfony\Component\Console\Exception\ExceptionInterface;
24
+ use Symfony\Component\Console\Exception\LogicException;
25
  use Symfony\Component\Console\Formatter\OutputFormatter;
26
  use Symfony\Component\Console\Helper\DebugFormatterHelper;
27
+ use Symfony\Component\Console\Helper\FormatterHelper;
28
  use Symfony\Component\Console\Helper\Helper;
29
+ use Symfony\Component\Console\Helper\HelperSet;
30
  use Symfony\Component\Console\Helper\ProcessHelper;
31
  use Symfony\Component\Console\Helper\QuestionHelper;
 
 
32
  use Symfony\Component\Console\Input\ArgvInput;
33
  use Symfony\Component\Console\Input\ArrayInput;
 
 
34
  use Symfony\Component\Console\Input\InputArgument;
35
  use Symfony\Component\Console\Input\InputAwareInterface;
36
+ use Symfony\Component\Console\Input\InputDefinition;
37
+ use Symfony\Component\Console\Input\InputInterface;
38
+ use Symfony\Component\Console\Input\InputOption;
39
+ use Symfony\Component\Console\Input\StreamableInputInterface;
40
  use Symfony\Component\Console\Output\ConsoleOutput;
41
  use Symfony\Component\Console\Output\ConsoleOutputInterface;
42
+ use Symfony\Component\Console\Output\OutputInterface;
43
+ use Symfony\Component\Debug\ErrorHandler;
 
 
 
 
 
 
 
 
 
44
  use Symfony\Component\Debug\Exception\FatalThrowableError;
45
  use Symfony\Component\EventDispatcher\EventDispatcherInterface;
46
 
66
  private $runningCommand;
67
  private $name;
68
  private $version;
69
+ private $commandLoader;
70
  private $catchExceptions = true;
71
  private $autoExit = true;
72
  private $definition;
94
  $this->dispatcher = $dispatcher;
95
  }
96
 
97
+ public function setCommandLoader(CommandLoaderInterface $commandLoader)
98
+ {
99
+ $this->commandLoader = $commandLoader;
100
+ }
101
+
102
  /**
103
  * Runs the current application.
104
  *
119
  $output = new ConsoleOutput();
120
  }
121
 
122
+ $renderException = function ($e) use ($output) {
123
+ if (!$e instanceof \Exception) {
124
+ $e = class_exists(FatalThrowableError::class) ? new FatalThrowableError($e) : new \ErrorException($e->getMessage(), $e->getCode(), E_ERROR, $e->getFile(), $e->getLine());
125
+ }
126
+ if ($output instanceof ConsoleOutputInterface) {
127
+ $this->renderException($e, $output->getErrorOutput());
128
+ } else {
129
+ $this->renderException($e, $output);
130
+ }
131
+ };
132
+ if ($phpHandler = set_exception_handler($renderException)) {
133
+ restore_exception_handler();
134
+ if (!\is_array($phpHandler) || !$phpHandler[0] instanceof ErrorHandler) {
135
+ $debugHandler = true;
136
+ } elseif ($debugHandler = $phpHandler[0]->setExceptionHandler($renderException)) {
137
+ $phpHandler[0]->setExceptionHandler($debugHandler);
138
+ }
139
+ }
140
+
141
  if (null !== $this->dispatcher && $this->dispatcher->hasListeners(ConsoleEvents::EXCEPTION)) {
142
  @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);
143
  }
145
  $this->configureIO($input, $output);
146
 
147
  try {
 
148
  $exitCode = $this->doRun($input, $output);
149
  } catch (\Exception $e) {
 
 
 
150
  if (!$this->catchExceptions) {
151
  throw $e;
152
  }
153
 
154
+ $renderException($e);
 
 
 
 
155
 
156
  $exitCode = $e->getCode();
157
  if (is_numeric($exitCode)) {
162
  } else {
163
  $exitCode = 1;
164
  }
165
+ } finally {
166
+ // if the exception handler changed, keep it
167
+ // otherwise, unregister $renderException
168
+ if (!$phpHandler) {
169
+ if (set_exception_handler($renderException) === $renderException) {
170
+ restore_exception_handler();
171
+ }
172
+ restore_exception_handler();
173
+ } elseif (!$debugHandler) {
174
+ $finalHandler = $phpHandler[0]->setExceptionHandler(null);
175
+ if ($finalHandler !== $renderException) {
176
+ $phpHandler[0]->setExceptionHandler($finalHandler);
177
+ }
178
+ }
179
  }
180
 
181
  if ($this->autoExit) {
451
  }
452
 
453
  if (null === $command->getDefinition()) {
454
+ throw new LogicException(sprintf('Command class "%s" is not correctly initialized. You probably forgot to call the parent constructor.', \get_class($command)));
455
+ }
456
+
457
+ if (!$command->getName()) {
458
+ throw new LogicException(sprintf('The command defined in "%s" cannot have an empty name.', \get_class($command)));
459
  }
460
 
461
  $this->commands[$command->getName()] = $command;
480
  {
481
  $this->init();
482
 
483
+ if (!$this->has($name)) {
484
  throw new CommandNotFoundException(sprintf('The command "%s" does not exist.', $name));
485
  }
486
 
509
  {
510
  $this->init();
511
 
512
+ return isset($this->commands[$name]) || ($this->commandLoader && $this->commandLoader->has($name) && $this->add($this->commandLoader->get($name)));
513
  }
514
 
515
  /**
552
  $message = sprintf('There are no commands defined in the "%s" namespace.', $namespace);
553
 
554
  if ($alternatives = $this->findAlternatives($namespace, $allNamespaces)) {
555
+ if (1 == \count($alternatives)) {
556
  $message .= "\n\nDid you mean this?\n ";
557
  } else {
558
  $message .= "\n\nDid you mean one of these?\n ";
564
  throw new CommandNotFoundException($message, $alternatives);
565
  }
566
 
567
+ $exact = \in_array($namespace, $namespaces, true);
568
+ if (\count($namespaces) > 1 && !$exact) {
569
  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));
570
  }
571
 
587
  public function find($name)
588
  {
589
  $this->init();
590
+
591
  $aliases = array();
592
+ $allCommands = $this->commandLoader ? array_merge($this->commandLoader->getNames(), array_keys($this->commands)) : array_keys($this->commands);
593
  $expr = preg_replace_callback('{([^:]+|)}', function ($matches) { return preg_quote($matches[1]).'[^:]*'; }, $name);
594
  $commands = preg_grep('{^'.$expr.'}', $allCommands);
595
 
596
+ if (empty($commands)) {
597
+ $commands = preg_grep('{^'.$expr.'}i', $allCommands);
598
+ }
599
+
600
+ // if no commands matched or we just matched namespaces
601
+ if (empty($commands) || \count(preg_grep('{^'.$expr.'$}i', $commands)) < 1) {
602
  if (false !== $pos = strrpos($name, ':')) {
603
  // check if a namespace exists and contains commands
604
  $this->findNamespace(substr($name, 0, $pos));
607
  $message = sprintf('Command "%s" is not defined.', $name);
608
 
609
  if ($alternatives = $this->findAlternatives($name, $allCommands)) {
610
+ if (1 == \count($alternatives)) {
611
  $message .= "\n\nDid you mean this?\n ";
612
  } else {
613
  $message .= "\n\nDid you mean one of these?\n ";
619
  }
620
 
621
  // filter out aliases for commands which are already on the list
622
+ if (\count($commands) > 1) {
623
+ $commandList = $this->commandLoader ? array_merge(array_flip($this->commandLoader->getNames()), $this->commands) : $this->commands;
624
+ $commands = array_unique(array_filter($commands, function ($nameOrAlias) use ($commandList, $commands, &$aliases) {
625
+ $commandName = $commandList[$nameOrAlias] instanceof Command ? $commandList[$nameOrAlias]->getName() : $nameOrAlias;
626
  $aliases[$nameOrAlias] = $commandName;
627
 
628
+ return $commandName === $nameOrAlias || !\in_array($commandName, $commands);
629
+ }));
630
  }
631
 
632
+ $exact = \in_array($name, $commands, true) || isset($aliases[$name]);
633
+ if (\count($commands) > 1 && !$exact) {
634
  $usableWidth = $this->terminal->getWidth() - 10;
635
  $abbrevs = array_values($commands);
636
  $maxLen = 0;
638
  $maxLen = max(Helper::strlen($abbrev), $maxLen);
639
  }
640
  $abbrevs = array_map(function ($cmd) use ($commandList, $usableWidth, $maxLen) {
641
+ if (!$commandList[$cmd] instanceof Command) {
642
+ return $cmd;
643
+ }
644
  $abbrev = str_pad($cmd, $maxLen, ' ').' '.$commandList[$cmd]->getDescription();
645
 
646
  return Helper::strlen($abbrev) > $usableWidth ? Helper::substr($abbrev, 0, $usableWidth - 3).'...' : $abbrev;
667
  $this->init();
668
 
669
  if (null === $namespace) {
670
+ if (!$this->commandLoader) {
671
+ return $this->commands;
672
+ }
673
+
674
+ $commands = $this->commands;
675
+ foreach ($this->commandLoader->getNames() as $name) {
676
+ if (!isset($commands[$name]) && $this->has($name)) {
677
+ $commands[$name] = $this->get($name);
678
+ }
679
+ }
680
+
681
+ return $commands;
682
  }
683
 
684
  $commands = array();
688
  }
689
  }
690
 
691
+ if ($this->commandLoader) {
692
+ foreach ($this->commandLoader->getNames() as $name) {
693
+ if (!isset($commands[$name]) && $namespace === $this->extractNamespace($name, substr_count($namespace, ':') + 1) && $this->has($name)) {
694
+ $commands[$name] = $this->get($name);
695
+ }
696
+ }
697
+ }
698
+
699
  return $commands;
700
  }
701
 
710
  {
711
  $abbrevs = array();
712
  foreach ($names as $name) {
713
+ for ($len = \strlen($name); $len > 0; --$len) {
714
  $abbrev = substr($name, 0, $len);
715
  $abbrevs[$abbrev][] = $name;
716
  }
726
  {
727
  $output->writeln('', OutputInterface::VERBOSITY_QUIET);
728
 
729
+ $this->doRenderException($e, $output);
730
+
731
+ if (null !== $this->runningCommand) {
732
+ $output->writeln(sprintf('<info>%s</info>', sprintf($this->runningCommand->getSynopsis(), $this->getName())), OutputInterface::VERBOSITY_QUIET);
733
+ $output->writeln('', OutputInterface::VERBOSITY_QUIET);
734
+ }
735
+ }
736
 
737
+ protected function doRenderException(\Exception $e, OutputInterface $output)
738
+ {
739
+ do {
740
+ $message = trim($e->getMessage());
741
+ if ('' === $message || OutputInterface::VERBOSITY_VERBOSE <= $output->getVerbosity()) {
742
+ $title = sprintf(' [%s%s] ', \get_class($e), 0 !== ($code = $e->getCode()) ? ' ('.$code.')' : '');
743
+ $len = Helper::strlen($title);
744
+ } else {
745
+ $len = 0;
746
+ }
747
 
748
  $width = $this->terminal->getWidth() ? $this->terminal->getWidth() - 1 : PHP_INT_MAX;
749
  // 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
750
+ if (\defined('HHVM_VERSION') && $width > 1 << 31) {
751
  $width = 1 << 31;
752
  }
753
  $lines = array();
754
+ foreach ('' !== $message ? preg_split('/\r?\n/', $message) : array() as $line) {
755
  foreach ($this->splitStringByWidth($line, $width - 4) as $line) {
756
  // pre-format lines to get the right string length
757
  $lineLength = Helper::strlen($line) + 4;
762
  }
763
 
764
  $messages = array();
765
+ if (!$e instanceof ExceptionInterface || OutputInterface::VERBOSITY_VERBOSE <= $output->getVerbosity()) {
766
+ $messages[] = sprintf('<comment>%s</comment>', OutputFormatter::escape(sprintf('In %s line %s:', basename($e->getFile()) ?: 'n/a', $e->getLine() ?: 'n/a')));
767
+ }
768
  $messages[] = $emptyLine = sprintf('<error>%s</error>', str_repeat(' ', $len));
769
+ if ('' === $message || OutputInterface::VERBOSITY_VERBOSE <= $output->getVerbosity()) {
770
+ $messages[] = sprintf('<error>%s%s</error>', $title, str_repeat(' ', max(0, $len - Helper::strlen($title))));
771
+ }
772
  foreach ($lines as $line) {
773
  $messages[] = sprintf('<error> %s %s</error>', OutputFormatter::escape($line[0]), str_repeat(' ', $len - $line[1]));
774
  }
782
 
783
  // exception related properties
784
  $trace = $e->getTrace();
785
+
786
+ for ($i = 0, $count = \count($trace); $i < $count; ++$i) {
 
 
 
 
 
 
787
  $class = isset($trace[$i]['class']) ? $trace[$i]['class'] : '';
788
  $type = isset($trace[$i]['type']) ? $trace[$i]['type'] : '';
789
  $function = $trace[$i]['function'];
796
  $output->writeln('', OutputInterface::VERBOSITY_QUIET);
797
  }
798
  } while ($e = $e->getPrevious());
 
 
 
 
 
799
  }
800
 
801
  /**
807
  */
808
  protected function getTerminalWidth()
809
  {
810
+ @trigger_error(sprintf('The "%s()" method is deprecated as of 3.2 and will be removed in 4.0. Create a Terminal instance instead.', __METHOD__), E_USER_DEPRECATED);
811
 
812
  return $this->terminal->getWidth();
813
  }
821
  */
822
  protected function getTerminalHeight()
823
  {
824
+ @trigger_error(sprintf('The "%s()" method is deprecated as of 3.2 and will be removed in 4.0. Create a Terminal instance instead.', __METHOD__), E_USER_DEPRECATED);
825
 
826
  return $this->terminal->getHeight();
827
  }
835
  */
836
  public function getTerminalDimensions()
837
  {
838
+ @trigger_error(sprintf('The "%s()" method is deprecated as of 3.2 and will be removed in 4.0. Create a Terminal instance instead.', __METHOD__), E_USER_DEPRECATED);
839
 
840
  return array($this->terminal->getWidth(), $this->terminal->getHeight());
841
  }
854
  */
855
  public function setTerminalDimensions($width, $height)
856
  {
857
+ @trigger_error(sprintf('The "%s()" method 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);
858
 
859
  putenv('COLUMNS='.$width);
860
  putenv('LINES='.$height);
875
 
876
  if (true === $input->hasParameterOption(array('--no-interaction', '-n'), true)) {
877
  $input->setInteractive(false);
878
+ } elseif (\function_exists('posix_isatty')) {
879
  $inputStream = null;
880
 
881
  if ($input instanceof StreamableInputInterface) {
893
  }
894
  }
895
 
896
+ switch ($shellVerbosity = (int) getenv('SHELL_VERBOSITY')) {
897
+ case -1: $output->setVerbosity(OutputInterface::VERBOSITY_QUIET); break;
898
+ case 1: $output->setVerbosity(OutputInterface::VERBOSITY_VERBOSE); break;
899
+ case 2: $output->setVerbosity(OutputInterface::VERBOSITY_VERY_VERBOSE); break;
900
+ case 3: $output->setVerbosity(OutputInterface::VERBOSITY_DEBUG); break;
901
+ default: $shellVerbosity = 0; break;
902
+ }
903
+
904
  if (true === $input->hasParameterOption(array('--quiet', '-q'), true)) {
905
  $output->setVerbosity(OutputInterface::VERBOSITY_QUIET);
906
+ $shellVerbosity = -1;
907
  } else {
908
  if ($input->hasParameterOption('-vvv', true) || $input->hasParameterOption('--verbose=3', true) || 3 === $input->getParameterOption('--verbose', false, true)) {
909
  $output->setVerbosity(OutputInterface::VERBOSITY_DEBUG);
910
+ $shellVerbosity = 3;
911
  } elseif ($input->hasParameterOption('-vv', true) || $input->hasParameterOption('--verbose=2', true) || 2 === $input->getParameterOption('--verbose', false, true)) {
912
  $output->setVerbosity(OutputInterface::VERBOSITY_VERY_VERBOSE);
913
+ $shellVerbosity = 2;
914
  } elseif ($input->hasParameterOption('-v', true) || $input->hasParameterOption('--verbose=1', true) || $input->hasParameterOption('--verbose', true) || $input->getParameterOption('--verbose', false, true)) {
915
  $output->setVerbosity(OutputInterface::VERBOSITY_VERBOSE);
916
+ $shellVerbosity = 1;
917
  }
918
  }
919
+
920
+ if (-1 === $shellVerbosity) {
921
+ $input->setInteractive(false);
922
+ }
923
+
924
+ putenv('SHELL_VERBOSITY='.$shellVerbosity);
925
+ $_ENV['SHELL_VERBOSITY'] = $shellVerbosity;
926
+ $_SERVER['SHELL_VERBOSITY'] = $shellVerbosity;
927
  }
928
 
929
  /**
1079
  $parts = explode(':', $name);
1080
  array_pop($parts);
1081
 
1082
+ return implode(':', null === $limit ? $parts : \array_slice($parts, 0, $limit));
1083
  }
1084
 
1085
  /**
1112
  }
1113
 
1114
  $lev = levenshtein($subname, $parts[$i]);
1115
+ if ($lev <= \strlen($subname) / 3 || '' !== $subname && false !== strpos($parts[$i], $subname)) {
1116
  $alternatives[$collectionName] = $exists ? $alternatives[$collectionName] + $lev : $lev;
1117
  } elseif ($exists) {
1118
  $alternatives[$collectionName] += $threshold;
1122
 
1123
  foreach ($collection as $item) {
1124
  $lev = levenshtein($name, $item);
1125
+ if ($lev <= \strlen($name) / 3 || false !== strpos($item, $name)) {
1126
  $alternatives[$item] = isset($alternatives[$item]) ? $alternatives[$item] - $lev : $lev;
1127
  }
1128
  }
1178
  $line = $char;
1179
  }
1180
 
1181
+ $lines[] = \count($lines) ? str_pad($line, $width) : $line;
1182
 
1183
  mb_convert_variables($encoding, 'utf8', $lines);
1184
 
1199
  $namespaces = array();
1200
 
1201
  foreach ($parts as $part) {
1202
+ if (\count($namespaces)) {
1203
  $namespaces[] = end($namespaces).':'.$part;
1204
  } else {
1205
  $namespaces[] = $part;
vendor/symfony/console/Command/Command.php CHANGED
@@ -11,16 +11,16 @@
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.
@@ -29,6 +29,11 @@ use Symfony\Component\Console\Exception\LogicException;
29
  */
30
  class Command
31
  {
 
 
 
 
 
32
  private $application;
33
  private $name;
34
  private $processTitle;
@@ -45,6 +50,17 @@ class Command
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
  *
@@ -54,15 +70,11 @@ class Command
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
  /**
@@ -138,7 +150,7 @@ class Command
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
  *
@@ -161,10 +173,14 @@ class Command
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
  {
@@ -205,16 +221,15 @@ class Command
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>');
@@ -235,7 +250,7 @@ class Command
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
  }
@@ -539,7 +554,7 @@ class Command
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
 
11
 
12
  namespace Symfony\Component\Console\Command;
13
 
14
+ use Symfony\Component\Console\Application;
15
  use Symfony\Component\Console\Exception\ExceptionInterface;
16
+ use Symfony\Component\Console\Exception\InvalidArgumentException;
17
+ use Symfony\Component\Console\Exception\LogicException;
18
+ use Symfony\Component\Console\Helper\HelperSet;
19
  use Symfony\Component\Console\Input\InputArgument;
20
+ use Symfony\Component\Console\Input\InputDefinition;
21
  use Symfony\Component\Console\Input\InputInterface;
22
+ use Symfony\Component\Console\Input\InputOption;
23
  use Symfony\Component\Console\Output\OutputInterface;
 
 
 
 
24
 
25
  /**
26
  * Base class for all commands.
29
  */
30
  class Command
31
  {
32
+ /**
33
+ * @var string|null The default command name
34
+ */
35
+ protected static $defaultName;
36
+
37
  private $application;
38
  private $name;
39
  private $processTitle;
50
  private $usages = array();
51
  private $helperSet;
52
 
53
+ /**
54
+ * @return string|null The default command name or null when no default name is set
55
+ */
56
+ public static function getDefaultName()
57
+ {
58
+ $class = \get_called_class();
59
+ $r = new \ReflectionProperty($class, 'defaultName');
60
+
61
+ return $class === $r->class ? static::$defaultName : null;
62
+ }
63
+
64
  /**
65
  * @param string|null $name The name of the command; passing null means it must be set in configure()
66
  *
70
  {
71
  $this->definition = new InputDefinition();
72
 
73
+ if (null !== $name || null !== $name = static::getDefaultName()) {
74
  $this->setName($name);
75
  }
76
 
77
  $this->configure();
 
 
 
 
78
  }
79
 
80
  /**
150
  * execute() method, you set the code to execute by passing
151
  * a Closure to the setCode() method.
152
  *
153
+ * @return int|null null or 0 if everything went fine, or an error code
154
  *
155
  * @throws LogicException When this abstract method is not implemented
156
  *
173
  }
174
 
175
  /**
176
+ * Initializes the command after the input has been bound and before the input
177
+ * is validated.
178
  *
179
  * This is mainly useful when a lot of commands extends one main command
180
  * where some things need to be initialized based on the input arguments and options.
181
+ *
182
+ * @see InputInterface::bind()
183
+ * @see InputInterface::validate()
184
  */
185
  protected function initialize(InputInterface $input, OutputInterface $output)
186
  {
221
  $this->initialize($input, $output);
222
 
223
  if (null !== $this->processTitle) {
224
+ if (\function_exists('cli_set_process_title')) {
225
+ if (!@cli_set_process_title($this->processTitle)) {
226
  if ('Darwin' === PHP_OS) {
227
+ $output->writeln('<comment>Running "cli_set_process_title" as an unprivileged user is not supported on MacOS.</comment>', OutputInterface::VERBOSITY_VERY_VERBOSE);
228
  } else {
229
+ cli_set_process_title($this->processTitle);
 
230
  }
231
  }
232
+ } elseif (\function_exists('setproctitle')) {
233
  setproctitle($this->processTitle);
234
  } elseif (OutputInterface::VERBOSITY_VERY_VERBOSE === $output->getVerbosity()) {
235
  $output->writeln('<comment>Install the proctitle PECL to be able to change the process title.</comment>');
250
  $input->validate();
251
 
252
  if ($this->code) {
253
+ $statusCode = \call_user_func($this->code, $input, $output);
254
  } else {
255
  $statusCode = $this->execute($input, $output);
256
  }
554
  */
555
  public function setAliases($aliases)
556
  {
557
+ if (!\is_array($aliases) && !$aliases instanceof \Traversable) {
558
  throw new InvalidArgumentException('$aliases must be an array or an instance of \Traversable');
559
  }
560
 
vendor/symfony/console/Command/HelpCommand.php CHANGED
@@ -13,8 +13,8 @@ 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
  /**
13
 
14
  use Symfony\Component\Console\Helper\DescriptorHelper;
15
  use Symfony\Component\Console\Input\InputArgument;
 
16
  use Symfony\Component\Console\Input\InputInterface;
17
+ use Symfony\Component\Console\Input\InputOption;
18
  use Symfony\Component\Console\Output\OutputInterface;
19
 
20
  /**
vendor/symfony/console/Command/ListCommand.php CHANGED
@@ -13,10 +13,10 @@ 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.
13
 
14
  use Symfony\Component\Console\Helper\DescriptorHelper;
15
  use Symfony\Component\Console\Input\InputArgument;
16
+ use Symfony\Component\Console\Input\InputDefinition;
17
  use Symfony\Component\Console\Input\InputInterface;
18
+ use Symfony\Component\Console\Input\InputOption;
19
  use Symfony\Component\Console\Output\OutputInterface;
 
20
 
21
  /**
22
  * ListCommand displays the list of all available commands for the application.
vendor/symfony/console/Command/LockableTrait.php CHANGED
@@ -13,7 +13,10 @@ 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.
@@ -22,7 +25,8 @@ use Symfony\Component\Filesystem\LockHandler;
22
  */
23
  trait LockableTrait
24
  {
25
- private $lockHandler;
 
26
 
27
  /**
28
  * Locks a command.
@@ -31,18 +35,23 @@ trait LockableTrait
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
  }
@@ -55,9 +64,9 @@ trait LockableTrait
55
  */
56
  private function release()
57
  {
58
- if ($this->lockHandler) {
59
- $this->lockHandler->release();
60
- $this->lockHandler = null;
61
  }
62
  }
63
  }
13
 
14
  use Symfony\Component\Console\Exception\LogicException;
15
  use Symfony\Component\Console\Exception\RuntimeException;
16
+ use Symfony\Component\Lock\Factory;
17
+ use Symfony\Component\Lock\Lock;
18
+ use Symfony\Component\Lock\Store\FlockStore;
19
+ use Symfony\Component\Lock\Store\SemaphoreStore;
20
 
21
  /**
22
  * Basic lock feature for commands.
25
  */
26
  trait LockableTrait
27
  {
28
+ /** @var Lock */
29
+ private $lock;
30
 
31
  /**
32
  * Locks a command.
35
  */
36
  private function lock($name = null, $blocking = false)
37
  {
38
+ if (!class_exists(SemaphoreStore::class)) {
39
+ throw new RuntimeException('To enable the locking feature you must install the symfony/lock component.');
40
  }
41
 
42
+ if (null !== $this->lock) {
43
  throw new LogicException('A lock is already in place.');
44
  }
45
 
46
+ if (SemaphoreStore::isSupported($blocking)) {
47
+ $store = new SemaphoreStore();
48
+ } else {
49
+ $store = new FlockStore();
50
+ }
51
 
52
+ $this->lock = (new Factory($store))->createLock($name ?: $this->getName());
53
+ if (!$this->lock->acquire($blocking)) {
54
+ $this->lock = null;
55
 
56
  return false;
57
  }
64
  */
65
  private function release()
66
  {
67
+ if ($this->lock) {
68
+ $this->lock->release();
69
+ $this->lock = null;
70
  }
71
  }
72
  }
vendor/symfony/console/CommandLoader/CommandLoaderInterface.php ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Symfony\Component\Console\CommandLoader;
4
+
5
+ use Symfony\Component\Console\Command\Command;
6
+ use Symfony\Component\Console\Exception\CommandNotFoundException;
7
+
8
+ /**
9
+ * @author Robin Chalas <robin.chalas@gmail.com>
10
+ */
11
+ interface CommandLoaderInterface
12
+ {
13
+ /**
14
+ * Loads a command.
15
+ *
16
+ * @param string $name
17
+ *
18
+ * @return Command
19
+ *
20
+ * @throws CommandNotFoundException
21
+ */
22
+ public function get($name);
23
+
24
+ /**
25
+ * Checks if a command exists.
26
+ *
27
+ * @param string $name
28
+ *
29
+ * @return bool
30
+ */
31
+ public function has($name);
32
+
33
+ /**
34
+ * @return string[] All registered command names
35
+ */
36
+ public function getNames();
37
+ }
vendor/symfony/console/CommandLoader/ContainerCommandLoader.php ADDED
@@ -0,0 +1,55 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Symfony\Component\Console\CommandLoader;
4
+
5
+ use Psr\Container\ContainerInterface;
6
+ use Symfony\Component\Console\Exception\CommandNotFoundException;
7
+
8
+ /**
9
+ * Loads commands from a PSR-11 container.
10
+ *
11
+ * @author Robin Chalas <robin.chalas@gmail.com>
12
+ */
13
+ class ContainerCommandLoader implements CommandLoaderInterface
14
+ {
15
+ private $container;
16
+ private $commandMap;
17
+
18
+ /**
19
+ * @param ContainerInterface $container A container from which to load command services
20
+ * @param array $commandMap An array with command names as keys and service ids as values
21
+ */
22
+ public function __construct(ContainerInterface $container, array $commandMap)
23
+ {
24
+ $this->container = $container;
25
+ $this->commandMap = $commandMap;
26
+ }
27
+
28
+ /**
29
+ * {@inheritdoc}
30
+ */
31
+ public function get($name)
32
+ {
33
+ if (!$this->has($name)) {
34
+ throw new CommandNotFoundException(sprintf('Command "%s" does not exist.', $name));
35
+ }
36
+
37
+ return $this->container->get($this->commandMap[$name]);
38
+ }
39
+
40
+ /**
41
+ * {@inheritdoc}
42
+ */
43
+ public function has($name)
44
+ {
45
+ return isset($this->commandMap[$name]) && $this->container->has($this->commandMap[$name]);
46
+ }
47
+
48
+ /**
49
+ * {@inheritdoc}
50
+ */
51
+ public function getNames()
52
+ {
53
+ return array_keys($this->commandMap);
54
+ }
55
+ }
vendor/symfony/console/CommandLoader/FactoryCommandLoader.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\CommandLoader;
13
+
14
+ use Symfony\Component\Console\Exception\CommandNotFoundException;
15
+
16
+ /**
17
+ * A simple command loader using factories to instantiate commands lazily.
18
+ *
19
+ * @author Maxime Steinhausser <maxime.steinhausser@gmail.com>
20
+ */
21
+ class FactoryCommandLoader implements CommandLoaderInterface
22
+ {
23
+ private $factories;
24
+
25
+ /**
26
+ * @param callable[] $factories Indexed by command names
27
+ */
28
+ public function __construct(array $factories)
29
+ {
30
+ $this->factories = $factories;
31
+ }
32
+
33
+ /**
34
+ * {@inheritdoc}
35
+ */
36
+ public function has($name)
37
+ {
38
+ return isset($this->factories[$name]);
39
+ }
40
+
41
+ /**
42
+ * {@inheritdoc}
43
+ */
44
+ public function get($name)
45
+ {
46
+ if (!isset($this->factories[$name])) {
47
+ throw new CommandNotFoundException(sprintf('Command "%s" does not exist.', $name));
48
+ }
49
+
50
+ $factory = $this->factories[$name];
51
+
52
+ return $factory();
53
+ }
54
+
55
+ /**
56
+ * {@inheritdoc}
57
+ */
58
+ public function getNames()
59
+ {
60
+ return array_keys($this->factories);
61
+ }
62
+ }
vendor/{sensiolabs/security-checker/SensioLabs/Security/Crawler → symfony/console/CommandLoader}/index.php RENAMED
File without changes
vendor/symfony/console/DependencyInjection/AddConsoleCommandPass.php CHANGED
@@ -12,9 +12,12 @@
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.
@@ -23,34 +26,81 @@ use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
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
  }
12
  namespace Symfony\Component\Console\DependencyInjection;
13
 
14
  use Symfony\Component\Console\Command\Command;
15
+ use Symfony\Component\Console\CommandLoader\ContainerCommandLoader;
16
  use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
17
+ use Symfony\Component\DependencyInjection\Compiler\ServiceLocatorTagPass;
18
  use Symfony\Component\DependencyInjection\ContainerBuilder;
19
  use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
20
+ use Symfony\Component\DependencyInjection\TypedReference;
21
 
22
  /**
23
  * Registers console commands.
26
  */
27
  class AddConsoleCommandPass implements CompilerPassInterface
28
  {
29
+ private $commandLoaderServiceId;
30
+ private $commandTag;
31
+
32
+ public function __construct($commandLoaderServiceId = 'console.command_loader', $commandTag = 'console.command')
33
+ {
34
+ $this->commandLoaderServiceId = $commandLoaderServiceId;
35
+ $this->commandTag = $commandTag;
36
+ }
37
+
38
  public function process(ContainerBuilder $container)
39
  {
40
+ $commandServices = $container->findTaggedServiceIds($this->commandTag, true);
41
+ $lazyCommandMap = array();
42
+ $lazyCommandRefs = array();
43
  $serviceIds = array();
44
+ $lazyServiceIds = array();
45
 
46
  foreach ($commandServices as $id => $tags) {
47
  $definition = $container->getDefinition($id);
48
  $class = $container->getParameterBag()->resolveValue($definition->getClass());
49
 
 
 
 
 
 
 
 
50
  $commandId = 'console.command.'.strtolower(str_replace('\\', '_', $class));
51
+
52
+ if (isset($tags[0]['command'])) {
53
+ $commandName = $tags[0]['command'];
54
+ } else {
55
+ if (!$r = $container->getReflectionClass($class)) {
56
+ throw new InvalidArgumentException(sprintf('Class "%s" used for service "%s" cannot be found.', $class, $id));
57
+ }
58
+ if (!$r->isSubclassOf(Command::class)) {
59
+ throw new InvalidArgumentException(sprintf('The service "%s" tagged "%s" must be a subclass of "%s".', $id, $this->commandTag, Command::class));
60
+ }
61
+ $commandName = $class::getDefaultName();
62
  }
63
+
64
+ if (null === $commandName) {
65
+ if (isset($serviceIds[$commandId]) || $container->hasAlias($commandId)) {
66
+ $commandId = $commandId.'_'.$id;
67
+ }
68
+ if (!$definition->isPublic() || $definition->isPrivate()) {
69
+ $container->setAlias($commandId, $id)->setPublic(true);
70
+ $id = $commandId;
71
+ }
72
+ $serviceIds[$commandId] = $id;
73
+
74
+ continue;
75
  }
76
 
77
  $serviceIds[$commandId] = $id;
78
+ $lazyServiceIds[$id] = true;
79
+ unset($tags[0]);
80
+ $lazyCommandMap[$commandName] = $id;
81
+ $lazyCommandRefs[$id] = new TypedReference($id, $class);
82
+ $aliases = array();
83
+
84
+ foreach ($tags as $tag) {
85
+ if (isset($tag['command'])) {
86
+ $aliases[] = $tag['command'];
87
+ $lazyCommandMap[$tag['command']] = $id;
88
+ }
89
+ }
90
+
91
+ $definition->addMethodCall('setName', array($commandName));
92
+
93
+ if ($aliases) {
94
+ $definition->addMethodCall('setAliases', array($aliases));
95
+ }
96
  }
97
 
98
+ $container
99
+ ->register($this->commandLoaderServiceId, ContainerCommandLoader::class)
100
+ ->setPublic(true)
101
+ ->setArguments(array(ServiceLocatorTagPass::register($container, $lazyCommandRefs), $lazyCommandMap));
102
+
103
  $container->setParameter('console.command.ids', $serviceIds);
104
+ $container->setParameter('console.lazy_command.ids', $lazyServiceIds);
105
  }
106
  }
vendor/symfony/console/Descriptor/Descriptor.php CHANGED
@@ -13,11 +13,11 @@ 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>
@@ -55,7 +55,7 @@ abstract class Descriptor implements DescriptorInterface
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
 
13
 
14
  use Symfony\Component\Console\Application;
15
  use Symfony\Component\Console\Command\Command;
16
+ use Symfony\Component\Console\Exception\InvalidArgumentException;
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
  * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
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
 
vendor/symfony/console/Descriptor/DescriptorInterface.php CHANGED
@@ -21,7 +21,7 @@ use Symfony\Component\Console\Output\OutputInterface;
21
  interface DescriptorInterface
22
  {
23
  /**
24
- * Describes an InputArgument instance.
25
  *
26
  * @param OutputInterface $output
27
  * @param object $object
21
  interface DescriptorInterface
22
  {
23
  /**
24
+ * Describes an object if supported.
25
  *
26
  * @param OutputInterface $output
27
  * @param object $object
vendor/symfony/console/Descriptor/JsonDescriptor.php CHANGED
@@ -121,7 +121,7 @@ class JsonDescriptor extends Descriptor
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(),
121
  {
122
  return array(
123
  'name' => '--'.$option->getName(),
124
+ 'shortcut' => $option->getShortcut() ? '-'.str_replace('|', '|-', $option->getShortcut()) : '',
125
  'accept_value' => $option->acceptValue(),
126
  'is_value_required' => $option->isValueRequired(),
127
  'is_multiple' => $option->isArray(),
vendor/symfony/console/Descriptor/MarkdownDescriptor.php CHANGED
@@ -70,7 +70,7 @@ class MarkdownDescriptor extends Descriptor
70
  {
71
  $name = '--'.$option->getName();
72
  if ($option->getShortcut()) {
73
- $name .= '|-'.implode('|-', explode('|', $option->getShortcut())).'';
74
  }
75
 
76
  $this->write(
@@ -88,7 +88,7 @@ class MarkdownDescriptor extends Descriptor
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");
@@ -96,7 +96,7 @@ class MarkdownDescriptor extends Descriptor
96
  }
97
  }
98
 
99
- if (count($definition->getOptions()) > 0) {
100
  if ($showArguments) {
101
  $this->write("\n\n");
102
  }
70
  {
71
  $name = '--'.$option->getName();
72
  if ($option->getShortcut()) {
73
+ $name .= '|-'.str_replace('|', '|-', $option->getShortcut()).'';
74
  }
75
 
76
  $this->write(
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");
96
  }
97
  }
98
 
99
+ if (\count($definition->getOptions()) > 0) {
100
  if ($showArguments) {
101
  $this->write("\n\n");
102
  }
vendor/symfony/console/Descriptor/TextDescriptor.php CHANGED
@@ -33,14 +33,14 @@ class TextDescriptor extends Descriptor
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(),
@@ -56,7 +56,7 @@ class TextDescriptor extends Descriptor
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 = '';
@@ -117,7 +117,7 @@ class TextDescriptor extends Descriptor
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
  }
@@ -202,7 +202,7 @@ class TextDescriptor extends Descriptor
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
 
@@ -280,11 +280,11 @@ class TextDescriptor extends Descriptor
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
  }
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(),
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 = '';
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
  }
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
 
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
  }
vendor/symfony/console/Descriptor/XmlDescriptor.php CHANGED
@@ -203,7 +203,7 @@ class XmlDescriptor extends Descriptor
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));
@@ -224,7 +224,7 @@ class XmlDescriptor extends Descriptor
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
  }
@@ -235,7 +235,7 @@ class XmlDescriptor extends Descriptor
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)) {
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));
224
  $pos = strpos($option->getShortcut(), '|');
225
  if (false !== $pos) {
226
  $objectXML->setAttribute('shortcut', '-'.substr($option->getShortcut(), 0, $pos));
227
+ $objectXML->setAttribute('shortcuts', '-'.str_replace('|', '|-', $option->getShortcut()));
228
  } else {
229
  $objectXML->setAttribute('shortcut', $option->getShortcut() ? '-'.$option->getShortcut() : '');
230
  }
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)) {
vendor/symfony/console/Event/ConsoleErrorEvent.php CHANGED
@@ -51,7 +51,7 @@ final class ConsoleErrorEvent extends ConsoleEvent
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;
@@ -78,6 +78,6 @@ final class ConsoleErrorEvent extends ConsoleEvent
78
  */
79
  public function getExitCode()
80
  {
81
- return null !== $this->exitCode ? $this->exitCode : (is_int($this->error->getCode()) && 0 !== $this->error->getCode() ? $this->error->getCode() : 1);
82
  }
83
  }
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;
78
  */
79
  public function getExitCode()
80
  {
81
+ return null !== $this->exitCode ? $this->exitCode : (\is_int($this->error->getCode()) && 0 !== $this->error->getCode() ? $this->error->getCode() : 1);
82
  }
83
  }
vendor/symfony/console/EventListener/ErrorListener.php CHANGED
@@ -40,10 +40,10 @@ class ErrorListener implements EventSubscriberInterface
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)
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('exception' => $error, 'message' => $error->getMessage()));
44
  }
45
 
46
+ $this->logger->error('Error thrown while running command "{command}". Message: "{message}"', array('exception' => $error, 'command' => $inputString, 'message' => $error->getMessage()));
47
  }
48
 
49
  public function onConsoleTerminate(ConsoleTerminateEvent $event)
vendor/symfony/console/Formatter/OutputFormatter.php CHANGED
@@ -50,10 +50,10 @@ class OutputFormatter implements OutputFormatterInterface
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;
@@ -145,7 +145,7 @@ class OutputFormatter implements OutputFormatterInterface
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]) {
@@ -237,6 +237,6 @@ class OutputFormatter implements OutputFormatterInterface
237
  */
238
  private function applyCurrentStyle($text)
239
  {
240
- return $this->isDecorated() && strlen($text) > 0 ? $this->styleStack->getCurrent()->apply($text) : $text;
241
  }
242
  }
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;
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]) {
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/OutputFormatterStyle.php CHANGED
@@ -69,7 +69,7 @@ class OutputFormatterStyle implements OutputFormatterStyleInterface
69
  if (null !== $background) {
70
  $this->setBackground($background);
71
  }
72
- if (count($options)) {
73
  $this->setOptions($options);
74
  }
75
  }
@@ -90,11 +90,7 @@ class OutputFormatterStyle implements OutputFormatterStyleInterface
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];
@@ -116,11 +112,7 @@ class OutputFormatterStyle implements OutputFormatterStyleInterface
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];
@@ -136,14 +128,10 @@ class OutputFormatterStyle implements OutputFormatterStyleInterface
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
  }
@@ -158,11 +146,7 @@ class OutputFormatterStyle implements OutputFormatterStyleInterface
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);
@@ -203,14 +187,14 @@ class OutputFormatterStyle implements OutputFormatterStyleInterface
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
 
69
  if (null !== $background) {
70
  $this->setBackground($background);
71
  }
72
+ if (\count($options)) {
73
  $this->setOptions($options);
74
  }
75
  }
90
  }
91
 
92
  if (!isset(static::$availableForegroundColors[$color])) {
93
+ throw new InvalidArgumentException(sprintf('Invalid foreground color specified: "%s". Expected one of (%s)', $color, implode(', ', array_keys(static::$availableForegroundColors))));
 
 
 
 
94
  }
95
 
96
  $this->foreground = static::$availableForegroundColors[$color];
112
  }
113
 
114
  if (!isset(static::$availableBackgroundColors[$color])) {
115
+ throw new InvalidArgumentException(sprintf('Invalid background color specified: "%s". Expected one of (%s)', $color, implode(', ', array_keys(static::$availableBackgroundColors))));
 
 
 
 
116
  }
117
 
118
  $this->background = static::$availableBackgroundColors[$color];
128
  public function setOption($option)
129
  {
130
  if (!isset(static::$availableOptions[$option])) {
131
+ throw new InvalidArgumentException(sprintf('Invalid option specified: "%s". Expected one of (%s)', $option, implode(', ', array_keys(static::$availableOptions))));
 
 
 
 
132
  }
133
 
134
+ if (!\in_array(static::$availableOptions[$option], $this->options)) {
135
  $this->options[] = static::$availableOptions[$option];
136
  }
137
  }
146
  public function unsetOption($option)
147
  {
148
  if (!isset(static::$availableOptions[$option])) {
149
+ throw new InvalidArgumentException(sprintf('Invalid option specified: "%s". Expected one of (%s)', $option, implode(', ', array_keys(static::$availableOptions))));
 
 
 
 
150
  }
151
 
152
  $pos = array_search(static::$availableOptions[$option], $this->options);
187
  $setCodes[] = $this->background['set'];
188
  $unsetCodes[] = $this->background['unset'];
189
  }
190
+ if (\count($this->options)) {
191
  foreach ($this->options as $option) {
192
  $setCodes[] = $option['set'];
193
  $unsetCodes[] = $option['unset'];
194
  }
195
  }
196
 
197
+ if (0 === \count($setCodes)) {
198
  return $text;
199
  }
200
 
vendor/symfony/console/Formatter/OutputFormatterStyleStack.php CHANGED
@@ -66,7 +66,7 @@ class OutputFormatterStyleStack
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
  }
@@ -86,7 +86,7 @@ class OutputFormatterStyleStack
86
  return $this->emptyStyle;
87
  }
88
 
89
- return $this->styles[count($this->styles) - 1];
90
  }
91
 
92
  /**
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
  }
86
  return $this->emptyStyle;
87
  }
88
 
89
+ return $this->styles[\count($this->styles) - 1];
90
  }
91
 
92
  /**
vendor/symfony/console/Helper/DebugFormatterHelper.php CHANGED
@@ -35,7 +35,7 @@ class DebugFormatterHelper extends Helper
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
  }
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
  }
vendor/symfony/console/Helper/DescriptorHelper.php CHANGED
@@ -16,8 +16,8 @@ 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.
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\Exception\InvalidArgumentException;
20
+ use Symfony\Component\Console\Output\OutputInterface;
21
 
22
  /**
23
  * This class adds helper method to describe objects in various formats.
vendor/symfony/console/Helper/FormatterHelper.php CHANGED
@@ -45,7 +45,7 @@ class FormatterHelper extends Helper
45
  */
46
  public function formatBlock($messages, $style, $large = false)
47
  {
48
- if (!is_array($messages)) {
49
  $messages = array($messages);
50
  }
51
 
45
  */
46
  public function formatBlock($messages, $style, $large = false)
47
  {
48
+ if (!\is_array($messages)) {
49
  $messages = array($messages);
50
  }
51
 
vendor/symfony/console/Helper/Helper.php CHANGED
@@ -48,7 +48,7 @@ abstract class Helper implements HelperInterface
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);
@@ -89,9 +89,9 @@ abstract class Helper implements HelperInterface
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
 
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);
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
 
vendor/symfony/console/Helper/HelperSet.php CHANGED
@@ -33,7 +33,7 @@ class HelperSet implements \IteratorAggregate
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
 
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
 
vendor/symfony/console/Helper/InputAwareHelper.php CHANGED
@@ -11,8 +11,8 @@
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.
11
 
12
  namespace Symfony\Component\Console\Helper;
13
 
 
14
  use Symfony\Component\Console\Input\InputAwareInterface;
15
+ use Symfony\Component\Console\Input\InputInterface;
16
 
17
  /**
18
  * An implementation of InputAwareInterface for Helpers.
vendor/symfony/console/Helper/ProcessHelper.php CHANGED
@@ -15,7 +15,6 @@ 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.
@@ -44,9 +43,7 @@ class ProcessHelper extends Helper
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);
@@ -124,7 +121,7 @@ class ProcessHelper extends Helper
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
  }
15
  use Symfony\Component\Console\Output\OutputInterface;
16
  use Symfony\Component\Process\Exception\ProcessFailedException;
17
  use Symfony\Component\Process\Process;
 
18
 
19
  /**
20
  * The ProcessHelper class provides helpers to run external processes.
43
 
44
  $formatter = $this->getHelperSet()->get('debug_formatter');
45
 
46
+ if ($cmd instanceof Process) {
 
 
47
  $process = $cmd;
48
  } else {
49
  $process = new Process($cmd);
121
  $output->write($formatter->progress(spl_object_hash($process), $this->escapeString($buffer), Process::ERR === $type));
122
 
123
  if (null !== $callback) {
124
+ \call_user_func($callback, $type, $buffer);
125
  }
126
  };
127
  }
vendor/symfony/console/Helper/ProgressBar.php CHANGED
@@ -11,9 +11,9 @@
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
  /**
@@ -583,7 +583,7 @@ final class ProgressBar
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 {
11
 
12
  namespace Symfony\Component\Console\Helper;
13
 
14
+ use Symfony\Component\Console\Exception\LogicException;
15
  use Symfony\Component\Console\Output\ConsoleOutputInterface;
16
  use Symfony\Component\Console\Output\OutputInterface;
 
17
  use Symfony\Component\Console\Terminal;
18
 
19
  /**
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 {
vendor/symfony/console/Helper/ProgressIndicator.php CHANGED
@@ -53,7 +53,7 @@ class ProgressIndicator
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
 
@@ -196,7 +196,7 @@ class ProgressIndicator
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];
@@ -241,7 +241,7 @@ class ProgressIndicator
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;
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
 
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];
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;
vendor/symfony/console/Helper/QuestionHelper.php CHANGED
@@ -19,8 +19,8 @@ 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.
@@ -87,7 +87,7 @@ class QuestionHelper extends Helper
87
  {
88
  @trigger_error(sprintf('The %s() method is deprecated since Symfony 3.2 and will be removed in 4.0. Use %s::setStream() instead.', __METHOD__, StreamableInputInterface::class), E_USER_DEPRECATED);
89
 
90
- if (!is_resource($stream)) {
91
  throw new InvalidArgumentException('Input stream must be a valid resource.');
92
  }
93
 
@@ -104,7 +104,7 @@ class QuestionHelper extends Helper
104
  */
105
  public function getInputStream()
106
  {
107
- if (0 === func_num_args() || func_get_arg(0)) {
108
  @trigger_error(sprintf('The %s() method is deprecated since Symfony 3.2 and will be removed in 4.0. Use %s::getStream() instead.', __METHOD__, StreamableInputInterface::class), E_USER_DEPRECATED);
109
  }
110
 
@@ -130,7 +130,7 @@ class QuestionHelper extends Helper
130
  /**
131
  * Asks the question to the user.
132
  *
133
- * @return bool|mixed|null|string
134
  *
135
  * @throws RuntimeException In case the fallback is deactivated and the response cannot be hidden
136
  */
@@ -161,10 +161,10 @@ class QuestionHelper extends Helper
161
  $ret = trim($ret);
162
  }
163
  } else {
164
- $ret = trim($this->autocomplete($output, $question, $inputStream, is_array($autocomplete) ? $autocomplete : iterator_to_array($autocomplete, false)));
165
  }
166
 
167
- $ret = strlen($ret) > 0 ? $ret : $question->getDefault();
168
 
169
  if ($normalizer = $question->getNormalizer()) {
170
  return $normalizer($ret);
@@ -228,7 +228,7 @@ class QuestionHelper extends Helper
228
  $i = 0;
229
  $ofs = -1;
230
  $matches = $autocomplete;
231
- $numMatches = count($matches);
232
 
233
  $sttyMode = shell_exec('stty -g');
234
 
@@ -253,7 +253,7 @@ class QuestionHelper extends Helper
253
  if (0 === $i) {
254
  $ofs = -1;
255
  $matches = $autocomplete;
256
- $numMatches = count($matches);
257
  } else {
258
  $numMatches = 0;
259
  }
@@ -277,13 +277,13 @@ class QuestionHelper extends Helper
277
  $ofs += ('A' === $c[2]) ? -1 : 1;
278
  $ofs = ($numMatches + $ofs) % $numMatches;
279
  }
280
- } elseif (ord($c) < 32) {
281
  if ("\t" === $c || "\n" === $c) {
282
  if ($numMatches > 0 && -1 !== $ofs) {
283
  $ret = $matches[$ofs];
284
  // Echo out remaining chars for current match
285
  $output->write(substr($ret, $i));
286
- $i = strlen($ret);
287
  }
288
 
289
  if ("\n" === $c) {
@@ -305,7 +305,7 @@ class QuestionHelper extends Helper
305
 
306
  foreach ($autocomplete as $value) {
307
  // If typed characters match the beginning chunk of value (e.g. [AcmeDe]moBundle)
308
- if (0 === strpos($value, $ret) && $i !== strlen($value)) {
309
  $matches[$numMatches++] = $value;
310
  }
311
  }
@@ -342,7 +342,7 @@ class QuestionHelper extends Helper
342
  */
343
  private function getHiddenResponse(OutputInterface $output, $inputStream)
344
  {
345
- if ('\\' === DIRECTORY_SEPARATOR) {
346
  $exe = __DIR__.'/../Resources/bin/hiddeninput.exe';
347
 
348
  // handle code running from a phar
@@ -412,7 +412,7 @@ class QuestionHelper extends Helper
412
  }
413
 
414
  try {
415
- return call_user_func($question->getValidator(), $interviewer());
416
  } catch (RuntimeException $e) {
417
  throw $e;
418
  } catch (\Exception $error) {
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\ChoiceQuestion;
23
+ use Symfony\Component\Console\Question\Question;
24
 
25
  /**
26
  * The QuestionHelper class provides helpers to interact with the user.
87
  {
88
  @trigger_error(sprintf('The %s() method is deprecated since Symfony 3.2 and will be removed in 4.0. Use %s::setStream() instead.', __METHOD__, StreamableInputInterface::class), E_USER_DEPRECATED);
89
 
90
+ if (!\is_resource($stream)) {
91
  throw new InvalidArgumentException('Input stream must be a valid resource.');
92
  }
93
 
104
  */
105
  public function getInputStream()
106
  {
107
+ if (0 === \func_num_args() || func_get_arg(0)) {
108
  @trigger_error(sprintf('The %s() method is deprecated since Symfony 3.2 and will be removed in 4.0. Use %s::getStream() instead.', __METHOD__, StreamableInputInterface::class), E_USER_DEPRECATED);
109
  }
110
 
130
  /**
131
  * Asks the question to the user.
132
  *
133
+ * @return bool|mixed|string|null
134
  *
135
  * @throws RuntimeException In case the fallback is deactivated and the response cannot be hidden
136
  */
161
  $ret = trim($ret);
162
  }
163
  } else {
164
+ $ret = trim($this->autocomplete($output, $question, $inputStream, \is_array($autocomplete) ? $autocomplete : iterator_to_array($autocomplete, false)));
165
  }
166
 
167
+ $ret = \strlen($ret) > 0 ? $ret : $question->getDefault();
168
 
169
  if ($normalizer = $question->getNormalizer()) {
170
  return $normalizer($ret);
228
  $i = 0;
229
  $ofs = -1;
230
  $matches = $autocomplete;
231
+ $numMatches = \count($matches);
232
 
233
  $sttyMode = shell_exec('stty -g');
234
 
253
  if (0 === $i) {
254
  $ofs = -1;
255
  $matches = $autocomplete;
256
+ $numMatches = \count($matches);
257
  } else {
258
  $numMatches = 0;
259
  }
277
  $ofs += ('A' === $c[2]) ? -1 : 1;
278
  $ofs = ($numMatches + $ofs) % $numMatches;
279
  }
280
+ } elseif (\ord($c) < 32) {
281
  if ("\t" === $c || "\n" === $c) {
282
  if ($numMatches > 0 && -1 !== $ofs) {
283
  $ret = $matches[$ofs];
284
  // Echo out remaining chars for current match
285
  $output->write(substr($ret, $i));
286
+ $i = \strlen($ret);
287
  }
288
 
289
  if ("\n" === $c) {
305
 
306
  foreach ($autocomplete as $value) {
307
  // If typed characters match the beginning chunk of value (e.g. [AcmeDe]moBundle)
308
+ if (0 === strpos($value, $ret)) {
309
  $matches[$numMatches++] = $value;
310
  }
311
  }
342
  */
343
  private function getHiddenResponse(OutputInterface $output, $inputStream)
344
  {
345
+ if ('\\' === \DIRECTORY_SEPARATOR) {
346
  $exe = __DIR__.'/../Resources/bin/hiddeninput.exe';
347
 
348
  // handle code running from a phar
412
  }
413
 
414
  try {
415
+ return \call_user_func($question->getValidator(), $interviewer());
416
  } catch (RuntimeException $e) {
417
  throw $e;
418
  } catch (\Exception $error) {
vendor/symfony/console/Helper/SymfonyQuestionHelper.php CHANGED
@@ -12,13 +12,13 @@
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.
@@ -29,6 +29,8 @@ class SymfonyQuestionHelper extends QuestionHelper
29
  {
30
  /**
31
  * {@inheritdoc}
 
 
32
  */
33
  public function ask(InputInterface $input, OutputInterface $output, Question $question)
34
  {
@@ -38,7 +40,9 @@ class SymfonyQuestionHelper extends QuestionHelper
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
  }
@@ -82,7 +86,7 @@ class SymfonyQuestionHelper extends QuestionHelper
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
 
12
  namespace Symfony\Component\Console\Helper;
13
 
14
  use Symfony\Component\Console\Exception\LogicException;
15
+ use Symfony\Component\Console\Formatter\OutputFormatter;
16
  use Symfony\Component\Console\Input\InputInterface;
17
  use Symfony\Component\Console\Output\OutputInterface;
18
  use Symfony\Component\Console\Question\ChoiceQuestion;
19
  use Symfony\Component\Console\Question\ConfirmationQuestion;
20
  use Symfony\Component\Console\Question\Question;
21
  use Symfony\Component\Console\Style\SymfonyStyle;
 
22
 
23
  /**
24
  * Symfony Style Guide compliant question helper.
29
  {
30
  /**
31
  * {@inheritdoc}
32
+ *
33
+ * To be removed in 4.0
34
  */
35
  public function ask(InputInterface $input, OutputInterface $output, Question $question)
36
  {
40
  $value = $validator($value);
41
  } else {
42
  // make required
43
+ if (!\is_array($value) && !\is_bool($value) && 0 === \strlen($value)) {
44
+ @trigger_error('The default question validator is deprecated since Symfony 3.3 and will not be used anymore in version 4.0. Set a custom question validator if needed.', E_USER_DEPRECATED);
45
+
46
  throw new LogicException('A value is required.');
47
  }
48
  }
86
 
87
  case $question instanceof ChoiceQuestion:
88
  $choices = $question->getChoices();
89
+ $text = sprintf(' <info>%s</info> [<comment>%s</comment>]:', $text, OutputFormatter::escape(isset($choices[$default]) ? $choices[$default] : $default));
90
 
91
  break;
92
 
vendor/symfony/console/Helper/Table.php CHANGED
@@ -11,8 +11,8 @@
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.
@@ -210,7 +210,7 @@ class Table
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
 
@@ -243,7 +243,7 @@ class Table
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
 
@@ -263,15 +263,14 @@ class Table
263
  * Renders table to output.
264
  *
265
  * Example:
266
- * <code>
267
- * +---------------+-----------------------+------------------+
268
- * | ISBN | Title | Author |
269
- * +---------------+-----------------------+------------------+
270
- * | 99921-58-10-7 | Divine Comedy | Dante Alighieri |
271
- * | 9971-5-0210-0 | A Tale of Two Cities | Charles Dickens |
272
- * | 960-425-059-0 | The Lord of the Rings | J. R. R. Tolkien |
273
- * +---------------+-----------------------+------------------+
274
- * </code>
275
  */
276
  public function render()
277
  {
@@ -305,7 +304,9 @@ class Table
305
  /**
306
  * Renders horizontal header separator.
307
  *
308
- * Example: <code>+-----+-----------+-------+</code>
 
 
309
  */
310
  private function renderRowSeparator()
311
  {
@@ -336,7 +337,9 @@ class Table
336
  /**
337
  * Renders table row.
338
  *
339
- * Example: <code>| 9971-5-0210-0 | A Tale of Two Cities | Charles Dickens |</code>
 
 
340
  *
341
  * @param array $row
342
  * @param string $cellFormat
@@ -375,7 +378,7 @@ class Table
375
 
376
  // str_pad won't work properly with multi-byte strings, we need to fix the padding
377
  if (false !== $encoding = mb_detect_encoding($cell, null, true)) {
378
- $width += strlen($cell) - mb_strwidth($cell, $encoding);
379
  }
380
 
381
  $style = $this->getColumnStyle($column);
@@ -414,7 +417,7 @@ class Table
414
  private function buildTableRows($rows)
415
  {
416
  $unmergedRows = array();
417
- for ($rowKey = 0; $rowKey < count($rows); ++$rowKey) {
418
  $rows = $this->fillNextRows($rows, $rowKey);
419
 
420
  // Remove any new line breaks and replace it with a new line
@@ -454,17 +457,22 @@ class Table
454
  * @param int $line
455
  *
456
  * @return array
 
 
457
  */
458
  private function fillNextRows(array $rows, $line)
459
  {
460
  $unmergedRows = array();
461
  foreach ($rows[$line] as $column => $cell) {
 
 
 
462
  if ($cell instanceof TableCell && $cell->getRowspan() > 1) {
463
  $nbLines = $cell->getRowspan() - 1;
464
  $lines = array($cell);
465
  if (strstr($cell, "\n")) {
466
  $lines = explode("\n", str_replace("\n", "<fg=default;bg=default>\n</>", $cell));
467
- $nbLines = count($lines) > $nbLines ? substr_count($cell, "\n") : $nbLines;
468
 
469
  $rows[$line][$column] = new TableCell($lines[0], array('colspan' => $cell->getColspan()));
470
  unset($lines[0]);
@@ -484,7 +492,7 @@ class Table
484
 
485
  foreach ($unmergedRows as $unmergedRowKey => $unmergedRow) {
486
  // we need to know if $unmergedRow will be merged or inserted into $rows
487
- if (isset($rows[$unmergedRowKey]) && is_array($rows[$unmergedRowKey]) && ($this->getNumberOfColumns($rows[$unmergedRowKey]) + $this->getNumberOfColumns($unmergedRows[$unmergedRowKey]) <= $this->numberOfColumns)) {
488
  foreach ($unmergedRow as $cellKey => $cell) {
489
  // insert cell into row at cellKey position
490
  array_splice($rows[$unmergedRowKey], $cellKey, 0, array($cell));
@@ -550,7 +558,7 @@ class Table
550
  */
551
  private function getNumberOfColumns(array $row)
552
  {
553
- $columns = count($row);
554
  foreach ($row as $column) {
555
  $columns += $column instanceof TableCell ? ($column->getColspan() - 1) : 0;
556
  }
@@ -604,7 +612,7 @@ class Table
604
  $lengths[] = $this->getCellWidth($row, $column);
605
  }
606
 
607
- $this->effectiveColumnWidths[$column] = max($lengths) + strlen($this->style->getCellRowContentFormat()) - 2;
608
  }
609
  }
610
 
@@ -615,7 +623,7 @@ class Table
615
  */
616
  private function getColumnSeparatorWidth()
617
  {
618
- return strlen(sprintf($this->style->getBorderFormat(), $this->style->getVerticalBorderChar()));
619
  }
620
 
621
  /**
11
 
12
  namespace Symfony\Component\Console\Helper;
13
 
 
14
  use Symfony\Component\Console\Exception\InvalidArgumentException;
15
+ use Symfony\Component\Console\Output\OutputInterface;
16
 
17
  /**
18
  * Provides helpers to display a table.
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
 
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
 
263
  * Renders table to output.
264
  *
265
  * Example:
266
+ *
267
+ * +---------------+-----------------------+------------------+
268
+ * | ISBN | Title | Author |
269
+ * +---------------+-----------------------+------------------+
270
+ * | 99921-58-10-7 | Divine Comedy | Dante Alighieri |
271
+ * | 9971-5-0210-0 | A Tale of Two Cities | Charles Dickens |
272
+ * | 960-425-059-0 | The Lord of the Rings | J. R. R. Tolkien |
273
+ * +---------------+-----------------------+------------------+
 
274
  */
275
  public function render()
276
  {
304
  /**
305
  * Renders horizontal header separator.
306
  *
307
+ * Example:
308
+ *
309
+ * +-----+-----------+-------+
310
  */
311
  private function renderRowSeparator()
312
  {
337
  /**
338
  * Renders table row.
339
  *
340
+ * Example:
341
+ *
342
+ * | 9971-5-0210-0 | A Tale of Two Cities | Charles Dickens |
343
  *
344
  * @param array $row
345
  * @param string $cellFormat
378
 
379
  // str_pad won't work properly with multi-byte strings, we need to fix the padding
380
  if (false !== $encoding = mb_detect_encoding($cell, null, true)) {
381
+ $width += \strlen($cell) - mb_strwidth($cell, $encoding);
382
  }
383
 
384
  $style = $this->getColumnStyle($column);
417
  private function buildTableRows($rows)
418
  {
419
  $unmergedRows = array();
420
+ for ($rowKey = 0; $rowKey < \count($rows); ++$rowKey) {
421
  $rows = $this->fillNextRows($rows, $rowKey);
422
 
423
  // Remove any new line breaks and replace it with a new line
457
  * @param int $line
458
  *
459
  * @return array
460
+ *
461
+ * @throws InvalidArgumentException
462
  */
463
  private function fillNextRows(array $rows, $line)
464
  {
465
  $unmergedRows = array();
466
  foreach ($rows[$line] as $column => $cell) {
467
+ if (null !== $cell && !$cell instanceof TableCell && !is_scalar($cell) && !(\is_object($cell) && method_exists($cell, '__toString'))) {
468
+ throw new InvalidArgumentException(sprintf('A cell must be a TableCell, a scalar or an object implementing __toString, %s given.', \gettype($cell)));
469
+ }
470
  if ($cell instanceof TableCell && $cell->getRowspan() > 1) {
471
  $nbLines = $cell->getRowspan() - 1;
472
  $lines = array($cell);
473
  if (strstr($cell, "\n")) {
474
  $lines = explode("\n", str_replace("\n", "<fg=default;bg=default>\n</>", $cell));
475
+ $nbLines = \count($lines) > $nbLines ? substr_count($cell, "\n") : $nbLines;
476
 
477
  $rows[$line][$column] = new TableCell($lines[0], array('colspan' => $cell->getColspan()));
478
  unset($lines[0]);
492
 
493
  foreach ($unmergedRows as $unmergedRowKey => $unmergedRow) {
494
  // we need to know if $unmergedRow will be merged or inserted into $rows
495
+ if (isset($rows[$unmergedRowKey]) && \is_array($rows[$unmergedRowKey]) && ($this->getNumberOfColumns($rows[$unmergedRowKey]) + $this->getNumberOfColumns($unmergedRows[$unmergedRowKey]) <= $this->numberOfColumns)) {
496
  foreach ($unmergedRow as $cellKey => $cell) {
497
  // insert cell into row at cellKey position
498
  array_splice($rows[$unmergedRowKey], $cellKey, 0, array($cell));
558
  */
559
  private function getNumberOfColumns(array $row)
560
  {
561
+ $columns = \count($row);
562
  foreach ($row as $column) {
563
  $columns += $column instanceof TableCell ? ($column->getColspan() - 1) : 0;
564
  }
612
  $lengths[] = $this->getCellWidth($row, $column);
613
  }
614
 
615
+ $this->effectiveColumnWidths[$column] = max($lengths) + Helper::strlen($this->style->getCellRowContentFormat()) - 2;
616
  }
617
  }
618
 
623
  */
624
  private function getColumnSeparatorWidth()
625
  {
626
+ return Helper::strlen(sprintf($this->style->getBorderFormat(), $this->style->getVerticalBorderChar()));
627
  }
628
 
629
  /**
vendor/symfony/console/Helper/TableCell.php CHANGED
@@ -30,7 +30,7 @@ class TableCell
30
  */
31
  public function __construct($value = '', array $options = array())
32
  {
33
- if (is_numeric($value) && !is_string($value)) {
34
  $value = (string) $value;
35
  }
36
 
30
  */
31
  public function __construct($value = '', array $options = array())
32
  {
33
+ if (is_numeric($value) && !\is_string($value)) {
34
  $value = (string) $value;
35
  }
36
 
vendor/symfony/console/Helper/TableStyle.php CHANGED
@@ -237,7 +237,7 @@ class TableStyle
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
 
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
 
vendor/symfony/console/Input/ArgvInput.php CHANGED
@@ -97,7 +97,7 @@ class ArgvInput extends Input
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));
@@ -118,10 +118,11 @@ class ArgvInput extends Input
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]);
@@ -145,7 +146,7 @@ class ArgvInput extends Input
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) {
@@ -168,7 +169,7 @@ class ArgvInput extends Input
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)) {
@@ -183,7 +184,7 @@ class ArgvInput extends Input
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
 
@@ -228,11 +229,11 @@ class ArgvInput extends Input
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);
@@ -282,7 +283,11 @@ class ArgvInput extends Input
282
  return false;
283
  }
284
  foreach ($values as $value) {
285
- if ($token === $value || 0 === strpos($token, $value.'=')) {
 
 
 
 
286
  return true;
287
  }
288
  }
@@ -299,20 +304,23 @@ class ArgvInput extends Input
299
  $values = (array) $values;
300
  $tokens = $this->tokens;
301
 
302
- while (0 < count($tokens)) {
303
  $token = array_shift($tokens);
304
  if ($onlyParams && '--' === $token) {
305
- return false;
306
  }
307
 
308
  foreach ($values as $value) {
309
- if ($token === $value || 0 === strpos($token, $value.'=')) {
310
- if (false !== $pos = strpos($token, '=')) {
311
- return substr($token, $pos + 1);
312
- }
313
-
314
  return array_shift($tokens);
315
  }
 
 
 
 
 
 
 
316
  }
317
  }
318
 
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));
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
+ $encoding = mb_detect_encoding($name, null, true);
125
+ throw new RuntimeException(sprintf('The "-%s" option does not exist.', false === $encoding ? $name[$i] : mb_substr($name, $i, 1, $encoding)));
126
  }
127
 
128
  $option = $this->definition->getOptionForShortcut($name[$i]);
146
  $name = substr($token, 2);
147
 
148
  if (false !== $pos = strpos($name, '=')) {
149
+ if (0 === \strlen($value = substr($name, $pos + 1))) {
150
  // if no value after "=" then substr() returns "" since php7 only, false before
151
  // see http://php.net/manual/fr/migration70.incompatible.php#119151
152
  if (\PHP_VERSION_ID < 70000 && false === $value) {
169
  */
170
  private function parseArgument($token)
171
  {
172
+ $c = \count($this->arguments);
173
 
174
  // if input is expecting another argument, add it
175
  if ($this->definition->hasArgument($c)) {
184
  // unexpected argument
185
  } else {
186
  $all = $this->definition->getArguments();
187
+ if (\count($all)) {
188
  throw new RuntimeException(sprintf('Too many arguments, expected arguments "%s".', implode('" "', array_keys($all))));
189
  }
190
 
229
  throw new RuntimeException(sprintf('The "--%s" option does not accept a value.', $name));
230
  }
231
 
232
+ if (\in_array($value, array('', null), true) && $option->acceptValue() && \count($this->parsed)) {
233
  // if option accepts an optional or mandatory argument
234
  // let's see if there is one provided
235
  $next = array_shift($this->parsed);
236
+ if ((isset($next[0]) && '-' !== $next[0]) || \in_array($next, array('', null), true)) {
237
  $value = $next;
238
  } else {
239
  array_unshift($this->parsed, $next);
283
  return false;
284
  }
285
  foreach ($values as $value) {
286
+ // Options with values:
287
+ // For long options, test for '--option=' at beginning
288
+ // For short options, test for '-o' at beginning
289
+ $leading = 0 === strpos($value, '--') ? $value.'=' : $value;
290
+ if ($token === $value || '' !== $leading && 0 === strpos($token, $leading)) {
291
  return true;
292
  }
293
  }
304
  $values = (array) $values;
305
  $tokens = $this->tokens;
306
 
307
+ while (0 < \count($tokens)) {
308
  $token = array_shift($tokens);
309
  if ($onlyParams && '--' === $token) {
310
+ return $default;
311
  }
312
 
313
  foreach ($values as $value) {
314
+ if ($token === $value) {
 
 
 
 
315
  return array_shift($tokens);
316
  }
317
+ // Options with values:
318
+ // For long options, test for '--option=' at beginning
319
+ // For short options, test for '-o' at beginning
320
+ $leading = 0 === strpos($value, '--') ? $value.'=' : $value;
321
+ if ('' !== $leading && 0 === strpos($token, $leading)) {
322
+ return substr($token, \strlen($leading));
323
+ }
324
  }
325
  }
326
 
vendor/symfony/console/Input/ArrayInput.php CHANGED
@@ -56,7 +56,7 @@ class ArrayInput extends Input
56
  $values = (array) $values;
57
 
58
  foreach ($this->parameters as $k => $v) {
59
- if (!is_int($k)) {
60
  $v = $k;
61
  }
62
 
@@ -64,7 +64,7 @@ class ArrayInput extends Input
64
  return false;
65
  }
66
 
67
- if (in_array($v, $values)) {
68
  return true;
69
  }
70
  }
@@ -80,15 +80,15 @@ class ArrayInput extends Input
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
  }
@@ -106,7 +106,7 @@ class ArrayInput extends Input
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
  }
@@ -114,7 +114,7 @@ class ArrayInput extends Input
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
 
56
  $values = (array) $values;
57
 
58
  foreach ($this->parameters as $k => $v) {
59
+ if (!\is_int($k)) {
60
  $v = $k;
61
  }
62
 
64
  return false;
65
  }
66
 
67
+ if (\in_array($v, $values)) {
68
  return true;
69
  }
70
  }
80
  $values = (array) $values;
81
 
82
  foreach ($this->parameters as $k => $v) {
83
+ if ($onlyParams && ('--' === $k || (\is_int($k) && '--' === $v))) {
84
+ return $default;
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
  }
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
  }
114
  $params[] = $param.('' != $val ? '='.$this->escapeToken($val) : '');
115
  }
116
  } else {
117
+ $params[] = \is_array($val) ? implode(' ', array_map(array($this, 'escapeToken'), $val)) : $this->escapeToken($val);
118
  }
119
  }
120
 
vendor/symfony/console/Input/Input.php CHANGED
@@ -72,7 +72,7 @@ abstract class Input implements InputInterface, StreamableInputInterface
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
  }
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
  }
vendor/symfony/console/Input/InputArgument.php CHANGED
@@ -31,10 +31,10 @@ class InputArgument
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
  */
@@ -42,7 +42,7 @@ class InputArgument
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
 
@@ -86,7 +86,7 @@ class InputArgument
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
  */
@@ -99,7 +99,7 @@ class InputArgument
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
  }
@@ -110,7 +110,7 @@ class InputArgument
110
  /**
111
  * Returns the default value.
112
  *
113
- * @return mixed The default value
114
  */
115
  public function getDefault()
116
  {
31
  private $description;
32
 
33
  /**
34
+ * @param string $name The argument name
35
+ * @param int|null $mode The argument mode: self::REQUIRED or self::OPTIONAL
36
+ * @param string $description A description text
37
+ * @param string|string[]|null $default The default value (for self::OPTIONAL mode only)
38
  *
39
  * @throws InvalidArgumentException When argument mode is not valid
40
  */
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
 
86
  /**
87
  * Sets the default value.
88
  *
89
+ * @param string|string[]|null $default The default value
90
  *
91
  * @throws LogicException When incorrect default value is given
92
  */
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
  }
110
  /**
111
  * Returns the default value.
112
  *
113
+ * @return string|string[]|null The default value
114
  */
115
  public function getDefault()
116
  {
vendor/symfony/console/Input/InputDefinition.php CHANGED
@@ -20,8 +20,8 @@ use Symfony\Component\Console\Exception\LogicException;
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>
@@ -135,7 +135,7 @@ class InputDefinition
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
  }
@@ -149,7 +149,7 @@ class InputDefinition
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
  }
@@ -171,7 +171,7 @@ class InputDefinition
171
  */
172
  public function getArgumentCount()
173
  {
174
- return $this->hasAnArrayArgument ? PHP_INT_MAX : count($this->arguments);
175
  }
176
 
177
  /**
@@ -378,7 +378,7 @@ class InputDefinition
378
  }
379
  }
380
 
381
- if (count($elements) && $this->getArguments()) {
382
  $elements[] = '[--]';
383
  }
384
 
@@ -387,7 +387,7 @@ class InputDefinition
387
  if (!$argument->isRequired()) {
388
  $element = '['.$element.']';
389
  } elseif ($argument->isArray()) {
390
- $element = $element.' ('.$element.')';
391
  }
392
 
393
  if ($argument->isArray()) {
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>
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
  }
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
  }
171
  */
172
  public function getArgumentCount()
173
  {
174
+ return $this->hasAnArrayArgument ? PHP_INT_MAX : \count($this->arguments);
175
  }
176
 
177
  /**
378
  }
379
  }
380
 
381
+ if (\count($elements) && $this->getArguments()) {
382
  $elements[] = '[--]';
383
  }
384
 
387
  if (!$argument->isRequired()) {
388
  $element = '['.$element.']';
389
  } elseif ($argument->isArray()) {
390
+ $element .= ' ('.$element.')';
391
  }
392
 
393
  if ($argument->isArray()) {
vendor/symfony/console/Input/InputInterface.php CHANGED
@@ -33,6 +33,8 @@ interface InputInterface
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
@@ -46,6 +48,8 @@ interface InputInterface
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
@@ -57,6 +61,8 @@ interface InputInterface
57
 
58
  /**
59
  * Binds the current Input instance with the given arguments and options.
 
 
60
  */
61
  public function bind(InputDefinition $definition);
62
 
@@ -79,7 +85,7 @@ interface InputInterface
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
  */
@@ -88,8 +94,8 @@ interface InputInterface
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
  */
@@ -116,7 +122,7 @@ interface InputInterface
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
  */
@@ -125,8 +131,8 @@ interface InputInterface
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
  */
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
+ * Does not necessarily return the correct result for short options
37
+ * when multiple flags are combined in the same option.
38
  *
39
  * @param string|array $values The values to look for in the raw parameters (can be an array)
40
  * @param bool $onlyParams Only check real parameters, skip those following an end of options (--) signal
48
  *
49
  * This method is to be used to introspect the input parameters
50
  * before they have been validated. It must be used carefully.
51
+ * Does not necessarily return the correct result for short options
52
+ * when multiple flags are combined in the same option.
53
  *
54
  * @param string|array $values The value(s) to look for in the raw parameters (can be an array)
55
  * @param mixed $default The default value to return if no result is found
61
 
62
  /**
63
  * Binds the current Input instance with the given arguments and options.
64
+ *
65
+ * @throws RuntimeException
66
  */
67
  public function bind(InputDefinition $definition);
68
 
85
  *
86
  * @param string $name The argument name
87
  *
88
+ * @return string|string[]|null The argument value
89
  *
90
  * @throws InvalidArgumentException When argument given doesn't exist
91
  */
94
  /**
95
  * Sets an argument value by name.
96
  *
97
+ * @param string $name The argument name
98
+ * @param string|string[]|null $value The argument value
99
  *
100
  * @throws InvalidArgumentException When argument given doesn't exist
101
  */
122
  *
123
  * @param string $name The option name
124
  *
125
+ * @return string|string[]|bool|null The option value
126
  *
127
  * @throws InvalidArgumentException When option given doesn't exist
128
  */
131
  /**
132
  * Sets an option value by name.
133
  *
134
+ * @param string $name The option name
135
+ * @param string|string[]|bool|null $value The option value
136
  *
137
  * @throws InvalidArgumentException When option given doesn't exist
138
  */
vendor/symfony/console/Input/InputOption.php CHANGED
@@ -33,11 +33,11 @@ class InputOption
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
  */
@@ -56,7 +56,7 @@ class InputOption
56
  }
57
 
58
  if (null !== $shortcut) {
59
- if (is_array($shortcut)) {
60
  $shortcut = implode('|', $shortcut);
61
  }
62
  $shortcuts = preg_split('{(\|)-?}', ltrim($shortcut, '-'));
@@ -70,7 +70,7 @@ class InputOption
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
 
@@ -149,7 +149,7 @@ class InputOption
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
  */
@@ -162,7 +162,7 @@ class InputOption
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
  }
@@ -173,7 +173,7 @@ class InputOption
173
  /**
174
  * Returns the default value.
175
  *
176
- * @return mixed The default value
177
  */
178
  public function getDefault()
179
  {
@@ -195,7 +195,7 @@ class InputOption
195
  *
196
  * @return bool
197
  */
198
- public function equals(InputOption $option)
199
  {
200
  return $option->getName() === $this->getName()
201
  && $option->getShortcut() === $this->getShortcut()
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|null $mode The option mode: One of the VALUE_* constants
39
+ * @param string $description A description text
40
+ * @param string|string[]|bool|null $default The default value (must be null for self::VALUE_NONE)
41
  *
42
  * @throws InvalidArgumentException If option mode is invalid or incompatible
43
  */
56
  }
57
 
58
  if (null !== $shortcut) {
59
+ if (\is_array($shortcut)) {
60
  $shortcut = implode('|', $shortcut);
61
  }
62
  $shortcuts = preg_split('{(\|)-?}', ltrim($shortcut, '-'));
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
 
149
  /**
150
  * Sets the default value.
151
  *
152
+ * @param string|string[]|bool|null $default The default value
153
  *
154
  * @throws LogicException When incorrect default value is given
155
  */
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
  }
173
  /**
174
  * Returns the default value.
175
  *
176
+ * @return string|string[]|bool|null The default value
177
  */
178
  public function getDefault()
179
  {
195
  *
196
  * @return bool
197
  */
198
+ public function equals(self $option)
199
  {
200
  return $option->getName() === $this->getName()
201
  && $option->getShortcut() === $this->getShortcut()
vendor/symfony/console/Input/StringInput.php CHANGED
@@ -49,14 +49,14 @@ class StringInput extends ArgvInput
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 {
@@ -64,7 +64,7 @@ class StringInput extends ArgvInput
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;
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 {
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;
vendor/symfony/console/Logger/ConsoleLogger.php CHANGED
@@ -14,8 +14,8 @@ namespace Symfony\Component\Console\Logger;
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.
@@ -87,6 +87,8 @@ class ConsoleLogger extends AbstractLogger
87
 
88
  /**
89
  * Returns true when any messages have been logged at error levels.
 
 
90
  */
91
  public function hasErrored()
92
  {
@@ -105,15 +107,23 @@ class ConsoleLogger extends AbstractLogger
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
  }
14
  use Psr\Log\AbstractLogger;
15
  use Psr\Log\InvalidArgumentException;
16
  use Psr\Log\LogLevel;
 
17
  use Symfony\Component\Console\Output\ConsoleOutputInterface;
18
+ use Symfony\Component\Console\Output\OutputInterface;
19
 
20
  /**
21
  * PSR-3 compliant console logger.
87
 
88
  /**
89
  * Returns true when any messages have been logged at error levels.
90
+ *
91
+ * @return bool
92
  */
93
  public function hasErrored()
94
  {
107
  */
108
  private function interpolate($message, array $context)
109
  {
110
+ if (false === strpos($message, '{')) {
111
+ return $message;
112
+ }
113
+
114
+ $replacements = array();
115
  foreach ($context as $key => $val) {
116
+ if (null === $val || is_scalar($val) || (\is_object($val) && method_exists($val, '__toString'))) {
117
+ $replacements["{{$key}}"] = $val;
118
+ } elseif ($val instanceof \DateTimeInterface) {
119
+ $replacements["{{$key}}"] = $val->format(\DateTime::RFC3339);
120
+ } elseif (\is_object($val)) {
121
+ $replacements["{{$key}}"] = '[object '.\get_class($val).']';
122
+ } else {
123
+ $replacements["{{$key}}"] = '['.\gettype($val).']';
124
  }
125
  }
126
 
127
+ return strtr($message, $replacements);
 
128
  }
129
  }
vendor/symfony/console/Output/ConsoleOutput.php CHANGED
@@ -122,7 +122,7 @@ class ConsoleOutput extends StreamOutput implements ConsoleOutputInterface
122
  private function isRunningOS400()
123
  {
124
  $checks = array(
125
- function_exists('php_uname') ? php_uname('s') : '',
126
  getenv('OSTYPE'),
127
  PHP_OS,
128
  );
122
  private function isRunningOS400()
123
  {
124
  $checks = array(
125
+ \function_exists('php_uname') ? php_uname('s') : '',
126
  getenv('OSTYPE'),
127
  PHP_OS,
128
  );
vendor/symfony/console/Output/Output.php CHANGED
@@ -11,8 +11,8 @@
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.
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
  * Base class for output classes.
vendor/symfony/console/Output/OutputInterface.php CHANGED
@@ -33,7 +33,7 @@ interface OutputInterface
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
  */
@@ -42,7 +42,7 @@ interface OutputInterface
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);
33
  /**
34
  * Writes a message to the output.
35
  *
36
+ * @param string|array $messages The message as an array of strings 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
  */
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 strings or 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);
vendor/symfony/console/Output/StreamOutput.php CHANGED
@@ -20,11 +20,11 @@ use Symfony\Component\Console\Formatter\OutputFormatterInterface;
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
  */
@@ -42,7 +42,7 @@ class StreamOutput extends Output
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
 
@@ -83,21 +83,38 @@ class StreamOutput extends Output
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
  }
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
  */
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
 
83
  *
84
  * Colorization is disabled if not supported by the stream:
85
  *
86
+ * This is tricky on Windows, because Cygwin, Msys2 etc emulate pseudo
87
+ * terminals via named pipes, so we can only check the environment.
88
+ *
89
+ * Reference: Composer\XdebugHandler\Process::supportsColor
90
+ * https://github.com/composer/xdebug-handler
91
  *
92
  * @return bool true if the stream supports colorization, false otherwise
93
  */
94
  protected function hasColorSupport()
95
  {
96
+ if ('Hyper' === getenv('TERM_PROGRAM')) {
97
+ return true;
98
+ }
99
+
100
+ if (\DIRECTORY_SEPARATOR === '\\') {
101
+ return (\function_exists('sapi_windows_vt100_support')
102
+ && @sapi_windows_vt100_support($this->stream))
103
  || false !== getenv('ANSICON')
104
  || 'ON' === getenv('ConEmuANSI')
105
  || 'xterm' === getenv('TERM');
106
  }
107
 
108
+ if (\function_exists('stream_isatty')) {
109
+ return @stream_isatty($this->stream);
110
+ }
111
+
112
+ if (\function_exists('posix_isatty')) {
113
+ return @posix_isatty($this->stream);
114
+ }
115
+
116
+ $stat = @fstat($this->stream);
117
+ // Check if formatted mode is S_IFCHR
118
+ return $stat ? 0020000 === ($stat['mode'] & 0170000) : false;
119
  }
120
  }
vendor/symfony/console/Question/ChoiceQuestion.php CHANGED
@@ -156,7 +156,7 @@ class ChoiceQuestion extends Question
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
 
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
 
vendor/symfony/console/Question/ConfirmationQuestion.php CHANGED
@@ -44,7 +44,7 @@ class ConfirmationQuestion extends Question
44
  $regex = $this->trueAnswerRegex;
45
 
46
  return function ($answer) use ($default, $regex) {
47
- if (is_bool($answer)) {
48
  return $answer;
49
  }
50
 
44
  $regex = $this->trueAnswerRegex;
45
 
46
  return function ($answer) use ($default, $regex) {
47
+ if (\is_bool($answer)) {
48
  return $answer;
49
  }
50
 
vendor/symfony/console/Question/Question.php CHANGED
@@ -117,7 +117,7 @@ class Question
117
  /**
118
  * Gets values for the autocompleter.
119
  *
120
- * @return null|iterable
121
  */
122
  public function getAutocompleterValues()
123
  {
@@ -127,7 +127,7 @@ class Question
127
  /**
128
  * Sets values for the autocompleter.
129
  *
130
- * @param null|iterable $values
131
  *
132
  * @return $this
133
  *
@@ -136,11 +136,11 @@ class Question
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
 
@@ -156,7 +156,7 @@ class Question
156
  /**
157
  * Sets a validator for the question.
158
  *
159
- * @param null|callable $validator
160
  *
161
  * @return $this
162
  */
@@ -170,7 +170,7 @@ class Question
170
  /**
171
  * Gets the validator for the question.
172
  *
173
- * @return null|callable
174
  */
175
  public function getValidator()
176
  {
@@ -182,7 +182,7 @@ class Question
182
  *
183
  * Null means an unlimited number of attempts.
184
  *
185
- * @param null|int $attempts
186
  *
187
  * @return $this
188
  *
@@ -204,7 +204,7 @@ class Question
204
  *
205
  * Null means an unlimited number of attempts.
206
  *
207
- * @return null|int
208
  */
209
  public function getMaxAttempts()
210
  {
@@ -241,6 +241,6 @@ class Question
241
 
242
  protected function isAssoc($array)
243
  {
244
- return (bool) count(array_filter(array_keys($array), 'is_string'));
245
  }
246
  }
117
  /**
118
  * Gets values for the autocompleter.
119
  *
120
+ * @return iterable|null
121
  */
122
  public function getAutocompleterValues()
123
  {
127
  /**
128
  * Sets values for the autocompleter.
129
  *
130
+ * @param iterable|null $values
131
  *
132
  * @return $this
133
  *
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
 
156
  /**
157
  * Sets a validator for the question.
158
  *
159
+ * @param callable|null $validator
160
  *
161
  * @return $this
162
  */
170
  /**
171
  * Gets the validator for the question.
172
  *
173
+ * @return callable|null
174
  */
175
  public function getValidator()
176
  {
182
  *
183
  * Null means an unlimited number of attempts.
184
  *
185
+ * @param int|null $attempts
186
  *
187
  * @return $this
188
  *
204
  *
205
  * Null means an unlimited number of attempts.
206
  *
207
+ * @return int|null
208
  */
209
  public function getMaxAttempts()
210
  {
241
 
242
  protected function isAssoc($array)
243
  {
244
+ return (bool) \count(array_filter(array_keys($array), 'is_string'));
245
  }
246
  }
vendor/symfony/console/Style/OutputStyle.php CHANGED
@@ -13,8 +13,8 @@ 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.
13
 
14
  use Symfony\Component\Console\Formatter\OutputFormatterInterface;
15
  use Symfony\Component\Console\Helper\ProgressBar;
 
16
  use Symfony\Component\Console\Output\ConsoleOutputInterface;
17
+ use Symfony\Component\Console\Output\OutputInterface;
18
 
19
  /**
20
  * Decorates output to add console style guide helpers.
vendor/symfony/console/Style/SymfonyStyle.php CHANGED
@@ -46,7 +46,7 @@ class SymfonyStyle extends OutputStyle
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
  }
@@ -63,7 +63,7 @@ class SymfonyStyle extends OutputStyle
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));
@@ -117,7 +117,7 @@ class SymfonyStyle extends OutputStyle
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
  }
@@ -269,7 +269,7 @@ class SymfonyStyle extends OutputStyle
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
@@ -387,7 +387,7 @@ class SymfonyStyle extends OutputStyle
387
 
388
  if (null !== $type) {
389
  $type = sprintf('[%s] ', $type);
390
- $indentLength = strlen($type);
391
  $lineIndentation = str_repeat(' ', $indentLength);
392
  }
393
 
@@ -399,7 +399,7 @@ class SymfonyStyle extends OutputStyle
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
  }
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
  }
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));
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
  }
269
  {
270
  $progressBar = parent::createProgressBar($max);
271
 
272
+ if ('\\' !== \DIRECTORY_SEPARATOR || 'Hyper' === getenv('TERM_PROGRAM')) {
273
  $progressBar->setEmptyBarCharacter('░'); // light shade character \u2591
274
  $progressBar->setProgressCharacter('');
275
  $progressBar->setBarCharacter('▓'); // dark shade character \u2593
387
 
388
  if (null !== $type) {
389
  $type = sprintf('[%s] ', $type);
390
+ $indentLength = \strlen($type);
391
  $lineIndentation = str_repeat(' ', $indentLength);
392
  }
393
 
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
  }
vendor/symfony/console/Terminal.php CHANGED
@@ -56,7 +56,7 @@ class Terminal
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"
@@ -87,7 +87,7 @@ class Terminal
87
  */
88
  private static function getConsoleMode()
89
  {
90
- if (!function_exists('proc_open')) {
91
  return;
92
  }
93
 
@@ -96,7 +96,7 @@ class Terminal
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]);
@@ -115,7 +115,7 @@ class Terminal
115
  */
116
  private static function getSttyColumns()
117
  {
118
- if (!function_exists('proc_open')) {
119
  return;
120
  }
121
 
@@ -125,7 +125,7 @@ class Terminal
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]);
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"
87
  */
88
  private static function getConsoleMode()
89
  {
90
+ if (!\function_exists('proc_open')) {
91
  return;
92
  }
93
 
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]);
115
  */
116
  private static function getSttyColumns()
117
  {
118
+ if (!\function_exists('proc_open')) {
119
  return;
120
  }
121
 
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]);
vendor/symfony/console/Tester/CommandTester.php CHANGED
@@ -13,9 +13,9 @@ 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.
13
 
14
  use Symfony\Component\Console\Command\Command;
15
  use Symfony\Component\Console\Input\ArrayInput;
 
16
  use Symfony\Component\Console\Input\InputInterface;
17
  use Symfony\Component\Console\Output\OutputInterface;
18
+ use Symfony\Component\Console\Output\StreamOutput;
19
 
20
  /**
21
  * Eases the testing of console commands.
vendor/symfony/console/Tests/ApplicationTest.php CHANGED
@@ -13,24 +13,28 @@ 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
@@ -47,6 +51,8 @@ class ApplicationTest extends TestCase
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';
@@ -117,6 +123,25 @@ class ApplicationTest extends TestCase
117
  $this->assertCount(1, $commands, '->all() takes a namespace as its first argument');
118
  }
119
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
120
  public function testRegister()
121
  {
122
  $application = new Application();
@@ -169,6 +194,30 @@ class ApplicationTest extends TestCase
169
  $this->assertInstanceOf('Symfony\Component\Console\Command\HelpCommand', $command, '->get() returns the help command if --help is provided as the input');
170
  }
171
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
172
  public function testSilentHelp()
173
  {
174
  $application = new Application();
@@ -280,6 +329,55 @@ class ApplicationTest extends TestCase
280
  $this->assertInstanceOf('FooCommand', $application->find('a'), '->find() returns a command if the abbreviation exists for an alias');
281
  }
282
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
283
  /**
284
  * @dataProvider provideAmbiguousAbbreviations
285
  */
@@ -363,8 +461,8 @@ class ApplicationTest extends TestCase
363
  public function provideInvalidCommandNamesSingle()
364
  {
365
  return array(
366
- array('foo3:baR'),
367
- array('foO3:bar'),
368
  );
369
  }
370
 
@@ -630,10 +728,10 @@ class ApplicationTest extends TestCase
630
  $tester = new ApplicationTester($application);
631
 
632
  $tester->run(array('command' => 'foo'), array('decorated' => false, 'capture_stderr_separately' => true));
633
- $this->assertStringEqualsFile(self::$fixturesPath.'/application_renderexception_doublewidth1.txt', $tester->getErrorOutput(true), '->renderException() renders a pretty exceptions with previous exceptions');
634
 
635
  $tester->run(array('command' => 'foo'), array('decorated' => true, 'capture_stderr_separately' => true));
636
- $this->assertStringEqualsFile(self::$fixturesPath.'/application_renderexception_doublewidth1decorated.txt', $tester->getErrorOutput(true), '->renderException() renders a pretty exceptions with previous exceptions');
637
 
638
  $application = new Application();
639
  $application->setAutoExit(false);
@@ -643,7 +741,7 @@ class ApplicationTest extends TestCase
643
  });
644
  $tester = new ApplicationTester($application);
645
  $tester->run(array('command' => 'foo'), array('decorated' => false, 'capture_stderr_separately' => true));
646
- $this->assertStringEqualsFile(self::$fixturesPath.'/application_renderexception_doublewidth2.txt', $tester->getErrorOutput(true), '->renderException() wraps messages when they are bigger than the terminal');
647
  putenv('COLUMNS=120');
648
  }
649
 
@@ -658,7 +756,7 @@ class ApplicationTest extends TestCase
658
  $tester = new ApplicationTester($application);
659
 
660
  $tester->run(array('command' => 'foo'), array('decorated' => false));
661
- $this->assertStringEqualsFile(self::$fixturesPath.'/application_renderexception_escapeslines.txt', $tester->getDisplay(true), '->renderException() escapes lines containing formatting');
662
  putenv('COLUMNS=120');
663
  }
664
 
@@ -675,7 +773,7 @@ class ApplicationTest extends TestCase
675
  $tester = new ApplicationTester($application);
676
 
677
  $tester->run(array('command' => 'foo'), array('decorated' => false));
678
- $this->assertStringEqualsFile(self::$fixturesPath.'/application_renderexception_linebreaks.txt', $tester->getDisplay(true), '->renderException() keep multiple line breaks');
679
  }
680
 
681
  public function testRun()
@@ -814,6 +912,30 @@ class ApplicationTest extends TestCase
814
  $this->assertSame(4, $exitCode, '->run() returns integer exit code extracted from raised exception');
815
  }
816
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
817
  public function testRunReturnsExitCodeOneForExceptionCodeZero()
818
  {
819
  $exception = new \Exception('', 0);
@@ -829,6 +951,30 @@ class ApplicationTest extends TestCase
829
  $this->assertSame(1, $exitCode, '->run() returns exit code 1 when exception code is 0');
830
  }
831
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
832
  /**
833
  * @expectedException \LogicException
834
  * @expectedExceptionMessage An option with shortcut "e" already exists.
@@ -1414,6 +1560,60 @@ class ApplicationTest extends TestCase
1414
  $this->assertEquals($tester->getInput()->isInteractive(), @posix_isatty($inputStream));
1415
  }
1416
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1417
  protected function getDispatcher($skipCommand = false)
1418
  {
1419
  $dispatcher = new EventDispatcher();
@@ -1462,6 +1662,13 @@ class ApplicationTest extends TestCase
1462
  $this->assertSame($e->getMessage(), 'Class \'UnknownClass\' not found');
1463
  }
1464
  }
 
 
 
 
 
 
 
1465
  }
1466
 
1467
  class CustomApplication extends Application
@@ -1501,3 +1708,19 @@ class CustomDefaultCommandApplication extends Application
1501
  $this->setDefaultCommand($command->getName());
1502
  }
1503
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
13
 
14
  use PHPUnit\Framework\TestCase;
15
  use Symfony\Component\Console\Application;
16
+ use Symfony\Component\Console\Command\Command;
17
+ use Symfony\Component\Console\CommandLoader\FactoryCommandLoader;
18
+ use Symfony\Component\Console\DependencyInjection\AddConsoleCommandPass;
19
+ use Symfony\Component\Console\Event\ConsoleCommandEvent;
20
+ use Symfony\Component\Console\Event\ConsoleErrorEvent;
21
+ use Symfony\Component\Console\Event\ConsoleExceptionEvent;
22
+ use Symfony\Component\Console\Event\ConsoleTerminateEvent;
23
+ use Symfony\Component\Console\Exception\CommandNotFoundException;
24
  use Symfony\Component\Console\Helper\FormatterHelper;
25
+ use Symfony\Component\Console\Helper\HelperSet;
26
  use Symfony\Component\Console\Input\ArgvInput;
27
  use Symfony\Component\Console\Input\ArrayInput;
 
28
  use Symfony\Component\Console\Input\InputArgument;
29
  use Symfony\Component\Console\Input\InputDefinition;
30
+ use Symfony\Component\Console\Input\InputInterface;
31
  use Symfony\Component\Console\Input\InputOption;
32
  use Symfony\Component\Console\Output\NullOutput;
33
  use Symfony\Component\Console\Output\Output;
34
  use Symfony\Component\Console\Output\OutputInterface;
35
  use Symfony\Component\Console\Output\StreamOutput;
36
  use Symfony\Component\Console\Tester\ApplicationTester;
37
+ use Symfony\Component\DependencyInjection\ContainerBuilder;
 
 
 
 
38
  use Symfony\Component\EventDispatcher\EventDispatcher;
39
 
40
  class ApplicationTest extends TestCase
51
  require_once self::$fixturesPath.'/Foo3Command.php';
52
  require_once self::$fixturesPath.'/Foo4Command.php';
53
  require_once self::$fixturesPath.'/Foo5Command.php';
54
+ require_once self::$fixturesPath.'/FooSameCaseUppercaseCommand.php';
55
+ require_once self::$fixturesPath.'/FooSameCaseLowercaseCommand.php';
56
  require_once self::$fixturesPath.'/FoobarCommand.php';
57
  require_once self::$fixturesPath.'/BarBucCommand.php';
58
  require_once self::$fixturesPath.'/FooSubnamespaced1Command.php';
123
  $this->assertCount(1, $commands, '->all() takes a namespace as its first argument');
124
  }
125
 
126
+ public function testAllWithCommandLoader()
127
+ {
128
+ $application = new Application();
129
+ $commands = $application->all();
130
+ $this->assertInstanceOf('Symfony\\Component\\Console\\Command\\HelpCommand', $commands['help'], '->all() returns the registered commands');
131
+
132
+ $application->add(new \FooCommand());
133
+ $commands = $application->all('foo');
134
+ $this->assertCount(1, $commands, '->all() takes a namespace as its first argument');
135
+
136
+ $application->setCommandLoader(new FactoryCommandLoader(array(
137
+ 'foo:bar1' => function () { return new \Foo1Command(); },
138
+ )));
139
+ $commands = $application->all('foo');
140
+ $this->assertCount(2, $commands, '->all() takes a namespace as its first argument');
141
+ $this->assertInstanceOf(\FooCommand::class, $commands['foo:bar'], '->all() returns the registered commands');
142
+ $this->assertInstanceOf(\Foo1Command::class, $commands['foo:bar1'], '->all() returns the registered commands');
143
+ }
144
+
145
  public function testRegister()
146
  {
147
  $application = new Application();
194
  $this->assertInstanceOf('Symfony\Component\Console\Command\HelpCommand', $command, '->get() returns the help command if --help is provided as the input');
195
  }
196
 
197
+ public function testHasGetWithCommandLoader()
198
+ {
199
+ $application = new Application();
200
+ $this->assertTrue($application->has('list'), '->has() returns true if a named command is registered');
201
+ $this->assertFalse($application->has('afoobar'), '->has() returns false if a named command is not registered');
202
+
203
+ $application->add($foo = new \FooCommand());
204
+ $this->assertTrue($application->has('afoobar'), '->has() returns true if an alias is registered');
205
+ $this->assertEquals($foo, $application->get('foo:bar'), '->get() returns a command by name');
206
+ $this->assertEquals($foo, $application->get('afoobar'), '->get() returns a command by alias');
207
+
208
+ $application->setCommandLoader(new FactoryCommandLoader(array(
209
+ 'foo:bar1' => function () { return new \Foo1Command(); },
210
+ )));
211
+
212
+ $this->assertTrue($application->has('afoobar'), '->has() returns true if an instance is registered for an alias even with command loader');
213
+ $this->assertEquals($foo, $application->get('foo:bar'), '->get() returns an instance by name even with command loader');
214
+ $this->assertEquals($foo, $application->get('afoobar'), '->get() returns an instance by alias even with command loader');
215
+ $this->assertTrue($application->has('foo:bar1'), '->has() returns true for commands registered in the loader');
216
+ $this->assertInstanceOf(\Foo1Command::class, $foo1 = $application->get('foo:bar1'), '->get() returns a command by name from the command loader');
217
+ $this->assertTrue($application->has('afoobar1'), '->has() returns true for commands registered in the loader');
218
+ $this->assertEquals($foo1, $application->get('afoobar1'), '->get() returns a command by name from the command loader');
219
+ }
220
+
221
  public function testSilentHelp()
222
  {
223
  $application = new Application();
329
  $this->assertInstanceOf('FooCommand', $application->find('a'), '->find() returns a command if the abbreviation exists for an alias');
330
  }
331
 
332
+ public function testFindCaseSensitiveFirst()
333
+ {
334
+ $application = new Application();
335
+ $application->add(new \FooSameCaseUppercaseCommand());
336
+ $application->add(new \FooSameCaseLowercaseCommand());
337
+
338
+ $this->assertInstanceOf('FooSameCaseUppercaseCommand', $application->find('f:B'), '->find() returns a command if the abbreviation is the correct case');
339
+ $this->assertInstanceOf('FooSameCaseUppercaseCommand', $application->find('f:BAR'), '->find() returns a command if the abbreviation is the correct case');
340
+ $this->assertInstanceOf('FooSameCaseLowercaseCommand', $application->find('f:b'), '->find() returns a command if the abbreviation is the correct case');
341
+ $this->assertInstanceOf('FooSameCaseLowercaseCommand', $application->find('f:bar'), '->find() returns a command if the abbreviation is the correct case');
342
+ }
343
+
344
+ public function testFindCaseInsensitiveAsFallback()
345
+ {
346
+ $application = new Application();
347
+ $application->add(new \FooSameCaseLowercaseCommand());
348
+
349
+ $this->assertInstanceOf('FooSameCaseLowercaseCommand', $application->find('f:b'), '->find() returns a command if the abbreviation is the correct case');
350
+ $this->assertInstanceOf('FooSameCaseLowercaseCommand', $application->find('f:B'), '->find() will fallback to case insensitivity');
351
+ $this->assertInstanceOf('FooSameCaseLowercaseCommand', $application->find('FoO:BaR'), '->find() will fallback to case insensitivity');
352
+ }
353
+
354
+ /**
355
+ * @expectedException \Symfony\Component\Console\Exception\CommandNotFoundException
356
+ * @expectedExceptionMessage Command "FoO:BaR" is ambiguous
357
+ */
358
+ public function testFindCaseInsensitiveSuggestions()
359
+ {
360
+ $application = new Application();
361
+ $application->add(new \FooSameCaseLowercaseCommand());
362
+ $application->add(new \FooSameCaseUppercaseCommand());
363
+
364
+ $this->assertInstanceOf('FooSameCaseLowercaseCommand', $application->find('FoO:BaR'), '->find() will find two suggestions with case insensitivity');
365
+ }
366
+
367
+ public function testFindWithCommandLoader()
368
+ {
369
+ $application = new Application();
370
+ $application->setCommandLoader(new FactoryCommandLoader(array(
371
+ 'foo:bar' => $f = function () { return new \FooCommand(); },
372
+ )));
373
+
374
+ $this->assertInstanceOf('FooCommand', $application->find('foo:bar'), '->find() returns a command if its name exists');
375
+ $this->assertInstanceOf('Symfony\Component\Console\Command\HelpCommand', $application->find('h'), '->find() returns a command if its name exists');
376
+ $this->assertInstanceOf('FooCommand', $application->find('f:bar'), '->find() returns a command if the abbreviation for the namespace exists');
377
+ $this->assertInstanceOf('FooCommand', $application->find('f:b'), '->find() returns a command if the abbreviation for the namespace and the command name exist');
378
+ $this->assertInstanceOf('FooCommand', $application->find('a'), '->find() returns a command if the abbreviation exists for an alias');
379
+ }
380
+
381
  /**
382
  * @dataProvider provideAmbiguousAbbreviations
383
  */
461
  public function provideInvalidCommandNamesSingle()
462
  {
463
  return array(
464
+ array('foo3:barr'),
465
+ array('fooo3:bar'),
466
  );
467
  }
468
 
728
  $tester = new ApplicationTester($application);
729
 
730
  $tester->run(array('command' => 'foo'), array('decorated' => false, 'capture_stderr_separately' => true));
731
+ $this->assertStringMatchesFormatFile(self::$fixturesPath.'/application_renderexception_doublewidth1.txt', $tester->getErrorOutput(true), '->renderException() renders a pretty exceptions with previous exceptions');
732
 
733
  $tester->run(array('command' => 'foo'), array('decorated' => true, 'capture_stderr_separately' => true));
734
+ $this->assertStringMatchesFormatFile(self::$fixturesPath.'/application_renderexception_doublewidth1decorated.txt', $tester->getErrorOutput(true), '->renderException() renders a pretty exceptions with previous exceptions');
735
 
736
  $application = new Application();
737
  $application->setAutoExit(false);
741
  });
742
  $tester = new ApplicationTester($application);
743
  $tester->run(array('command' => 'foo'), array('decorated' => false, 'capture_stderr_separately' => true));
744
+ $this->assertStringMatchesFormatFile(self::$fixturesPath.'/application_renderexception_doublewidth2.txt', $tester->getErrorOutput(true), '->renderException() wraps messages when they are bigger than the terminal');
745
  putenv('COLUMNS=120');
746
  }
747
 
756
  $tester = new ApplicationTester($application);
757
 
758
  $tester->run(array('command' => 'foo'), array('decorated' => false));
759
+ $this->assertStringMatchesFormatFile(self::$fixturesPath.'/application_renderexception_escapeslines.txt', $tester->getDisplay(true), '->renderException() escapes lines containing formatting');
760
  putenv('COLUMNS=120');
761
  }
762
 
773
  $tester = new ApplicationTester($application);
774
 
775
  $tester->run(array('command' => 'foo'), array('decorated' => false));
776
+ $this->assertStringMatchesFormatFile(self::$fixturesPath.'/application_renderexception_linebreaks.txt', $tester->getDisplay(true), '->renderException() keep multiple line breaks');
777
  }
778
 
779
  public function testRun()
912
  $this->assertSame(4, $exitCode, '->run() returns integer exit code extracted from raised exception');
913
  }
914
 
915
+ public function testRunDispatchesIntegerExitCode()
916
+ {
917
+ $passedRightValue = false;
918
+
919
+ // We can assume here that some other test asserts that the event is dispatched at all
920
+ $dispatcher = new EventDispatcher();
921
+ $dispatcher->addListener('console.terminate', function (ConsoleTerminateEvent $event) use (&$passedRightValue) {
922
+ $passedRightValue = (4 === $event->getExitCode());
923
+ });
924
+
925
+ $application = new Application();
926
+ $application->setDispatcher($dispatcher);
927
+ $application->setAutoExit(false);
928
+
929
+ $application->register('test')->setCode(function (InputInterface $input, OutputInterface $output) {
930
+ throw new \Exception('', 4);
931
+ });
932
+
933
+ $tester = new ApplicationTester($application);
934
+ $tester->run(array('command' => 'test'));
935
+
936
+ $this->assertTrue($passedRightValue, '-> exit code 4 was passed in the console.terminate event');
937
+ }
938
+
939
  public function testRunReturnsExitCodeOneForExceptionCodeZero()
940
  {
941
  $exception = new \Exception('', 0);
951
  $this->assertSame(1, $exitCode, '->run() returns exit code 1 when exception code is 0');
952
  }
953
 
954
+ public function testRunDispatchesExitCodeOneForExceptionCodeZero()
955
+ {
956
+ $passedRightValue = false;
957
+
958
+ // We can assume here that some other test asserts that the event is dispatched at all
959
+ $dispatcher = new EventDispatcher();
960
+ $dispatcher->addListener('console.terminate', function (ConsoleTerminateEvent $event) use (&$passedRightValue) {
961
+ $passedRightValue = (1 === $event->getExitCode());
962
+ });
963
+
964
+ $application = new Application();
965
+ $application->setDispatcher($dispatcher);
966
+ $application->setAutoExit(false);
967
+
968
+ $application->register('test')->setCode(function (InputInterface $input, OutputInterface $output) {
969
+ throw new \Exception();
970
+ });
971
+
972
+ $tester = new ApplicationTester($application);
973
+ $tester->run(array('command' => 'test'));
974
+
975
+ $this->assertTrue($passedRightValue, '-> exit code 1 was passed in the console.terminate event');
976
+ }
977
+
978
  /**
979
  * @expectedException \LogicException
980
  * @expectedExceptionMessage An option with shortcut "e" already exists.
1560
  $this->assertEquals($tester->getInput()->isInteractive(), @posix_isatty($inputStream));
1561
  }
1562
 
1563
+ public function testRunLazyCommandService()
1564
+ {
1565
+ $container = new ContainerBuilder();
1566
+ $container->addCompilerPass(new AddConsoleCommandPass());
1567
+ $container
1568
+ ->register('lazy-command', LazyCommand::class)
1569
+ ->addTag('console.command', array('command' => 'lazy:command'))
1570
+ ->addTag('console.command', array('command' => 'lazy:alias'))
1571
+ ->addTag('console.command', array('command' => 'lazy:alias2'));
1572
+ $container->compile();
1573
+
1574
+ $application = new Application();
1575
+ $application->setCommandLoader($container->get('console.command_loader'));
1576
+ $application->setAutoExit(false);
1577
+
1578
+ $tester = new ApplicationTester($application);
1579
+
1580
+ $tester->run(array('command' => 'lazy:command'));
1581
+ $this->assertSame("lazy-command called\n", $tester->getDisplay(true));
1582
+
1583
+ $tester->run(array('command' => 'lazy:alias'));
1584
+ $this->assertSame("lazy-command called\n", $tester->getDisplay(true));
1585
+
1586
+ $tester->run(array('command' => 'lazy:alias2'));
1587
+ $this->assertSame("lazy-command called\n", $tester->getDisplay(true));
1588
+
1589
+ $command = $application->get('lazy:command');
1590
+ $this->assertSame(array('lazy:alias', 'lazy:alias2'), $command->getAliases());
1591
+ }
1592
+
1593
+ /**
1594
+ * @expectedException \Symfony\Component\Console\Exception\CommandNotFoundException
1595
+ */
1596
+ public function testGetDisabledLazyCommand()
1597
+ {
1598
+ $application = new Application();
1599
+ $application->setCommandLoader(new FactoryCommandLoader(array('disabled' => function () { return new DisabledCommand(); })));
1600
+ $application->get('disabled');
1601
+ }
1602
+
1603
+ public function testHasReturnsFalseForDisabledLazyCommand()
1604
+ {
1605
+ $application = new Application();
1606
+ $application->setCommandLoader(new FactoryCommandLoader(array('disabled' => function () { return new DisabledCommand(); })));
1607
+ $this->assertFalse($application->has('disabled'));
1608
+ }
1609
+
1610
+ public function testAllExcludesDisabledLazyCommand()
1611
+ {
1612
+ $application = new Application();
1613
+ $application->setCommandLoader(new FactoryCommandLoader(array('disabled' => function () { return new DisabledCommand(); })));
1614
+ $this->assertArrayNotHasKey('disabled', $application->all());
1615
+ }
1616
+
1617
  protected function getDispatcher($skipCommand = false)
1618
  {
1619
  $dispatcher = new EventDispatcher();
1662
  $this->assertSame($e->getMessage(), 'Class \'UnknownClass\' not found');
1663
  }
1664
  }
1665
+
1666
+ protected function tearDown()
1667
+ {
1668
+ putenv('SHELL_VERBOSITY');
1669
+ unset($_ENV['SHELL_VERBOSITY']);
1670
+ unset($_SERVER['SHELL_VERBOSITY']);
1671
+ }
1672
  }
1673
 
1674
  class CustomApplication extends Application
1708
  $this->setDefaultCommand($command->getName());
1709
  }
1710
  }
1711
+
1712
+ class LazyCommand extends Command
1713
+ {
1714
+ public function execute(InputInterface $input, OutputInterface $output)
1715
+ {
1716
+ $output->writeln('lazy-command called');
1717
+ }
1718
+ }
1719
+
1720
+ class DisabledCommand extends Command
1721
+ {
1722
+ public function isEnabled()
1723
+ {
1724
+ return false;
1725
+ }
1726
+ }
vendor/symfony/console/Tests/Command/CommandTest.php CHANGED
@@ -12,16 +12,16 @@
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
@@ -46,7 +46,7 @@ class CommandTest extends TestCase
46
  */
47
  public function testCommandNameCannotBeEmpty()
48
  {
49
- new Command();
50
  }
51
 
52
  public function testSetApplication()
@@ -340,7 +340,7 @@ class CommandTest extends TestCase
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
  }
12
  namespace Symfony\Component\Console\Tests\Command;
13
 
14
  use PHPUnit\Framework\TestCase;
15
+ use Symfony\Component\Console\Application;
16
  use Symfony\Component\Console\Command\Command;
17
  use Symfony\Component\Console\Helper\FormatterHelper;
 
 
18
  use Symfony\Component\Console\Input\InputArgument;
19
+ use Symfony\Component\Console\Input\InputDefinition;
20
  use Symfony\Component\Console\Input\InputInterface;
21
+ use Symfony\Component\Console\Input\InputOption;
22
  use Symfony\Component\Console\Input\StringInput;
 
23
  use Symfony\Component\Console\Output\NullOutput;
24
+ use Symfony\Component\Console\Output\OutputInterface;
25
  use Symfony\Component\Console\Tester\CommandTester;
26
 
27
  class CommandTest extends TestCase
46
  */
47
  public function testCommandNameCannotBeEmpty()
48
  {
49
+ (new Application())->add(new Command());
50
  }
51
 
52
  public function testSetApplication()
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
  }
vendor/symfony/console/Tests/Command/HelpCommandTest.php CHANGED
@@ -12,10 +12,10 @@
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
  {
12
  namespace Symfony\Component\Console\Tests\Command;
13
 
14
  use PHPUnit\Framework\TestCase;
15
+ use Symfony\Component\Console\Application;
16
  use Symfony\Component\Console\Command\HelpCommand;
17
  use Symfony\Component\Console\Command\ListCommand;
18
+ use Symfony\Component\Console\Tester\CommandTester;
19
 
20
  class HelpCommandTest extends TestCase
21
  {
vendor/symfony/console/Tests/Command/ListCommandTest.php CHANGED
@@ -12,8 +12,8 @@
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
  {
12
  namespace Symfony\Component\Console\Tests\Command;
13
 
14
  use PHPUnit\Framework\TestCase;
 
15
  use Symfony\Component\Console\Application;
16
+ use Symfony\Component\Console\Tester\CommandTester;
17
 
18
  class ListCommandTest extends TestCase
19
  {
vendor/symfony/console/Tests/Command/LockableTraitTest.php CHANGED
@@ -13,7 +13,9 @@ 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
  {
@@ -39,8 +41,14 @@ class LockableTraitTest extends TestCase
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()));
13
 
14
  use PHPUnit\Framework\TestCase;
15
  use Symfony\Component\Console\Tester\CommandTester;
16
+ use Symfony\Component\Lock\Factory;
17
+ use Symfony\Component\Lock\Store\FlockStore;
18
+ use Symfony\Component\Lock\Store\SemaphoreStore;
19
 
20
  class LockableTraitTest extends TestCase
21
  {
41
  {
42
  $command = new \FooLockCommand();
43
 
44
+ if (SemaphoreStore::isSupported(false)) {
45
+ $store = new SemaphoreStore();
46
+ } else {
47
+ $store = new FlockStore();
48
+ }
49
+
50
+ $lock = (new Factory($store))->createLock($command->getName());
51
+ $lock->acquire();
52
 
53
  $tester = new CommandTester($command);
54
  $this->assertSame(1, $tester->execute(array()));
vendor/symfony/console/Tests/CommandLoader/ContainerCommandLoaderTest.php ADDED
@@ -0,0 +1,61 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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\CommandLoader;
13
+
14
+ use PHPUnit\Framework\TestCase;
15
+ use Symfony\Component\Console\Command\Command;
16
+ use Symfony\Component\Console\CommandLoader\ContainerCommandLoader;
17
+ use Symfony\Component\DependencyInjection\ServiceLocator;
18
+
19
+ class ContainerCommandLoaderTest extends TestCase
20
+ {
21
+ public function testHas()
22
+ {
23
+ $loader = new ContainerCommandLoader(new ServiceLocator(array(
24
+ 'foo-service' => function () { return new Command('foo'); },
25
+ 'bar-service' => function () { return new Command('bar'); },
26
+ )), array('foo' => 'foo-service', 'bar' => 'bar-service'));
27
+
28
+ $this->assertTrue($loader->has('foo'));
29
+ $this->assertTrue($loader->has('bar'));
30
+ $this->assertFalse($loader->has('baz'));
31
+ }
32
+
33
+ public function testGet()
34
+ {
35
+ $loader = new ContainerCommandLoader(new ServiceLocator(array(
36
+ 'foo-service' => function () { return new Command('foo'); },
37
+ 'bar-service' => function () { return new Command('bar'); },
38
+ )), array('foo' => 'foo-service', 'bar' => 'bar-service'));
39
+
40
+ $this->assertInstanceOf(Command::class, $loader->get('foo'));
41
+ $this->assertInstanceOf(Command::class, $loader->get('bar'));
42
+ }
43
+
44
+ /**
45
+ * @expectedException \Symfony\Component\Console\Exception\CommandNotFoundException
46
+ */
47
+ public function testGetUnknownCommandThrows()
48
+ {
49
+ (new ContainerCommandLoader(new ServiceLocator(array()), array()))->get('unknown');
50
+ }
51
+
52
+ public function testGetCommandNames()
53
+ {
54
+ $loader = new ContainerCommandLoader(new ServiceLocator(array(
55
+ 'foo-service' => function () { return new Command('foo'); },
56
+ 'bar-service' => function () { return new Command('bar'); },
57
+ )), array('foo' => 'foo-service', 'bar' => 'bar-service'));
58
+
59
+ $this->assertSame(array('foo', 'bar'), $loader->getNames());
60
+ }
61
+ }
vendor/symfony/console/Tests/CommandLoader/FactoryCommandLoaderTest.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\Tests\CommandLoader;
13
+
14
+ use PHPUnit\Framework\TestCase;
15
+ use Symfony\Component\Console\Command\Command;
16
+ use Symfony\Component\Console\CommandLoader\FactoryCommandLoader;
17
+
18
+ class FactoryCommandLoaderTest extends TestCase
19
+ {
20
+ public function testHas()
21
+ {
22
+ $loader = new FactoryCommandLoader(array(
23
+ 'foo' => function () { return new Command('foo'); },
24
+ 'bar' => function () { return new Command('bar'); },
25
+ ));
26
+
27
+ $this->assertTrue($loader->has('foo'));
28
+ $this->assertTrue($loader->has('bar'));
29
+ $this->assertFalse($loader->has('baz'));
30
+ }
31
+
32
+ public function testGet()
33
+ {
34
+ $loader = new FactoryCommandLoader(array(
35
+ 'foo' => function () { return new Command('foo'); },
36
+ 'bar' => function () { return new Command('bar'); },
37
+ ));
38
+
39
+ $this->assertInstanceOf(Command::class, $loader->get('foo'));
40
+ $this->assertInstanceOf(Command::class, $loader->get('bar'));
41
+ }
42
+
43
+ /**
44
+ * @expectedException \Symfony\Component\Console\Exception\CommandNotFoundException
45
+ */
46
+ public function testGetUnknownCommandThrows()
47
+ {
48
+ (new FactoryCommandLoader(array()))->get('unknown');
49
+ }
50
+
51
+ public function testGetCommandNames()
52
+ {
53
+ $loader = new FactoryCommandLoader(array(
54
+ 'foo' => function () { return new Command('foo'); },
55
+ 'bar' => function () { return new Command('bar'); },
56
+ ));
57
+
58
+ $this->assertSame(array('foo', 'bar'), $loader->getNames());
59
+ }
60
+ }
vendor/{sensiolabs/security-checker/SensioLabs/Security/Formatters → symfony/console/Tests/CommandLoader}/index.php RENAMED
File without changes
vendor/symfony/console/Tests/DependencyInjection/AddConsoleCommandPassTest.php CHANGED
@@ -12,10 +12,15 @@
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
  {
@@ -25,7 +30,7 @@ class AddConsoleCommandPassTest extends TestCase
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%');
@@ -52,6 +57,62 @@ class AddConsoleCommandPassTest extends TestCase
52
  $this->assertSame(array($alias => $id), $container->getParameter('console.command.ids'));
53
  }
54
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
55
  public function visibilityProvider()
56
  {
57
  return array(
@@ -68,7 +129,7 @@ class AddConsoleCommandPassTest extends TestCase
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');
@@ -86,7 +147,7 @@ class AddConsoleCommandPassTest extends TestCase
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');
@@ -116,8 +177,86 @@ class AddConsoleCommandPassTest extends TestCase
116
  $this->assertTrue($container->hasAlias($alias1));
117
  $this->assertTrue($container->hasAlias($alias2));
118
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
119
  }
120
 
121
  class MyCommand extends Command
122
  {
123
  }
 
 
 
 
 
12
  namespace Symfony\Component\Console\Tests\DependencyInjection;
13
 
14
  use PHPUnit\Framework\TestCase;
 
15
  use Symfony\Component\Console\Command\Command;
16
+ use Symfony\Component\Console\CommandLoader\ContainerCommandLoader;
17
+ use Symfony\Component\Console\DependencyInjection\AddConsoleCommandPass;
18
+ use Symfony\Component\DependencyInjection\Argument\ServiceClosureArgument;
19
+ use Symfony\Component\DependencyInjection\ChildDefinition;
20
+ use Symfony\Component\DependencyInjection\Compiler\PassConfig;
21
  use Symfony\Component\DependencyInjection\ContainerBuilder;
22
  use Symfony\Component\DependencyInjection\Definition;
23
+ use Symfony\Component\DependencyInjection\TypedReference;
24
 
25
  class AddConsoleCommandPassTest extends TestCase
26
  {
30
  public function testProcess($public)
31
  {
32
  $container = new ContainerBuilder();
33
+ $container->addCompilerPass(new AddConsoleCommandPass(), PassConfig::TYPE_BEFORE_REMOVING);
34
  $container->setParameter('my-command.class', 'Symfony\Component\Console\Tests\DependencyInjection\MyCommand');
35
 
36
  $definition = new Definition('%my-command.class%');
57
  $this->assertSame(array($alias => $id), $container->getParameter('console.command.ids'));
58
  }
59
 
60
+ public function testProcessRegistersLazyCommands()
61
+ {
62
+ $container = new ContainerBuilder();
63
+ $command = $container
64
+ ->register('my-command', MyCommand::class)
65
+ ->setPublic(false)
66
+ ->addTag('console.command', array('command' => 'my:command'))
67
+ ->addTag('console.command', array('command' => 'my:alias'))
68
+ ;
69
+
70
+ (new AddConsoleCommandPass())->process($container);
71
+
72
+ $commandLoader = $container->getDefinition('console.command_loader');
73
+ $commandLocator = $container->getDefinition((string) $commandLoader->getArgument(0));
74
+
75
+ $this->assertSame(ContainerCommandLoader::class, $commandLoader->getClass());
76
+ $this->assertSame(array('my:command' => 'my-command', 'my:alias' => 'my-command'), $commandLoader->getArgument(1));
77
+ $this->assertEquals(array(array('my-command' => new ServiceClosureArgument(new TypedReference('my-command', MyCommand::class)))), $commandLocator->getArguments());
78
+ $this->assertSame(array('console.command.symfony_component_console_tests_dependencyinjection_mycommand' => 'my-command'), $container->getParameter('console.command.ids'));
79
+ $this->assertSame(array('my-command' => true), $container->getParameter('console.lazy_command.ids'));
80
+ $this->assertSame(array(array('setName', array('my:command')), array('setAliases', array(array('my:alias')))), $command->getMethodCalls());
81
+ }
82
+
83
+ public function testProcessFallsBackToDefaultName()
84
+ {
85
+ $container = new ContainerBuilder();
86
+ $container
87
+ ->register('with-default-name', NamedCommand::class)
88
+ ->setPublic(false)
89
+ ->addTag('console.command')
90
+ ;
91
+
92
+ $pass = new AddConsoleCommandPass();
93
+ $pass->process($container);
94
+
95
+ $commandLoader = $container->getDefinition('console.command_loader');
96
+ $commandLocator = $container->getDefinition((string) $commandLoader->getArgument(0));
97
+
98
+ $this->assertSame(ContainerCommandLoader::class, $commandLoader->getClass());
99
+ $this->assertSame(array('default' => 'with-default-name'), $commandLoader->getArgument(1));
100
+ $this->assertEquals(array(array('with-default-name' => new ServiceClosureArgument(new TypedReference('with-default-name', NamedCommand::class)))), $commandLocator->getArguments());
101
+ $this->assertSame(array('console.command.symfony_component_console_tests_dependencyinjection_namedcommand' => 'with-default-name'), $container->getParameter('console.command.ids'));
102
+ $this->assertSame(array('with-default-name' => true), $container->getParameter('console.lazy_command.ids'));
103
+
104
+ $container = new ContainerBuilder();
105
+ $container
106
+ ->register('with-default-name', NamedCommand::class)
107
+ ->setPublic(false)
108
+ ->addTag('console.command', array('command' => 'new-name'))
109
+ ;
110
+
111
+ $pass->process($container);
112
+
113
+ $this->assertSame(array('new-name' => 'with-default-name'), $container->getDefinition('console.command_loader')->getArgument(1));
114
+ }
115
+
116
  public function visibilityProvider()
117
  {
118
  return array(
129
  {
130
  $container = new ContainerBuilder();
131
  $container->setResourceTracking(false);
132
+ $container->addCompilerPass(new AddConsoleCommandPass(), PassConfig::TYPE_BEFORE_REMOVING);
133
 
134
  $definition = new Definition('Symfony\Component\Console\Tests\DependencyInjection\MyCommand');
135
  $definition->addTag('console.command');
147
  {
148
  $container = new ContainerBuilder();
149
  $container->setResourceTracking(false);
150
+ $container->addCompilerPass(new AddConsoleCommandPass(), PassConfig::TYPE_BEFORE_REMOVING);
151
 
152
  $definition = new Definition('SplObjectStorage');
153
  $definition->addTag('console.command');
177
  $this->assertTrue($container->hasAlias($alias1));
178
  $this->assertTrue($container->hasAlias($alias2));
179
  }
180
+
181
+ public function testProcessOnChildDefinitionWithClass()
182
+ {
183
+ $container = new ContainerBuilder();
184
+ $container->addCompilerPass(new AddConsoleCommandPass(), PassConfig::TYPE_BEFORE_REMOVING);
185
+ $className = 'Symfony\Component\Console\Tests\DependencyInjection\MyCommand';
186
+
187
+ $parentId = 'my-parent-command';
188
+ $childId = 'my-child-command';
189
+
190
+ $parentDefinition = new Definition(/* no class */);
191
+ $parentDefinition->setAbstract(true)->setPublic(false);
192
+
193
+ $childDefinition = new ChildDefinition($parentId);
194
+ $childDefinition->addTag('console.command')->setPublic(true);
195
+ $childDefinition->setClass($className);
196
+
197
+ $container->setDefinition($parentId, $parentDefinition);
198
+ $container->setDefinition($childId, $childDefinition);
199
+
200
+ $container->compile();
201
+ $command = $container->get($childId);
202
+
203
+ $this->assertInstanceOf($className, $command);
204
+ }
205
+
206
+ public function testProcessOnChildDefinitionWithParentClass()
207
+ {
208
+ $container = new ContainerBuilder();
209
+ $container->addCompilerPass(new AddConsoleCommandPass(), PassConfig::TYPE_BEFORE_REMOVING);
210
+ $className = 'Symfony\Component\Console\Tests\DependencyInjection\MyCommand';
211
+
212
+ $parentId = 'my-parent-command';
213
+ $childId = 'my-child-command';
214
+
215
+ $parentDefinition = new Definition($className);
216
+ $parentDefinition->setAbstract(true)->setPublic(false);
217
+
218
+ $childDefinition = new ChildDefinition($parentId);
219
+ $childDefinition->addTag('console.command')->setPublic(true);
220
+
221
+ $container->setDefinition($parentId, $parentDefinition);
222
+ $container->setDefinition($childId, $childDefinition);
223
+
224
+ $container->compile();
225
+ $command = $container->get($childId);
226
+
227
+ $this->assertInstanceOf($className, $command);
228
+ }
229
+
230
+ /**
231
+ * @expectedException \RuntimeException
232
+ * @expectedExceptionMessage The definition for "my-child-command" has no class.
233
+ */
234
+ public function testProcessOnChildDefinitionWithoutClass()
235
+ {
236
+ $container = new ContainerBuilder();
237
+ $container->addCompilerPass(new AddConsoleCommandPass(), PassConfig::TYPE_BEFORE_REMOVING);
238
+
239
+ $parentId = 'my-parent-command';
240
+ $childId = 'my-child-command';
241
+
242
+ $parentDefinition = new Definition();
243
+ $parentDefinition->setAbstract(true)->setPublic(false);
244
+
245
+ $childDefinition = new ChildDefinition($parentId);
246
+ $childDefinition->addTag('console.command')->setPublic(true);
247
+
248
+ $container->setDefinition($parentId, $parentDefinition);
249
+ $container->setDefinition($childId, $childDefinition);
250
+
251
+ $container->compile();
252
+ }
253
  }
254
 
255
  class MyCommand extends Command
256
  {
257
  }
258
+
259
+ class NamedCommand extends Command
260
+ {
261
+ protected static $defaultName = 'default';
262
+ }
vendor/symfony/console/Tests/EventListener/ErrorListenerTest.php CHANGED
@@ -20,8 +20,8 @@ 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
@@ -34,7 +34,7 @@ class ErrorListenerTest extends TestCase
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);
@@ -49,7 +49,7 @@ class ErrorListenerTest extends TestCase
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);
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\InputInterface;
24
+ use Symfony\Component\Console\Input\StringInput;
25
  use Symfony\Component\Console\Output\OutputInterface;
26
 
27
  class ErrorListenerTest extends TestCase
34
  $logger
35
  ->expects($this->once())
36
  ->method('error')
37
+ ->with('Error thrown while running command "{command}". Message: "{message}"', array('exception' => $error, 'command' => 'test:run --foo=baz buzz', 'message' => 'An error occurred'))
38
  ;
39
 
40
  $listener = new ErrorListener($logger);
49
  $logger
50
  ->expects($this->once())
51
  ->method('error')
52
+ ->with('An error occurred while using the console. Message: "{message}"', array('exception' => $error, 'message' => 'An error occurred'))
53
  ;
54
 
55
  $listener = new ErrorListener($logger);
vendor/symfony/console/Tests/Fixtures/Foo6Command.php CHANGED
@@ -1,6 +1,5 @@
1
  <?php
2
 
3
-
4
  use Symfony\Component\Console\Command\Command;
5
 
6
  class Foo6Command extends Command
1
  <?php
2
 
 
3
  use Symfony\Component\Console\Command\Command;
4
 
5
  class Foo6Command extends Command
vendor/symfony/console/Tests/Fixtures/FooSameCaseLowercaseCommand.php ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ use Symfony\Component\Console\Command\Command;
4
+
5
+ class FooSameCaseLowercaseCommand extends Command
6
+ {
7
+ protected function configure()
8
+ {
9
+ $this->setName('foo:bar')->setDescription('foo:bar command');
10
+ }
11
+ }
vendor/symfony/console/Tests/Fixtures/FooSameCaseUppercaseCommand.php ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ use Symfony\Component\Console\Command\Command;
4
+
5
+ class FooSameCaseUppercaseCommand extends Command
6
+ {
7
+ protected function configure()
8
+ {
9
+ $this->setName('foo:BAR')->setDescription('foo:BAR command');
10
+ }
11
+ }
vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/command/command_8.php CHANGED
@@ -1,9 +1,9 @@
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) {
1
  <?php
2
 
3
+ use Symfony\Component\Console\Helper\TableCell;
4
  use Symfony\Component\Console\Input\InputInterface;
5
  use Symfony\Component\Console\Output\OutputInterface;
6
  use Symfony\Component\Console\Style\SymfonyStyle;
 
7
 
8
  //Ensure formatting tables when using multiple headers with TableCell
9
  return function (InputInterface $input, OutputInterface $output) {
vendor/symfony/console/Tests/Formatter/OutputFormatterStyleStackTest.php CHANGED
@@ -12,8 +12,8 @@
12
  namespace Symfony\Component\Console\Tests\Formatter;
13
 
14
  use PHPUnit\Framework\TestCase;
15
- use Symfony\Component\Console\Formatter\OutputFormatterStyleStack;
16
  use Symfony\Component\Console\Formatter\OutputFormatterStyle;
 
17
 
18
  class OutputFormatterStyleStackTest extends TestCase
19
  {
12
  namespace Symfony\Component\Console\Tests\Formatter;
13
 
14
  use PHPUnit\Framework\TestCase;
 
15
  use Symfony\Component\Console\Formatter\OutputFormatterStyle;
16
+ use Symfony\Component\Console\Formatter\OutputFormatterStyleStack;
17
 
18
  class OutputFormatterStyleStackTest extends TestCase
19
  {
vendor/symfony/console/Tests/Helper/HelperSetTest.php CHANGED
@@ -12,8 +12,8 @@
12
  namespace Symfony\Component\Console\Tests\Helper;
13
 
14
  use PHPUnit\Framework\TestCase;
15
- use Symfony\Component\Console\Helper\HelperSet;
16
  use Symfony\Component\Console\Command\Command;
 
17
 
18
  class HelperSetTest extends TestCase
19
  {
12
  namespace Symfony\Component\Console\Tests\Helper;
13
 
14
  use PHPUnit\Framework\TestCase;
 
15
  use Symfony\Component\Console\Command\Command;
16
+ use Symfony\Component\Console\Helper\HelperSet;
17
 
18
  class HelperSetTest extends TestCase
19
  {
vendor/symfony/console/Tests/Helper/ProcessHelperTest.php CHANGED
@@ -14,10 +14,9 @@ namespace Symfony\Component\Console\Tests\Helper;
14
  use PHPUnit\Framework\TestCase;
15
  use Symfony\Component\Console\Helper\DebugFormatterHelper;
16
  use Symfony\Component\Console\Helper\HelperSet;
17
- use Symfony\Component\Console\Output\StreamOutput;
18
  use Symfony\Component\Console\Helper\ProcessHelper;
 
19
  use Symfony\Component\Process\Process;
20
- use Symfony\Component\Process\ProcessBuilder;
21
 
22
  class ProcessHelperTest extends TestCase
23
  {
@@ -85,8 +84,8 @@ EOT;
85
  EOT;
86
 
87
  $errorMessage = 'An error occurred';
88
- $args = new ProcessBuilder(array('php', '-r', 'echo 42;'));
89
- $args = $args->getProcess()->getCommandLine();
90
  $successOutputProcessDebug = str_replace("'php' '-r' 'echo 42;'", $args, $successOutputProcessDebug);
91
 
92
  return array(
14
  use PHPUnit\Framework\TestCase;
15
  use Symfony\Component\Console\Helper\DebugFormatterHelper;
16
  use Symfony\Component\Console\Helper\HelperSet;
 
17
  use Symfony\Component\Console\Helper\ProcessHelper;
18
+ use Symfony\Component\Console\Output\StreamOutput;
19
  use Symfony\Component\Process\Process;
 
20
 
21
  class ProcessHelperTest extends TestCase
22
  {
84
  EOT;
85
 
86
  $errorMessage = 'An error occurred';
87
+ $args = new Process(array('php', '-r', 'echo 42;'));
88
+ $args = $args->getCommandLine();
89
  $successOutputProcessDebug = str_replace("'php' '-r' 'echo 42;'", $args, $successOutputProcessDebug);
90
 
91
  return array(
vendor/symfony/console/Tests/Helper/ProgressBarTest.php CHANGED
@@ -12,8 +12,8 @@
12
  namespace Symfony\Component\Console\Tests\Helper;
13
 
14
  use PHPUnit\Framework\TestCase;
15
- use Symfony\Component\Console\Helper\ProgressBar;
16
  use Symfony\Component\Console\Helper\Helper;
 
17
  use Symfony\Component\Console\Output\StreamOutput;
18
 
19
  /**
12
  namespace Symfony\Component\Console\Tests\Helper;
13
 
14
  use PHPUnit\Framework\TestCase;
 
15
  use Symfony\Component\Console\Helper\Helper;
16
+ use Symfony\Component\Console\Helper\ProgressBar;
17
  use Symfony\Component\Console\Output\StreamOutput;
18
 
19
  /**
vendor/symfony/console/Tests/Helper/QuestionHelperTest.php CHANGED
@@ -12,9 +12,9 @@
12
  namespace Symfony\Component\Console\Tests\Helper;
13
 
14
  use Symfony\Component\Console\Formatter\OutputFormatter;
15
- use Symfony\Component\Console\Helper\QuestionHelper;
16
- use Symfony\Component\Console\Helper\HelperSet;
17
  use Symfony\Component\Console\Helper\FormatterHelper;
 
 
18
  use Symfony\Component\Console\Output\StreamOutput;
19
  use Symfony\Component\Console\Question\ChoiceQuestion;
20
  use Symfony\Component\Console\Question\ConfirmationQuestion;
@@ -157,6 +157,29 @@ class QuestionHelperTest extends AbstractQuestionHelperTest
157
  $this->assertEquals('AsseticBundle', $dialog->ask($this->createStreamableInputInterfaceMock($inputStream), $this->createOutputInterface(), $question));
158
  }
159
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
160
  public function testAutocompleteWithTrailingBackslash()
161
  {
162
  if (!$this->hasSttyAvailable()) {
@@ -198,7 +221,7 @@ class QuestionHelperTest extends AbstractQuestionHelperTest
198
 
199
  public function testAskHiddenResponse()
200
  {
201
- if ('\\' === DIRECTORY_SEPARATOR) {
202
  $this->markTestSkipped('This test is not supported on Windows');
203
  }
204
 
@@ -253,7 +276,7 @@ class QuestionHelperTest extends AbstractQuestionHelperTest
253
 
254
  $error = 'This is not a color!';
255
  $validator = function ($color) use ($error) {
256
- if (!in_array($color, array('white', 'black'))) {
257
  throw new \InvalidArgumentException($error);
258
  }
259
 
@@ -614,7 +637,7 @@ class QuestionHelperTest extends AbstractQuestionHelperTest
614
  */
615
  public function testLegacyAskHiddenResponse()
616
  {
617
- if ('\\' === DIRECTORY_SEPARATOR) {
618
  $this->markTestSkipped('This test is not supported on Windows');
619
  }
620
 
@@ -665,7 +688,7 @@ class QuestionHelperTest extends AbstractQuestionHelperTest
665
 
666
  $error = 'This is not a color!';
667
  $validator = function ($color) use ($error) {
668
- if (!in_array($color, array('white', 'black'))) {
669
  throw new \InvalidArgumentException($error);
670
  }
671
 
12
  namespace Symfony\Component\Console\Tests\Helper;
13
 
14
  use Symfony\Component\Console\Formatter\OutputFormatter;
 
 
15
  use Symfony\Component\Console\Helper\FormatterHelper;
16
+ use Symfony\Component\Console\Helper\HelperSet;
17
+ use Symfony\Component\Console\Helper\QuestionHelper;
18
  use Symfony\Component\Console\Output\StreamOutput;
19
  use Symfony\Component\Console\Question\ChoiceQuestion;
20
  use Symfony\Component\Console\Question\ConfirmationQuestion;
157
  $this->assertEquals('AsseticBundle', $dialog->ask($this->createStreamableInputInterfaceMock($inputStream), $this->createOutputInterface(), $question));
158
  }
159
 
160
+ public function testAskWithAutocompleteWithExactMatch()
161
+ {
162
+ if (!$this->hasSttyAvailable()) {
163
+ $this->markTestSkipped('`stty` is required to test autocomplete functionality');
164
+ }
165
+
166
+ $inputStream = $this->getInputStream("b\n");
167
+
168
+ $possibleChoices = array(
169
+ 'a' => 'berlin',
170
+ 'b' => 'copenhagen',
171
+ 'c' => 'amsterdam',
172
+ );
173
+
174
+ $dialog = new QuestionHelper();
175
+ $dialog->setHelperSet(new HelperSet(array(new FormatterHelper())));
176
+
177
+ $question = new ChoiceQuestion('Please select a city', $possibleChoices);
178
+ $question->setMaxAttempts(1);
179
+
180
+ $this->assertSame('b', $dialog->ask($this->createStreamableInputInterfaceMock($inputStream), $this->createOutputInterface(), $question));
181
+ }
182
+
183
  public function testAutocompleteWithTrailingBackslash()
184
  {
185
  if (!$this->hasSttyAvailable()) {
221
 
222
  public function testAskHiddenResponse()
223
  {
224
+ if ('\\' === \DIRECTORY_SEPARATOR) {
225
  $this->markTestSkipped('This test is not supported on Windows');
226
  }
227
 
276
 
277
  $error = 'This is not a color!';
278
  $validator = function ($color) use ($error) {
279
+ if (!\in_array($color, array('white', 'black'))) {
280
  throw new \InvalidArgumentException($error);
281
  }
282
 
637
  */
638
  public function testLegacyAskHiddenResponse()
639
  {
640
+ if ('\\' === \DIRECTORY_SEPARATOR) {
641
  $this->markTestSkipped('This test is not supported on Windows');
642
  }
643
 
688
 
689
  $error = 'This is not a color!';
690
  $validator = function ($color) use ($error) {
691
+ if (!\in_array($color, array('white', 'black'))) {
692
  throw new \InvalidArgumentException($error);
693
  }
694
 
vendor/symfony/console/Tests/Helper/SymfonyQuestionHelperTest.php CHANGED
@@ -6,8 +6,8 @@ use Symfony\Component\Console\Helper\FormatterHelper;
6
  use Symfony\Component\Console\Helper\HelperSet;
7
  use Symfony\Component\Console\Helper\SymfonyQuestionHelper;
8
  use Symfony\Component\Console\Output\StreamOutput;
9
- use Symfony\Component\Console\Question\Question;
10
  use Symfony\Component\Console\Question\ChoiceQuestion;
 
11
 
12
  /**
13
  * @group tty
@@ -74,6 +74,18 @@ class SymfonyQuestionHelperTest extends AbstractQuestionHelperTest
74
  $this->assertOutputContains('What is your favorite superhero? [Superman, Batman]', $output);
75
  }
76
 
 
 
 
 
 
 
 
 
 
 
 
 
77
  public function testAskReturnsNullIfValidatorAllowsIt()
78
  {
79
  $questionHelper = new SymfonyQuestionHelper();
6
  use Symfony\Component\Console\Helper\HelperSet;
7
  use Symfony\Component\Console\Helper\SymfonyQuestionHelper;
8
  use Symfony\Component\Console\Output\StreamOutput;
 
9
  use Symfony\Component\Console\Question\ChoiceQuestion;
10
+ use Symfony\Component\Console\Question\Question;
11
 
12
  /**
13
  * @group tty
74
  $this->assertOutputContains('What is your favorite superhero? [Superman, Batman]', $output);
75
  }
76
 
77
+ public function testAskChoiceWithChoiceValueAsDefault()
78
+ {
79
+ $questionHelper = new SymfonyQuestionHelper();
80
+ $helperSet = new HelperSet(array(new FormatterHelper()));
81
+ $questionHelper->setHelperSet($helperSet);
82
+ $question = new ChoiceQuestion('What is your favorite superhero?', array('Superman', 'Batman', 'Spiderman'), 'Batman');
83
+ $question->setMaxAttempts(1);
84
+
85
+ $this->assertSame('Batman', $questionHelper->ask($this->createStreamableInputInterfaceMock($this->getInputStream("Batman\n")), $output = $this->createOutputInterface(), $question));
86
+ $this->assertOutputContains('What is your favorite superhero? [Batman]', $output);
87
+ }
88
+
89
  public function testAskReturnsNullIfValidatorAllowsIt()
90
  {
91
  $questionHelper = new SymfonyQuestionHelper();
vendor/symfony/console/Tests/Helper/TableTest.php CHANGED
@@ -13,9 +13,9 @@ namespace Symfony\Component\Console\Tests\Helper;
13
 
14
  use PHPUnit\Framework\TestCase;
15
  use Symfony\Component\Console\Helper\Table;
16
- use Symfony\Component\Console\Helper\TableStyle;
17
- use Symfony\Component\Console\Helper\TableSeparator;
18
  use Symfony\Component\Console\Helper\TableCell;
 
 
19
  use Symfony\Component\Console\Output\StreamOutput;
20
 
21
  class TableTest extends TestCase
@@ -726,7 +726,23 @@ TABLE;
726
  $this->assertEquals($expected, $this->getOutputContent($output));
727
  }
728
 
729
- public function testColumnWith()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
730
  {
731
  $table = new Table($output = $this->getOutputStream());
732
  $table
@@ -758,7 +774,7 @@ TABLE;
758
  $this->assertEquals($expected, $this->getOutputContent($output));
759
  }
760
 
761
- public function testColumnWiths()
762
  {
763
  $table = new Table($output = $this->getOutputStream());
764
  $table
@@ -808,6 +824,42 @@ TABLE;
808
  Table::getStyleDefinition('absent');
809
  }
810
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
811
  protected function getOutputStream($decorated = false)
812
  {
813
  return new StreamOutput($this->stream, StreamOutput::VERBOSITY_NORMAL, $decorated);
13
 
14
  use PHPUnit\Framework\TestCase;
15
  use Symfony\Component\Console\Helper\Table;
 
 
16
  use Symfony\Component\Console\Helper\TableCell;
17
+ use Symfony\Component\Console\Helper\TableSeparator;
18
+ use Symfony\Component\Console\Helper\TableStyle;
19
  use Symfony\Component\Console\Output\StreamOutput;
20
 
21
  class TableTest extends TestCase
726
  $this->assertEquals($expected, $this->getOutputContent($output));
727
  }
728
 
729
+ /**
730
+ * @expectedException \Symfony\Component\Console\Exception\InvalidArgumentException
731
+ * @expectedExceptionMessage A cell must be a TableCell, a scalar or an object implementing __toString, array given.
732
+ */
733
+ public function testThrowsWhenTheCellInAnArray()
734
+ {
735
+ $table = new Table($output = $this->getOutputStream());
736
+ $table
737
+ ->setHeaders(array('ISBN', 'Title', 'Author', 'Price'))
738
+ ->setRows(array(
739
+ array('99921-58-10-7', array(), 'Dante Alighieri', '9.95'),
740
+ ));
741
+
742
+ $table->render();
743
+ }
744
+
745
+ public function testColumnWidth()
746
  {
747
  $table = new Table($output = $this->getOutputStream());
748
  $table
774
  $this->assertEquals($expected, $this->getOutputContent($output));
775
  }
776
 
777
+ public function testColumnWidths()
778
  {
779
  $table = new Table($output = $this->getOutputStream());
780
  $table
824
  Table::getStyleDefinition('absent');
825
  }
826
 
827
+ public function testBoxedStyleWithColspan()
828
+ {
829
+ $boxed = new TableStyle();
830
+ $boxed
831
+ ->setHorizontalBorderChar('─')
832
+ ->setVerticalBorderChar('│')
833
+ ->setCrossingChar('┼')
834
+ ;
835
+
836
+ $table = new Table($output = $this->getOutputStream());
837
+ $table->setStyle($boxed);
838
+ $table
839
+ ->setHeaders(array('ISBN', 'Title', 'Author'))
840
+ ->setRows(array(
841
+ array('99921-58-10-7', 'Divine Comedy', 'Dante Alighieri'),
842
+ new TableSeparator(),
843
+ array(new TableCell('This value spans 3 columns.', array('colspan' => 3))),
844
+ ))
845
+ ;
846
+ $table->render();
847
+
848
+ $expected =
849
+ <<<TABLE
850
+ ┼───────────────┼───────────────┼─────────────────┼
851
+ │ ISBN │ Title │ Author │
852
+ ┼───────────────┼───────────────┼─────────────────┼
853
+ │ 99921-58-10-7 │ Divine Comedy │ Dante Alighieri │
854
+ ┼───────────────┼───────────────┼─────────────────┼
855
+ │ This value spans 3 columns. │
856
+ ┼───────────────┼───────────────┼─────────────────┼
857
+
858
+ TABLE;
859
+
860
+ $this->assertSame($expected, $this->getOutputContent($output));
861
+ }
862
+
863
  protected function getOutputStream($decorated = false)
864
  {
865
  return new StreamOutput($this->stream, StreamOutput::VERBOSITY_NORMAL, $decorated);
vendor/symfony/console/Tests/Input/ArgvInputTest.php CHANGED
@@ -13,8 +13,8 @@ namespace Symfony\Component\Console\Tests\Input;
13
 
14
  use PHPUnit\Framework\TestCase;
15
  use Symfony\Component\Console\Input\ArgvInput;
16
- use Symfony\Component\Console\Input\InputDefinition;
17
  use Symfony\Component\Console\Input\InputArgument;
 
18
  use Symfony\Component\Console\Input\InputOption;
19
 
20
  class ArgvInputTest extends TestCase
@@ -246,6 +246,11 @@ class ArgvInputTest extends TestCase
246
  new InputDefinition(array(new InputArgument('number'))),
247
  'The "-1" option does not exist.',
248
  ),
 
 
 
 
 
249
  );
250
  }
251
 
@@ -314,6 +319,10 @@ class ArgvInputTest extends TestCase
314
  $input = new ArgvInput(array('cli.php', '-f', 'foo'));
315
  $this->assertTrue($input->hasParameterOption('-f'), '->hasParameterOption() returns true if the given short option is in the raw input');
316
 
 
 
 
 
317
  $input = new ArgvInput(array('cli.php', '--foo', 'foo'));
318
  $this->assertTrue($input->hasParameterOption('--foo'), '->hasParameterOption() returns true if the given short option is in the raw input');
319
 
@@ -339,6 +348,46 @@ class ArgvInputTest extends TestCase
339
  $this->assertFalse($input->hasParameterOption('--foo', true), '->hasParameterOption() returns false if the given option is in the raw input but after an end of options signal');
340
  }
341
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
342
  public function testToString()
343
  {
344
  $input = new ArgvInput(array('cli.php', '-f', 'foo'));
@@ -351,25 +400,26 @@ class ArgvInputTest extends TestCase
351
  /**
352
  * @dataProvider provideGetParameterOptionValues
353
  */
354
- public function testGetParameterOptionEqualSign($argv, $key, $onlyParams, $expected)
355
  {
356
  $input = new ArgvInput($argv);
357
- $this->assertEquals($expected, $input->getParameterOption($key, false, $onlyParams), '->getParameterOption() returns the expected value');
358
  }
359
 
360
  public function provideGetParameterOptionValues()
361
  {
362
  return array(
363
- array(array('app/console', 'foo:bar', '-e', 'dev'), '-e', false, 'dev'),
364
- array(array('app/console', 'foo:bar', '--env=dev'), '--env', false, 'dev'),
365
- array(array('app/console', 'foo:bar', '-e', 'dev'), array('-e', '--env'), false, 'dev'),
366
- array(array('app/console', 'foo:bar', '--env=dev'), array('-e', '--env'), false, 'dev'),
367
- array(array('app/console', 'foo:bar', '--env=dev', '--en=1'), array('--en'), false, '1'),
368
- array(array('app/console', 'foo:bar', '--env=dev', '', '--en=1'), array('--en'), false, '1'),
369
- array(array('app/console', 'foo:bar', '--env', 'val'), '--env', false, 'val'),
370
- array(array('app/console', 'foo:bar', '--env', 'val', '--dummy'), '--env', false, 'val'),
371
- array(array('app/console', 'foo:bar', '--', '--env=dev'), '--env', false, 'dev'),
372
- array(array('app/console', 'foo:bar', '--', '--env=dev'), '--env', true, false),
 
373
  );
374
  }
375
 
13
 
14
  use PHPUnit\Framework\TestCase;
15
  use Symfony\Component\Console\Input\ArgvInput;
 
16
  use Symfony\Component\Console\Input\InputArgument;
17
+ use Symfony\Component\Console\Input\InputDefinition;
18
  use Symfony\Component\Console\Input\InputOption;
19
 
20
  class ArgvInputTest extends TestCase
246
  new InputDefinition(array(new InputArgument('number'))),
247
  'The "-1" option does not exist.',
248
  ),
249
+ array(
250
+ array('cli.php', '-fЩ'),
251
+ new InputDefinition(array(new InputOption('foo', 'f', InputOption::VALUE_NONE))),
252
+ 'The "-Щ" option does not exist.',
253
+ ),
254
  );
255
  }
256
 
319
  $input = new ArgvInput(array('cli.php', '-f', 'foo'));
320
  $this->assertTrue($input->hasParameterOption('-f'), '->hasParameterOption() returns true if the given short option is in the raw input');
321
 
322
+ $input = new ArgvInput(array('cli.php', '-etest'));
323
+ $this->assertTrue($input->hasParameterOption('-e'), '->hasParameterOption() returns true if the given short option is in the raw input');
324
+ $this->assertFalse($input->hasParameterOption('-s'), '->hasParameterOption() returns true if the given short option is in the raw input');
325
+
326
  $input = new ArgvInput(array('cli.php', '--foo', 'foo'));
327
  $this->assertTrue($input->hasParameterOption('--foo'), '->hasParameterOption() returns true if the given short option is in the raw input');
328
 
348
  $this->assertFalse($input->hasParameterOption('--foo', true), '->hasParameterOption() returns false if the given option is in the raw input but after an end of options signal');
349
  }
350
 
351
+ public function testHasParameterOptionEdgeCasesAndLimitations()
352
+ {
353
+ $input = new ArgvInput(array('cli.php', '-fh'));
354
+ // hasParameterOption does not know if the previous short option, -f,
355
+ // takes a value or not. If -f takes a value, then -fh does NOT include
356
+ // -h; Otherwise it does. Since we do not know which short options take
357
+ // values, hasParameterOption does not support this use-case.
358
+ $this->assertFalse($input->hasParameterOption('-h'), '->hasParameterOption() returns true if the given short option is in the raw input');
359
+ // hasParameterOption does detect that `-fh` contains `-f`, since
360
+ // `-f` is the first short option in the set.
361
+ $this->assertTrue($input->hasParameterOption('-f'), '->hasParameterOption() returns true if the given short option is in the raw input');
362
+ // The test below happens to pass, although it might make more sense
363
+ // to disallow it, and require the use of
364
+ // $input->hasParameterOption('-f') && $input->hasParameterOption('-h')
365
+ // instead.
366
+ $this->assertTrue($input->hasParameterOption('-fh'), '->hasParameterOption() returns true if the given short option is in the raw input');
367
+ // In theory, if -fh is supported, then -hf should also work.
368
+ // However, this is not supported.
369
+ $this->assertFalse($input->hasParameterOption('-hf'), '->hasParameterOption() returns true if the given short option is in the raw input');
370
+
371
+ $input = new ArgvInput(array('cli.php', '-f', '-h'));
372
+ // If hasParameterOption('-fh') is supported for 'cli.php -fh', then
373
+ // one might also expect that it should also be supported for
374
+ // 'cli.php -f -h'. However, this is not supported.
375
+ $this->assertFalse($input->hasParameterOption('-fh'), '->hasParameterOption() returns true if the given short option is in the raw input');
376
+ }
377
+
378
+ public function testNoWarningOnInvalidParameterOption()
379
+ {
380
+ $input = new ArgvInput(array('cli.php', '-edev'));
381
+
382
+ $this->assertTrue($input->hasParameterOption(array('-e', '')));
383
+ // No warning thrown
384
+ $this->assertFalse($input->hasParameterOption(array('-m', '')));
385
+
386
+ $this->assertEquals('dev', $input->getParameterOption(array('-e', '')));
387
+ // No warning thrown
388
+ $this->assertFalse($input->getParameterOption(array('-m', '')));
389
+ }
390
+
391
  public function testToString()
392
  {
393
  $input = new ArgvInput(array('cli.php', '-f', 'foo'));
400
  /**
401
  * @dataProvider provideGetParameterOptionValues
402
  */
403
+ public function testGetParameterOptionEqualSign($argv, $key, $default, $onlyParams, $expected)
404
  {
405
  $input = new ArgvInput($argv);
406
+ $this->assertEquals($expected, $input->getParameterOption($key, $default, $onlyParams), '->getParameterOption() returns the expected value');
407
  }
408
 
409
  public function provideGetParameterOptionValues()
410
  {
411
  return array(
412
+ array(array('app/console', 'foo:bar'), '-e', 'default', false, 'default'),
413
+ array(array('app/console', 'foo:bar', '-e', 'dev'), '-e', 'default', false, 'dev'),
414
+ array(array('app/console', 'foo:bar', '--env=dev'), '--env', 'default', false, 'dev'),
415
+ array(array('app/console', 'foo:bar', '-e', 'dev'), array('-e', '--env'), 'default', false, 'dev'),
416
+ array(array('app/console', 'foo:bar', '--env=dev'), array('-e', '--env'), 'default', false, 'dev'),
417
+ array(array('app/console', 'foo:bar', '--env=dev', '--en=1'), array('--en'), 'default', false, '1'),
418
+ array(array('app/console', 'foo:bar', '--env=dev', '', '--en=1'), array('--en'), 'default', false, '1'),
419
+ array(array('app/console', 'foo:bar', '--env', 'val'), '--env', 'default', false, 'val'),
420
+ array(array('app/console', 'foo:bar', '--env', 'val', '--dummy'), '--env', 'default', false, 'val'),
421
+ array(array('app/console', 'foo:bar', '--', '--env=dev'), '--env', 'default', false, 'dev'),
422
+ array(array('app/console', 'foo:bar', '--', '--env=dev'), '--env', 'default', true, 'default'),
423
  );
424
  }
425
 
vendor/symfony/console/Tests/Input/ArrayInputTest.php CHANGED
@@ -13,8 +13,8 @@ namespace Symfony\Component\Console\Tests\Input;
13
 
14
  use PHPUnit\Framework\TestCase;
15
  use Symfony\Component\Console\Input\ArrayInput;
16
- use Symfony\Component\Console\Input\InputDefinition;
17
  use Symfony\Component\Console\Input\InputArgument;
 
18
  use Symfony\Component\Console\Input\InputOption;
19
 
20
  class ArrayInputTest extends TestCase
@@ -47,14 +47,14 @@ class ArrayInputTest extends TestCase
47
  {
48
  $input = new ArrayInput(array('name' => 'Fabien', '--foo' => 'bar'));
49
  $this->assertEquals('bar', $input->getParameterOption('--foo'), '->getParameterOption() returns the option of specified name');
50
- $this->assertFalse($input->getParameterOption('--bar'), '->getParameterOption() returns the default if an option is not present in the passed parameters');
51
 
52
  $input = new ArrayInput(array('Fabien', '--foo' => 'bar'));
53
  $this->assertEquals('bar', $input->getParameterOption('--foo'), '->getParameterOption() returns the option of specified name');
54
 
55
  $input = new ArrayInput(array('--foo', '--', '--bar' => 'woop'));
56
  $this->assertEquals('woop', $input->getParameterOption('--bar'), '->getParameterOption() returns the correct value if an option is present in the passed parameters');
57
- $this->assertFalse($input->getParameterOption('--bar', false, true), '->getParameterOption() returns false if an option is present in the passed parameters after an end of options signal');
58
  }
59
 
60
  public function testParseArguments()
@@ -170,5 +170,8 @@ class ArrayInputTest extends TestCase
170
 
171
  $input = new ArrayInput(array('-b' => array('bval_1', 'bval_2'), '--f' => array('fval_1', 'fval_2')));
172
  $this->assertSame('-b=bval_1 -b=bval_2 --f=fval_1 --f=fval_2', (string) $input);
 
 
 
173
  }
174
  }
13
 
14
  use PHPUnit\Framework\TestCase;
15
  use Symfony\Component\Console\Input\ArrayInput;
 
16
  use Symfony\Component\Console\Input\InputArgument;
17
+ use Symfony\Component\Console\Input\InputDefinition;
18
  use Symfony\Component\Console\Input\InputOption;
19
 
20
  class ArrayInputTest extends TestCase
47
  {
48
  $input = new ArrayInput(array('name' => 'Fabien', '--foo' => 'bar'));
49
  $this->assertEquals('bar', $input->getParameterOption('--foo'), '->getParameterOption() returns the option of specified name');
50
+ $this->assertEquals('default', $input->getParameterOption('--bar', 'default'), '->getParameterOption() returns the default value if an option is not present in the passed parameters');
51
 
52
  $input = new ArrayInput(array('Fabien', '--foo' => 'bar'));
53
  $this->assertEquals('bar', $input->getParameterOption('--foo'), '->getParameterOption() returns the option of specified name');
54
 
55
  $input = new ArrayInput(array('--foo', '--', '--bar' => 'woop'));
56
  $this->assertEquals('woop', $input->getParameterOption('--bar'), '->getParameterOption() returns the correct value if an option is present in the passed parameters');
57
+ $this->assertEquals('default', $input->getParameterOption('--bar', 'default', true), '->getParameterOption() returns the default value if an option is present in the passed parameters after an end of options signal');
58
  }
59
 
60
  public function testParseArguments()
170
 
171
  $input = new ArrayInput(array('-b' => array('bval_1', 'bval_2'), '--f' => array('fval_1', 'fval_2')));
172
  $this->assertSame('-b=bval_1 -b=bval_2 --f=fval_1 --f=fval_2', (string) $input);
173
+
174
+ $input = new ArrayInput(array('array_arg' => array('val_1', 'val_2')));
175
+ $this->assertSame('val_1 val_2', (string) $input);
176
  }
177
  }
vendor/symfony/console/Tests/Input/InputDefinitionTest.php CHANGED
@@ -12,8 +12,8 @@
12
  namespace Symfony\Component\Console\Tests\Input;
13
 
14
  use PHPUnit\Framework\TestCase;
15
- use Symfony\Component\Console\Input\InputDefinition;
16
  use Symfony\Component\Console\Input\InputArgument;
 
17
  use Symfony\Component\Console\Input\InputOption;
18
 
19
  class InputDefinitionTest extends TestCase
12
  namespace Symfony\Component\Console\Tests\Input;
13
 
14
  use PHPUnit\Framework\TestCase;
 
15
  use Symfony\Component\Console\Input\InputArgument;
16
+ use Symfony\Component\Console\Input\InputDefinition;
17
  use Symfony\Component\Console\Input\InputOption;
18
 
19
  class InputDefinitionTest extends TestCase
vendor/symfony/console/Tests/Input/InputTest.php CHANGED
@@ -13,8 +13,8 @@ namespace Symfony\Component\Console\Tests\Input;
13
 
14
  use PHPUnit\Framework\TestCase;
15
  use Symfony\Component\Console\Input\ArrayInput;
16
- use Symfony\Component\Console\Input\InputDefinition;
17
  use Symfony\Component\Console\Input\InputArgument;
 
18
  use Symfony\Component\Console\Input\InputOption;
19
 
20
  class InputTest extends TestCase
13
 
14
  use PHPUnit\Framework\TestCase;
15
  use Symfony\Component\Console\Input\ArrayInput;
 
16
  use Symfony\Component\Console\Input\InputArgument;
17
+ use Symfony\Component\Console\Input\InputDefinition;
18
  use Symfony\Component\Console\Input\InputOption;
19
 
20
  class InputTest extends TestCase
vendor/symfony/console/Tests/Logger/ConsoleLoggerTest.php CHANGED
@@ -16,8 +16,8 @@ use Psr\Log\LoggerInterface;
16
  use Psr\Log\LogLevel;
17
  use Symfony\Component\Console\Logger\ConsoleLogger;
18
  use Symfony\Component\Console\Output\BufferedOutput;
19
- use Symfony\Component\Console\Tests\Fixtures\DummyOutput;
20
  use Symfony\Component\Console\Output\OutputInterface;
 
21
 
22
  /**
23
  * Console logger test.
@@ -166,9 +166,7 @@ class ConsoleLoggerTest extends TestCase
166
  } else {
167
  $dummy = $this->getMock('Symfony\Component\Console\Tests\Logger\DummyTest', array('__toString'));
168
  }
169
- $dummy->expects($this->once())
170
- ->method('__toString')
171
- ->will($this->returnValue('DUMMY'));
172
 
173
  $this->getLogger()->warning($dummy);
174
 
16
  use Psr\Log\LogLevel;
17
  use Symfony\Component\Console\Logger\ConsoleLogger;
18
  use Symfony\Component\Console\Output\BufferedOutput;
 
19
  use Symfony\Component\Console\Output\OutputInterface;
20
+ use Symfony\Component\Console\Tests\Fixtures\DummyOutput;
21
 
22
  /**
23
  * Console logger test.
166
  } else {
167
  $dummy = $this->getMock('Symfony\Component\Console\Tests\Logger\DummyTest', array('__toString'));
168
  }
169
+ $dummy->method('__toString')->will($this->returnValue('DUMMY'));
 
 
170
 
171
  $this->getLogger()->warning($dummy);
172
 
vendor/symfony/console/Tests/Output/OutputTest.php CHANGED
@@ -12,8 +12,8 @@
12
  namespace Symfony\Component\Console\Tests\Output;
13
 
14
  use PHPUnit\Framework\TestCase;
15
- use Symfony\Component\Console\Output\Output;
16
  use Symfony\Component\Console\Formatter\OutputFormatterStyle;
 
17
 
18
  class OutputTest extends TestCase
19
  {
12
  namespace Symfony\Component\Console\Tests\Output;
13
 
14
  use PHPUnit\Framework\TestCase;
 
15
  use Symfony\Component\Console\Formatter\OutputFormatterStyle;
16
+ use Symfony\Component\Console\Output\Output;
17
 
18
  class OutputTest extends TestCase
19
  {
vendor/symfony/console/Tests/Style/SymfonyStyleTest.php CHANGED
@@ -13,12 +13,12 @@ namespace Symfony\Component\Console\Tests\Style;
13
 
14
  use PHPUnit\Framework\TestCase;
15
  use Symfony\Component\Console\Command\Command;
16
- use Symfony\Component\Console\Tester\CommandTester;
17
  use Symfony\Component\Console\Formatter\OutputFormatter;
18
- use Symfony\Component\Console\Output\OutputInterface;
19
- use Symfony\Component\Console\Output\ConsoleOutputInterface;
20
  use Symfony\Component\Console\Input\InputInterface;
 
 
21
  use Symfony\Component\Console\Style\SymfonyStyle;
 
22
 
23
  class SymfonyStyleTest extends TestCase
24
  {
13
 
14
  use PHPUnit\Framework\TestCase;
15
  use Symfony\Component\Console\Command\Command;
 
16
  use Symfony\Component\Console\Formatter\OutputFormatter;
 
 
17
  use Symfony\Component\Console\Input\InputInterface;
18
+ use Symfony\Component\Console\Output\ConsoleOutputInterface;
19
+ use Symfony\Component\Console\Output\OutputInterface;
20
  use Symfony\Component\Console\Style\SymfonyStyle;
21
+ use Symfony\Component\Console\Tester\CommandTester;
22
 
23
  class SymfonyStyleTest extends TestCase
24
  {
vendor/symfony/console/Tests/Tester/CommandTesterTest.php CHANGED
@@ -14,12 +14,12 @@ namespace Symfony\Component\Console\Tests\Tester;
14
  use PHPUnit\Framework\TestCase;
15
  use Symfony\Component\Console\Application;
16
  use Symfony\Component\Console\Command\Command;
17
- use Symfony\Component\Console\Output\Output;
18
- use Symfony\Component\Console\Tester\CommandTester;
19
- use Symfony\Component\Console\Question\Question;
20
  use Symfony\Component\Console\Helper\HelperSet;
21
  use Symfony\Component\Console\Helper\QuestionHelper;
 
 
22
  use Symfony\Component\Console\Style\SymfonyStyle;
 
23
 
24
  class CommandTesterTest extends TestCase
25
  {
14
  use PHPUnit\Framework\TestCase;
15
  use Symfony\Component\Console\Application;
16
  use Symfony\Component\Console\Command\Command;
 
 
 
17
  use Symfony\Component\Console\Helper\HelperSet;
18
  use Symfony\Component\Console\Helper\QuestionHelper;
19
+ use Symfony\Component\Console\Output\Output;
20
+ use Symfony\Component\Console\Question\Question;
21
  use Symfony\Component\Console\Style\SymfonyStyle;
22
+ use Symfony\Component\Console\Tester\CommandTester;
23
 
24
  class CommandTesterTest extends TestCase
25
  {
vendor/symfony/console/composer.json CHANGED
@@ -18,24 +18,25 @@
18
  "require": {
19
  "php": "^5.5.9|>=7.0.8",
20
  "symfony/polyfill-mbstring": "~1.0",
21
- "symfony/debug": "~2.8|~3.0"
22
  },
23
  "require-dev": {
24
- "symfony/config": "~3.3",
25
- "symfony/event-dispatcher": "~2.8|~3.0",
26
- "symfony/dependency-injection": "~3.3",
27
- "symfony/filesystem": "~2.8|~3.0",
28
- "symfony/process": "~2.8|~3.0",
29
  "psr/log": "~1.0"
30
  },
31
  "suggest": {
32
  "symfony/event-dispatcher": "",
33
- "symfony/filesystem": "",
34
  "symfony/process": "",
35
- "psr/log": "For using the console logger"
36
  },
37
  "conflict": {
38
- "symfony/dependency-injection": "<3.3"
 
39
  },
40
  "autoload": {
41
  "psr-4": { "Symfony\\Component\\Console\\": "" },
@@ -46,7 +47,7 @@
46
  "minimum-stability": "dev",
47
  "extra": {
48
  "branch-alias": {
49
- "dev-master": "3.3-dev"
50
  }
51
  }
52
  }
18
  "require": {
19
  "php": "^5.5.9|>=7.0.8",
20
  "symfony/polyfill-mbstring": "~1.0",
21
+ "symfony/debug": "~2.8|~3.0|~4.0"
22
  },
23
  "require-dev": {
24
+ "symfony/config": "~3.3|~4.0",
25
+ "symfony/event-dispatcher": "~2.8|~3.0|~4.0",
26
+ "symfony/dependency-injection": "~3.4|~4.0",
27
+ "symfony/lock": "~3.4|~4.0",
28
+ "symfony/process": "~3.3|~4.0",
29
  "psr/log": "~1.0"
30
  },
31
  "suggest": {
32
  "symfony/event-dispatcher": "",
33
+ "symfony/lock": "",
34
  "symfony/process": "",
35
+ "psr/log-implementation": "For using the console logger"
36
  },
37
  "conflict": {
38
+ "symfony/dependency-injection": "<3.4",
39
+ "symfony/process": "<3.3"
40
  },
41
  "autoload": {
42
  "psr-4": { "Symfony\\Component\\Console\\": "" },
47
  "minimum-stability": "dev",
48
  "extra": {
49
  "branch-alias": {
50
+ "dev-master": "3.4-dev"
51
  }
52
  }
53
  }
vendor/symfony/debug/DebugClassLoader.php CHANGED
@@ -129,8 +129,6 @@ class DebugClassLoader
129
  *
130
  * @param string $class The name of the class
131
  *
132
- * @return bool|null True, if loaded
133
- *
134
  * @throws \RuntimeException
135
  */
136
  public function loadClass($class)
@@ -184,200 +182,227 @@ class DebugClassLoader
184
  throw new \RuntimeException(sprintf('Case mismatch between loaded and declared class names: "%s" vs "%s".', $class, $name));
185
  }
186
 
187
- // Don't trigger deprecations for classes in the same vendor
188
- if (2 > $len = 1 + (\strpos($name, '\\') ?: \strpos($name, '_'))) {
189
- $len = 0;
190
- $ns = '';
191
- } else {
192
- $ns = \substr($name, 0, $len);
193
  }
194
 
195
- // Detect annotations on the class
196
- if (false !== $doc = $refl->getDocComment()) {
197
- foreach (array('final', 'deprecated', 'internal') as $annotation) {
198
- if (false !== \strpos($doc, $annotation) && preg_match('#\n \* @'.$annotation.'(?:( .+?)\.?)?\r?\n \*(?: @|/$)#s', $doc, $notice)) {
199
- self::${$annotation}[$name] = isset($notice[1]) ? preg_replace('#\s*\r?\n \* +#', ' ', $notice[1]) : '';
200
- }
201
- }
202
  }
 
203
 
204
- $parentAndTraits = \class_uses($name, false);
205
- if ($parent = \get_parent_class($class)) {
206
- $parentAndTraits[] = $parent;
207
 
208
- if (!isset(self::$checkedClasses[$parent])) {
209
- $this->checkClass($parent);
210
- }
 
 
 
 
 
 
 
 
 
211
 
212
- if (isset(self::$final[$parent])) {
213
- @trigger_error(sprintf('The "%s" class is considered final%s. It may change without further notice as of its next major version. You should not extend it from "%s".', $parent, self::$final[$parent], $name), E_USER_DEPRECATED);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
214
  }
215
  }
 
216
 
217
- // Detect if the parent is annotated
218
- foreach ($parentAndTraits + $this->getOwnInterfaces($name, $parent) as $use) {
219
- if (!isset(self::$checkedClasses[$use])) {
220
- $this->checkClass($use);
221
- }
222
- if (isset(self::$deprecated[$use]) && \strncmp($ns, $use, $len)) {
223
- $type = class_exists($name, false) ? 'class' : (interface_exists($name, false) ? 'interface' : 'trait');
224
- $verb = class_exists($use, false) || interface_exists($name, false) ? 'extends' : (interface_exists($use, false) ? 'implements' : 'uses');
225
 
226
- @trigger_error(sprintf('The "%s" %s %s "%s" that is deprecated%s.', $name, $type, $verb, $use, self::$deprecated[$use]), E_USER_DEPRECATED);
227
- }
228
- if (isset(self::$internal[$use]) && \strncmp($ns, $use, $len)) {
229
- @trigger_error(sprintf('The "%s" %s is considered internal%s. It may change without further notice. You should not use it from "%s".', $use, class_exists($use, false) ? 'class' : (interface_exists($use, false) ? 'interface' : 'trait'), self::$internal[$use], $name), E_USER_DEPRECATED);
230
- }
231
  }
232
 
233
- // Inherit @final and @internal annotations for methods
234
- self::$finalMethods[$name] = array();
235
- self::$internalMethods[$name] = array();
236
- foreach ($parentAndTraits as $use) {
237
- foreach (array('finalMethods', 'internalMethods') as $property) {
238
- if (isset(self::${$property}[$use])) {
239
- self::${$property}[$name] = self::${$property}[$name] ? self::${$property}[$use] + self::${$property}[$name] : self::${$property}[$use];
240
- }
241
- }
242
  }
 
243
 
244
- $isClass = \class_exists($name, false);
245
- foreach ($refl->getMethods(\ReflectionMethod::IS_PUBLIC | \ReflectionMethod::IS_PROTECTED) as $method) {
246
- if ($method->class !== $name) {
247
- continue;
248
- }
 
 
 
249
 
250
- // Method from a trait
251
- if ($method->getFilename() !== $refl->getFileName()) {
252
- continue;
253
- }
 
 
254
 
255
- if ($isClass && $parent && isset(self::$finalMethods[$parent][$method->name])) {
256
- list($declaringClass, $message) = self::$finalMethods[$parent][$method->name];
257
- @trigger_error(sprintf('The "%s::%s()" method is considered final%s. It may change without further notice as of its next major version. You should not extend it from "%s".', $declaringClass, $method->name, $message, $name), E_USER_DEPRECATED);
258
- }
259
 
260
- foreach ($parentAndTraits as $use) {
261
- if (isset(self::$internalMethods[$use][$method->name])) {
262
- list($declaringClass, $message) = self::$internalMethods[$use][$method->name];
263
- if (\strncmp($ns, $declaringClass, $len)) {
264
- @trigger_error(sprintf('The "%s::%s()" method is considered internal%s. It may change without further notice. You should not extend it from "%s".', $declaringClass, $method->name, $message, $name), E_USER_DEPRECATED);
265
- }
266
- }
267
  }
 
 
268
 
269
- // Detect method annotations
270
- if (false === $doc = $method->getDocComment()) {
271
- continue;
272
- }
273
 
274
- foreach (array('final', 'internal') as $annotation) {
275
- if (false !== \strpos($doc, $annotation) && preg_match('#\n\s+\* @'.$annotation.'(?:( .+?)\.?)?\r?\n\s+\*(?: @|/$)#s', $doc, $notice)) {
276
- $message = isset($notice[1]) ? preg_replace('#\s*\r?\n \* +#', ' ', $notice[1]) : '';
277
- self::${$annotation.'Methods'}[$name][$method->name] = array($name, $message);
278
- }
 
 
 
 
279
  }
280
  }
281
 
282
- if (isset(self::$php7Reserved[\strtolower($refl->getShortName())])) {
283
- @trigger_error(sprintf('The "%s" class uses the reserved name "%s", it will break on PHP 7 and higher', $name, $refl->getShortName()), E_USER_DEPRECATED);
 
284
  }
285
- }
286
 
287
- if ($file) {
288
- if (!$exists) {
289
- if (false !== strpos($class, '/')) {
290
- throw new \RuntimeException(sprintf('Trying to autoload a class with an invalid name "%s". Be careful that the namespace separator is "\" in PHP, not "/".', $class));
291
  }
292
-
293
- throw new \RuntimeException(sprintf('The autoloader expected class "%s" to be defined in file "%s". The file was found but the class was not in it, the class name or namespace probably has a typo.', $class, $file));
294
  }
295
- if (self::$caseCheck) {
296
- $real = explode('\\', $class.strrchr($file, '.'));
297
- $tail = explode(\DIRECTORY_SEPARATOR, str_replace('/', \DIRECTORY_SEPARATOR, $file));
298
 
299
- $i = \count($tail) - 1;
300
- $j = \count($real) - 1;
301
 
302
- while (isset($tail[$i], $real[$j]) && $tail[$i] === $real[$j]) {
303
- --$i;
304
- --$j;
305
- }
306
 
307
- array_splice($tail, 0, $i + 1);
308
- }
309
- if (self::$caseCheck && $tail) {
310
- $tail = \DIRECTORY_SEPARATOR.implode(\DIRECTORY_SEPARATOR, $tail);
311
- $tailLen = \strlen($tail);
312
- $real = $refl->getFileName();
313
-
314
- if (2 === self::$caseCheck) {
315
- // realpath() on MacOSX doesn't normalize the case of characters
316
-
317
- $i = 1 + strrpos($real, '/');
318
- $file = substr($real, $i);
319
- $real = substr($real, 0, $i);
320
-
321
- if (isset(self::$darwinCache[$real])) {
322
- $kDir = $real;
323
- } else {
324
- $kDir = strtolower($real);
325
-
326
- if (isset(self::$darwinCache[$kDir])) {
327
- $real = self::$darwinCache[$kDir][0];
328
- } else {
329
- $dir = getcwd();
330
- chdir($real);
331
- $real = getcwd().'/';
332
- chdir($dir);
333
-
334
- $dir = $real;
335
- $k = $kDir;
336
- $i = \strlen($dir) - 1;
337
- while (!isset(self::$darwinCache[$k])) {
338
- self::$darwinCache[$k] = array($dir, array());
339
- self::$darwinCache[$dir] = &self::$darwinCache[$k];
340
-
341
- while ('/' !== $dir[--$i]) {
342
- }
343
- $k = substr($k, 0, ++$i);
344
- $dir = substr($dir, 0, $i--);
345
- }
346
- }
347
- }
348
 
349
- $dirFiles = self::$darwinCache[$kDir][1];
350
-
351
- if (isset($dirFiles[$file])) {
352
- $kFile = $file;
353
- } else {
354
- $kFile = strtolower($file);
355
-
356
- if (!isset($dirFiles[$kFile])) {
357
- foreach (scandir($real, 2) as $f) {
358
- if ('.' !== $f[0]) {
359
- $dirFiles[$f] = $f;
360
- if ($f === $file) {
361
- $kFile = $k = $file;
362
- } elseif ($f !== $k = strtolower($f)) {
363
- $dirFiles[$k] = $f;
364
- }
365
- }
366
- }
367
- self::$darwinCache[$kDir][1] = $dirFiles;
368
- }
369
- }
370
 
371
- $real .= $dirFiles[$kFile];
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
372
  }
 
 
373
 
374
- if (0 === substr_compare($real, $tail, -$tailLen, $tailLen, true)
375
- && 0 !== substr_compare($real, $tail, -$tailLen, $tailLen, false)
376
- ) {
377
- throw new \RuntimeException(sprintf('Case mismatch between class and real file names: "%s" vs "%s" in "%s".', substr($tail, -$tailLen + 1), substr($real, -$tailLen + 1), substr($real, 0, -$tailLen + 1)));
 
 
 
 
 
 
 
 
 
 
 
 
 
378
  }
379
  }
 
380
  }
 
 
381
  }
382
 
383
  /**
129
  *
130
  * @param string $class The name of the class
131
  *
 
 
132
  * @throws \RuntimeException
133
  */
134
  public function loadClass($class)
182
  throw new \RuntimeException(sprintf('Case mismatch between loaded and declared class names: "%s" vs "%s".', $class, $name));
183
  }
184
 
185
+ $deprecations = $this->checkAnnotations($refl, $name);
186
+
187
+ if (isset(self::$php7Reserved[\strtolower($refl->getShortName())])) {
188
+ $deprecations[] = sprintf('The "%s" class uses the reserved name "%s", it will break on PHP 7 and higher', $name, $refl->getShortName());
 
 
189
  }
190
 
191
+ foreach ($deprecations as $message) {
192
+ @trigger_error($message, E_USER_DEPRECATED);
 
 
 
 
 
193
  }
194
+ }
195
 
196
+ if (!$file) {
197
+ return;
198
+ }
199
 
200
+ if (!$exists) {
201
+ if (false !== strpos($class, '/')) {
202
+ throw new \RuntimeException(sprintf('Trying to autoload a class with an invalid name "%s". Be careful that the namespace separator is "\" in PHP, not "/".', $class));
203
+ }
204
+
205
+ throw new \RuntimeException(sprintf('The autoloader expected class "%s" to be defined in file "%s". The file was found but the class was not in it, the class name or namespace probably has a typo.', $class, $file));
206
+ }
207
+
208
+ if (self::$caseCheck && $message = $this->checkCase($refl, $file, $class)) {
209
+ throw new \RuntimeException(sprintf('Case mismatch between class and real file names: "%s" vs "%s" in "%s".', $message[0], $message[1], $message[2]));
210
+ }
211
+ }
212
 
213
+ public function checkAnnotations(\ReflectionClass $refl, $class)
214
+ {
215
+ $deprecations = array();
216
+
217
+ // Don't trigger deprecations for classes in the same vendor
218
+ if (2 > $len = 1 + (\strpos($class, '\\') ?: \strpos($class, '_'))) {
219
+ $len = 0;
220
+ $ns = '';
221
+ } else {
222
+ $ns = \substr($class, 0, $len);
223
+ }
224
+
225
+ // Detect annotations on the class
226
+ if (false !== $doc = $refl->getDocComment()) {
227
+ foreach (array('final', 'deprecated', 'internal') as $annotation) {
228
+ if (false !== \strpos($doc, $annotation) && preg_match('#\n \* @'.$annotation.'(?:( .+?)\.?)?\r?\n \*(?: @|/$)#s', $doc, $notice)) {
229
+ self::${$annotation}[$class] = isset($notice[1]) ? preg_replace('#\s*\r?\n \* +#', ' ', $notice[1]) : '';
230
  }
231
  }
232
+ }
233
 
234
+ $parent = \get_parent_class($class);
235
+ $parentAndOwnInterfaces = $this->getOwnInterfaces($class, $parent);
236
+ if ($parent) {
237
+ $parentAndOwnInterfaces[$parent] = $parent;
 
 
 
 
238
 
239
+ if (!isset(self::$checkedClasses[$parent])) {
240
+ $this->checkClass($parent);
 
 
 
241
  }
242
 
243
+ if (isset(self::$final[$parent])) {
244
+ $deprecations[] = sprintf('The "%s" class is considered final%s. It may change without further notice as of its next major version. You should not extend it from "%s".', $parent, self::$final[$parent], $class);
 
 
 
 
 
 
 
245
  }
246
+ }
247
 
248
+ // Detect if the parent is annotated
249
+ foreach ($parentAndOwnInterfaces + \class_uses($class, false) as $use) {
250
+ if (!isset(self::$checkedClasses[$use])) {
251
+ $this->checkClass($use);
252
+ }
253
+ if (isset(self::$deprecated[$use]) && \strncmp($ns, $use, $len)) {
254
+ $type = class_exists($class, false) ? 'class' : (interface_exists($class, false) ? 'interface' : 'trait');
255
+ $verb = class_exists($use, false) || interface_exists($class, false) ? 'extends' : (interface_exists($use, false) ? 'implements' : 'uses');
256
 
257
+ $deprecations[] = sprintf('The "%s" %s %s "%s" that is deprecated%s.', $class, $type, $verb, $use, self::$deprecated[$use]);
258
+ }
259
+ if (isset(self::$internal[$use]) && \strncmp($ns, $use, $len)) {
260
+ $deprecations[] = sprintf('The "%s" %s is considered internal%s. It may change without further notice. You should not use it from "%s".', $use, class_exists($use, false) ? 'class' : (interface_exists($use, false) ? 'interface' : 'trait'), self::$internal[$use], $class);
261
+ }
262
+ }
263
 
264
+ if (\trait_exists($class)) {
265
+ return $deprecations;
266
+ }
 
267
 
268
+ // Inherit @final and @internal annotations for methods
269
+ self::$finalMethods[$class] = array();
270
+ self::$internalMethods[$class] = array();
271
+ foreach ($parentAndOwnInterfaces as $use) {
272
+ foreach (array('finalMethods', 'internalMethods') as $property) {
273
+ if (isset(self::${$property}[$use])) {
274
+ self::${$property}[$class] = self::${$property}[$class] ? self::${$property}[$use] + self::${$property}[$class] : self::${$property}[$use];
275
  }
276
+ }
277
+ }
278
 
279
+ foreach ($refl->getMethods(\ReflectionMethod::IS_PUBLIC | \ReflectionMethod::IS_PROTECTED) as $method) {
280
+ if ($method->class !== $class) {
281
+ continue;
282
+ }
283
 
284
+ if ($parent && isset(self::$finalMethods[$parent][$method->name])) {
285
+ list($declaringClass, $message) = self::$finalMethods[$parent][$method->name];
286
+ $deprecations[] = sprintf('The "%s::%s()" method is considered final%s. It may change without further notice as of its next major version. You should not extend it from "%s".', $declaringClass, $method->name, $message, $class);
287
+ }
288
+
289
+ if (isset(self::$internalMethods[$class][$method->name])) {
290
+ list($declaringClass, $message) = self::$internalMethods[$class][$method->name];
291
+ if (\strncmp($ns, $declaringClass, $len)) {
292
+ $deprecations[] = sprintf('The "%s::%s()" method is considered internal%s. It may change without further notice. You should not extend it from "%s".', $declaringClass, $method->name, $message, $class);
293
  }
294
  }
295
 
296
+ // Detect method annotations
297
+ if (false === $doc = $method->getDocComment()) {
298
+ continue;
299
  }
 
300
 
301
+ foreach (array('final', 'internal') as $annotation) {
302
+ if (false !== \strpos($doc, $annotation) && preg_match('#\n\s+\* @'.$annotation.'(?:( .+?)\.?)?\r?\n\s+\*(?: @|/$)#s', $doc, $notice)) {
303
+ $message = isset($notice[1]) ? preg_replace('#\s*\r?\n \* +#', ' ', $notice[1]) : '';
304
+ self::${$annotation.'Methods'}[$class][$method->name] = array($class, $message);
305
  }
 
 
306
  }
307
+ }
 
 
308
 
309
+ return $deprecations;
310
+ }
311
 
312
+ public function checkCase(\ReflectionClass $refl, $file, $class)
313
+ {
314
+ $real = explode('\\', $class.strrchr($file, '.'));
315
+ $tail = explode(\DIRECTORY_SEPARATOR, str_replace('/', \DIRECTORY_SEPARATOR, $file));
316
 
317
+ $i = \count($tail) - 1;
318
+ $j = \count($real) - 1;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
319
 
320
+ while (isset($tail[$i], $real[$j]) && $tail[$i] === $real[$j]) {
321
+ --$i;
322
+ --$j;
323
+ }
324
+
325
+ array_splice($tail, 0, $i + 1);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
326
 
327
+ if (!$tail) {
328
+ return;
329
+ }
330
+
331
+ $tail = \DIRECTORY_SEPARATOR.implode(\DIRECTORY_SEPARATOR, $tail);
332
+ $tailLen = \strlen($tail);
333
+ $real = $refl->getFileName();
334
+
335
+ if (2 === self::$caseCheck) {
336
+ $real = $this->darwinRealpath($real);
337
+ }
338
+
339
+ if (0 === substr_compare($real, $tail, -$tailLen, $tailLen, true)
340
+ && 0 !== substr_compare($real, $tail, -$tailLen, $tailLen, false)
341
+ ) {
342
+ return array(substr($tail, -$tailLen + 1), substr($real, -$tailLen + 1), substr($real, 0, -$tailLen + 1));
343
+ }
344
+ }
345
+
346
+ /**
347
+ * `realpath` on MacOSX doesn't normalize the case of characters.
348
+ */
349
+ private function darwinRealpath($real)
350
+ {
351
+ $i = 1 + strrpos($real, '/');
352
+ $file = substr($real, $i);
353
+ $real = substr($real, 0, $i);
354
+
355
+ if (isset(self::$darwinCache[$real])) {
356
+ $kDir = $real;
357
+ } else {
358
+ $kDir = strtolower($real);
359
+
360
+ if (isset(self::$darwinCache[$kDir])) {
361
+ $real = self::$darwinCache[$kDir][0];
362
+ } else {
363
+ $dir = getcwd();
364
+ chdir($real);
365
+ $real = getcwd().'/';
366
+ chdir($dir);
367
+
368
+ $dir = $real;
369
+ $k = $kDir;
370
+ $i = \strlen($dir) - 1;
371
+ while (!isset(self::$darwinCache[$k])) {
372
+ self::$darwinCache[$k] = array($dir, array());
373
+ self::$darwinCache[$dir] = &self::$darwinCache[$k];
374
+
375
+ while ('/' !== $dir[--$i]) {
376
+ }
377
+ $k = substr($k, 0, ++$i);
378
+ $dir = substr($dir, 0, $i--);
379
  }
380
+ }
381
+ }
382
 
383
+ $dirFiles = self::$darwinCache[$kDir][1];
384
+
385
+ if (isset($dirFiles[$file])) {
386
+ return $real .= $dirFiles[$file];
387
+ }
388
+
389
+ $kFile = strtolower($file);
390
+
391
+ if (!isset($dirFiles[$kFile])) {
392
+ foreach (scandir($real, 2) as $f) {
393
+ if ('.' !== $f[0]) {
394
+ $dirFiles[$f] = $f;
395
+ if ($f === $file) {
396
+ $kFile = $k = $file;
397
+ } elseif ($f !== $k = strtolower($f)) {
398
+ $dirFiles[$k] = $f;
399
+ }
400
  }
401
  }
402
+ self::$darwinCache[$kDir][1] = $dirFiles;
403
  }
404
+
405
+ return $real .= $dirFiles[$kFile];
406
  }
407
 
408
  /**
vendor/symfony/debug/Tests/DebugClassLoaderTest.php CHANGED
@@ -312,24 +312,21 @@ class DebugClassLoaderTest extends TestCase
312
 
313
  public function testExtendedFinalMethod()
314
  {
315
- set_error_handler(function () { return false; });
316
- $e = error_reporting(0);
317
- trigger_error('', E_USER_NOTICE);
318
 
319
  class_exists(__NAMESPACE__.'\\Fixtures\\ExtendedFinalMethod', true);
320
 
321
  error_reporting($e);
322
  restore_error_handler();
323
 
324
- $lastError = error_get_last();
325
- unset($lastError['file'], $lastError['line']);
326
-
327
  $xError = array(
328
- 'type' => E_USER_DEPRECATED,
329
- 'message' => 'The "Symfony\Component\Debug\Tests\Fixtures\FinalMethod::finalMethod()" method is considered final since version 3.3. It may change without further notice as of its next major version. You should not extend it from "Symfony\Component\Debug\Tests\Fixtures\ExtendedFinalMethod".',
330
  );
331
 
332
- $this->assertSame($xError, $lastError);
333
  }
334
 
335
  public function testExtendedDeprecatedMethodDoesntTriggerAnyNotice()
@@ -361,12 +358,26 @@ class DebugClassLoaderTest extends TestCase
361
  restore_error_handler();
362
 
363
  $this->assertSame($deprecations, array(
364
- 'The "Symfony\Component\Debug\Tests\Fixtures\InternalClass" class is considered internal since version 3.4. It may change without further notice. You should not use it from "Test\Symfony\Component\Debug\Tests\ExtendsInternalsParent".',
365
  'The "Symfony\Component\Debug\Tests\Fixtures\InternalInterface" interface is considered internal. It may change without further notice. You should not use it from "Test\Symfony\Component\Debug\Tests\ExtendsInternalsParent".',
 
366
  'The "Symfony\Component\Debug\Tests\Fixtures\InternalTrait" trait is considered internal. It may change without further notice. You should not use it from "Test\Symfony\Component\Debug\Tests\ExtendsInternals".',
367
- 'The "Symfony\Component\Debug\Tests\Fixtures\InternalTrait2::internalMethod()" method is considered internal since version 3.4. It may change without further notice. You should not extend it from "Test\Symfony\Component\Debug\Tests\ExtendsInternals".',
368
  ));
369
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
370
  }
371
 
372
  class ClassLoader
@@ -420,6 +431,8 @@ class ClassLoader
420
  }');
421
  } elseif ('Test\\'.__NAMESPACE__.'\ExtendsInternalsParent' === $class) {
422
  eval('namespace Test\\'.__NAMESPACE__.'; class ExtendsInternalsParent extends \\'.__NAMESPACE__.'\Fixtures\InternalClass implements \\'.__NAMESPACE__.'\Fixtures\InternalInterface { }');
 
 
423
  }
424
  }
425
  }
312
 
313
  public function testExtendedFinalMethod()
314
  {
315
+ $deprecations = array();
316
+ set_error_handler(function ($type, $msg) use (&$deprecations) { $deprecations[] = $msg; });
317
+ $e = error_reporting(E_USER_DEPRECATED);
318
 
319
  class_exists(__NAMESPACE__.'\\Fixtures\\ExtendedFinalMethod', true);
320
 
321
  error_reporting($e);
322
  restore_error_handler();
323
 
 
 
 
324
  $xError = array(
325
+ 'The "Symfony\Component\Debug\Tests\Fixtures\FinalMethod::finalMethod()" method is considered final since version 3.3. It may change without further notice as of its next major version. You should not extend it from "Symfony\Component\Debug\Tests\Fixtures\ExtendedFinalMethod".',
326
+ 'The "Symfony\Component\Debug\Tests\Fixtures\FinalMethod::finalMethod2()" method is considered final. It may change without further notice as of its next major version. You should not extend it from "Symfony\Component\Debug\Tests\Fixtures\ExtendedFinalMethod".',
327
  );
328
 
329
+ $this->assertSame($xError, $deprecations);
330
  }
331
 
332
  public function testExtendedDeprecatedMethodDoesntTriggerAnyNotice()
358
  restore_error_handler();
359
 
360
  $this->assertSame($deprecations, array(
 
361
  'The "Symfony\Component\Debug\Tests\Fixtures\InternalInterface" interface is considered internal. It may change without further notice. You should not use it from "Test\Symfony\Component\Debug\Tests\ExtendsInternalsParent".',
362
+ 'The "Symfony\Component\Debug\Tests\Fixtures\InternalClass" class is considered internal since version 3.4. It may change without further notice. You should not use it from "Test\Symfony\Component\Debug\Tests\ExtendsInternalsParent".',
363
  'The "Symfony\Component\Debug\Tests\Fixtures\InternalTrait" trait is considered internal. It may change without further notice. You should not use it from "Test\Symfony\Component\Debug\Tests\ExtendsInternals".',
364
+ 'The "Symfony\Component\Debug\Tests\Fixtures\InternalClass::internalMethod()" method is considered internal since version 3.4. It may change without further notice. You should not extend it from "Test\Symfony\Component\Debug\Tests\ExtendsInternals".',
365
  ));
366
  }
367
+
368
+ public function testUseTraitWithInternalMethod()
369
+ {
370
+ $deprecations = array();
371
+ set_error_handler(function ($type, $msg) use (&$deprecations) { $deprecations[] = $msg; });
372
+ $e = error_reporting(E_USER_DEPRECATED);
373
+
374
+ class_exists('Test\\'.__NAMESPACE__.'\\UseTraitWithInternalMethod', true);
375
+
376
+ error_reporting($e);
377
+ restore_error_handler();
378
+
379
+ $this->assertSame(array(), $deprecations);
380
+ }
381
  }
382
 
383
  class ClassLoader
431
  }');
432
  } elseif ('Test\\'.__NAMESPACE__.'\ExtendsInternalsParent' === $class) {
433
  eval('namespace Test\\'.__NAMESPACE__.'; class ExtendsInternalsParent extends \\'.__NAMESPACE__.'\Fixtures\InternalClass implements \\'.__NAMESPACE__.'\Fixtures\InternalInterface { }');
434
+ } elseif ('Test\\'.__NAMESPACE__.'\UseTraitWithInternalMethod' === $class) {
435
+ eval('namespace Test\\'.__NAMESPACE__.'; class UseTraitWithInternalMethod { use \\'.__NAMESPACE__.'\Fixtures\TraitWithInternalMethod; }');
436
  }
437
  }
438
  }
vendor/symfony/debug/Tests/FatalErrorHandler/UndefinedMethodFatalErrorHandlerTest.php CHANGED
@@ -64,10 +64,10 @@ class UndefinedMethodFatalErrorHandlerTest extends TestCase
64
  ),
65
  array(
66
  array(
67
- 'type' => 1,
68
- 'message' => 'Call to undefined method class@anonymous::test()',
69
- 'file' => '/home/possum/work/symfony/test.php',
70
- 'line' => 11,
71
  ),
72
  'Attempted to call an undefined method named "test" of class "class@anonymous".',
73
  ),
64
  ),
65
  array(
66
  array(
67
+ 'type' => 1,
68
+ 'message' => 'Call to undefined method class@anonymous::test()',
69
+ 'file' => '/home/possum/work/symfony/test.php',
70
+ 'line' => 11,
71
  ),
72
  'Attempted to call an undefined method named "test" of class "class@anonymous".',
73
  ),
vendor/symfony/debug/Tests/Fixtures/ExtendedFinalMethod.php CHANGED
@@ -4,6 +4,8 @@ namespace Symfony\Component\Debug\Tests\Fixtures;
4
 
5
  class ExtendedFinalMethod extends FinalMethod
6
  {
 
 
7
  /**
8
  * {@inheritdoc}
9
  */
4
 
5
  class ExtendedFinalMethod extends FinalMethod
6
  {
7
+ use FinalMethod2Trait;
8
+
9
  /**
10
  * {@inheritdoc}
11
  */
vendor/symfony/debug/Tests/Fixtures/FinalMethod.php CHANGED
@@ -11,6 +11,13 @@ class FinalMethod
11
  {
12
  }
13
 
 
 
 
 
 
 
 
14
  public function anotherMethod()
15
  {
16
  }
11
  {
12
  }
13
 
14
+ /**
15
+ * @final
16
+ */
17
+ public function finalMethod2()
18
+ {
19
+ }
20
+
21
  public function anotherMethod()
22
  {
23
  }
vendor/symfony/debug/Tests/Fixtures/FinalMethod2Trait.php ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Symfony\Component\Debug\Tests\Fixtures;
4
+
5
+ trait FinalMethod2Trait
6
+ {
7
+ public function finalMethod2()
8
+ {
9
+ }
10
+ }
vendor/symfony/debug/Tests/Fixtures/TraitWithInternalMethod.php ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Symfony\Component\Debug\Tests\Fixtures;
4
+
5
+ trait TraitWithInternalMethod
6
+ {
7
+ /**
8
+ * @internal
9
+ */
10
+ public function foo()
11
+ {
12
+ }
13
+ }
vendor/symfony/debug/Tests/phpt/debug_class_loader.phpt CHANGED
@@ -24,3 +24,4 @@ class_exists(ExtendedFinalMethod::class);
24
  ?>
25
  --EXPECTF--
26
  The "Symfony\Component\Debug\Tests\Fixtures\FinalMethod::finalMethod()" method is considered final since version 3.3. It may change without further notice as of its next major version. You should not extend it from "Symfony\Component\Debug\Tests\Fixtures\ExtendedFinalMethod".
 
24
  ?>
25
  --EXPECTF--
26
  The "Symfony\Component\Debug\Tests\Fixtures\FinalMethod::finalMethod()" method is considered final since version 3.3. It may change without further notice as of its next major version. You should not extend it from "Symfony\Component\Debug\Tests\Fixtures\ExtendedFinalMethod".
27
+ The "Symfony\Component\Debug\Tests\Fixtures\FinalMethod::finalMethod2()" method is considered final. It may change without further notice as of its next major version. You should not extend it from "Symfony\Component\Debug\Tests\Fixtures\ExtendedFinalMethod".
vendor/symfony/debug/Tests/phpt/decorate_exception_hander.phpt CHANGED
@@ -1,5 +1,7 @@
1
  --TEST--
2
  Test catching fatal errors when handlers are nested
 
 
3
  --FILE--
4
  <?php
5
 
@@ -24,7 +26,6 @@ if (true) {
24
 
25
  ?>
26
  --EXPECTF--
27
- Fatal error: Class 'Symfony\Component\Debug\missing' not found in %s on line %d
28
  object(Symfony\Component\Debug\Exception\ClassNotFoundException)#%d (8) {
29
  ["message":protected]=>
30
  string(131) "Attempted to load class "missing" from namespace "Symfony\Component\Debug".
@@ -38,8 +39,7 @@ Did you forget a "use" statement for another namespace?"
38
  ["line":protected]=>
39
  int(%d)
40
  ["trace":"Exception":private]=>
41
- array(0) {
42
- }
43
  ["previous":"Exception":private]=>
44
  NULL
45
  ["severity":protected]=>
1
  --TEST--
2
  Test catching fatal errors when handlers are nested
3
+ --INI--
4
+ display_errors=0
5
  --FILE--
6
  <?php
7
 
26
 
27
  ?>
28
  --EXPECTF--
 
29
  object(Symfony\Component\Debug\Exception\ClassNotFoundException)#%d (8) {
30
  ["message":protected]=>
31
  string(131) "Attempted to load class "missing" from namespace "Symfony\Component\Debug".
39
  ["line":protected]=>
40
  int(%d)
41
  ["trace":"Exception":private]=>
42
+ array(%d) {%A}
 
43
  ["previous":"Exception":private]=>
44
  NULL
45
  ["severity":protected]=>
vendor/symfony/polyfill-mbstring/Mbstring.php CHANGED
@@ -44,7 +44,7 @@ namespace Symfony\Polyfill\Mbstring;
44
  * - mb_strrchr - Finds the last occurrence of a character in a string within another
45
  * - mb_strrichr - Finds the last occurrence of a character in a string within another, case insensitive
46
  * - mb_strripos - Finds position of last occurrence of a string within another, case insensitive
47
- * - mb_strstr - Finds first occurrence of a string within anothers
48
  * - mb_strwidth - Return width of string
49
  * - mb_substr_count - Count the number of substring occurrences
50
  *
@@ -281,8 +281,11 @@ final class Mbstring
281
  }
282
 
283
  if (MB_CASE_TITLE == $mode) {
284
- $s = preg_replace_callback('/\b\p{Ll}/u', array(__CLASS__, 'title_case_upper'), $s);
285
- $s = preg_replace_callback('/\B[\p{Lu}\p{Lt}]+/u', array(__CLASS__, 'title_case_lower'), $s);
 
 
 
286
  } else {
287
  if (MB_CASE_UPPER == $mode) {
288
  static $upper = null;
@@ -752,14 +755,9 @@ final class Mbstring
752
  return $entities;
753
  }
754
 
755
- private static function title_case_lower(array $s)
756
- {
757
- return self::mb_convert_case($s[0], MB_CASE_LOWER, 'UTF-8');
758
- }
759
-
760
- private static function title_case_upper(array $s)
761
  {
762
- return self::mb_convert_case($s[0], MB_CASE_UPPER, 'UTF-8');
763
  }
764
 
765
  private static function getData($file)
44
  * - mb_strrchr - Finds the last occurrence of a character in a string within another
45
  * - mb_strrichr - Finds the last occurrence of a character in a string within another, case insensitive
46
  * - mb_strripos - Finds position of last occurrence of a string within another, case insensitive
47
+ * - mb_strstr - Finds first occurrence of a string within another
48
  * - mb_strwidth - Return width of string
49
  * - mb_substr_count - Count the number of substring occurrences
50
  *
281
  }
282
 
283
  if (MB_CASE_TITLE == $mode) {
284
+ static $titleRegexp = null;
285
+ if (null === $titleRegexp) {
286
+ $titleRegexp = self::getData('titleCaseRegexp');
287
+ }
288
+ $s = preg_replace_callback($titleRegexp, array(__CLASS__, 'title_case'), $s);
289
  } else {
290
  if (MB_CASE_UPPER == $mode) {
291
  static $upper = null;
755
  return $entities;
756
  }
757
 
758
+ private static function title_case(array $s)
 
 
 
 
 
759
  {
760
+ return self::mb_convert_case($s[1], MB_CASE_UPPER, 'UTF-8').self::mb_convert_case($s[2], MB_CASE_LOWER, 'UTF-8');
761
  }
762
 
763
  private static function getData($file)
vendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ <?php
2
+
3
+ // from Case_Ignorable in https://unicode.org/Public/UNIDATA/DerivedCoreProperties.txt
4
+
5
+ return '/(?<![\x{0027}\x{002E}\x{003A}\x{005E}\x{0060}\x{00A8}\x{00AD}\x{00AF}\x{00B4}\x{00B7}\x{00B8}\x{02B0}-\x{02C1}\x{02C2}-\x{02C5}\x{02C6}-\x{02D1}\x{02D2}-\x{02DF}\x{02E0}-\x{02E4}\x{02E5}-\x{02EB}\x{02EC}\x{02ED}\x{02EE}\x{02EF}-\x{02FF}\x{0300}-\x{036F}\x{0374}\x{0375}\x{037A}\x{0384}-\x{0385}\x{0387}\x{0483}-\x{0487}\x{0488}-\x{0489}\x{0559}\x{0591}-\x{05BD}\x{05BF}\x{05C1}-\x{05C2}\x{05C4}-\x{05C5}\x{05C7}\x{05F4}\x{0600}-\x{0605}\x{0610}-\x{061A}\x{061C}\x{0640}\x{064B}-\x{065F}\x{0670}\x{06D6}-\x{06DC}\x{06DD}\x{06DF}-\x{06E4}\x{06E5}-\x{06E6}\x{06E7}-\x{06E8}\x{06EA}-\x{06ED}\x{070F}\x{0711}\x{0730}-\x{074A}\x{07A6}-\x{07B0}\x{07EB}-\x{07F3}\x{07F4}-\x{07F5}\x{07FA}\x{07FD}\x{0816}-\x{0819}\x{081A}\x{081B}-\x{0823}\x{0824}\x{0825}-\x{0827}\x{0828}\x{0829}-\x{082D}\x{0859}-\x{085B}\x{08D3}-\x{08E1}\x{08E2}\x{08E3}-\x{0902}\x{093A}\x{093C}\x{0941}-\x{0948}\x{094D}\x{0951}-\x{0957}\x{0962}-\x{0963}\x{0971}\x{0981}\x{09BC}\x{09C1}-\x{09C4}\x{09CD}\x{09E2}-\x{09E3}\x{09FE}\x{0A01}-\x{0A02}\x{0A3C}\x{0A41}-\x{0A42}\x{0A47}-\x{0A48}\x{0A4B}-\x{0A4D}\x{0A51}\x{0A70}-\x{0A71}\x{0A75}\x{0A81}-\x{0A82}\x{0ABC}\x{0AC1}-\x{0AC5}\x{0AC7}-\x{0AC8}\x{0ACD}\x{0AE2}-\x{0AE3}\x{0AFA}-\x{0AFF}\x{0B01}\x{0B3C}\x{0B3F}\x{0B41}-\x{0B44}\x{0B4D}\x{0B56}\x{0B62}-\x{0B63}\x{0B82}\x{0BC0}\x{0BCD}\x{0C00}\x{0C04}\x{0C3E}-\x{0C40}\x{0C46}-\x{0C48}\x{0C4A}-\x{0C4D}\x{0C55}-\x{0C56}\x{0C62}-\x{0C63}\x{0C81}\x{0CBC}\x{0CBF}\x{0CC6}\x{0CCC}-\x{0CCD}\x{0CE2}-\x{0CE3}\x{0D00}-\x{0D01}\x{0D3B}-\x{0D3C}\x{0D41}-\x{0D44}\x{0D4D}\x{0D62}-\x{0D63}\x{0DCA}\x{0DD2}-\x{0DD4}\x{0DD6}\x{0E31}\x{0E34}-\x{0E3A}\x{0E46}\x{0E47}-\x{0E4E}\x{0EB1}\x{0EB4}-\x{0EB9}\x{0EBB}-\x{0EBC}\x{0EC6}\x{0EC8}-\x{0ECD}\x{0F18}-\x{0F19}\x{0F35}\x{0F37}\x{0F39}\x{0F71}-\x{0F7E}\x{0F80}-\x{0F84}\x{0F86}-\x{0F87}\x{0F8D}-\x{0F97}\x{0F99}-\x{0FBC}\x{0FC6}\x{102D}-\x{1030}\x{1032}-\x{1037}\x{1039}-\x{103A}\x{103D}-\x{103E}\x{1058}-\x{1059}\x{105E}-\x{1060}\x{1071}-\x{1074}\x{1082}\x{1085}-\x{1086}\x{108D}\x{109D}\x{10FC}\x{135D}-\x{135F}\x{1712}-\x{1714}\x{1732}-\x{1734}\x{1752}-\x{1753}\x{1772}-\x{1773}\x{17B4}-\x{17B5}\x{17B7}-\x{17BD}\x{17C6}\x{17C9}-\x{17D3}\x{17D7}\x{17DD}\x{180B}-\x{180D}\x{180E}\x{1843}\x{1885}-\x{1886}\x{18A9}\x{1920}-\x{1922}\x{1927}-\x{1928}\x{1932}\x{1939}-\x{193B}\x{1A17}-\x{1A18}\x{1A1B}\x{1A56}\x{1A58}-\x{1A5E}\x{1A60}\x{1A62}\x{1A65}-\x{1A6C}\x{1A73}-\x{1A7C}\x{1A7F}\x{1AA7}\x{1AB0}-\x{1ABD}\x{1ABE}\x{1B00}-\x{1B03}\x{1B34}\x{1B36}-\x{1B3A}\x{1B3C}\x{1B42}\x{1B6B}-\x{1B73}\x{1B80}-\x{1B81}\x{1BA2}-\x{1BA5}\x{1BA8}-\x{1BA9}\x{1BAB}-\x{1BAD}\x{1BE6}\x{1BE8}-\x{1BE9}\x{1BED}\x{1BEF}-\x{1BF1}\x{1C2C}-\x{1C33}\x{1C36}-\x{1C37}\x{1C78}-\x{1C7D}\x{1CD0}-\x{1CD2}\x{1CD4}-\x{1CE0}\x{1CE2}-\x{1CE8}\x{1CED}\x{1CF4}\x{1CF8}-\x{1CF9}\x{1D2C}-\x{1D6A}\x{1D78}\x{1D9B}-\x{1DBF}\x{1DC0}-\x{1DF9}\x{1DFB}-\x{1DFF}\x{1FBD}\x{1FBF}-\x{1FC1}\x{1FCD}-\x{1FCF}\x{1FDD}-\x{1FDF}\x{1FED}-\x{1FEF}\x{1FFD}-\x{1FFE}\x{200B}-\x{200F}\x{2018}\x{2019}\x{2024}\x{2027}\x{202A}-\x{202E}\x{2060}-\x{2064}\x{2066}-\x{206F}\x{2071}\x{207F}\x{2090}-\x{209C}\x{20D0}-\x{20DC}\x{20DD}-\x{20E0}\x{20E1}\x{20E2}-\x{20E4}\x{20E5}-\x{20F0}\x{2C7C}-\x{2C7D}\x{2CEF}-\x{2CF1}\x{2D6F}\x{2D7F}\x{2DE0}-\x{2DFF}\x{2E2F}\x{3005}\x{302A}-\x{302D}\x{3031}-\x{3035}\x{303B}\x{3099}-\x{309A}\x{309B}-\x{309C}\x{309D}-\x{309E}\x{30FC}-\x{30FE}\x{A015}\x{A4F8}-\x{A4FD}\x{A60C}\x{A66F}\x{A670}-\x{A672}\x{A674}-\x{A67D}\x{A67F}\x{A69C}-\x{A69D}\x{A69E}-\x{A69F}\x{A6F0}-\x{A6F1}\x{A700}-\x{A716}\x{A717}-\x{A71F}\x{A720}-\x{A721}\x{A770}\x{A788}\x{A789}-\x{A78A}\x{A7F8}-\x{A7F9}\x{A802}\x{A806}\x{A80B}\x{A825}-\x{A826}\x{A8C4}-\x{A8C5}\x{A8E0}-\x{A8F1}\x{A8FF}\x{A926}-\x{A92D}\x{A947}-\x{A951}\x{A980}-\x{A982}\x{A9B3}\x{A9B6}-\x{A9B9}\x{A9BC}\x{A9CF}\x{A9E5}\x{A9E6}\x{AA29}-\x{AA2E}\x{AA31}-\x{AA32}\x{AA35}-\x{AA36}\x{AA43}\x{AA4C}\x{AA70}\x{AA7C}\x{AAB0}\x{AAB2}-\x{AAB4}\x{AAB7}-\x{AAB8}\x{AABE}-\x{AABF}\x{AAC1}\x{AADD}\x{AAEC}-\x{AAED}\x{AAF3}-\x{AAF4}\x{AAF6}\x{AB5B}\x{AB5C}-\x{AB5F}\x{ABE5}\x{ABE8}\x{ABED}\x{FB1E}\x{FBB2}-\x{FBC1}\x{FE00}-\x{FE0F}\x{FE13}\x{FE20}-\x{FE2F}\x{FE52}\x{FE55}\x{FEFF}\x{FF07}\x{FF0E}\x{FF1A}\x{FF3E}\x{FF40}\x{FF70}\x{FF9E}-\x{FF9F}\x{FFE3}\x{FFF9}-\x{FFFB}\x{101FD}\x{102E0}\x{10376}-\x{1037A}\x{10A01}-\x{10A03}\x{10A05}-\x{10A06}\x{10A0C}-\x{10A0F}\x{10A38}-\x{10A3A}\x{10A3F}\x{10AE5}-\x{10AE6}\x{10D24}-\x{10D27}\x{10F46}-\x{10F50}\x{11001}\x{11038}-\x{11046}\x{1107F}-\x{11081}\x{110B3}-\x{110B6}\x{110B9}-\x{110BA}\x{110BD}\x{110CD}\x{11100}-\x{11102}\x{11127}-\x{1112B}\x{1112D}-\x{11134}\x{11173}\x{11180}-\x{11181}\x{111B6}-\x{111BE}\x{111C9}-\x{111CC}\x{1122F}-\x{11231}\x{11234}\x{11236}-\x{11237}\x{1123E}\x{112DF}\x{112E3}-\x{112EA}\x{11300}-\x{11301}\x{1133B}-\x{1133C}\x{11340}\x{11366}-\x{1136C}\x{11370}-\x{11374}\x{11438}-\x{1143F}\x{11442}-\x{11444}\x{11446}\x{1145E}\x{114B3}-\x{114B8}\x{114BA}\x{114BF}-\x{114C0}\x{114C2}-\x{114C3}\x{115B2}-\x{115B5}\x{115BC}-\x{115BD}\x{115BF}-\x{115C0}\x{115DC}-\x{115DD}\x{11633}-\x{1163A}\x{1163D}\x{1163F}-\x{11640}\x{116AB}\x{116AD}\x{116B0}-\x{116B5}\x{116B7}\x{1171D}-\x{1171F}\x{11722}-\x{11725}\x{11727}-\x{1172B}\x{1182F}-\x{11837}\x{11839}-\x{1183A}\x{11A01}-\x{11A0A}\x{11A33}-\x{11A38}\x{11A3B}-\x{11A3E}\x{11A47}\x{11A51}-\x{11A56}\x{11A59}-\x{11A5B}\x{11A8A}-\x{11A96}\x{11A98}-\x{11A99}\x{11C30}-\x{11C36}\x{11C38}-\x{11C3D}\x{11C3F}\x{11C92}-\x{11CA7}\x{11CAA}-\x{11CB0}\x{11CB2}-\x{11CB3}\x{11CB5}-\x{11CB6}\x{11D31}-\x{11D36}\x{11D3A}\x{11D3C}-\x{11D3D}\x{11D3F}-\x{11D45}\x{11D47}\x{11D90}-\x{11D91}\x{11D95}\x{11D97}\x{11EF3}-\x{11EF4}\x{16AF0}-\x{16AF4}\x{16B30}-\x{16B36}\x{16B40}-\x{16B43}\x{16F8F}-\x{16F92}\x{16F93}-\x{16F9F}\x{16FE0}-\x{16FE1}\x{1BC9D}-\x{1BC9E}\x{1BCA0}-\x{1BCA3}\x{1D167}-\x{1D169}\x{1D173}-\x{1D17A}\x{1D17B}-\x{1D182}\x{1D185}-\x{1D18B}\x{1D1AA}-\x{1D1AD}\x{1D242}-\x{1D244}\x{1DA00}-\x{1DA36}\x{1DA3B}-\x{1DA6C}\x{1DA75}\x{1DA84}\x{1DA9B}-\x{1DA9F}\x{1DAA1}-\x{1DAAF}\x{1E000}-\x{1E006}\x{1E008}-\x{1E018}\x{1E01B}-\x{1E021}\x{1E023}-\x{1E024}\x{1E026}-\x{1E02A}\x{1E8D0}-\x{1E8D6}\x{1E944}-\x{1E94A}\x{1F3FB}-\x{1F3FF}\x{E0001}\x{E0020}-\x{E007F}\x{E0100}-\x{E01EF}])(\pL)(\pL*+)/u';
vendor/symfony/polyfill-mbstring/composer.json CHANGED
@@ -28,7 +28,7 @@
28
  "minimum-stability": "dev",
29
  "extra": {
30
  "branch-alias": {
31
- "dev-master": "1.8-dev"
32
  }
33
  }
34
  }
28
  "minimum-stability": "dev",
29
  "extra": {
30
  "branch-alias": {
31
+ "dev-master": "1.9-dev"
32
  }
33
  }
34
  }
vendor/symfony/translation/Catalogue/AbstractOperation.php CHANGED
@@ -37,21 +37,20 @@ abstract class AbstractOperation implements OperationInterface
37
  * This array stores 'all', 'new' and 'obsolete' messages for all valid domains.
38
  *
39
  * The data structure of this array is as follows:
40
- * ```php
41
- * array(
42
- * 'domain 1' => array(
43
- * 'all' => array(...),
44
- * 'new' => array(...),
45
- * 'obsolete' => array(...)
46
- * ),
47
- * 'domain 2' => array(
48
- * 'all' => array(...),
49
- * 'new' => array(...),
50
- * 'obsolete' => array(...)
51
- * ),
52
- * ...
53
- * )
54
- * ```
55
  *
56
  * @var array The array that stores 'all', 'new' and 'obsolete' messages
57
  */
37
  * This array stores 'all', 'new' and 'obsolete' messages for all valid domains.
38
  *
39
  * The data structure of this array is as follows:
40
+ *
41
+ * array(
42
+ * 'domain 1' => array(
43
+ * 'all' => array(...),
44
+ * 'new' => array(...),
45
+ * 'obsolete' => array(...)
46
+ * ),
47
+ * 'domain 2' => array(
48
+ * 'all' => array(...),
49
+ * 'new' => array(...),
50
+ * 'obsolete' => array(...)
51
+ * ),
52
+ * ...
53
+ * )
 
54
  *
55
  * @var array The array that stores 'all', 'new' and 'obsolete' messages
56
  */
vendor/symfony/translation/Dumper/CsvFileDumper.php CHANGED
@@ -38,7 +38,7 @@ class CsvFileDumper extends FileDumper
38
  */
39
  public function formatCatalogue(MessageCatalogue $messages, $domain, array $options = array())
40
  {
41
- $handle = fopen('php://memory', 'rb+');
42
 
43
  foreach ($messages->all($domain) as $source => $target) {
44
  fputcsv($handle, array($source, $target), $this->delimiter, $this->enclosure);
38
  */
39
  public function formatCatalogue(MessageCatalogue $messages, $domain, array $options = array())
40
  {
41
+ $handle = fopen('php://memory', 'r+b');
42
 
43
  foreach ($messages->all($domain) as $source => $target) {
44
  fputcsv($handle, array($source, $target), $this->delimiter, $this->enclosure);
{vendor/sensiolabs/security-checker/SensioLabs/Security/Resources → views/emails}/index.php RENAMED
File without changes
views/emails/newSubscriberNotification.html ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <p><%= __('Howdy,') %>
2
+
3
+ <p><%= __('The subscriber %$1s has just subscribed to your list %$2s!')
4
+ |replace({'%$1s': subscriber_email, '%$2s': segments_names})
5
+ %>
6
+
7
+ <p><%= __('Cheers,') %>
8
+
9
+ <p><%= __('The MailPoet Plugin') %>
10
+
11
+ <p><small><%= __('You can disable these emails in your [link]MailPoet Settings.[/link]'
12
+ |replaceLinkTags(link_settings)
13
+ ) %></small>
14
+
15
+ <# date('-1hour') is here to get today's date, this is the only way that worked for me #>
16
+ <% if date('-1hour') < date('2018-11-12') %>
17
+ <p>
18
+ <small>
19
+ <%= __('PS. MailPoet annual plans are nearly half price for a limited time.
20
+ [link]Find out more in the Premium page in your admin.[/link]'
21
+ |replaceLinkTags(link_premium)
22
+ ) %>
23
+ </small>
24
+ <% endif %>
views/emails/newSubscriberNotification.txt ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <%= __('Howdy,') %>
2
+
3
+ <%= __('The subscriber %$1s has just subscribed to your list %$2s!')
4
+ |replace({'%$1s': subscriber_email, '%$2s': segments_names})
5
+ %>
6
+
7
+ <%= __('Cheers,') %>
8
+ <%= __('The MailPoet Plugin') %>
9
+
10
+ <%= __('You can disable these emails in your MailPoet Settings.') %>
11
+ <%= link_settings %>
12
+
13
+ <# date('-1hour') is here to get today's date, this is the only way that worked for me #>
14
+ <% if date('-1hour') < date('2018-11-12') %>
15
+ <%= __('PS. MailPoet annual plans are nearly half price for a limited time. Find out more in the Premium page in your admin.') %>
16
+ <%= link_premium %>
17
+ <% endif %>
18
+
views/form/editor.html CHANGED
@@ -195,6 +195,13 @@
195
  </div>
196
  </div>
197
 
 
 
 
 
 
 
 
198
  <!-- End | Form Editor: Toolbar -->
199
  </div>
200
 
195
  </div>
196
  </div>
197
 
198
+ <p class="help">
199
+ <%= __('<strong>Tip:</strong> read our [link]GDPR guide[/link] to make sure your form follows the privacy directive of the European Union.')
200
+ |replaceLinkTags('https://beta.docs.mailpoet.com/article/246-guide-to-conform-to-gdpr?utm_source=plugin&utm_medium=formeditor&utm_campaign=helpdocs', {'target' : '_blank', id: 'mailpoet_helper_link'})
201
+ |raw
202
+ %>
203
+ </p>
204
+
205
  <!-- End | Form Editor: Toolbar -->
206
  </div>
207
 
views/premium.html CHANGED
@@ -1,8 +1,17 @@
1
  <% extends 'layout.html' %>
2
 
3
  <% block content %>
4
-
5
  <div class="wrap mailpoet-about-wrap">
 
 
 
 
 
 
 
 
 
 
6
  <h1 style="text-align: center; margin-right: 0;"><%= __('What is MailPoet Premium?') %></h1>
7
 
8
  <p class="about-text" style="text-align: center; margin-right: 0;"><%= __("Check out the brief video below. Or, keep reading!") %></p>
1
  <% extends 'layout.html' %>
2
 
3
  <% block content %>
 
4
  <div class="wrap mailpoet-about-wrap">
5
+
6
+ <% if display_discount %>
7
+ <div class="mailpoet-discount-container">
8
+ <h1><%= __('Discounts up to 40% for a limited time') %></h1>
9
+ <p><%= __('Don’t miss out on our only sale of the year which ends on November 30.') %></p>
10
+ <p><%= __('There’s never been a better time to change gears.') %></p>
11
+ <a href=" https://account.mailpoet.com/?s=<%= subscriber_count %>&utm_source=plugin&utm_medium=premium&utm_campaign=discount">Save up to 40%</a>
12
+ </div>
13
+ <% endif %>
14
+
15
  <h1 style="text-align: center; margin-right: 0;"><%= __('What is MailPoet Premium?') %></h1>
16
 
17
  <p class="about-text" style="text-align: center; margin-right: 0;"><%= __("Check out the brief video below. Or, keep reading!") %></p>
views/settings.html CHANGED
@@ -87,6 +87,16 @@
87
  } else {
88
  $('#settings_re_captcha_tokens_error').hide();
89
  }
 
 
 
 
 
 
 
 
 
 
90
  // if we're setting up a sending method, try to activate it
91
  if ($('.mailpoet_mta_setup_save').is(':visible')) {
92
  $('.mailpoet_mta_setup_save').trigger('click');
@@ -190,10 +200,18 @@
190
  });
191
  });
192
  });
 
 
 
 
 
193
  </script>
194
  <% endblock %>
195
  <% block translations %>
196
  <%= localize({
197
- 'reinstallConfirmation': __('Are you sure? All of your MailPoet data will be permanently erased (newsletters, statistics, subscribers, etc.).')
 
 
 
198
  }) %>
199
  <% endblock %>
87
  } else {
88
  $('#settings_re_captcha_tokens_error').hide();
89
  }
90
+ // if new subscriber notification is enabled but sender is empty, show error
91
+ var notifications_enabled = $('input[name="subscriber_email_notification[enabled]"]:checked').val(),
92
+ address = $('input[name="subscriber_email_notification[address]"]').val().trim();
93
+ if (notifications_enabled && address == '') {
94
+ $('#settings_subscriber_email_notification_error').show();
95
+ window.location.href = '#basic';
96
+ return false;
97
+ } else {
98
+ $('#settings_subscriber_email_notification_error').hide();
99
+ }
100
  // if we're setting up a sending method, try to activate it
101
  if ($('.mailpoet_mta_setup_save').is(':visible')) {
102
  $('.mailpoet_mta_setup_save').trigger('click');
200
  });
201
  });
202
  });
203
+ var mailpoet_in_app_announcements = <%= json_encode(settings.in_app_announcements) %>;
204
+ var mailpoet_new_subscriber_announcement_image = '<%= image_url('in_app_announcements/new-subscriber-notification.png') %>';
205
+ var mailpoet_installed_at = <%= json_encode(settings.installed_at) %>;
206
+ <% set newUser = (is_new_user == true) ? 'true' : 'false' %>
207
+ var mailpoet_is_new_user = <%= newUser %>;
208
  </script>
209
  <% endblock %>
210
  <% block translations %>
211
  <%= localize({
212
+ 'reinstallConfirmation': __('Are you sure? All of your MailPoet data will be permanently erased (newsletters, statistics, subscribers, etc.).'),
213
+ 'announcementHeader': __('Get notified when someone subscribes'),
214
+ 'announcementParagraph1': __('It’s been a popular feature request from our users, we hope you get lots of emails about all your new subscribers!'),
215
+ 'announcementParagraph2': __('(You can turn this feature off if it’s too many emails.)'),
216
  }) %>
217
  <% endblock %>
views/settings/basics.html CHANGED
@@ -299,6 +299,48 @@
299
  </p>
300
  </td>
301
  </tr>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
302
  <!-- shortcode: archive page -->
303
  <tr>
304
  <th scope="row">
299
  </p>
300
  </td>
301
  </tr>
302
+
303
+ <!-- New subscriber emails notifications -->
304
+ <tr>
305
+ <th scope="row">
306
+ <label for="subscription_unsubscribe_page">
307
+ <%= __('New subscriber notifications') %> <span id="new_subscriber_announcement" class="new_subscriber_announcement" />
308
+ </label>
309
+ <p class="description">
310
+ <%= __('Enter the email address that should receive notifications when someone subscribes.') %>
311
+ <td>
312
+ <p>
313
+ <label>
314
+ <input
315
+ type="radio"
316
+ name="subscriber_email_notification[enabled]"
317
+ value="1"
318
+ <% if(settings.subscriber_email_notification.enabled) %>
319
+ checked
320
+ <% endif %>
321
+ /><%= __('Yes') %>
322
+ </label>
323
+ &nbsp;
324
+ <label>
325
+ <input
326
+ type="radio"
327
+ name="subscriber_email_notification[enabled]"
328
+ value=""
329
+ <% if not(settings.subscriber_email_notification.enabled) %>
330
+ checked
331
+ <% endif %>
332
+ /><%= __('No') %>
333
+ </label>
334
+ <br>
335
+ <input type="email"
336
+ id="subscriber_email_notification[address]"
337
+ name="subscriber_email_notification[address]"
338
+ value="<%= settings.subscriber_email_notification.address %>"
339
+ placeholder="me@mydomain.com" />
340
+ <br>
341
+ <div id="settings_subscriber_email_notification_error" class="mailpoet_error_item mailpoet_error">
342
+ <%= __('Please fill the email address.') %>
343
+ </div>
344
  <!-- shortcode: archive page -->
345
  <tr>
346
  <th scope="row">