Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/matomo-org/matomo.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthieu Aubry <mattab@users.noreply.github.com>2016-10-31 02:53:46 +0300
committerGitHub <noreply@github.com>2016-10-31 02:53:46 +0300
commit44283a6f19e4f1b2ca96e4ebacab1f2dc8eb42ed (patch)
treec9c21b56c40f74cdd4c96d6f1f6e11bd0cd597f7
parent395d447052b81ed98b7840df863ec183ed1e285d (diff)
parent67d67100e4c6b8cd42bae8460477ffb6d0e23988 (diff)
Merge 3.x-dev into master for 3.0.0-b2 release3.0.0-b2
-rw-r--r--CHANGELOG.md63
-rw-r--r--core/API/Proxy.php15
-rw-r--r--core/API/Request.php6
-rw-r--r--core/Date.php6
-rw-r--r--core/Db/Schema/Mysql.php2
-rw-r--r--core/Exception/ErrorException.php1
-rw-r--r--core/Exception/PluginDeactivatedException.php (renamed from core/PluginDeactivatedException.php)2
-rw-r--r--core/Filechecks.php45
-rw-r--r--core/FrontController.php3
-rw-r--r--core/Plugin/Manager.php16
-rw-r--r--core/Report/ReportWidgetConfig.php1
-rw-r--r--core/Updates/2.16.5.php (renamed from core/Updates/2.16.3-b3.php)9
-rw-r--r--core/Updates/3.0.0-b1.php27
-rw-r--r--core/Updates/3.0.0-b2.php24
-rw-r--r--core/Version.php2
-rw-r--r--core/Widget/WidgetConfig.php20
-rw-r--r--lang/ar.json64
-rw-r--r--lang/bg.json1
-rw-r--r--lang/ca.json32
-rw-r--r--lang/cs.json25
-rw-r--r--lang/da.json12
-rw-r--r--lang/de.json14
-rw-r--r--lang/el.json9
-rw-r--r--lang/es.json9
-rw-r--r--lang/et.json1
-rw-r--r--lang/fi.json1
-rw-r--r--lang/fr.json17
-rw-r--r--lang/hi.json1
-rw-r--r--lang/it.json9
-rw-r--r--lang/ja.json1
-rw-r--r--lang/ko.json7
-rw-r--r--lang/nb.json9
-rw-r--r--lang/nl.json1
-rw-r--r--lang/pl.json1
-rw-r--r--lang/pt-br.json10
-rw-r--r--lang/ru.json12
-rw-r--r--lang/sk.json1
-rw-r--r--lang/sl.json1
-rw-r--r--lang/sq.json136
-rw-r--r--lang/sr.json30
-rw-r--r--lang/sv.json1
-rw-r--r--lang/ta.json1
-rw-r--r--lang/tr.json1
-rw-r--r--lang/uk.json10
-rw-r--r--lang/vi.json1
-rw-r--r--lang/zh-cn.json18
-rw-r--r--plugins/API/ProcessedReport.php4
-rw-r--r--plugins/API/SegmentMetadata.php36
-rw-r--r--plugins/API/WidgetMetadata.php1
-rw-r--r--plugins/API/lang/nl.json4
-rw-r--r--plugins/API/lang/ru.json6
-rw-r--r--plugins/API/lang/sq.json6
-rw-r--r--plugins/API/lang/sr.json5
-rw-r--r--plugins/API/templates/glossary.twig62
-rw-r--r--plugins/API/tests/Unit/WidgetMetadataTest.php13
-rw-r--r--plugins/Actions/lang/cs.json9
-rw-r--r--plugins/Actions/lang/da.json1
-rw-r--r--plugins/Actions/lang/de.json1
-rw-r--r--plugins/Actions/lang/el.json1
-rw-r--r--plugins/Actions/lang/es.json1
-rw-r--r--plugins/Actions/lang/fr.json1
-rw-r--r--plugins/Actions/lang/it.json1
-rw-r--r--plugins/Actions/lang/ko.json1
-rw-r--r--plugins/Actions/lang/nb.json1
-rw-r--r--plugins/Actions/lang/nl.json3
-rw-r--r--plugins/Actions/lang/ru.json43
-rw-r--r--plugins/Actions/lang/sq.json19
-rw-r--r--plugins/Actions/lang/sr.json5
-rw-r--r--plugins/Annotations/lang/ru.json30
-rw-r--r--plugins/Annotations/lang/sq.json6
m---------plugins/AnonymousPiwikUsageMeasurement0
-rw-r--r--plugins/Contents/lang/ko.json4
-rw-r--r--plugins/Contents/lang/sq.json7
-rw-r--r--plugins/Contents/lang/sr.json5
-rw-r--r--plugins/CoreAdminHome/lang/ar.json12
-rw-r--r--plugins/CoreAdminHome/lang/bg.json1
-rw-r--r--plugins/CoreAdminHome/lang/bs.json3
-rw-r--r--plugins/CoreAdminHome/lang/cs.json19
-rw-r--r--plugins/CoreAdminHome/lang/da.json5
-rw-r--r--plugins/CoreAdminHome/lang/de.json5
-rw-r--r--plugins/CoreAdminHome/lang/el.json5
-rw-r--r--plugins/CoreAdminHome/lang/es.json9
-rw-r--r--plugins/CoreAdminHome/lang/et.json1
-rw-r--r--plugins/CoreAdminHome/lang/fa.json1
-rw-r--r--plugins/CoreAdminHome/lang/fi.json1
-rw-r--r--plugins/CoreAdminHome/lang/fr.json7
-rw-r--r--plugins/CoreAdminHome/lang/he.json1
-rw-r--r--plugins/CoreAdminHome/lang/hi.json1
-rw-r--r--plugins/CoreAdminHome/lang/hu.json1
-rw-r--r--plugins/CoreAdminHome/lang/id.json1
-rw-r--r--plugins/CoreAdminHome/lang/it.json5
-rw-r--r--plugins/CoreAdminHome/lang/ja.json1
-rw-r--r--plugins/CoreAdminHome/lang/ko.json12
-rw-r--r--plugins/CoreAdminHome/lang/nb.json5
-rw-r--r--plugins/CoreAdminHome/lang/nl.json4
-rw-r--r--plugins/CoreAdminHome/lang/pl.json1
-rw-r--r--plugins/CoreAdminHome/lang/pt-br.json5
-rw-r--r--plugins/CoreAdminHome/lang/pt.json1
-rw-r--r--plugins/CoreAdminHome/lang/ro.json1
-rw-r--r--plugins/CoreAdminHome/lang/ru.json31
-rw-r--r--plugins/CoreAdminHome/lang/sk.json1
-rw-r--r--plugins/CoreAdminHome/lang/sl.json1
-rw-r--r--plugins/CoreAdminHome/lang/sq.json81
-rw-r--r--plugins/CoreAdminHome/lang/sr.json13
-rw-r--r--plugins/CoreAdminHome/lang/sv.json1
-rw-r--r--plugins/CoreAdminHome/lang/ta.json1
-rw-r--r--plugins/CoreAdminHome/lang/th.json1
-rw-r--r--plugins/CoreAdminHome/lang/tl.json1
-rw-r--r--plugins/CoreAdminHome/lang/tr.json1
-rw-r--r--plugins/CoreAdminHome/lang/uk.json1
-rw-r--r--plugins/CoreAdminHome/lang/vi.json1
-rw-r--r--plugins/CoreAdminHome/lang/zh-cn.json1
-rw-r--r--plugins/CoreAdminHome/lang/zh-tw.json3
-rw-r--r--plugins/CoreAdminHome/templates/home.twig20
-rw-r--r--plugins/CoreHome/Controller.php30
-rw-r--r--plugins/CoreHome/CoreHome.php1
-rw-r--r--plugins/CoreHome/angularjs/content-block/content-block.directive.js43
-rw-r--r--plugins/CoreHome/angularjs/reporting-menu/reportingmenu-model.js30
-rw-r--r--plugins/CoreHome/angularjs/reporting-page/reportingpage-model.js14
-rw-r--r--plugins/CoreHome/angularjs/reporting-page/reportingpage.directive.html8
-rw-r--r--plugins/CoreHome/angularjs/widget-bydimension-container/widget-bydimension-container.directive.less68
-rw-r--r--plugins/CoreHome/javascripts/broadcast.js9
-rw-r--r--plugins/CoreHome/javascripts/dataTable.js61
-rw-r--r--plugins/CoreHome/lang/ar.json14
-rw-r--r--plugins/CoreHome/lang/bg.json1
-rw-r--r--plugins/CoreHome/lang/ca.json1
-rw-r--r--plugins/CoreHome/lang/cs.json17
-rw-r--r--plugins/CoreHome/lang/da.json4
-rw-r--r--plugins/CoreHome/lang/de.json13
-rw-r--r--plugins/CoreHome/lang/el.json13
-rw-r--r--plugins/CoreHome/lang/en.json3
-rw-r--r--plugins/CoreHome/lang/es.json13
-rw-r--r--plugins/CoreHome/lang/et.json1
-rw-r--r--plugins/CoreHome/lang/fa.json1
-rw-r--r--plugins/CoreHome/lang/fi.json1
-rw-r--r--plugins/CoreHome/lang/fr.json13
-rw-r--r--plugins/CoreHome/lang/hi.json1
-rw-r--r--plugins/CoreHome/lang/id.json1
-rw-r--r--plugins/CoreHome/lang/it.json13
-rw-r--r--plugins/CoreHome/lang/ja.json1
-rw-r--r--plugins/CoreHome/lang/ko.json15
-rw-r--r--plugins/CoreHome/lang/nb.json12
-rw-r--r--plugins/CoreHome/lang/nl.json13
-rw-r--r--plugins/CoreHome/lang/pt-br.json11
-rw-r--r--plugins/CoreHome/lang/ro.json1
-rw-r--r--plugins/CoreHome/lang/ru.json14
-rw-r--r--plugins/CoreHome/lang/sk.json1
-rw-r--r--plugins/CoreHome/lang/sq.json53
-rw-r--r--plugins/CoreHome/lang/sr.json22
-rw-r--r--plugins/CoreHome/lang/sv.json1
-rw-r--r--plugins/CoreHome/lang/ta.json1
-rw-r--r--plugins/CoreHome/lang/tl.json1
-rw-r--r--plugins/CoreHome/lang/tr.json1
-rw-r--r--plugins/CoreHome/lang/uk.json1
-rw-r--r--plugins/CoreHome/lang/vi.json1
-rw-r--r--plugins/CoreHome/lang/zh-cn.json1
-rw-r--r--plugins/CoreHome/stylesheets/zen-mode.less2
-rw-r--r--plugins/CoreHome/templates/_singleWidget.twig3
-rw-r--r--plugins/CorePluginsAdmin/Controller.php2
-rw-r--r--plugins/CorePluginsAdmin/Widgets/GetNewPlugins.php2
-rw-r--r--plugins/CorePluginsAdmin/angularjs/field/field.directive.js16
-rw-r--r--plugins/CorePluginsAdmin/angularjs/form-field/field-textarea.html1
-rw-r--r--plugins/CorePluginsAdmin/lang/ar.json1
-rw-r--r--plugins/CorePluginsAdmin/lang/bg.json6
-rw-r--r--plugins/CorePluginsAdmin/lang/cs.json15
-rw-r--r--plugins/CorePluginsAdmin/lang/da.json6
-rw-r--r--plugins/CorePluginsAdmin/lang/de.json13
-rw-r--r--plugins/CorePluginsAdmin/lang/el.json15
-rw-r--r--plugins/CorePluginsAdmin/lang/en.json5
-rw-r--r--plugins/CorePluginsAdmin/lang/es.json15
-rw-r--r--plugins/CorePluginsAdmin/lang/et.json4
-rw-r--r--plugins/CorePluginsAdmin/lang/fa.json5
-rw-r--r--plugins/CorePluginsAdmin/lang/fi.json5
-rw-r--r--plugins/CorePluginsAdmin/lang/fr.json15
-rw-r--r--plugins/CorePluginsAdmin/lang/it.json15
-rw-r--r--plugins/CorePluginsAdmin/lang/ja.json6
-rw-r--r--plugins/CorePluginsAdmin/lang/ko.json3
-rw-r--r--plugins/CorePluginsAdmin/lang/nb.json15
-rw-r--r--plugins/CorePluginsAdmin/lang/nl.json6
-rw-r--r--plugins/CorePluginsAdmin/lang/pl.json5
-rw-r--r--plugins/CorePluginsAdmin/lang/pt-br.json12
-rw-r--r--plugins/CorePluginsAdmin/lang/pt.json1
-rw-r--r--plugins/CorePluginsAdmin/lang/ro.json6
-rw-r--r--plugins/CorePluginsAdmin/lang/ru.json15
-rw-r--r--plugins/CorePluginsAdmin/lang/sk.json6
-rw-r--r--plugins/CorePluginsAdmin/lang/sl.json1
-rw-r--r--plugins/CorePluginsAdmin/lang/sq.json93
-rw-r--r--plugins/CorePluginsAdmin/lang/sr.json15
-rw-r--r--plugins/CorePluginsAdmin/lang/sv.json6
-rw-r--r--plugins/CorePluginsAdmin/lang/tl.json6
-rw-r--r--plugins/CorePluginsAdmin/lang/tr.json3
-rw-r--r--plugins/CorePluginsAdmin/lang/uk.json6
-rw-r--r--plugins/CorePluginsAdmin/lang/vi.json2
-rw-r--r--plugins/CorePluginsAdmin/lang/zh-cn.json6
-rw-r--r--plugins/CoreUpdater/SystemSettings.php2
-rw-r--r--plugins/CoreUpdater/lang/cs.json6
-rw-r--r--plugins/CoreUpdater/lang/da.json1
-rw-r--r--plugins/CoreUpdater/lang/de.json4
-rw-r--r--plugins/CoreUpdater/lang/el.json4
-rw-r--r--plugins/CoreUpdater/lang/es.json4
-rw-r--r--plugins/CoreUpdater/lang/fi.json1
-rw-r--r--plugins/CoreUpdater/lang/fr.json4
-rw-r--r--plugins/CoreUpdater/lang/it.json6
-rw-r--r--plugins/CoreUpdater/lang/ja.json1
-rw-r--r--plugins/CoreUpdater/lang/lt.json7
-rw-r--r--plugins/CoreUpdater/lang/nb.json4
-rw-r--r--plugins/CoreUpdater/lang/nl.json10
-rw-r--r--plugins/CoreUpdater/lang/pl.json1
-rw-r--r--plugins/CoreUpdater/lang/pt-br.json3
-rw-r--r--plugins/CoreUpdater/lang/ro.json1
-rw-r--r--plugins/CoreUpdater/lang/ru.json5
-rw-r--r--plugins/CoreUpdater/lang/sk.json1
-rw-r--r--plugins/CoreUpdater/lang/sq.json33
-rw-r--r--plugins/CoreUpdater/lang/sr.json10
-rw-r--r--plugins/CoreUpdater/lang/sv.json1
-rw-r--r--plugins/CoreUpdater/lang/tl.json1
-rw-r--r--plugins/CoreUpdater/lang/uk.json1
-rw-r--r--plugins/CoreUpdater/lang/zh-cn.json1
-rw-r--r--plugins/CoreUpdater/lang/zh-tw.json1
-rw-r--r--plugins/CoreVisualizations/Visualizations/HtmlTable/AllColumns.php1
-rw-r--r--plugins/CoreVisualizations/Visualizations/Sparklines.php9
-rw-r--r--plugins/CoreVisualizations/Visualizations/Sparklines/Config.php13
-rw-r--r--plugins/CoreVisualizations/templates/_dataTableViz_sparklines.twig4
-rw-r--r--plugins/CoreVisualizations/templates/macros.twig4
-rw-r--r--plugins/CoreVisualizations/tests/Integration/SparklinesConfigTest.php34
-rw-r--r--plugins/CustomPiwikJs/TrackerUpdater.php18
-rw-r--r--plugins/CustomPiwikJs/lang/de.json4
-rw-r--r--plugins/CustomPiwikJs/lang/it.json7
-rw-r--r--plugins/CustomPiwikJs/lang/nb.json6
-rw-r--r--plugins/CustomPiwikJs/lang/ru.json7
-rw-r--r--plugins/CustomPiwikJs/lang/sq.json7
-rw-r--r--plugins/CustomPiwikJs/lang/sr.json7
-rw-r--r--plugins/CustomPiwikJs/lang/tr.json7
-rw-r--r--plugins/CustomPiwikJs/tests/Integration/TrackerUpdaterTest.php52
-rw-r--r--plugins/CustomVariables/lang/ko.json3
-rw-r--r--plugins/CustomVariables/lang/nb.json20
-rw-r--r--plugins/CustomVariables/lang/sq.json23
-rw-r--r--plugins/CustomVariables/lang/sr.json15
-rw-r--r--plugins/CustomVariables/lang/tr.json4
-rw-r--r--plugins/DBStats/lang/sq.json8
-rw-r--r--plugins/Dashboard/javascripts/widgetMenu.js6
-rw-r--r--plugins/Dashboard/lang/sq.json4
-rw-r--r--plugins/Dashboard/lang/sr.json1
-rw-r--r--plugins/DevicePlugins/lang/ko.json2
-rw-r--r--plugins/DevicePlugins/lang/sr.json1
-rw-r--r--plugins/DevicesDetection/lang/sq.json32
-rw-r--r--plugins/DevicesDetection/lang/tr.json13
-rw-r--r--plugins/Diagnostics/Diagnostic/FileIntegrityCheck.php5
-rw-r--r--plugins/Diagnostics/lang/sq.json2
-rw-r--r--plugins/Diagnostics/lang/sr.json8
-rw-r--r--plugins/Diagnostics/lang/tr.json8
-rw-r--r--plugins/Ecommerce/lang/ru.json4
-rw-r--r--plugins/Ecommerce/lang/sq.json2
-rw-r--r--plugins/Events/Archiver.php5
-rw-r--r--plugins/Events/lang/sq.json35
-rw-r--r--plugins/Feedback/lang/cs.json4
-rw-r--r--plugins/Feedback/lang/nb.json4
-rw-r--r--plugins/Feedback/lang/sq.json15
-rw-r--r--plugins/Feedback/lang/sr.json12
-rw-r--r--plugins/Goals/Goals.php1
-rw-r--r--plugins/Goals/Updates/3.0.0-b1.php29
-rw-r--r--plugins/Goals/angularjs/manage-goals/manage-goals.controller.js2
-rw-r--r--plugins/Goals/lang/ar.json5
-rw-r--r--plugins/Goals/lang/be.json3
-rw-r--r--plugins/Goals/lang/bg.json3
-rw-r--r--plugins/Goals/lang/ca.json3
-rw-r--r--plugins/Goals/lang/cs.json11
-rw-r--r--plugins/Goals/lang/da.json9
-rw-r--r--plugins/Goals/lang/de.json10
-rw-r--r--plugins/Goals/lang/el.json9
-rw-r--r--plugins/Goals/lang/en.json1
-rw-r--r--plugins/Goals/lang/es.json9
-rw-r--r--plugins/Goals/lang/et.json2
-rw-r--r--plugins/Goals/lang/fa.json2
-rw-r--r--plugins/Goals/lang/fi.json3
-rw-r--r--plugins/Goals/lang/fr.json9
-rw-r--r--plugins/Goals/lang/hi.json3
-rw-r--r--plugins/Goals/lang/hu.json5
-rw-r--r--plugins/Goals/lang/id.json3
-rw-r--r--plugins/Goals/lang/is.json2
-rw-r--r--plugins/Goals/lang/it.json9
-rw-r--r--plugins/Goals/lang/ja.json4
-rw-r--r--plugins/Goals/lang/ka.json5
-rw-r--r--plugins/Goals/lang/ko.json4
-rw-r--r--plugins/Goals/lang/lt.json2
-rw-r--r--plugins/Goals/lang/nb.json15
-rw-r--r--plugins/Goals/lang/nl.json4
-rw-r--r--plugins/Goals/lang/pl.json5
-rw-r--r--plugins/Goals/lang/pt-br.json6
-rw-r--r--plugins/Goals/lang/pt.json3
-rw-r--r--plugins/Goals/lang/ro.json3
-rw-r--r--plugins/Goals/lang/ru.json4
-rw-r--r--plugins/Goals/lang/sk.json2
-rw-r--r--plugins/Goals/lang/sq.json31
-rw-r--r--plugins/Goals/lang/sr.json11
-rw-r--r--plugins/Goals/lang/sv.json4
-rw-r--r--plugins/Goals/lang/th.json5
-rw-r--r--plugins/Goals/lang/tr.json1
-rw-r--r--plugins/Goals/lang/uk.json4
-rw-r--r--plugins/Goals/lang/vi.json3
-rw-r--r--plugins/Goals/lang/zh-cn.json4
-rw-r--r--plugins/Goals/lang/zh-tw.json5
-rw-r--r--plugins/Insights/lang/sq.json24
-rw-r--r--plugins/Installation/lang/ar.json9
-rw-r--r--plugins/Installation/lang/cs.json10
-rw-r--r--plugins/Installation/lang/de.json4
-rw-r--r--plugins/Installation/lang/el.json2
-rw-r--r--plugins/Installation/lang/es.json2
-rw-r--r--plugins/Installation/lang/fr.json2
-rw-r--r--plugins/Installation/lang/it.json2
-rw-r--r--plugins/Installation/lang/ko.json9
-rw-r--r--plugins/Installation/lang/nb.json2
-rw-r--r--plugins/Installation/lang/pt-br.json1
-rw-r--r--plugins/Installation/lang/ru.json7
-rw-r--r--plugins/Installation/lang/sq.json53
-rw-r--r--plugins/Installation/lang/sr.json9
-rw-r--r--plugins/Installation/lang/tr.json28
-rw-r--r--plugins/LanguagesManager/Commands/CreatePull.php4
-rwxr-xr-xplugins/LanguagesManager/Test/Integration/LanguagesManagerTest.php7
-rw-r--r--plugins/LanguagesManager/lang/ko.json3
-rw-r--r--plugins/Live/lang/es.json1
-rw-r--r--plugins/Live/lang/nb.json2
-rw-r--r--plugins/Live/lang/sq.json36
-rw-r--r--plugins/Live/lang/sr.json4
-rw-r--r--plugins/Login/Controller.php2
-rw-r--r--plugins/Login/SessionInitializer.php10
-rw-r--r--plugins/Login/lang/bg.json3
-rw-r--r--plugins/Login/lang/ca.json3
-rw-r--r--plugins/Login/lang/cs.json14
-rw-r--r--plugins/Login/lang/da.json3
-rw-r--r--plugins/Login/lang/de.json6
-rw-r--r--plugins/Login/lang/el.json6
-rw-r--r--plugins/Login/lang/es.json6
-rw-r--r--plugins/Login/lang/et.json3
-rw-r--r--plugins/Login/lang/fa.json3
-rw-r--r--plugins/Login/lang/fi.json3
-rw-r--r--plugins/Login/lang/fr.json6
-rw-r--r--plugins/Login/lang/hi.json3
-rw-r--r--plugins/Login/lang/hu.json3
-rw-r--r--plugins/Login/lang/id.json3
-rw-r--r--plugins/Login/lang/it.json6
-rw-r--r--plugins/Login/lang/ja.json3
-rw-r--r--plugins/Login/lang/ko.json7
-rw-r--r--plugins/Login/lang/nb.json3
-rw-r--r--plugins/Login/lang/nl.json3
-rw-r--r--plugins/Login/lang/pl.json3
-rw-r--r--plugins/Login/lang/pt-br.json6
-rw-r--r--plugins/Login/lang/ro.json3
-rw-r--r--plugins/Login/lang/ru.json6
-rw-r--r--plugins/Login/lang/sk.json3
-rw-r--r--plugins/Login/lang/sq.json20
-rw-r--r--plugins/Login/lang/sr.json8
-rw-r--r--plugins/Login/lang/sv.json3
-rw-r--r--plugins/Login/lang/ta.json3
-rw-r--r--plugins/Login/lang/th.json3
-rw-r--r--plugins/Login/lang/tl.json3
-rw-r--r--plugins/Login/lang/tr.json3
-rw-r--r--plugins/Login/lang/uk.json3
-rw-r--r--plugins/Login/lang/vi.json3
-rw-r--r--plugins/Login/lang/zh-cn.json3
-rw-r--r--plugins/MobileAppMeasurable/lang/ko.json7
-rw-r--r--plugins/MobileAppMeasurable/lang/tr.json7
-rw-r--r--plugins/MobileMessaging/lang/bg.json1
-rw-r--r--plugins/MobileMessaging/lang/ca.json1
-rw-r--r--plugins/MobileMessaging/lang/cs.json12
-rw-r--r--plugins/MobileMessaging/lang/da.json1
-rw-r--r--plugins/MobileMessaging/lang/de.json6
-rw-r--r--plugins/MobileMessaging/lang/el.json6
-rw-r--r--plugins/MobileMessaging/lang/es.json6
-rw-r--r--plugins/MobileMessaging/lang/fa.json1
-rw-r--r--plugins/MobileMessaging/lang/fi.json1
-rw-r--r--plugins/MobileMessaging/lang/fr.json6
-rw-r--r--plugins/MobileMessaging/lang/hi.json1
-rw-r--r--plugins/MobileMessaging/lang/id.json1
-rw-r--r--plugins/MobileMessaging/lang/it.json6
-rw-r--r--plugins/MobileMessaging/lang/ja.json1
-rw-r--r--plugins/MobileMessaging/lang/ko.json1
-rw-r--r--plugins/MobileMessaging/lang/nb.json2
-rw-r--r--plugins/MobileMessaging/lang/nl.json1
-rw-r--r--plugins/MobileMessaging/lang/pt-br.json4
-rw-r--r--plugins/MobileMessaging/lang/ro.json1
-rw-r--r--plugins/MobileMessaging/lang/ru.json1
-rw-r--r--plugins/MobileMessaging/lang/sq.json41
-rw-r--r--plugins/MobileMessaging/lang/sr.json6
-rw-r--r--plugins/MobileMessaging/lang/sv.json1
-rw-r--r--plugins/MobileMessaging/lang/tl.json1
-rw-r--r--plugins/MobileMessaging/lang/tr.json1
-rw-r--r--plugins/MobileMessaging/lang/vi.json1
-rw-r--r--plugins/MobileMessaging/lang/zh-cn.json1
-rw-r--r--plugins/Morpheus/stylesheets/ui/_map.less3
-rw-r--r--plugins/MultiSites/lang/ko.json2
-rw-r--r--plugins/MultiSites/lang/sq.json5
-rw-r--r--plugins/Overlay/client/followingpages.js23
-rw-r--r--plugins/Overlay/lang/cs.json2
-rw-r--r--plugins/Overlay/lang/sq.json12
-rw-r--r--plugins/PrivacyManager/lang/en.json4
-rw-r--r--plugins/PrivacyManager/lang/nb.json6
-rw-r--r--plugins/PrivacyManager/lang/sq.json50
-rw-r--r--plugins/Provider/lang/sq.json10
-rw-r--r--plugins/Referrers/Reports/GetReferrerType.php1
-rw-r--r--plugins/Referrers/lang/sq.json8
-rw-r--r--plugins/Resolution/lang/sq.json2
-rw-r--r--plugins/RssWidget/stylesheets/rss.less6
-rw-r--r--plugins/SEO/Metric/Bing.php6
-rw-r--r--plugins/SEO/Metric/Dmoz.php2
-rw-r--r--plugins/SEO/Metric/DomainAge.php15
-rw-r--r--plugins/SEO/Metric/Google.php111
-rw-r--r--plugins/SEO/lang/sq.json2
-rw-r--r--plugins/ScheduledReports/lang/bg.json1
-rw-r--r--plugins/ScheduledReports/lang/ca.json1
-rw-r--r--plugins/ScheduledReports/lang/cs.json16
-rw-r--r--plugins/ScheduledReports/lang/da.json1
-rw-r--r--plugins/ScheduledReports/lang/de.json3
-rw-r--r--plugins/ScheduledReports/lang/el.json4
-rw-r--r--plugins/ScheduledReports/lang/es.json4
-rw-r--r--plugins/ScheduledReports/lang/et.json1
-rw-r--r--plugins/ScheduledReports/lang/fa.json1
-rw-r--r--plugins/ScheduledReports/lang/fi.json1
-rw-r--r--plugins/ScheduledReports/lang/fr.json3
-rw-r--r--plugins/ScheduledReports/lang/hi.json1
-rw-r--r--plugins/ScheduledReports/lang/id.json1
-rw-r--r--plugins/ScheduledReports/lang/it.json3
-rw-r--r--plugins/ScheduledReports/lang/ja.json1
-rw-r--r--plugins/ScheduledReports/lang/ko.json3
-rw-r--r--plugins/ScheduledReports/lang/nb.json1
-rw-r--r--plugins/ScheduledReports/lang/nl.json1
-rw-r--r--plugins/ScheduledReports/lang/pl.json1
-rw-r--r--plugins/ScheduledReports/lang/pt-br.json2
-rw-r--r--plugins/ScheduledReports/lang/pt.json1
-rw-r--r--plugins/ScheduledReports/lang/ro.json1
-rw-r--r--plugins/ScheduledReports/lang/ru.json1
-rw-r--r--plugins/ScheduledReports/lang/sl.json1
-rw-r--r--plugins/ScheduledReports/lang/sq.json19
-rw-r--r--plugins/ScheduledReports/lang/sr.json3
-rw-r--r--plugins/ScheduledReports/lang/sv.json1
-rw-r--r--plugins/ScheduledReports/lang/tl.json1
-rw-r--r--plugins/ScheduledReports/lang/tr.json1
-rw-r--r--plugins/ScheduledReports/lang/uk.json1
-rw-r--r--plugins/ScheduledReports/lang/vi.json1
-rw-r--r--plugins/ScheduledReports/lang/zh-cn.json1
-rw-r--r--plugins/ScheduledReports/templates/_addReport.twig2
-rw-r--r--plugins/SegmentEditor/lang/nl.json10
-rw-r--r--plugins/SegmentEditor/lang/sq.json36
-rw-r--r--plugins/SegmentEditor/lang/sr.json14
-rw-r--r--plugins/SitesManager/lang/cs.json3
-rw-r--r--plugins/SitesManager/lang/de.json3
-rw-r--r--plugins/SitesManager/lang/el.json3
-rw-r--r--plugins/SitesManager/lang/es.json3
-rw-r--r--plugins/SitesManager/lang/fr.json3
-rw-r--r--plugins/SitesManager/lang/it.json3
-rw-r--r--plugins/SitesManager/lang/ko.json4
-rw-r--r--plugins/SitesManager/lang/pt-br.json3
-rw-r--r--plugins/SitesManager/lang/sq.json57
-rw-r--r--plugins/SitesManager/lang/sr.json7
-rw-r--r--plugins/TestRunner/Commands/GenerateTravisYmlFile.php4
-rw-r--r--plugins/Transitions/lang/cs.json3
-rw-r--r--plugins/Transitions/lang/de.json3
-rw-r--r--plugins/Transitions/lang/el.json3
-rw-r--r--plugins/Transitions/lang/es.json3
-rw-r--r--plugins/Transitions/lang/fr.json3
-rw-r--r--plugins/Transitions/lang/it.json3
-rw-r--r--plugins/Transitions/lang/pt-br.json3
-rw-r--r--plugins/Transitions/lang/sq.json19
-rw-r--r--plugins/Transitions/lang/sr.json3
-rw-r--r--plugins/UserCountry/lang/cs.json3
-rw-r--r--plugins/UserCountry/lang/da.json3
-rw-r--r--plugins/UserCountry/lang/de.json3
-rw-r--r--plugins/UserCountry/lang/el.json3
-rw-r--r--plugins/UserCountry/lang/es.json3
-rw-r--r--plugins/UserCountry/lang/fr.json3
-rw-r--r--plugins/UserCountry/lang/it.json3
-rw-r--r--plugins/UserCountry/lang/ko.json3
-rw-r--r--plugins/UserCountry/lang/pt-br.json3
-rw-r--r--plugins/UserCountry/lang/sq.json77
-rw-r--r--plugins/UserCountry/lang/sr.json3
-rw-r--r--plugins/UserCountryMap/lang/da.json1
-rw-r--r--plugins/UserCountryMap/lang/sq.json10
-rw-r--r--plugins/UserId/lang/sq.json4
-rw-r--r--plugins/UserId/lang/sr.json4
-rw-r--r--plugins/UserLanguage/lang/sq.json2
-rw-r--r--plugins/UsersManager/lang/cs.json12
-rw-r--r--plugins/UsersManager/lang/de.json2
-rw-r--r--plugins/UsersManager/lang/el.json2
-rw-r--r--plugins/UsersManager/lang/es.json2
-rw-r--r--plugins/UsersManager/lang/fi.json1
-rw-r--r--plugins/UsersManager/lang/fr.json2
-rw-r--r--plugins/UsersManager/lang/it.json2
-rw-r--r--plugins/UsersManager/lang/ko.json10
-rw-r--r--plugins/UsersManager/lang/pt-br.json1
-rw-r--r--plugins/UsersManager/lang/sq.json25
-rw-r--r--plugins/UsersManager/lang/sr.json13
-rw-r--r--plugins/UsersManager/lang/sv.json1
-rw-r--r--plugins/UsersManager/lang/uk.json1
-rw-r--r--plugins/VisitFrequency/lang/am.json3
-rw-r--r--plugins/VisitFrequency/lang/ar.json5
-rw-r--r--plugins/VisitFrequency/lang/be.json5
-rw-r--r--plugins/VisitFrequency/lang/bg.json5
-rw-r--r--plugins/VisitFrequency/lang/ca.json5
-rw-r--r--plugins/VisitFrequency/lang/cs.json12
-rw-r--r--plugins/VisitFrequency/lang/da.json5
-rw-r--r--plugins/VisitFrequency/lang/de.json10
-rw-r--r--plugins/VisitFrequency/lang/el.json10
-rw-r--r--plugins/VisitFrequency/lang/es.json10
-rw-r--r--plugins/VisitFrequency/lang/et.json5
-rw-r--r--plugins/VisitFrequency/lang/eu.json3
-rw-r--r--plugins/VisitFrequency/lang/fa.json4
-rw-r--r--plugins/VisitFrequency/lang/fi.json5
-rw-r--r--plugins/VisitFrequency/lang/fr.json10
-rw-r--r--plugins/VisitFrequency/lang/gl.json2
-rw-r--r--plugins/VisitFrequency/lang/he.json4
-rw-r--r--plugins/VisitFrequency/lang/hi.json5
-rw-r--r--plugins/VisitFrequency/lang/hu.json5
-rw-r--r--plugins/VisitFrequency/lang/id.json5
-rw-r--r--plugins/VisitFrequency/lang/is.json5
-rw-r--r--plugins/VisitFrequency/lang/it.json10
-rw-r--r--plugins/VisitFrequency/lang/ja.json5
-rw-r--r--plugins/VisitFrequency/lang/ka.json5
-rw-r--r--plugins/VisitFrequency/lang/ko.json12
-rw-r--r--plugins/VisitFrequency/lang/lt.json5
-rw-r--r--plugins/VisitFrequency/lang/nb.json5
-rw-r--r--plugins/VisitFrequency/lang/nl.json5
-rw-r--r--plugins/VisitFrequency/lang/nn.json4
-rw-r--r--plugins/VisitFrequency/lang/pl.json5
-rw-r--r--plugins/VisitFrequency/lang/pt-br.json9
-rw-r--r--plugins/VisitFrequency/lang/pt.json5
-rw-r--r--plugins/VisitFrequency/lang/ro.json5
-rw-r--r--plugins/VisitFrequency/lang/ru.json5
-rw-r--r--plugins/VisitFrequency/lang/sk.json5
-rw-r--r--plugins/VisitFrequency/lang/sl.json5
-rw-r--r--plugins/VisitFrequency/lang/sq.json20
-rw-r--r--plugins/VisitFrequency/lang/sr.json10
-rw-r--r--plugins/VisitFrequency/lang/sv.json5
-rw-r--r--plugins/VisitFrequency/lang/th.json5
-rw-r--r--plugins/VisitFrequency/lang/tl.json5
-rw-r--r--plugins/VisitFrequency/lang/tr.json5
-rw-r--r--plugins/VisitFrequency/lang/uk.json5
-rw-r--r--plugins/VisitFrequency/lang/vi.json5
-rw-r--r--plugins/VisitFrequency/lang/zh-cn.json5
-rw-r--r--plugins/VisitFrequency/lang/zh-tw.json5
-rw-r--r--plugins/VisitTime/lang/sq.json2
-rw-r--r--plugins/VisitTime/lang/tr.json12
-rw-r--r--plugins/VisitorInterest/lang/sq.json4
-rw-r--r--plugins/VisitsSummary/VisitsSummary.php12
-rw-r--r--plugins/VisitsSummary/lang/am.json3
-rw-r--r--plugins/VisitsSummary/lang/ar.json5
-rw-r--r--plugins/VisitsSummary/lang/be.json5
-rw-r--r--plugins/VisitsSummary/lang/bg.json14
-rw-r--r--plugins/VisitsSummary/lang/ca.json13
-rw-r--r--plugins/VisitsSummary/lang/cs.json32
-rw-r--r--plugins/VisitsSummary/lang/da.json14
-rw-r--r--plugins/VisitsSummary/lang/de.json30
-rw-r--r--plugins/VisitsSummary/lang/el.json30
-rw-r--r--plugins/VisitsSummary/lang/es.json30
-rw-r--r--plugins/VisitsSummary/lang/et.json14
-rw-r--r--plugins/VisitsSummary/lang/eu.json3
-rw-r--r--plugins/VisitsSummary/lang/fa.json14
-rw-r--r--plugins/VisitsSummary/lang/fi.json14
-rw-r--r--plugins/VisitsSummary/lang/fr.json30
-rw-r--r--plugins/VisitsSummary/lang/gl.json2
-rw-r--r--plugins/VisitsSummary/lang/he.json14
-rw-r--r--plugins/VisitsSummary/lang/hi.json8
-rw-r--r--plugins/VisitsSummary/lang/hu.json5
-rw-r--r--plugins/VisitsSummary/lang/id.json14
-rw-r--r--plugins/VisitsSummary/lang/is.json5
-rw-r--r--plugins/VisitsSummary/lang/it.json30
-rw-r--r--plugins/VisitsSummary/lang/ja.json14
-rw-r--r--plugins/VisitsSummary/lang/ka.json5
-rw-r--r--plugins/VisitsSummary/lang/ko.json14
-rw-r--r--plugins/VisitsSummary/lang/lt.json5
-rw-r--r--plugins/VisitsSummary/lang/lv.json10
-rw-r--r--plugins/VisitsSummary/lang/nb.json14
-rw-r--r--plugins/VisitsSummary/lang/nl.json14
-rw-r--r--plugins/VisitsSummary/lang/nn.json3
-rw-r--r--plugins/VisitsSummary/lang/pl.json14
-rw-r--r--plugins/VisitsSummary/lang/pt-br.json29
-rw-r--r--plugins/VisitsSummary/lang/pt.json11
-rw-r--r--plugins/VisitsSummary/lang/ro.json14
-rw-r--r--plugins/VisitsSummary/lang/ru.json22
-rw-r--r--plugins/VisitsSummary/lang/sk.json14
-rw-r--r--plugins/VisitsSummary/lang/sl.json14
-rw-r--r--plugins/VisitsSummary/lang/sq.json30
-rw-r--r--plugins/VisitsSummary/lang/sr.json30
-rw-r--r--plugins/VisitsSummary/lang/sv.json14
-rw-r--r--plugins/VisitsSummary/lang/te.json2
-rw-r--r--plugins/VisitsSummary/lang/th.json14
-rw-r--r--plugins/VisitsSummary/lang/tl.json14
-rw-r--r--plugins/VisitsSummary/lang/tr.json4
-rw-r--r--plugins/VisitsSummary/lang/uk.json14
-rw-r--r--plugins/VisitsSummary/lang/vi.json14
-rw-r--r--plugins/VisitsSummary/lang/zh-cn.json14
-rw-r--r--plugins/VisitsSummary/lang/zh-tw.json5
-rw-r--r--plugins/WebsiteMeasurable/lang/ru.json4
-rw-r--r--plugins/Widgetize/lang/sq.json4
-rw-r--r--tests/PHPUnit/Fixtures/ThreeVisitsWithCustomEvents.php (renamed from tests/PHPUnit/Fixtures/TwoVisitsWithCustomEvents.php)11
-rw-r--r--tests/PHPUnit/Integration/EmailValidatorTest.php2
-rw-r--r--tests/PHPUnit/Integration/HttpTest.php4
-rw-r--r--tests/PHPUnit/System/BackwardsCompatibility1XTest.php4
-rw-r--r--tests/PHPUnit/System/CustomEventsTest.php8
-rw-r--r--tests/PHPUnit/System/expected/test_CustomEvents_Events.getAction_flat__API.getProcessedReport_day.xml178
-rw-r--r--tests/PHPUnit/System/expected/test_CustomEvents_Events.getAction_lastN__API.getProcessedReport_day.xml198
-rw-r--r--tests/PHPUnit/System/expected/test_CustomEvents_Events.getCategory_flat__API.getProcessedReport_day.xml160
-rw-r--r--tests/PHPUnit/System/expected/test_CustomEvents_Events.getCategory_lastN__API.getProcessedReport_day.xml60
-rw-r--r--tests/PHPUnit/System/expected/test_CustomEvents_Events.getName_flat__API.getProcessedReport_day.xml187
-rw-r--r--tests/PHPUnit/System/expected/test_CustomEvents_Events.getName_lastN__API.getProcessedReport_day.xml121
-rw-r--r--tests/PHPUnit/System/expected/test_CustomEvents__Actions.getPageUrls_month.xml20
-rw-r--r--tests/PHPUnit/System/expected/test_CustomEvents__Actions.get_month.xml6
-rw-r--r--tests/PHPUnit/System/expected/test_CustomEvents__Events.getAction_month.xml200
-rw-r--r--tests/PHPUnit/System/expected/test_CustomEvents__Events.getCategory_month.xml144
-rw-r--r--tests/PHPUnit/System/expected/test_CustomEvents__Events.getName_month.xml186
-rw-r--r--tests/PHPUnit/System/expected/test_CustomEvents__Live.getLastVisitsDetails_month.xml412
-rw-r--r--tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventAction__Events.getCategory_month.xml144
-rw-r--r--tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventAction__Events.getName_month.xml186
-rw-r--r--tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventCategory__Events.getAction_month.xml194
-rw-r--r--tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventCategory__Events.getName_month.xml108
-rw-r--r--tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventName__Events.getAction_month.xml200
-rw-r--r--tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventName__Events.getCategory_month.xml78
-rw-r--r--tests/PHPUnit/System/expected/test_ImportLogs__CorePluginsAdmin.getSystemSettings.xml4
-rw-r--r--tests/PHPUnit/System/expected/test_OneVisitorTwoVisits__CorePluginsAdmin.getSystemSettings.xml4
-rw-r--r--tests/PHPUnit/System/expected/test_apiGetReportMetadata__API.getReportPagesMetadata.xml188
-rw-r--r--tests/PHPUnit/System/expected/test_apiGetReportMetadata__API.getWidgetMetadata.xml121
-rw-r--r--tests/PHPUnit/System/expected/test_noVisit_PeriodIsLast__CorePluginsAdmin.getSystemSettings.xml4
-rw-r--r--tests/PHPUnit/System/expected/test_noVisit__CorePluginsAdmin.getSystemSettings.xml4
-rw-r--r--tests/PHPUnit/Unit/Widget/WidgetConfigTest.php11
-rw-r--r--tests/PHPUnit/phpunit.xml.dist2
-rw-r--r--tests/UI/config.dist.js2
-rw-r--r--tests/UI/expected-screenshots/DashboardManager_removed.png4
-rw-r--r--tests/UI/expected-screenshots/Dashboard_removed.png4
-rw-r--r--tests/UI/expected-screenshots/Morpheus_load.png4
-rw-r--r--tests/UI/expected-screenshots/Theme_demo.png4
-rw-r--r--tests/UI/expected-screenshots/Theme_home.png4
-rw-r--r--tests/UI/expected-screenshots/UIIntegrationTest_admin_home.png4
-rw-r--r--tests/UI/expected-screenshots/UIIntegrationTest_admin_settings_general.png4
-rw-r--r--tests/UI/expected-screenshots/UIIntegrationTest_api_listing.png4
-rw-r--r--tests/UI/expected-screenshots/UIIntegrationTest_dashboard1.png4
-rw-r--r--tests/UI/expected-screenshots/UIIntegrationTest_dashboard2.png4
-rw-r--r--tests/UI/expected-screenshots/UIIntegrationTest_dashboard3.png4
-rw-r--r--tests/UI/expected-screenshots/UIIntegrationTest_email_reports.png4
-rw-r--r--tests/UI/expected-screenshots/UIIntegrationTest_email_reports_editor.png3
-rw-r--r--tests/UI/expected-screenshots/UIIntegrationTest_menu_apidisallowed.png4
-rw-r--r--tests/UI/expected-screenshots/UIIntegrationTest_visitor_profile_not_segmented.png4
-rw-r--r--tests/UI/expected-screenshots/UIIntegrationTest_visitors_realtime_map.png4
-rw-r--r--tests/UI/expected-screenshots/ViewDataTableTest_4_exclude_low_population.png3
-rw-r--r--tests/UI/expected-screenshots/ViewDataTableTest_5_goals.png4
-rw-r--r--tests/UI/expected-screenshots/ViewDataTableTest_exclude_low_population.png3
-rw-r--r--tests/UI/specs/ActionsDataTable_spec.js5
-rw-r--r--tests/UI/specs/DashboardManager_spec.js2
-rw-r--r--tests/UI/specs/MultiSites_spec.js6
-rw-r--r--tests/UI/specs/Overlay_spec.js2
-rw-r--r--tests/UI/specs/QuickAccess_spec.js2
-rw-r--r--tests/UI/specs/SegmentSelectorEditor_spec.js6
-rw-r--r--tests/UI/specs/Theme_spec.js2
-rw-r--r--tests/UI/specs/UIIntegration_spec.js39
-rw-r--r--tests/UI/specs/ViewDataTable_spec.js17
-rw-r--r--tests/UI/specs/VisitorMap_spec.js2
-rwxr-xr-xtests/lib/mocha-2.2.5/README.md11
-rwxr-xr-xtests/lib/mocha-2.2.5/bower.json47
-rwxr-xr-xtests/lib/mocha-2.2.5/component.json20
-rwxr-xr-xtests/lib/mocha-2.2.5/index.js3
-rwxr-xr-xtests/lib/mocha-2.2.5/lib/browser/debug.js4
-rwxr-xr-xtests/lib/mocha-2.2.5/lib/browser/escape-string-regexp.js11
-rwxr-xr-xtests/lib/mocha-2.2.5/lib/browser/fs.js0
-rwxr-xr-xtests/lib/mocha-2.2.5/lib/browser/glob.js0
-rwxr-xr-xtests/lib/mocha-2.2.5/lib/browser/path.js0
-rwxr-xr-xtests/lib/mocha-2.2.5/lib/browser/progress.js125
-rwxr-xr-xtests/lib/mocha-2.2.5/lib/browser/tty.js12
-rwxr-xr-xtests/lib/mocha-2.2.5/lib/context.js95
-rwxr-xr-xtests/lib/mocha-2.2.5/lib/interfaces/bdd.js115
-rwxr-xr-xtests/lib/mocha-2.2.5/lib/interfaces/common.js58
-rwxr-xr-xtests/lib/mocha-2.2.5/lib/interfaces/tdd.js109
-rwxr-xr-xtests/lib/mocha-2.2.5/lib/reporters/dot.js62
-rwxr-xr-xtests/lib/mocha-2.2.5/lib/reporters/html-cov.js50
-rwxr-xr-xtests/lib/mocha-2.2.5/lib/reporters/html.js287
-rwxr-xr-xtests/lib/mocha-2.2.5/lib/reporters/index.js17
-rwxr-xr-xtests/lib/mocha-2.2.5/lib/reporters/json-cov.js152
-rwxr-xr-xtests/lib/mocha-2.2.5/lib/reporters/templates/coverage.jade51
-rwxr-xr-xtests/lib/mocha-2.2.5/lib/reporters/templates/menu.jade13
-rwxr-xr-xtests/lib/mocha-2.2.5/lib/reporters/templates/script.html34
-rwxr-xr-xtests/lib/mocha-2.2.5/lib/reporters/templates/style.html324
-rwxr-xr-xtests/lib/mocha-2.2.5/lib/reporters/xunit.js149
-rwxr-xr-xtests/lib/mocha-2.2.5/lib/runnable.js280
-rwxr-xr-xtests/lib/mocha-2.2.5/lib/runner.js716
-rwxr-xr-xtests/lib/mocha-2.2.5/lib/test.js31
-rwxr-xr-xtests/lib/mocha-2.2.5/mocha.js6564
-rwxr-xr-xtests/lib/mocha-2.2.5/package.json75
-rwxr-xr-xtests/lib/mocha-2.2.5/support/compile.js157
-rwxr-xr-xtests/lib/mocha-2.2.5/support/foot.js1
-rwxr-xr-xtests/lib/mocha-2.2.5/support/head.js1
-rwxr-xr-xtests/lib/mocha-2.2.5/test.js9
-rw-r--r--tests/lib/mocha-3.1.0/.editorconfig18
-rw-r--r--tests/lib/mocha-3.1.0/.eslintignore3
-rw-r--r--tests/lib/mocha-3.1.0/.eslintrc129
-rw-r--r--tests/lib/mocha-3.1.0/.gitignore17
-rw-r--r--tests/lib/mocha-3.1.0/.mailmap12
-rw-r--r--tests/lib/mocha-3.1.0/.npmignore2
-rw-r--r--tests/lib/mocha-3.1.0/.travis.yml55
-rw-r--r--tests/lib/mocha-3.1.0/CHANGELOG.md1418
-rw-r--r--tests/lib/mocha-3.1.0/CONTRIBUTING.md49
-rw-r--r--[-rwxr-xr-x]tests/lib/mocha-3.1.0/LICENSE (renamed from tests/lib/mocha-2.2.5/LICENSE)2
-rw-r--r--tests/lib/mocha-3.1.0/Makefile176
-rw-r--r--tests/lib/mocha-3.1.0/README.md84
-rw-r--r--tests/lib/mocha-3.1.0/appveyor.yml26
-rw-r--r--tests/lib/mocha-3.1.0/assets/mocha-banner-192.pngbin0 -> 15667 bytes
-rw-r--r--tests/lib/mocha-3.1.0/assets/mocha-banner.svg160
-rw-r--r--tests/lib/mocha-3.1.0/assets/mocha-logo-128.pngbin0 -> 7445 bytes
-rw-r--r--tests/lib/mocha-3.1.0/assets/mocha-logo-192.pngbin0 -> 10373 bytes
-rw-r--r--tests/lib/mocha-3.1.0/assets/mocha-logo-64.pngbin0 -> 3275 bytes
-rw-r--r--tests/lib/mocha-3.1.0/assets/mocha-logo.svg125
-rw-r--r--tests/lib/mocha-3.1.0/bin/.eslintrc3
-rw-r--r--[-rwxr-xr-x]tests/lib/mocha-3.1.0/bin/_mocha (renamed from tests/lib/mocha-2.2.5/bin/_mocha)323
-rw-r--r--[-rwxr-xr-x]tests/lib/mocha-3.1.0/bin/mocha (renamed from tests/lib/mocha-2.2.5/bin/mocha)49
-rw-r--r--[-rwxr-xr-x]tests/lib/mocha-3.1.0/bin/options.js (renamed from tests/lib/mocha-2.2.5/bin/options.js)13
-rw-r--r--tests/lib/mocha-3.1.0/bower.json38
-rw-r--r--[-rwxr-xr-x]tests/lib/mocha-3.1.0/browser-entry.js (renamed from tests/lib/mocha-2.2.5/support/tail.js)108
-rw-r--r--[-rwxr-xr-x]tests/lib/mocha-3.1.0/editors/JavaScript mocha.tmbundle/Snippets/bdd - after each.tmSnippet (renamed from tests/lib/mocha-2.2.5/editors/JavaScript mocha.tmbundle/Snippets/bdd - after each.tmSnippet)0
-rw-r--r--[-rwxr-xr-x]tests/lib/mocha-3.1.0/editors/JavaScript mocha.tmbundle/Snippets/bdd - after.tmSnippet (renamed from tests/lib/mocha-2.2.5/editors/JavaScript mocha.tmbundle/Snippets/bdd - after.tmSnippet)0
-rw-r--r--[-rwxr-xr-x]tests/lib/mocha-3.1.0/editors/JavaScript mocha.tmbundle/Snippets/bdd - before each.tmSnippet (renamed from tests/lib/mocha-2.2.5/editors/JavaScript mocha.tmbundle/Snippets/bdd - before each.tmSnippet)0
-rw-r--r--[-rwxr-xr-x]tests/lib/mocha-3.1.0/editors/JavaScript mocha.tmbundle/Snippets/bdd - before.tmSnippet (renamed from tests/lib/mocha-2.2.5/editors/JavaScript mocha.tmbundle/Snippets/bdd - before.tmSnippet)0
-rw-r--r--[-rwxr-xr-x]tests/lib/mocha-3.1.0/editors/JavaScript mocha.tmbundle/Snippets/bdd - describe.tmSnippet (renamed from tests/lib/mocha-2.2.5/editors/JavaScript mocha.tmbundle/Snippets/bdd - describe.tmSnippet)0
-rw-r--r--[-rwxr-xr-x]tests/lib/mocha-3.1.0/editors/JavaScript mocha.tmbundle/Snippets/bdd - it.tmSnippet (renamed from tests/lib/mocha-2.2.5/editors/JavaScript mocha.tmbundle/Snippets/bdd - it.tmSnippet)0
-rw-r--r--[-rwxr-xr-x]tests/lib/mocha-3.1.0/editors/JavaScript mocha.tmbundle/Snippets/tdd - assert.tmSnippet (renamed from tests/lib/mocha-2.2.5/editors/JavaScript mocha.tmbundle/Snippets/tdd - assert.tmSnippet)0
-rw-r--r--[-rwxr-xr-x]tests/lib/mocha-3.1.0/editors/JavaScript mocha.tmbundle/Snippets/tdd - assert_deepEqual.tmSnippet (renamed from tests/lib/mocha-2.2.5/editors/JavaScript mocha.tmbundle/Snippets/tdd - assert_deepEqual.tmSnippet)0
-rw-r--r--[-rwxr-xr-x]tests/lib/mocha-3.1.0/editors/JavaScript mocha.tmbundle/Snippets/tdd - assert_equal.tmSnippet (renamed from tests/lib/mocha-2.2.5/editors/JavaScript mocha.tmbundle/Snippets/tdd - assert_equal.tmSnippet)0
-rw-r--r--[-rwxr-xr-x]tests/lib/mocha-3.1.0/editors/JavaScript mocha.tmbundle/Snippets/tdd - assert_fail.tmSnippet (renamed from tests/lib/mocha-2.2.5/editors/JavaScript mocha.tmbundle/Snippets/tdd - assert_fail.tmSnippet)0
-rw-r--r--[-rwxr-xr-x]tests/lib/mocha-3.1.0/editors/JavaScript mocha.tmbundle/Snippets/tdd - assert_isFunction.tmSnippet (renamed from tests/lib/mocha-2.2.5/editors/JavaScript mocha.tmbundle/Snippets/tdd - assert_isFunction.tmSnippet)0
-rw-r--r--[-rwxr-xr-x]tests/lib/mocha-3.1.0/editors/JavaScript mocha.tmbundle/Snippets/tdd - setup.tmSnippet (renamed from tests/lib/mocha-2.2.5/editors/JavaScript mocha.tmbundle/Snippets/tdd - setup.tmSnippet)0
-rw-r--r--[-rwxr-xr-x]tests/lib/mocha-3.1.0/editors/JavaScript mocha.tmbundle/Snippets/tdd - suite.tmSnippet (renamed from tests/lib/mocha-2.2.5/editors/JavaScript mocha.tmbundle/Snippets/tdd - suite.tmSnippet)0
-rw-r--r--[-rwxr-xr-x]tests/lib/mocha-3.1.0/editors/JavaScript mocha.tmbundle/Snippets/tdd - teardown.tmSnippet (renamed from tests/lib/mocha-2.2.5/editors/JavaScript mocha.tmbundle/Snippets/tdd - teardown.tmSnippet)0
-rw-r--r--[-rwxr-xr-x]tests/lib/mocha-3.1.0/editors/JavaScript mocha.tmbundle/Snippets/tdd - test.tmSnippet (renamed from tests/lib/mocha-2.2.5/editors/JavaScript mocha.tmbundle/Snippets/tdd - test.tmSnippet)0
-rw-r--r--[-rwxr-xr-x]tests/lib/mocha-3.1.0/editors/JavaScript mocha.tmbundle/info.plist (renamed from tests/lib/mocha-2.2.5/editors/JavaScript mocha.tmbundle/info.plist)0
-rw-r--r--[-rwxr-xr-x]tests/lib/mocha-3.1.0/images/error.png (renamed from tests/lib/mocha-2.2.5/images/error.png)bin412 -> 412 bytes
-rw-r--r--[-rwxr-xr-x]tests/lib/mocha-3.1.0/images/ok.png (renamed from tests/lib/mocha-2.2.5/images/ok.png)bin388 -> 388 bytes
-rw-r--r--tests/lib/mocha-3.1.0/index.js3
-rw-r--r--tests/lib/mocha-3.1.0/karma.conf.js179
-rw-r--r--tests/lib/mocha-3.1.0/lib/browser/debug.js4
-rw-r--r--[-rwxr-xr-x]tests/lib/mocha-3.1.0/lib/browser/events.js (renamed from tests/lib/mocha-2.2.5/lib/browser/events.js)68
-rw-r--r--tests/lib/mocha-3.1.0/lib/browser/progress.js117
-rw-r--r--tests/lib/mocha-3.1.0/lib/browser/tty.js11
-rw-r--r--tests/lib/mocha-3.1.0/lib/context.js110
-rw-r--r--[-rwxr-xr-x]tests/lib/mocha-3.1.0/lib/hook.js (renamed from tests/lib/mocha-2.2.5/lib/hook.js)12
-rw-r--r--tests/lib/mocha-3.1.0/lib/interfaces/bdd.js113
-rw-r--r--tests/lib/mocha-3.1.0/lib/interfaces/common.js158
-rw-r--r--[-rwxr-xr-x]tests/lib/mocha-3.1.0/lib/interfaces/exports.js (renamed from tests/lib/mocha-2.2.5/lib/interfaces/exports.js)18
-rw-r--r--[-rwxr-xr-x]tests/lib/mocha-3.1.0/lib/interfaces/index.js (renamed from tests/lib/mocha-2.2.5/lib/interfaces/index.js)0
-rw-r--r--[-rwxr-xr-x]tests/lib/mocha-3.1.0/lib/interfaces/qunit.js (renamed from tests/lib/mocha-2.2.5/lib/interfaces/qunit.js)59
-rw-r--r--tests/lib/mocha-3.1.0/lib/interfaces/tdd.js104
-rw-r--r--[-rwxr-xr-x]tests/lib/mocha-3.1.0/lib/mocha.js (renamed from tests/lib/mocha-2.2.5/lib/mocha.js)308
-rw-r--r--[-rwxr-xr-x]tests/lib/mocha-3.1.0/lib/ms.js (renamed from tests/lib/mocha-2.2.5/lib/ms.js)67
-rw-r--r--[-rwxr-xr-x]tests/lib/mocha-3.1.0/lib/pending.js (renamed from tests/lib/mocha-2.2.5/lib/pending.js)5
-rw-r--r--[-rwxr-xr-x]tests/lib/mocha-3.1.0/lib/reporters/base.js (renamed from tests/lib/mocha-2.2.5/lib/reporters/base.js)301
-rw-r--r--[-rwxr-xr-x]tests/lib/mocha-3.1.0/lib/reporters/doc.js (renamed from tests/lib/mocha-2.2.5/lib/reporters/doc.js)30
-rw-r--r--tests/lib/mocha-3.1.0/lib/reporters/dot.js66
-rw-r--r--tests/lib/mocha-3.1.0/lib/reporters/html.js344
-rw-r--r--tests/lib/mocha-3.1.0/lib/reporters/index.js17
-rw-r--r--[-rwxr-xr-x]tests/lib/mocha-3.1.0/lib/reporters/json-stream.js (renamed from tests/lib/mocha-2.2.5/lib/reporters/json-stream.js)33
-rw-r--r--[-rwxr-xr-x]tests/lib/mocha-3.1.0/lib/reporters/json.js (renamed from tests/lib/mocha-2.2.5/lib/reporters/json.js)36
-rw-r--r--[-rwxr-xr-x]tests/lib/mocha-3.1.0/lib/reporters/landing.js (renamed from tests/lib/mocha-2.2.5/lib/reporters/landing.js)44
-rw-r--r--[-rwxr-xr-x]tests/lib/mocha-3.1.0/lib/reporters/list.js (renamed from tests/lib/mocha-2.2.5/lib/reporters/list.js)30
-rw-r--r--[-rwxr-xr-x]tests/lib/mocha-3.1.0/lib/reporters/markdown.js (renamed from tests/lib/mocha-2.2.5/lib/reporters/markdown.js)39
-rw-r--r--[-rwxr-xr-x]tests/lib/mocha-3.1.0/lib/reporters/min.js (renamed from tests/lib/mocha-2.2.5/lib/reporters/min.js)9
-rw-r--r--[-rwxr-xr-x]tests/lib/mocha-3.1.0/lib/reporters/nyan.js (renamed from tests/lib/mocha-2.2.5/lib/reporters/nyan.js)97
-rw-r--r--[-rwxr-xr-x]tests/lib/mocha-3.1.0/lib/reporters/progress.js (renamed from tests/lib/mocha-2.2.5/lib/reporters/progress.js)43
-rw-r--r--[-rwxr-xr-x]tests/lib/mocha-3.1.0/lib/reporters/spec.js (renamed from tests/lib/mocha-2.2.5/lib/reporters/spec.js)47
-rw-r--r--[-rwxr-xr-x]tests/lib/mocha-3.1.0/lib/reporters/tap.js (renamed from tests/lib/mocha-2.2.5/lib/reporters/tap.js)34
-rw-r--r--tests/lib/mocha-3.1.0/lib/reporters/xunit.js166
-rw-r--r--tests/lib/mocha-3.1.0/lib/runnable.js380
-rw-r--r--tests/lib/mocha-3.1.0/lib/runner.js957
-rw-r--r--[-rwxr-xr-x]tests/lib/mocha-3.1.0/lib/suite.js (renamed from tests/lib/mocha-2.2.5/lib/suite.js)235
-rw-r--r--[-rwxr-xr-x]tests/lib/mocha-3.1.0/lib/template.html (renamed from tests/lib/mocha-2.2.5/lib/template.html)2
-rw-r--r--tests/lib/mocha-3.1.0/lib/test.js50
-rw-r--r--tests/lib/mocha-3.1.0/lib/to-iso-string/LICENSE19
-rw-r--r--tests/lib/mocha-3.1.0/lib/to-iso-string/index.js37
-rw-r--r--[-rwxr-xr-x]tests/lib/mocha-3.1.0/lib/utils.js (renamed from tests/lib/mocha-2.2.5/lib/utils.js)530
-rw-r--r--tests/lib/mocha-3.1.0/media/logo.svg7
-rw-r--r--[-rwxr-xr-x]tests/lib/mocha-3.1.0/mocha.css (renamed from tests/lib/mocha-2.2.5/mocha.css)64
-rw-r--r--tests/lib/mocha-3.1.0/mocha.js15466
-rw-r--r--tests/lib/mocha-3.1.0/package.json357
-rw-r--r--tests/lib/mocha-3.1.0/scripts/dedefine.js26
-rw-r--r--tests/lib/mocha-3.1.0/scripts/travis-after-script.sh9
-rw-r--r--tests/lib/mocha-3.1.0/scripts/travis-before-install.sh5
-rw-r--r--tests/lib/mocha-3.1.0/scripts/travis-before-script.sh7
-rw-r--r--tests/lib/mocha-3.1.0/test/.eslintrc5
-rw-r--r--tests/lib/mocha-3.1.0/test/acceptance/context.spec.js72
-rw-r--r--tests/lib/mocha-3.1.0/test/acceptance/duration.spec.js25
-rw-r--r--tests/lib/mocha-3.1.0/test/acceptance/fs.spec.js20
-rw-r--r--tests/lib/mocha-3.1.0/test/acceptance/glob/glob.sh66
-rw-r--r--tests/lib/mocha-3.1.0/test/acceptance/glob/glob.spec.js5
-rw-r--r--tests/lib/mocha-3.1.0/test/acceptance/globals.spec.js41
-rw-r--r--tests/lib/mocha-3.1.0/test/acceptance/http.spec.js16
-rw-r--r--tests/lib/mocha-3.1.0/test/acceptance/interfaces/bdd.spec.js32
-rw-r--r--tests/lib/mocha-3.1.0/test/acceptance/interfaces/exports.spec.js43
-rw-r--r--tests/lib/mocha-3.1.0/test/acceptance/interfaces/qunit.spec.js23
-rw-r--r--tests/lib/mocha-3.1.0/test/acceptance/interfaces/tdd.spec.js40
-rw-r--r--tests/lib/mocha-3.1.0/test/acceptance/lookup-files.spec.js90
-rw-r--r--tests/lib/mocha-3.1.0/test/acceptance/misc/exit.spec.js18
-rw-r--r--tests/lib/mocha-3.1.0/test/acceptance/misc/many.spec.js27
-rw-r--r--tests/lib/mocha-3.1.0/test/acceptance/misc/nontty.spec.js9
-rw-r--r--tests/lib/mocha-3.1.0/test/acceptance/misc/only/bdd-require.spec.js18
-rw-r--r--tests/lib/mocha-3.1.0/test/acceptance/misc/only/bdd.spec.js125
-rw-r--r--tests/lib/mocha-3.1.0/test/acceptance/misc/only/global/bdd.spec.js12
-rw-r--r--tests/lib/mocha-3.1.0/test/acceptance/misc/only/global/qunit.spec.js12
-rw-r--r--tests/lib/mocha-3.1.0/test/acceptance/misc/only/global/tdd.spec.js12
-rw-r--r--tests/lib/mocha-3.1.0/test/acceptance/misc/only/qunit.spec.js73
-rw-r--r--tests/lib/mocha-3.1.0/test/acceptance/misc/only/tdd.spec.js125
-rw-r--r--tests/lib/mocha-3.1.0/test/acceptance/overspecified-async.spec.js8
-rw-r--r--tests/lib/mocha-3.1.0/test/acceptance/require/a.js2
-rw-r--r--tests/lib/mocha-3.1.0/test/acceptance/require/b.coffee2
-rw-r--r--tests/lib/mocha-3.1.0/test/acceptance/require/c.js2
-rw-r--r--tests/lib/mocha-3.1.0/test/acceptance/require/d.coffee2
-rw-r--r--tests/lib/mocha-3.1.0/test/acceptance/require/require.spec.js9
-rw-r--r--tests/lib/mocha-3.1.0/test/acceptance/required-tokens.spec.js10
-rw-r--r--tests/lib/mocha-3.1.0/test/acceptance/root.spec.js11
-rw-r--r--tests/lib/mocha-3.1.0/test/acceptance/test.coffee6
-rw-r--r--tests/lib/mocha-3.1.0/test/acceptance/test.foo1
-rw-r--r--tests/lib/mocha-3.1.0/test/acceptance/throw.spec.js108
-rw-r--r--tests/lib/mocha-3.1.0/test/acceptance/timeout.spec.js79
-rw-r--r--tests/lib/mocha-3.1.0/test/acceptance/utils.spec.js406
-rw-r--r--tests/lib/mocha-3.1.0/test/browser-fixtures/bdd.fixture.js4
-rw-r--r--tests/lib/mocha-3.1.0/test/browser-fixtures/exports.fixture.js4
-rw-r--r--tests/lib/mocha-3.1.0/test/browser-fixtures/qunit.fixture.js4
-rw-r--r--tests/lib/mocha-3.1.0/test/browser-fixtures/tdd.fixture.js4
-rw-r--r--tests/lib/mocha-3.1.0/test/browser/array.spec.js38
-rw-r--r--tests/lib/mocha-3.1.0/test/browser/grep.html51
-rw-r--r--tests/lib/mocha-3.1.0/test/browser/grep.spec.js108
-rw-r--r--tests/lib/mocha-3.1.0/test/browser/index.html33
-rw-r--r--tests/lib/mocha-3.1.0/test/browser/large.html24
-rw-r--r--tests/lib/mocha-3.1.0/test/browser/large.spec.js48
-rw-r--r--tests/lib/mocha-3.1.0/test/browser/multiple-done.spec.js16
-rw-r--r--tests/lib/mocha-3.1.0/test/browser/opts.html30
-rw-r--r--tests/lib/mocha-3.1.0/test/browser/opts.spec.js5
-rw-r--r--tests/lib/mocha-3.1.0/test/browser/stack-trace.html24
-rw-r--r--tests/lib/mocha-3.1.0/test/browser/stack-trace.spec.js20
-rw-r--r--tests/lib/mocha-3.1.0/test/browser/ui.html46
-rw-r--r--tests/lib/mocha-3.1.0/test/browser/ui.spec.js31
-rw-r--r--tests/lib/mocha-3.1.0/test/color.spec.js18
-rw-r--r--tests/lib/mocha-3.1.0/test/compiler/foo.js8
-rw-r--r--tests/lib/mocha-3.1.0/test/fixture-expect.js1
-rw-r--r--tests/lib/mocha-3.1.0/test/grep.spec.js65
-rw-r--r--tests/lib/mocha-3.1.0/test/hook-async.spec.js129
-rw-r--r--tests/lib/mocha-3.1.0/test/hook-sync-nested.spec.js98
-rw-r--r--tests/lib/mocha-3.1.0/test/hook-sync.spec.js97
-rw-r--r--tests/lib/mocha-3.1.0/test/hook-timeout.spec.js8
-rw-r--r--tests/lib/mocha-3.1.0/test/http-meta-2.spec.js91
-rw-r--r--tests/lib/mocha-3.1.0/test/http-meta.spec.js61
-rw-r--r--tests/lib/mocha-3.1.0/test/integration/diffs.spec.js44
-rw-r--r--tests/lib/mocha-3.1.0/test/integration/fixtures/cascade.fixture.js57
-rw-r--r--tests/lib/mocha-3.1.0/test/integration/fixtures/diffs/diffs.css.in9
-rw-r--r--tests/lib/mocha-3.1.0/test/integration/fixtures/diffs/diffs.css.out13
-rw-r--r--tests/lib/mocha-3.1.0/test/integration/fixtures/diffs/diffs.fixture.js84
-rw-r--r--tests/lib/mocha-3.1.0/test/integration/fixtures/diffs/output91
-rw-r--r--tests/lib/mocha-3.1.0/test/integration/fixtures/hooks/after-hook-async-error.fixture.js19
-rw-r--r--tests/lib/mocha-3.1.0/test/integration/fixtures/hooks/after-hook-error.fixture.js17
-rw-r--r--tests/lib/mocha-3.1.0/test/integration/fixtures/hooks/afterEach-hook-async-error.fixture.js19
-rw-r--r--tests/lib/mocha-3.1.0/test/integration/fixtures/hooks/afterEach-hook-error.fixture.js17
-rw-r--r--tests/lib/mocha-3.1.0/test/integration/fixtures/hooks/before-hook-async-error-tip.fixture.js11
-rw-r--r--tests/lib/mocha-3.1.0/test/integration/fixtures/hooks/before-hook-async-error.fixture.js19
-rw-r--r--tests/lib/mocha-3.1.0/test/integration/fixtures/hooks/before-hook-error-tip.fixture.js9
-rw-r--r--tests/lib/mocha-3.1.0/test/integration/fixtures/hooks/before-hook-error.fixture.js17
-rw-r--r--tests/lib/mocha-3.1.0/test/integration/fixtures/hooks/beforeEach-hook-async-error.fixture.js19
-rw-r--r--tests/lib/mocha-3.1.0/test/integration/fixtures/hooks/beforeEach-hook-error.fixture.js17
-rw-r--r--tests/lib/mocha-3.1.0/test/integration/fixtures/hooks/multiple-hook-async-error.fixture.js139
-rw-r--r--tests/lib/mocha-3.1.0/test/integration/fixtures/hooks/multiple-hook-error.fixture.js129
-rw-r--r--tests/lib/mocha-3.1.0/test/integration/fixtures/multiple-done-before.fixture.js10
-rw-r--r--tests/lib/mocha-3.1.0/test/integration/fixtures/multiple-done-beforeEach.fixture.js14
-rw-r--r--tests/lib/mocha-3.1.0/test/integration/fixtures/multiple-done-specs.fixture.js10
-rw-r--r--tests/lib/mocha-3.1.0/test/integration/fixtures/multiple-done.fixture.js18
-rw-r--r--tests/lib/mocha-3.1.0/test/integration/fixtures/options/async-only-async.fixture.js3
-rw-r--r--tests/lib/mocha-3.1.0/test/integration/fixtures/options/async-only-sync.fixture.js1
-rw-r--r--tests/lib/mocha-3.1.0/test/integration/fixtures/options/bail.fixture.js21
-rw-r--r--tests/lib/mocha-3.1.0/test/integration/fixtures/options/delay-fail.fixture.js5
-rw-r--r--tests/lib/mocha-3.1.0/test/integration/fixtures/options/delay.fixture.js14
-rw-r--r--tests/lib/mocha-3.1.0/test/integration/fixtures/options/grep.fixture.js17
-rw-r--r--tests/lib/mocha-3.1.0/test/integration/fixtures/options/only/bdd.fixture.js71
-rw-r--r--tests/lib/mocha-3.1.0/test/integration/fixtures/options/only/qunit.fixture.js26
-rw-r--r--tests/lib/mocha-3.1.0/test/integration/fixtures/options/only/tdd.fixture.js35
-rw-r--r--tests/lib/mocha-3.1.0/test/integration/fixtures/options/retries.fixture.js5
-rw-r--r--tests/lib/mocha-3.1.0/test/integration/fixtures/options/sort-alpha.fixture.js7
-rw-r--r--tests/lib/mocha-3.1.0/test/integration/fixtures/options/sort-beta.fixture.js5
-rw-r--r--tests/lib/mocha-3.1.0/test/integration/fixtures/passing.fixture.js11
-rw-r--r--tests/lib/mocha-3.1.0/test/integration/fixtures/pending/skip-async-before.fixture.js16
-rw-r--r--tests/lib/mocha-3.1.0/test/integration/fixtures/pending/skip-async-beforeEach.fixture.js16
-rw-r--r--tests/lib/mocha-3.1.0/test/integration/fixtures/pending/skip-async-spec.fixture.js12
-rw-r--r--tests/lib/mocha-3.1.0/test/integration/fixtures/pending/skip-sync-before.fixture.js13
-rw-r--r--tests/lib/mocha-3.1.0/test/integration/fixtures/pending/skip-sync-beforeEach.fixture.js13
-rw-r--r--tests/lib/mocha-3.1.0/test/integration/fixtures/pending/skip-sync-spec.fixture.js10
-rw-r--r--tests/lib/mocha-3.1.0/test/integration/fixtures/pending/spec.fixture.js3
-rw-r--r--tests/lib/mocha-3.1.0/test/integration/fixtures/regression/1794/issue-1794.fixture.js3
-rw-r--r--tests/lib/mocha-3.1.0/test/integration/fixtures/regression/1794/simple-ui.js27
-rw-r--r--tests/lib/mocha-3.1.0/test/integration/fixtures/regression/issue-1327.fixture.js15
-rw-r--r--tests/lib/mocha-3.1.0/test/integration/fixtures/regression/issue-1991.fixture.js47
-rw-r--r--tests/lib/mocha-3.1.0/test/integration/fixtures/regression/issue-2315.js9
-rw-r--r--tests/lib/mocha-3.1.0/test/integration/fixtures/regression/issue-2406.fixture.js15
-rw-r--r--tests/lib/mocha-3.1.0/test/integration/fixtures/regression/issue-2417.fixture.js7
-rw-r--r--tests/lib/mocha-3.1.0/test/integration/fixtures/retries/async.fixture.js28
-rw-r--r--tests/lib/mocha-3.1.0/test/integration/fixtures/retries/early-pass.fixture.js11
-rw-r--r--tests/lib/mocha-3.1.0/test/integration/fixtures/retries/hooks.fixture.js25
-rw-r--r--tests/lib/mocha-3.1.0/test/integration/fixtures/retries/nested.fixture.js9
-rw-r--r--tests/lib/mocha-3.1.0/test/integration/fixtures/suite/suite-no-callback.fixture.js1
-rw-r--r--tests/lib/mocha-3.1.0/test/integration/fixtures/suite/suite-skipped-callback.fixture.js1
-rw-r--r--tests/lib/mocha-3.1.0/test/integration/fixtures/suite/suite-skipped-no-callback.fixture.js1
-rw-r--r--tests/lib/mocha-3.1.0/test/integration/fixtures/timeout.fixture.js17
-rw-r--r--tests/lib/mocha-3.1.0/test/integration/fixtures/uncaught-hook.fixture.js15
-rw-r--r--tests/lib/mocha-3.1.0/test/integration/fixtures/uncaught.fixture.js26
-rw-r--r--tests/lib/mocha-3.1.0/test/integration/helpers.js191
-rw-r--r--tests/lib/mocha-3.1.0/test/integration/hook-err.spec.js215
-rw-r--r--tests/lib/mocha-3.1.0/test/integration/hooks.spec.js43
-rw-r--r--tests/lib/mocha-3.1.0/test/integration/multiple-done.spec.js96
-rw-r--r--tests/lib/mocha-3.1.0/test/integration/only.spec.js45
-rw-r--r--tests/lib/mocha-3.1.0/test/integration/options.spec.js182
-rw-r--r--tests/lib/mocha-3.1.0/test/integration/pending.spec.js100
-rw-r--r--tests/lib/mocha-3.1.0/test/integration/regression.spec.js97
-rw-r--r--tests/lib/mocha-3.1.0/test/integration/reporters.spec.js61
-rw-r--r--tests/lib/mocha-3.1.0/test/integration/retries.spec.js106
-rw-r--r--tests/lib/mocha-3.1.0/test/integration/suite.spec.js42
-rw-r--r--tests/lib/mocha-3.1.0/test/integration/timeout.spec.js16
-rw-r--r--tests/lib/mocha-3.1.0/test/integration/uncaught.spec.js35
-rw-r--r--tests/lib/mocha-3.1.0/test/jsapi/index.js29
-rw-r--r--tests/lib/mocha-3.1.0/test/mocha.opts8
-rw-r--r--tests/lib/mocha-3.1.0/test/mocha.spec.js33
-rw-r--r--tests/lib/mocha-3.1.0/test/ms.spec.js82
-rw-r--r--tests/lib/mocha-3.1.0/test/reporters/base.spec.js214
-rw-r--r--tests/lib/mocha-3.1.0/test/reporters/json.spec.js61
-rw-r--r--tests/lib/mocha-3.1.0/test/reporters/nyan.spec.js30
-rw-r--r--tests/lib/mocha-3.1.0/test/runnable.spec.js470
-rw-r--r--tests/lib/mocha-3.1.0/test/runner.spec.js420
-rw-r--r--tests/lib/mocha-3.1.0/test/sanity/sanity.spec.js9
-rw-r--r--tests/lib/mocha-3.1.0/test/suite.spec.js439
-rw-r--r--tests/lib/mocha-3.1.0/test/test.spec.js76
-rw-r--r--tests/lib/mocha-3.1.0/test/utils.spec.js259
-rw-r--r--tests/lib/q-1.4.1/CHANGES.md2
-rw-r--r--tests/lib/screenshot-testing/support/app.js6
-rw-r--r--tests/lib/screenshot-testing/support/diff-viewer.js4
-rw-r--r--tests/lib/screenshot-testing/support/page-renderer.js9
932 files changed, 35161 insertions, 13869 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 53bbd03c19..08e09abd05 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,31 +4,11 @@ This is the Developer Changelog for Piwik platform developers. All changes in ou
The Product Changelog at **[piwik.org/changelog](http://piwik.org/changelog)** lets you see more details about any Piwik release, such as the list of new guides and FAQs, security fixes, and links to all closed issues.
-## Piwik 2.16.3
-
-### New APIs
-* The Piwik JavaScript tracker has a new method `trackRequest` that allows you to send any tracking parameters to Piwik. For example `_paq.push(['trackRequest', 'te=foo&bar=baz'])`
-
-### Internal Changes
-* Expected screenshots for UI tests are now stored using Git LFS instead of a submodule. Running, creating or updating UI tests will require Git LFS to be installed.
-The folder containing expected screenshots was renamed from `expected-ui-screenshots` to `expected-screenshots`. The UI-Test-Runner is now able to handle both names.
-
-## Piwik 2.16.2
+## Piwik 3.0.0
-### New APIs
- * Multiple JavaScript trackers can now be created easily via `_paq.push(['addTracker', piwikUrl, piwikSiteId])`. All tracking requests will be then sent to all added Piwik trackers. [Learn more.](http://developer.piwik.org/guides/tracking-javascript-guide#multiple-piwik-trackers)
- * It is possible to get an asynchronously created tracker instance (`addTracker`) via the method `Piwik.getAsyncTracker(optionalPiwikUrl, optionalPiwikSiteId)`. This allows you to get the tracker instance and to send different tracking requests to this Piwik instance and to configure it differently than other tracker instances.
- * Added a new API method `Goals.getGoal($idSite, $idGoal)` to fetch a single goal.
-
-### Internal change
- * Piwik is now compatible with PHP7.
- * `piwik.js`, if you call the method `setDomains` note that that the behavior has slightly changed. The current page domain (hostname) will now be added automatically if none of the given host alias passed as a parameter to `setDomains` contain a path and if no host alias is already given for the current host alias.
- Say you are on "example.org" and set `hostAlias = ['example.com', 'example.org/test']` then the current "example.org" domain will not be added as there is already a more restrictive hostAlias 'example.org/test' given.
- We also do not add the current page domain (hostname) automatically if there was any other host specifying any path such as `['example.com', 'example2.com/test']`.
- In this case we also do not add the current page domain "example.org" automatically as the "path" feature is used. As soon as someone uses the path feature, for Piwik JS Tracker to work correctly in all cases, one needs to specify all hosts manually. [Learn more.](http://developer.piwik.org/guides/tracking-javascript-guide#measuring-domains-andor-sub-domains)
- * `piwik.js`: after an ecommerce order is tracked using `trackEcommerceOrder`, the items in the cart will now be removed from the JavaScript object. Calling `trackEcommerceCartUpdate` will not remove the items in the cart.
+### New guide
-## Piwik 3.0.0
+Read more about migrating a plugin from Piwik 2.X to Piwik 3 in [our Migration guide](http://developer.piwik.org/guides/migrate-piwik-2-to-3).
### Breaking Changes
* The menu classes `Piwik\Menu\MenuReporting` and `Piwik\Menu\MenuMain` have been removed
@@ -51,7 +31,7 @@ The folder containing expected screenshots was renamed from `expected-ui-screens
* A new methd `Piwik\Menu\MenuAdmin::addMeasurablesItem()` was added.
* The class `Piwik\Plugin\Settings` has been splitted to `Piwik\Settings\Plugin\SystemSettings` and `Piwik\Settings\Plugin\UserSettings`.
* The creation of settings has slightly changed to improve performance. It is now possible to create new settings via the method `$this->makeSetting()` see `Piwik\Plugins\ExampleSettingsPlugin\SystemSettings` for an example.
-* It is no possible to define an introduction text for settings.
+* It is no longer possible to define an introduction text for settings.
* If requesting multipe periods for one report, the keys that define the range are no longer translated. For example before 3.0 an API response may contain: `<result date="From 2010-02-01 to 2010-02-07">` which is now `<result date="2010-02-01,2010-02-07">`.
* The following deprecated events have been removed as mentioned.
* `Tracker.existingVisitInformation` Use [dimensions](http://developer.piwik.org/guides/dimensions) instead of using `Tracker` events.
@@ -68,6 +48,7 @@ The folder containing expected screenshots was renamed from `expected-ui-screens
* `Login.authenticate` Create a custom SessionInitializer instead of using `Login` events
* `Login.initSession.end`
* `Login.authenticate.successful`
+* When posting one of the events `API.Request.dispatch`, `API.Request.dispatch.end`, `API.$plugin.$apiAction`, or `API.$plugin.$apiAction.end` the `$finalParameters` parameter is indexed in Piwik 2 (eg `array(1, 6)`), and named in Piwik 3 (eg `array('idSite' => 1, 'idGoal' => 6)`)
Read more about migrating a plugin from Piwik 2.X to Piwik 3 on our [Migration guide](https://developer.piwik.org/guides/migrate-piwik-2-to-3).
@@ -96,17 +77,43 @@ Read more about migrating a plugin from Piwik 2.X to Piwik 3 on our [Migration g
* `PluginManager.pluginInstalled` triggered after a plugin was installed
* `PluginManager.pluginUninstalled` triggered after a plugin was uninstalled
* New HTTP Tracking API parameter `pv_id` which accepts a six character unique ID that identifies which actions were performed on a specific page view. Read more about it in the [HTTP Tracking API](https://developer.piwik.org/api-reference/tracking-api);
+* New event `Segment.addSegments` that lets you add segments.
### New features
-* New "Sparklines" visualization that lets you create a widget showing multiple sparklines
+* New "Sparklines" visualization that lets you create a widget showing multiple sparklines.
### Library updates
* Updated AngularJS from 1.2.28 to 1.4.3
+* Updated several backend libraries to their latest version: doctrine/cache, php-di.
### Internal change
* Support for IE8 was dropped. This affects only the Piwik UI, not the Piwik.js Tracker.
-* Required PHP version was changed from 5.3 to 5.5
-* We have updated PhantomJS 1.9 to 2.1.1 for our screenshot tests.
+* Required PHP version was increased from 5.3 to 5.5.9
+* We have updated PhantomJS 1.9 to 2.1.1 for our UI screenshot tests.
+
+## Piwik 2.16.3
+
+### New APIs
+* The Piwik JavaScript tracker has a new method `trackRequest` that allows you to send any tracking parameters to Piwik. For example `_paq.push(['trackRequest', 'te=foo&bar=baz'])`
+
+### Internal Changes
+* Expected screenshots for UI tests are now stored using Git LFS instead of a submodule. Running, creating or updating UI tests will require Git LFS to be installed.
+The folder containing expected screenshots was renamed from `expected-ui-screenshots` to `expected-screenshots`. The UI-Test-Runner is now able to handle both names.
+
+## Piwik 2.16.2
+
+### New APIs
+ * Multiple JavaScript trackers can now be created easily via `_paq.push(['addTracker', piwikUrl, piwikSiteId])`. All tracking requests will be then sent to all added Piwik trackers. [Learn more.](http://developer.piwik.org/guides/tracking-javascript-guide#multiple-piwik-trackers)
+ * It is possible to get an asynchronously created tracker instance (`addTracker`) via the method `Piwik.getAsyncTracker(optionalPiwikUrl, optionalPiwikSiteId)`. This allows you to get the tracker instance and to send different tracking requests to this Piwik instance and to configure it differently than other tracker instances.
+ * Added a new API method `Goals.getGoal($idSite, $idGoal)` to fetch a single goal.
+
+### Internal change
+ * Piwik is now compatible with PHP7.
+ * `piwik.js`, if you call the method `setDomains` note that that the behavior has slightly changed. The current page domain (hostname) will now be added automatically if none of the given host alias passed as a parameter to `setDomains` contain a path and if no host alias is already given for the current host alias.
+ Say you are on "example.org" and set `hostAlias = ['example.com', 'example.org/test']` then the current "example.org" domain will not be added as there is already a more restrictive hostAlias 'example.org/test' given.
+ We also do not add the current page domain (hostname) automatically if there was any other host specifying any path such as `['example.com', 'example2.com/test']`.
+ In this case we also do not add the current page domain "example.org" automatically as the "path" feature is used. As soon as someone uses the path feature, for Piwik JS Tracker to work correctly in all cases, one needs to specify all hosts manually. [Learn more.](http://developer.piwik.org/guides/tracking-javascript-guide#measuring-domains-andor-sub-domains)
+ * `piwik.js`: after an ecommerce order is tracked using `trackEcommerceOrder`, the items in the cart will now be removed from the JavaScript object. Calling `trackEcommerceCartUpdate` will not remove the items in the cart.
## Piwik 2.16.1
@@ -197,7 +204,7 @@ Read more about migrating a plugin from Piwik 2.X to Piwik 3 on our [Migration g
* `Tracker.recordAction`
* `Tracker.recordEcommerceGoal`
* `Tracker.recordStandardGoals`
-* The Platform API method `\Piwik\Plugin::getListHooksRegistered()` has been deprecated and will be removed in Piwik 3.0. Use `\Piwik\Plugin::registerEvents()` instead.
+* The Platform API method `\Piwik\Plugin::getListHooksRegistered()` has been deprecated and will be removed in Piwik 4.0. Use `\Piwik\Plugin::registerEvents()` instead.
### Internal changes
diff --git a/core/API/Proxy.php b/core/API/Proxy.php
index 1d348e1b87..7e88841f2a 100644
--- a/core/API/Proxy.php
+++ b/core/API/Proxy.php
@@ -105,6 +105,9 @@ class Proxy extends Singleton
$doc = preg_replace("/(@package)[a-z _A-Z]*/", "", $doc);
$doc = preg_replace("/(@method).*/", "", $doc);
$doc = str_replace(array("\t", "\n", "/**", "*/", " * ", " *", " ", "\t*", " * @package"), " ", $doc);
+
+ // replace 'foo' and `bar` and "foobar" with code blocks... much magic
+ $doc = preg_replace('/`(.*?)`/', '<code>$1</code>', $doc);
$this->metadataArray[$className]['__documentation'] = $doc;
}
@@ -204,8 +207,16 @@ class Proxy extends Singleton
*/
Piwik::postEvent(sprintf('API.%s.%s', $pluginName, $methodName), array(&$finalParameters));
+ $apiParametersInCorrectOrder = array();
+
+ foreach ($parameterNamesDefaultValues as $name => $defaultValue) {
+ if (isset($finalParameters[$name]) || array_key_exists($name, $finalParameters)) {
+ $apiParametersInCorrectOrder[] = $finalParameters[$name];
+ }
+ }
+
// call the method
- $returnedValue = call_user_func_array(array($object, $methodName), $finalParameters);
+ $returnedValue = call_user_func_array(array($object, $methodName), $apiParametersInCorrectOrder);
$endHookParams = array(
&$returnedValue,
@@ -405,7 +416,7 @@ class Proxy extends Singleton
} catch (Exception $e) {
throw new Exception(Piwik::translate('General_PleaseSpecifyValue', array($name)));
}
- $finalParameters[] = $requestValue;
+ $finalParameters[$name] = $requestValue;
}
return $finalParameters;
}
diff --git a/core/API/Request.php b/core/API/Request.php
index 6ddb8333f5..ee14cdca15 100644
--- a/core/API/Request.php
+++ b/core/API/Request.php
@@ -12,13 +12,13 @@ use Exception;
use Piwik\Access;
use Piwik\Common;
use Piwik\DataTable;
+use Piwik\Exception\PluginDeactivatedException;
+use Piwik\Log;
use Piwik\Piwik;
-use Piwik\PluginDeactivatedException;
+use Piwik\Plugin\Manager as PluginManager;
use Piwik\SettingsServer;
use Piwik\Url;
use Piwik\UrlHelper;
-use Piwik\Log;
-use Piwik\Plugin\Manager as PluginManager;
/**
* Dispatches API requests to the appropriate API method.
diff --git a/core/Date.php b/core/Date.php
index 8922ed8ac2..dd2051a1a0 100644
--- a/core/Date.php
+++ b/core/Date.php
@@ -258,7 +258,7 @@ class Date
}
/**
- * Converts a timestamp in a from UTC to a timezone.
+ * Converts a timestamp from UTC to a timezone.
*
* @param int $timestamp The UNIX timestamp to adjust.
* @param string $timezone The timezone to adjust to.
@@ -266,6 +266,10 @@ class Date
*/
public static function adjustForTimezone($timestamp, $timezone)
{
+ if (empty($timezone)) {
+ return $timestamp;
+ }
+
// manually adjust for UTC timezones
$utcOffset = self::extractUtcOffset($timezone);
if ($utcOffset !== false) {
diff --git a/core/Db/Schema/Mysql.php b/core/Db/Schema/Mysql.php
index 3a91752e8e..146ee77068 100644
--- a/core/Db/Schema/Mysql.php
+++ b/core/Db/Schema/Mysql.php
@@ -86,7 +86,7 @@ class Mysql implements SchemaInterface
",
'site_setting' => "CREATE TABLE {$prefixTables}site_setting (
- idsite INTEGER(10) UNSIGNED NOT NULL AUTO_INCREMENT,
+ idsite INTEGER(10) UNSIGNED NOT NULL,
`plugin_name` VARCHAR(60) NOT NULL,
`setting_name` VARCHAR(255) NOT NULL,
`setting_value` LONGTEXT NOT NULL,
diff --git a/core/Exception/ErrorException.php b/core/Exception/ErrorException.php
index 2de42f2898..77c7ea3287 100644
--- a/core/Exception/ErrorException.php
+++ b/core/Exception/ErrorException.php
@@ -11,7 +11,6 @@ namespace Piwik\Exception;
/**
* ErrorException
*
- * @author Matthieu Napoli <matthieu@mnapoli.fr>
*/
class ErrorException extends \ErrorException
{
diff --git a/core/PluginDeactivatedException.php b/core/Exception/PluginDeactivatedException.php
index fe42667674..d0582840e5 100644
--- a/core/PluginDeactivatedException.php
+++ b/core/Exception/PluginDeactivatedException.php
@@ -6,7 +6,7 @@
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
-namespace Piwik;
+namespace Piwik\Exception;
/**
* Exception thrown when the requested plugin is not activated in the config file
diff --git a/core/Filechecks.php b/core/Filechecks.php
index ee29adad7e..387fa244ca 100644
--- a/core/Filechecks.php
+++ b/core/Filechecks.php
@@ -9,6 +9,8 @@
namespace Piwik;
use Piwik\Exception\MissingFilePermissionException;
+use Piwik\Plugins\CustomPiwikJs\Exception\AccessDeniedException;
+use Piwik\Plugins\CustomPiwikJs\TrackerUpdater;
class Filechecks
{
@@ -102,6 +104,40 @@ class Filechecks
throw $ex;
}
+ private static function isModifiedPathValid($path)
+ {
+ if ($path === 'piwik.js') {
+ // we could have used a postEvent hook to enrich "\Piwik\Manifest::$files;" which would also benefit plugins
+ // that want to check for file integrity but we do not want to risk to break anything right now. It is not
+ // as trivial because piwik.js might be already updated, or updated on the next request. We cannot define
+ // 2 or 3 different filesizes and md5 hashes for one file so we check it here.
+
+ if (Plugin\Manager::getInstance()->isPluginActivated('CustomPiwikJs')) {
+ $trackerUpdater = new TrackerUpdater();
+
+ if ($trackerUpdater->getCurrentTrackerFileContent() === $trackerUpdater->getUpdatedTrackerFileContent()) {
+ // file was already updated, eg manually or via custom piwik.js, this is a valid piwik.js file as
+ // it was enriched by tracker plugins
+ return true;
+ }
+
+ try {
+ // the piwik.js tracker file was not updated yet, but may be updated just after the update by
+ // one of the events CustomPiwikJs is listening to or by a scheduled task.
+ // In this case, we check whether such an update will succeed later and if it will, the file is
+ // valid as well as it will be updated on the next request
+ $trackerUpdater->checkWillSucceed();
+ return true;
+ } catch (AccessDeniedException $e) {
+ return false;
+ }
+
+ }
+ }
+
+ return false;
+ }
+
/**
* Get file integrity information (in PIWIK_INCLUDE_PATH).
*
@@ -136,6 +172,11 @@ class Filechecks
if (!file_exists($file) || !is_readable($file)) {
$messages[] = Piwik::translate('General_ExceptionMissingFile', $file);
} elseif (filesize($file) != $props[0]) {
+
+ if (self::isModifiedPathValid($path)) {
+ continue;
+ }
+
if (!$hasMd5 || in_array(substr($path, -4), array('.gif', '.ico', '.jpg', '.png', '.swf'))) {
// files that contain binary data (e.g., images) must match the file size
$messages[] = Piwik::translate('General_ExceptionFilesizeMismatch', array($file, $props[0], filesize($file)));
@@ -150,6 +191,10 @@ class Filechecks
}
}
} elseif ($hasMd5file && (@md5_file($file) !== $props[1])) {
+ if (self::isModifiedPathValid($path)) {
+ continue;
+ }
+
$messages[] = Piwik::translate('General_ExceptionFileIntegrity', $file);
}
}
diff --git a/core/FrontController.php b/core/FrontController.php
index 79e1bc52cd..569f541dfa 100644
--- a/core/FrontController.php
+++ b/core/FrontController.php
@@ -14,6 +14,7 @@ use Piwik\API\Request;
use Piwik\Container\StaticContainer;
use Piwik\Exception\AuthenticationFailedException;
use Piwik\Exception\DatabaseSchemaIsNewerThanCodebaseException;
+use Piwik\Exception\PluginDeactivatedException;
use Piwik\Http\ControllerResolver;
use Piwik\Http\Router;
use Piwik\Plugins\CoreAdminHome\CustomLogo;
@@ -95,7 +96,7 @@ class FrontController extends Singleton
/**
* Executes the requested plugin controller method.
*
- * @throws Exception|\Piwik\PluginDeactivatedException in case the plugin doesn't exist, the action doesn't exist,
+ * @throws Exception|\Piwik\Exception\PluginDeactivatedException in case the plugin doesn't exist, the action doesn't exist,
* there is not enough permission, etc.
*
* @param string $module The name of the plugin whose controller to execute, eg, `'UserCountryMap'`.
diff --git a/core/Plugin/Manager.php b/core/Plugin/Manager.php
index c38773380d..9bd2231df8 100644
--- a/core/Plugin/Manager.php
+++ b/core/Plugin/Manager.php
@@ -12,26 +12,25 @@ namespace Piwik\Plugin;
use Piwik\Application\Kernel\PluginList;
use Piwik\Cache;
use Piwik\Columns\Dimension;
-use Piwik\Config as PiwikConfig;
use Piwik\Config;
-use Piwik\Db;
-use Piwik\Settings\Storage as SettingsStorage;
+use Piwik\Config as PiwikConfig;
use Piwik\Container\StaticContainer;
+use Piwik\Db;
use Piwik\EventDispatcher;
use Piwik\Filesystem;
use Piwik\Log;
use Piwik\Notification;
use Piwik\Piwik;
use Piwik\Plugin;
-use Piwik\PluginDeactivatedException;
+use Piwik\Plugin\Dimension\ActionDimension;
+use Piwik\Plugin\Dimension\ConversionDimension;
+use Piwik\Plugin\Dimension\VisitDimension;
use Piwik\Session;
+use Piwik\Settings\Storage as SettingsStorage;
use Piwik\Theme;
use Piwik\Tracker;
use Piwik\Translation\Translator;
use Piwik\Updater;
-use Piwik\Plugin\Dimension\ActionDimension;
-use Piwik\Plugin\Dimension\ConversionDimension;
-use Piwik\Plugin\Dimension\VisitDimension;
require_once PIWIK_INCLUDE_PATH . '/core/EventDispatcher.php';
@@ -468,7 +467,8 @@ class Manager
{
$plugins = $this->pluginList->getActivatedPlugins();
if (in_array($pluginName, $plugins)) {
- throw new \Exception("Plugin '$pluginName' already activated.");
+ // plugin is already activated
+ return;
}
if (!$this->isPluginInFilesystem($pluginName)) {
diff --git a/core/Report/ReportWidgetConfig.php b/core/Report/ReportWidgetConfig.php
index 3169280ef5..5f091800e6 100644
--- a/core/Report/ReportWidgetConfig.php
+++ b/core/Report/ReportWidgetConfig.php
@@ -7,7 +7,6 @@
*
*/
namespace Piwik\Report;
-use Piwik\ViewDataTable\Factory;
use Piwik\Widget\WidgetConfig;
/**
diff --git a/core/Updates/2.16.3-b3.php b/core/Updates/2.16.5.php
index e5f2075c71..c5aef85066 100644
--- a/core/Updates/2.16.3-b3.php
+++ b/core/Updates/2.16.5.php
@@ -16,24 +16,25 @@ use Piwik\Updater;
use Piwik\Updates as PiwikUpdates;
/**
- * Update for version 2.16.3-b3.
+ * Update for version 2.16.5.
*
* Update existing scheduled reports to use UTC timezone for hour setting
*/
-class Updates_2_16_3_b3 extends PiwikUpdates
+class Updates_2_16_5 extends PiwikUpdates
{
public function doUpdate(Updater $updater)
{
$model = new ScheduledReportsModel();
$allReports = ScheduledReportsAPI::getInstance()->getReports();
foreach ($allReports as $report) {
- $report['hour'] = $this->adjustTimezoneBySite($report['hour'], $report['idsite']);
- $model->updateReport($report['idreport'], $report);
+ $update = array('hour' => $this->adjustTimezoneBySite($report['hour'], $report['idsite']));
+ $model->updateReport($report['idreport'], $update);
}
}
protected function adjustTimezoneBySite($hour, $idSite)
{
+ $timezone = Site::getTimezoneFor($idSite);
$timeZoneDifference = -ceil(Date::getUtcOffset($timezone)/3600);
return (24 + $hour + $timeZoneDifference) % 24;
}
diff --git a/core/Updates/3.0.0-b1.php b/core/Updates/3.0.0-b1.php
index bb3bf57350..1b08d48fcb 100644
--- a/core/Updates/3.0.0-b1.php
+++ b/core/Updates/3.0.0-b1.php
@@ -68,11 +68,8 @@ class Updates_3_0_0_b1 extends Updates
ServerFilesGenerator::createHtAccessFiles();
// Renamed plugin ExampleRssWidget -> RssWidget
- try {
- \Piwik\Plugin\Manager::getInstance()->activatePlugin('RssWidget');
- \Piwik\Plugin\Manager::getInstance()->deactivatePlugin('ExampleRssWidget');
- } catch (\Exception $e) {
- }
+ \Piwik\Plugin\Manager::getInstance()->activatePlugin('RssWidget');
+ \Piwik\Plugin\Manager::getInstance()->deactivatePlugin('ExampleRssWidget');
}
private function migratePluginEmailUpdateSetting()
@@ -166,17 +163,23 @@ class Updates_3_0_0_b1 extends Updates
private function getSiteSettingsMigrations($queries)
{
$table = $this->siteSettingsTable;
- $queries[] = $this->migration->db->addColumn($table, 'plugin_name', 'VARCHAR(60) NOT NULL', $afer = 'idsite');
+
+ // we cannot migrate existing settings as we do not know the related plugin name, but this feature
+ // (measurablesettings) was not used anyway. also see https://github.com/piwik/piwik/issues/10703
+ // we make sure to recreate the table as it might not have existed for some users instead of just
+ // deleting the content of it
+ $queries[] = $this->migration->db->dropTable($table);
+ $queries[] = $this->migration->db->createTable($table, array(
+ 'idsite' => 'INTEGER(10) UNSIGNED NOT NULL',
+ 'plugin_name' => 'VARCHAR(60) NOT NULL',
+ 'setting_name' => 'VARCHAR(255) NOT NULL',
+ 'setting_value' => 'LONGTEXT NOT NULL',
+ ));
$table = Common::prefixTable($table);
- $queries[] = $this->migration->db->sql("ALTER TABLE `$table` DROP PRIMARY KEY, ADD INDEX(idsite, plugin_name);",
+ $queries[] = $this->migration->db->sql("ALTER TABLE `$table` ADD INDEX(idsite, plugin_name);",
Migration\Db::ERROR_CODE_COLUMN_NOT_EXISTS);
- // we cannot migrate existing settings as we do not know the related plugin name, but this feature
- // (measurablesettings) was not really used anyway. If a migration is somewhere really needed it has to be
- // handled in the plugin
- $queries[] = $this->migration->db->sql(sprintf('DELETE FROM `%s`', $table));
-
return $queries;
}
diff --git a/core/Updates/3.0.0-b2.php b/core/Updates/3.0.0-b2.php
new file mode 100644
index 0000000000..17c0fce85b
--- /dev/null
+++ b/core/Updates/3.0.0-b2.php
@@ -0,0 +1,24 @@
+<?php
+/**
+ * Piwik - free/libre analytics platform
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ *
+ */
+
+namespace Piwik\Updates;
+
+use Piwik\Db;
+use Piwik\Plugins\Dashboard;
+use Piwik\Updater;
+use Piwik\Updater\Migration;
+use Piwik\Updates;
+
+class Updates_3_0_0_b2 extends Updates
+{
+ public static function isMajorUpdate()
+ {
+ return true;
+ }
+}
diff --git a/core/Version.php b/core/Version.php
index 224db01a2c..9a9fee75b4 100644
--- a/core/Version.php
+++ b/core/Version.php
@@ -20,7 +20,7 @@ final class Version
* The current Piwik version.
* @var string
*/
- const VERSION = '3.0.0-b1';
+ const VERSION = '3.0.0-b2';
public function isStableVersion($version)
{
diff --git a/core/Widget/WidgetConfig.php b/core/Widget/WidgetConfig.php
index fcfc72c24b..e50afaff7c 100644
--- a/core/Widget/WidgetConfig.php
+++ b/core/Widget/WidgetConfig.php
@@ -29,6 +29,7 @@ class WidgetConfig
protected $order = 99;
protected $isEnabled = true;
protected $isWidgetizable = true;
+ protected $isWide = false;
/**
* Set the id of the category the widget belongs to.
@@ -345,5 +346,24 @@ class WidgetConfig
return $this->middlewareParameters;
}
+ /**
+ * Marks this widget as a "wide" widget that requires the full width.
+ *
+ * @return $this
+ */
+ public function setIsWide()
+ {
+ $this->isWide = true;
+ return $this;
+ }
+
+ /**
+ * Detect whether the widget should be shown wide or not.
+ * @return bool
+ */
+ public function isWide()
+ {
+ return $this->isWide;
+ }
} \ No newline at end of file
diff --git a/lang/ar.json b/lang/ar.json
index 3cf538d2f8..0332fc3b6b 100644
--- a/lang/ar.json
+++ b/lang/ar.json
@@ -9,6 +9,7 @@
"Add": "أضف",
"AfterEntry": "بعد الدخول هنا",
"All": "الكل",
+ "AllowPiwikArchivingToTriggerBrowser": "إحفظ التقارير عند عرضها من المتصفح",
"AllWebsitesDashboard": "لوحة التحكم لكافة المواقع",
"And": "و",
"API": "واجهة تحكم التطبيقات",
@@ -62,6 +63,8 @@
"ColumnRevenue": "الأرباح",
"ColumnSumVisitLength": "إجمالي الوقت الذي استغرقه الزائر (بالثواني)",
"ColumnTotalPageviews": "إجمالي عدد المشاهدات",
+ "ColumnUniqueEntrances": "دخلات فريدة",
+ "ColumnUniqueExits": "خرجات فريدة",
"ColumnUniquePageviews": "المشاهدات الفريدة",
"ColumnValuePerVisit": "القيمة لكل زيارة",
"ColumnVisitDuration": "مدة الزيارة (بالثواني)",
@@ -75,10 +78,12 @@
"Daily": "يومي",
"DailyReport": "يومي",
"DailyReports": "التقارير اليومية",
+ "DailySum": "المجموع اليومي",
"DashboardForASpecificWebsite": "اللوحة الرئيسية لموقع محدد",
"Date": "التاريخ",
"DateRange": "فترة معينة:",
"DateRangeFrom": "من",
+ "DateRangeInPeriodList": "مدى التاريخ",
"DateRangeTo": "إلى",
"DaysHours": "%1$s أيام %2$s ساعات",
"DaysSinceFirstVisit": "أيام منذ أول زيارة",
@@ -108,13 +113,19 @@
"Edit": "تحرير",
"EncryptedSmtpTransport": "أدخل نوع التشفير المطلوب بواسطة خادم SMTP",
"Error": "خطأ",
+ "Errors": "أخطاء",
"ErrorRequest": "عفوا ... كان هناك مشكلة أثناء الطلب. ربما يواجه الخادم مشكلة مؤقتة، أو ربما طلبت تقريرا يحوي عدد كبير من البيانات. حاول مرة اخرى. في حالة حدوث هذا الخطأ بشكل متكرر يرجى %1$s الاتصال بالمشرف ب Piwik %2$s للحصول على المساعدة.",
"EvolutionOverPeriod": "النمو خلال فترة معينة",
+ "ExceptionCheckUserHasSuperUserAccessOrIsTheUser": "لابد أن يكون المستخدم مستخدماً فائقاً أو المستخدم '%s' نفسه.",
"ExceptionConfigurationFileNotFound": "لم يمكن العثور على ملف الإعدادات (%s).",
+ "ExceptionConfigurationFileExistsButNotReadable": "يبدو أن ملف الإعداد %s موجود ، لكن Piwik لايمكنه قراءته.",
+ "ExceptionConfigurationFilePleaseCheckReadableByUser": "فضلاً تحقق من أن %1$s يمكن للمستخدم '%2$s' قراءته.",
"ExceptionDatabaseVersion": "%1$s إصدارك %2$s ولكن Piwik يتطلب على الأقل %3$s.",
+ "ExceptionDatabaseVersionNewerThanCodebaseWait": "قد يكون مشرفو Piwik لديك ينهون حالياً عملية الترقية. فضلاً حاول ثانية خلال بضع دقائق.",
"ExceptionFileIntegrity": "فشل فحص السلامة: %s",
"ExceptionFilesizeMismatch": "خطأ في حجم الملف: %1$s (الحجم المتوقع: %2$s، الحجم الفعلي: %3$s).",
"ExceptionIncompatibleClientServerVersions": "%1$s إصدار عميلك %2$s والذي هو غير متوافق مع إصدار الخادم %3$s.",
+ "ExceptionInvalidAggregateReportsFormat": "صيغة التقارير المجمَّعة '%1$s' غير صالحة. جرّب أياً من الصيغ التالية : %2$s .",
"ExceptionInvalidArchiveTimeToLive": "زمن الأرشفة لليوم يجب أن يكون رقماً أكبر من الصفر حيث يمثل الثواني.",
"ExceptionInvalidDateFormat": "يجب أن تكون صيغة التاريخ: %1$s أو أي كلمة استدلالية مدعومة بواسطة الدالة %2$s (انظر %3$s لمزيد من المعلومات).",
"ExceptionInvalidDateRange": "التاريخ \"%1$s\" ليس بفترة صالحة في التقويم. يجب أن تكون على الصيغة التالية: %2$s.",
@@ -129,8 +140,11 @@
"ExceptionPrivilege": "لا يمكنك الوصول لهذا المورد، فهو يتطلب صلاحيات وصول %s.",
"ExceptionPrivilegeAccessWebsite": "لا يمكنك مشاهدة هذا المورد، فهو يتطلب صلاحيات وصول %s لموقع id=%d.",
"ExceptionPrivilegeAtLeastOneWebsite": "لا يمكنك الوصول لهذا المورد، فهو يتطلب صلاحيات وصول %s على الأقل لموقع واحد.",
+ "ExceptionUnableToStartSession": "لا يمكن بدء الجلسة.",
"ExceptionUndeletableFile": "لم يمكن حذف %s",
"ExceptionUnreadableFileDisabledMethod": "لم يمكن قراءة ملف الإعدادات (%1$s). قد يكون المستضيف قد عطل %2$s.",
+ "ExceptionReportNotFound": "التقرير المطلوب غير موجود.",
+ "ExceptionWidgetNotFound": "عنصر الواجهة المطلوب غير موجود.",
"Export": "تصدير",
"ExportAsImage": "تصدير كصورة",
"ExportThisReport": "تصدير البيانات في هيئة ملفات أخرى",
@@ -142,7 +156,7 @@
"Forums": "المنتديات",
"FromReferrer": "من",
"GeneralInformation": "معلومات عامة",
- "General": "عام",
+ "GeneralSettings": "إعدادات عامة",
"GetStarted": "الشروع",
"GiveUsYourFeedback": "أخبرنا عن رأيك!",
"Goal": "هدف",
@@ -236,12 +250,15 @@
"Others": "أخرى",
"Outlink": "رابط صادر",
"Outlinks": "الروابط الصادرة",
+ "OverlayRowActionTooltip": "شاهد البيانات الإحصائية مباشرة على صفحة موقعك (ستفتح تبويباً جديداً)",
+ "OverlayRowActionTooltipTitle": "فتح الإحصاءات على الصفحة",
"Overview": "نظرة عامة",
"Pages": "الصفحات",
"Password": "كلمة المرور",
"Period": "الفترة",
"Piechart": "رسم بياني",
"PiwikXIsAvailablePleaseUpdateNow": "Piwik %1$s متوفر الآن. %2$s الرجاء التحديث الآن! %3$s (انظر %4$s التغييرات %5$s).",
+ "PleaseContactYourPiwikAdministrator": "فضلاً اتصل بمشرف Piwik لديك.",
"PleaseSpecifyValue": "الرجاء تحديد قيمة للحقل \"%s\".",
"PleaseUpdatePiwik": "الرجاء تحديث Piwik",
"Plugin": "التطبيق",
@@ -251,61 +268,101 @@
"PreviousDays": "%s يوم سابق (لا يشمل اليوم الحالي)",
"PreviousDaysShort": "الأيام %s السابقة",
"Price": "السعر",
+ "ProductConversionRate": "معدل تحويل المنتج",
+ "ProductRevenue": "إيراد المنتج",
"PurchasedProducts": "شراء المنتجات",
"Quantity": "الكمية",
"RecordsToPlot": "السجلات لرسم",
+ "Refresh": "تحديث",
"RefreshPage": "تحديث الصفحة",
+ "RelatedReport": "تقرير متصل",
+ "RelatedReports": "تقارير ذات صلة",
+ "Remove": "حذف",
"Report": "تقرير",
+ "ReportGeneratedFrom": "استخدمت البيانات من %s لإنشاء هذا التقرير.",
"Reports": "تقارير",
"ReportsWillBeProcessedAtMostEveryHour": "وبذلك سيتم معالجة التقارير كل ساعة بحد أقصى.",
"RequestTimedOut": "انتهت صلاحية طلب البيانات المرسل إلى %s. يرجى المحاولة مرة أخرى.",
"Required": "%s مطلوب",
"ReturningVisitor": "زائر متكرر",
+ "ReturningVisitorAllVisits": "عرض كل الزيارات",
+ "Rows": "صفوف",
"RowsToDisplay": "الصفوف التي تريد عرضها",
"Save": "حفظ",
"SaveImageOnYourComputer": "لحفظ الصورة على جهازك، انقر بز الفأرة الأيمن واختر \"حفظ الصورة باسم\"...",
"Search": "بحث",
+ "Clear": "مسح",
+ "SearchNoResults": "لا نتائج",
+ "SeeAll": "مشاهدة الكل",
"SeeTheOfficialDocumentationForMoreInformation": "انظر %1$sمستندات المساعدة الرسمية%2$s لمزيد من المعلومات.",
+ "Segment": "قطاع",
"SelectYesIfYouWantToSendEmailsViaServer": "اختر \"نعم\" إذا كنت ترغب في أو يتوجب عليك إرسال البريد الإلكتروني من خلال مزود معين بدلاً من دالة البريد الإلكتروني المحلية.",
"Settings": "الإعدادات",
+ "Show": "أظهر",
+ "SingleWebsitesDashboard": "لوحة معلومات موقع ويب واحد",
"SmallTrafficYouCanLeaveDefault": "للمواقع قليلة الزيارات، يمكنك ترك القيمة الافتراضية %s ثانية، ومراجعة التقارير في الوقت الحقيقي.",
"SmtpEncryption": "تشفير SMTP",
"SmtpPassword": "كلمة مرور SMTP",
"SmtpPort": "منفذ SMTP",
"SmtpServerAddress": "عنوان مزود SMTP",
"SmtpUsername": "اسم مستخدم SMTP",
+ "Source": "المصدر",
"Subtotal": "المجموع الفرعي",
"Summary": "موجز",
"Table": "جدول",
"TagCloud": "سحابة وسوم",
+ "TimeAgo": "منذ %s",
+ "TimeFormat": "صيفة التوقيت",
+ "TimeOnPage": "الوقت على الصفحة",
"Total": "مجموع",
"TotalRevenue": "إجمالي الإيرادات",
+ "TrackingScopePage": "صفحة",
+ "TrackingScopeVisit": "زيارة",
+ "TransitionsRowActionTooltipTitle": "فتح الانتقالات",
"TranslatorName": "Mustafa Rawi, Benkheil Abdelouali",
+ "UniquePurchases": "المشتريات الفريدة",
"Unknown": "غير معروف",
"Upload": "رفع",
+ "UserId": "معرّف المستخدم",
"Username": "اسم المستخدم",
"UseSMTPServerForEmail": "استخدم مزود بريد SMTP",
"Value": "القيمة",
"VBarGraph": "رسم بياني رأسي",
"View": "مشاهدة",
+ "ViewDocumentationFor": "عرض التوثيق لـ %1$s",
"Visit": "زيارة",
"VisitConvertedGoal": "الزيارات التي حققت هدفاً واحداً على الأقل",
"VisitConvertedGoalId": "زيارة تحويل معرف هدف محدد",
"VisitConvertedNGoals": "الزيارة حولت %s أهداف",
"VisitDuration": "متوسط زمن الزيارة (بالثواني)",
+ "Visitor": "الزائر",
"VisitorID": "معرف الزائر",
"VisitorIP": "عنوان IP للزائر",
"Visitors": "الزوار",
+ "VisitsWith": "الزيارات بـ %s",
"VisitorSettings": "إعدادات الزوار",
+ "VisitType": "نوع الزيارة",
"Warning": "تنبيه",
+ "PiwikCannotBeUpgradedBecausePhpIsTooOld": "لا يمكن ترقية Piwik إلى آخر إصدار رئيس لأن نسخة PHP لديك عتيقة.",
+ "PleaseUpgradeYourPhpVersionSoYourPiwikDataStaysSecure": "فضلاً حدّث نسخة PHP لديك إلى PHP %s على الأقل لتبقى بيانات تحليلات Piwik الخاصة بك في مأمن.",
"WarningFileIntegrityNoManifest": "لم يمكن إجراء فحص سلامة الملفات بسبب فقد ملف manifest.inc.php.",
+ "WarningFileIntegrityNoManifestDeployingFromGit": "هذه الرسالة طبيعية إن كنت تنشر Piwik من Git .",
"WarningFileIntegrityNoMd5file": "لم يمكن إتمام فحص سلامة الملفات بسبب فقد دالة md5_file().",
"WarningPasswordStored": "%1$sتنبيه:%2$s سيتم حفظ كلمة المرور هذه في ملف الإعدادات وظاهرة لأياً كان ممن يمكنه الوصول إليه.",
"Website": "الموقع",
"Weekly": "أسبوعي",
+ "WeeklyReport": "أسبوعي",
+ "WeeklyReports": "تقارير أسبوعيّة",
+ "WellDone": "أحسنت!",
"Widgets": "الإضافات",
+ "Widget": "عنصر واجهة",
+ "XComparedToY": "%1$s مقارنة بـ %2$s",
+ "YearlyReport": "سنويّا",
+ "YearlyReports": "تقارير سنويّة",
"YearsDays": "%1$s سنة %2$s أيام",
"Yes": "نعم",
+ "YouAreCurrentlyUsing": "أنت تشاهد حالياً نسخة Piwik %s .",
+ "YouAreViewingDemoShortMessage": "أنت تشاهد نسخة عرض من Piwik",
"YouMustBeLoggedIn": "يجب عليك تسجيل الدخول للوصول إلى هذه الخاصية.",
"YourChangesHaveBeenSaved": "تم حفظ التغييرات."
},
@@ -335,7 +392,9 @@
"HttpTimeout": "مهلة HTTP",
"LastUpdated": "آخر تحديث: %s",
"LoadingReport": "تحميل %s",
+ "LoginCredentials": "بيانات الاعتماد",
"LoginUseHttps": "استخدم https",
+ "MultiChartLabel": "إعرض الرسوم الصغيرة",
"NavigationBack": "العودة",
"NetworkError": "خطأ شبكة",
"NetworkErrorWithStatusCodeShort": "خطأ شبكة %s",
@@ -356,6 +415,7 @@
"RatingNow": "حسناً سأقيّمه الآن",
"Reloading": "إعادة تحميل...",
"RequestTimedOutShort": "خطأ مهلة الشبكة",
+ "RestrictedCompatibility": "توافق مقيّد",
"SaveSuccessError": "رابط Piwik أو اسم المستخدم و كلمة السر غير صحيح.",
"SearchWebsite": "بحث مواقع الوب",
"ShowAll": "عرض الكل",
@@ -363,11 +423,13 @@
"StaticGraph": "رسم النظرة العامّة",
"TopVisitedWebsites": "أكثر مواقع الويب تصفحاً",
"TryIt": "جربه !",
+ "VerifyAccount": "التحقق من الحساب",
"VerifyLoginData": "تأكد من أن اسم المستخدم وكلمة المرور صحيحين.",
"YouAreOffline": "نعتذر، لست مشتركاً حالياً"
},
"RowEvolution": {
"AvailableMetrics": "المقاييس المتوفرة",
+ "CompareDocumentation": "إضغط على الرابط أسفله و افتح هذه المنبثقة لسطر آخر من نفس الجدول لكي تقارن عدة تسجيلات.<br \/> إستعمل shift-click لتسجل السطر للمقارنة بدون فتح هذه المنبثقة.",
"CompareRows": "قارن السجلات",
"ComparingRecords": "مقارنة %s صفوف",
"MetricBetweenText": "من %1$s إلى %2$s",
diff --git a/lang/bg.json b/lang/bg.json
index 93c642b01c..936a6d304a 100644
--- a/lang/bg.json
+++ b/lang/bg.json
@@ -168,7 +168,6 @@
"Forums": "Форуми",
"FromReferrer": "от",
"GeneralInformation": "Обща информация",
- "General": "Общо",
"GetStarted": "Как да започнем",
"GiveUsYourFeedback": "Обратна връзка",
"Goal": "Цел",
diff --git a/lang/ca.json b/lang/ca.json
index 2ea32e3f67..9660315595 100644
--- a/lang/ca.json
+++ b/lang/ca.json
@@ -1,5 +1,7 @@
{
"General": {
+ "12HourClock": "Rellotge 12-hores",
+ "24HourClock": "Rellotge 24-hores",
"AbandonedCarts": "Cistelles abandonades",
"AboutPiwikX": "Sobre Piwik %s",
"Action": "Acció",
@@ -7,8 +9,11 @@
"Add": "Afegir",
"AfterEntry": "després d'entrar aquí",
"All": "Tots",
+ "AllowPiwikArchivingToTriggerBrowser": "Permetre que l'arxivat del Piwik es dispari quan els informes es veuen des del navegador",
"AllWebsitesDashboard": "Tauler de tots els llocs web",
+ "And": "i",
"API": "API",
+ "Apply": "Aplica",
"ArchivingInlineHelp": "Per llocs amb transit entre mig i alt, es recomana desactivar l'arxivat del Piwik des del navegador. En canvi, recomanem que configureu una tasca de cron per processar els informes de Piwik cada hora.",
"ArchivingTriggerDescription": "Recomanat per instal·lacions grans de Piwik, es pot %1$sconfigurar una %2$stasca programada per processar les entrades automàticament.",
"AuthenticationMethodSmtp": "Mètode d'autenticació SMTP",
@@ -22,11 +27,13 @@
"CannotUnzipFile": "No es pot descomprimir el fitxer %1$s: %2$s",
"ChangePassword": "Canvia la contrasenya",
"ChangeTagCloudView": "Si us plau, tingueu en compte que podeu veure l'informe en altres formes que en nuvol d'etiquetes. Feu servir els controls al peu de l'informe per fer-ho.",
+ "ChooseDate": "Seleccioneu una data, la data seleccionada actualment es: %s",
"ChooseLanguage": "Tria idioma",
"ChoosePeriod": "Triar període",
"ClickHere": "Fes clic aquí per més informació.",
"ClickToChangePeriod": "Torneu a clickar per canviar el període",
"Close": "Tanca",
+ "ClickToSearch": "Cliqueu per cercar",
"ColumnActionsPerVisit": "Accions per visita",
"ColumnActionsPerVisitDocumentation": "El número mig d'accions (pàgines vistes, descarregues o enllaços de sortida) que s'han fet durant les visites.",
"ColumnAverageTimeOnPage": "Temps mig a la pàgina",
@@ -76,6 +83,7 @@
"ConfigFileIsNotWritable": "El fitxer de configuració del Piwiki %1$s no es pot modificar, alguns dels canvis que has fet no es guardaran. Si us plau %2$s canvia els permisos del fitxer de configuració per tal que es pugui modificar.",
"Continue": "Continuar",
"ContinueToPiwik": "Vés cap al Piwik",
+ "CreatedByUser": "Creat per %s",
"CurrentMonth": "Mes actual",
"CurrentWeek": "Setmana actual",
"CurrentYear": "Any actual",
@@ -121,6 +129,7 @@
"Edit": "Edita",
"EncryptedSmtpTransport": "Entreu el xifrat de la capa de transport requerit per el vostre servidor SMTP.",
"Error": "Error",
+ "Errors": "Errors",
"EvolutionOverPeriod": "Evolució del període",
"ExceptionConfigurationFileNotFound": "El fitxer de configuració {%s} no s'ha trobat.",
"ExceptionDatabaseVersion": "La teva %1$s versió és %2$s però el Piwik necessita com a mínim %3$s",
@@ -146,6 +155,7 @@
"ExceptionUnableToStartSession": "No s'ha pogut començar la sessió.",
"ExceptionUndeletableFile": "No s'ha pogut esborrar %s",
"ExceptionUnreadableFileDisabledMethod": "El fitxer de configuració {%1$s} no s'ha pogut llegir. El vostre host pot tenir deshabilitat %2$s.",
+ "ExceptionReportNotFound": "El informe que s'ha seleccionat no existeix.",
"Export": "Exporta",
"ExportAsImage": "Exportar com a imatge",
"ExportThisReport": "Guardar aquestes dades en altres formats",
@@ -156,7 +166,7 @@
"Forums": "Fòrums",
"FromReferrer": "de",
"GeneralInformation": "Informació General",
- "General": "General",
+ "GeneralSettings": "Configuració general",
"GetStarted": "Comenceu",
"GiveUsYourFeedback": "Què penseu del Piwik?",
"Goal": "Objectiu",
@@ -172,6 +182,7 @@
"Installed": "Instal·lat",
"InvalidDateRange": "Rang de dates no vàlid, si us plau proveu-ho de nou",
"InvalidResponse": "Les dades rebudes són invàlides.",
+ "IP": "IP",
"JsTrackingTag": "Etiqueta de seguiment JavaScript",
"Language": "Idioma",
"LastDays": "Últims %s dies (incloent avui)",
@@ -201,6 +212,7 @@
"Name": "Nom",
"NbActions": "Número d'accions",
"NbSearches": "Nombre de cerques internes",
+ "NeedMoreHelp": "Necessiteu més ajuda?",
"Never": "Mai",
"NewReportsWillBeProcessedByCron": "Quan l'arxivat del piwik no es dispara per el navegador, els nous informes es processaran per el crontab.",
"NewUpdatePiwikX": "Nova actualització: Piwik %s",
@@ -213,6 +225,7 @@
"NotDefined": "%s sense definir",
"Note": "Nota",
"NotInstalled": "No instal·lat",
+ "NotRecommended": "no recomanat",
"NotValid": "%s no és vàlid",
"NumberOfVisits": "Número de visites",
"NUsers": "%s usuaris",
@@ -229,6 +242,11 @@
"OperationContains": "Conté",
"OperationDoesNotContain": "No conté",
"OperationEquals": "Es igual",
+ "OperationGreaterThan": "Major que",
+ "OperationLessThan": "Menor que",
+ "OperationNotEquals": "Diferent",
+ "OperationStartsWith": "Comença amb",
+ "OperationEndsWith": "Acaba amb",
"OptionalSmtpPort": "Opcional. Per defecte té el valor 25 per no xifrat i TLS SMTP, i 465 per SSL SMTP.",
"Options": "Opcions",
"OrCancel": "o %1$s cancel·la %2$s",
@@ -246,6 +264,7 @@
"Period": "Període",
"Piechart": "Gràfic de sectors",
"PiwikXIsAvailablePleaseUpdateNow": "Hi ha una nova versió del Piwik, %1$s, disponible! %2$s Si us plau, actualitzeu ara!%3$s (%4$s Mostra els canvis%5$s)",
+ "PleaseContactYourPiwikAdministrator": "Si us plau, contacteu amb el vostre administrador del Piwik.",
"PleaseSpecifyValue": "Si us plau especifiqueu el valor per '%s'",
"PleaseUpdatePiwik": "Si us plau actualitzeu el Piwik",
"Plugin": "Connector",
@@ -260,6 +279,7 @@
"PurchasedProducts": "Productes comprats",
"Quantity": "Quantitat",
"RangeReports": "Rang de data personalitzat",
+ "Recommended": "Recomanat",
"RecordsToPlot": "Entrades a mostrar",
"Refresh": "Actualitza",
"RefreshPage": "Actualitza la pàgina",
@@ -281,7 +301,9 @@
"Save": "Desa",
"SaveImageOnYourComputer": "Per guardar la imatge al vostre ordinador, feu click amb el botó dret sobre la imatge i trieu \"Guardar la imatge com..\"",
"Search": "Cerca",
+ "Clear": "Neteja",
"SearchNoResults": "Sense resultats",
+ "SeeAll": "veure-ho tot",
"SeeTheOfficialDocumentationForMoreInformation": "Vegeu la %1$sinformació oficial%2$s per més informació.",
"Segment": "Segment",
"SelectYesIfYouWantToSendEmailsViaServer": "Trieu \"si\" si voleu o heu d'enviar el correu a través de un servidor enlloc de a través de la funció mail local.",
@@ -303,6 +325,9 @@
"TimeOnPage": "Temps a la pàgina",
"Total": "Total",
"TotalRevenue": "Total Ingressos",
+ "TrackingScopeAction": "Acció",
+ "TrackingScopePage": "Pàgina",
+ "TrackingScopeVisit": "Visita",
"TransitionsRowActionTooltip": "Observar que van fer els visitants abans i desprès de veure aquesta pàgina",
"TransitionsRowActionTooltipTitle": "Obre les transicions",
"TranslatorName": "Isaac Sánchez Barrera, Joan Juvanteny",
@@ -310,6 +335,7 @@
"Unknown": "Desconegut",
"Upload": "Càrrega",
"UsePlusMinusIconsDocumentation": "Fes servir les icones de més i menys a l'esquerra per navegar.",
+ "UserId": "Identificador Usuari",
"Username": "Usuari",
"UseSMTPServerForEmail": "Fer servir un servidor SMTP per el correu",
"Value": "Valor",
@@ -326,6 +352,7 @@
"Visitors": "Visitants",
"VisitsWith": "Visites amb %s",
"VisitorSettings": "Configuració del visitant",
+ "VisitType": "Tipus de visitant",
"VisitTypeExample": "Per exemple, per seleccionar tots els visitants que han retornat al lloc web, incloent els que han comprat alguna cosa en anteriors visites, la petició de l'API tindria %s",
"Warning": "Avís",
"WarningFileIntegrityNoManifest": "La verificació de la integritat dels fitxers no s'ha pogut fer perquè falta el manifest.inc.php.",
@@ -343,6 +370,7 @@
"YearsDays": "%1$s anys %2$s dies",
"Yes": "Sí",
"YouAreCurrentlyUsing": "Ara mateix estàs fent servir el Piwik %s.",
+ "YouAreViewingDemoShortMessage": "Ara mateix estàs veient la demostració del Piwik",
"YouMustBeLoggedIn": "Has d'entrar per accedir a aquesta funcionalitat.",
"YourChangesHaveBeenSaved": "Els vostres canvis s'han guardat"
},
@@ -359,6 +387,7 @@
"ChooseHttpTimeout": "Seleccioneu el temps d'expiració HTTP",
"ChooseMetric": "Trieu una mètrica",
"ChooseReport": "Trieu un informe",
+ "ChooseSegment": "Seleccioneu un segment",
"ConfirmRemoveAccount": "Voleu eliminar aquest compte?",
"DefaultReportDate": "Data de l'informe",
"EmailUs": "Envia'ns un email",
@@ -384,6 +413,7 @@
"NoWebsiteFound": "No s'ha trobat el lloc web",
"NoWebsitesShort": "Sense llocs web",
"PullDownToRefresh": "Estireu per actualitzar...",
+ "IgnoreSslError": "Ignorar error SSL",
"RatingDontRemindMe": "No em recordis",
"RatingNotNow": "Ara no",
"RatingNow": "D'acord, el puntuaré ara",
diff --git a/lang/cs.json b/lang/cs.json
index 02d99dbac4..0940ea70d4 100644
--- a/lang/cs.json
+++ b/lang/cs.json
@@ -64,7 +64,7 @@
"ColumnNbUniqVisitors": "Jedineční návštěvníci",
"ColumnNbUniqVisitorsDocumentation": "Počet neduplicitních návštěvníků, kteří navštívili vaše stránky. Každý návštěvník je počítán pouze jednou, i pokud přišel několikrát za den.",
"ColumnNbUsers": "Uživatelé",
- "ColumnNbUsersDocumentation": "Počet uživatelů přihlášených na vašich stránkách. Je to počet unikátních aktivních uživatelů, kteří mají nastavené ID pomocí sledovací funkce 'setUserId'.",
+ "ColumnNbUsersDocumentation": "Počet uživatelů přihlášených na webových stránkách. Je to počet jedinečných aktivních uživatelů, kteří mají nastavené ID (pomocí sledovací funkce 'setUserId').",
"ColumnNbVisits": "Návštěv",
"ColumnNbVisitsDocumentation": "Pokud návštěvník přijde na stránku poprvé nebo opakovaně po více než 30ti minutách, je návštěva započítána jako nová.",
"ColumnPageBounceRateDocumentation": "Procento návštěv, které začaly touto stránkou a ihned ji opustili.",
@@ -74,15 +74,15 @@
"ColumnRevenue": "Příjem",
"ColumnSumVisitLength": "Celkový čas strávený návštěvníky (v sekundách)",
"ColumnTotalPageviews": "Celkem zobrazených stránek",
- "ColumnUniqueEntrances": "Unikátních vstupů",
- "ColumnUniqueExits": "Unikátních opuštění stránky",
+ "ColumnUniqueEntrances": "Jedinečných vstupů",
+ "ColumnUniqueExits": "Jedinečná opuštění stránky",
"ColumnUniquePageviews": "Jedinečná zobrazení stránek",
"ColumnUniquePageviewsDocumentation": "Počet návštěvníků, kteří navštívily tuto stránku. Pokud byla tato stránka navštívena několikrát, návštěva je započítána jen jednou.",
"ColumnValuePerVisit": "Hodnota za návštěvu",
"ColumnViewedAfterSearch": "Kliknuto ve výsledcích vyhledávání",
"ColumnViewedAfterSearchDocumentation": "Počet návštěv této stránky poté, co návštěvník provedl vyhledávání a kliknul na tuto stránku.",
"ColumnVisitDuration": "Doba návštěvy (v sekundách)",
- "ColumnVisitsWithConversions": "Návštěvy s přechodem",
+ "ColumnVisitsWithConversions": "Návštěvy s převodem",
"ConfigFileIsNotWritable": "Konfigurační soubor Piwiku %1$s není zapisovatelný, některé změny nebudou uloženy. %2$s Prosím upravte oprávnění ke konfiguračnímu souboru",
"Continue": "Pokračovat",
"ContinueToPiwik": "Pokračujte do Piwiku",
@@ -134,6 +134,7 @@
"Edit": "Upravit",
"EncryptedSmtpTransport": "Zadejte šifrování transportní vrstvy vyžadované vaším SMTP serverem.",
"Error": "Chyba",
+ "Errors": "Chyby",
"ErrorRequest": "Ajaj! Při požadavku došlo k chybě. Na serveru mohlo dojít k dočasnému problému, nebo jste požádali o hlášení s příliš mnoha daty. Prosím, zkuste to znovu. Pokud se bude problém opakovat, %1$skontaktujte svého administrátora Piwiku%2$s.",
"EvolutionOverPeriod": "Vývoj za periodu",
"EvolutionSummaryGeneric": "%1$s v %2$s srovnáno s %3$s v %4$s. Vývoj: %5$s",
@@ -170,6 +171,7 @@
"ExceptionReportNotFound": "Požadované hlášení neexistuje.",
"ExceptionWidgetNotFound": "Požadovaný widget neexistuje.",
"ExceptionReportNotEnabled": "Požadované hlášení není povoleno. To obvykle znamená, že zásuvný modul, který ho poskytuje je zakázán, nebo že nemáte dostatečná oprávnění.",
+ "ExceptionWidgetNotEnabled": "Požadovaný widget není povolen. To obvykle znamená, že zásuvný modul, který ho definuje je zakázán, nebo nemáte dostatečná oprávnění k jeho zobrazení.",
"ExpandDataTableFooter": "Změnit vizualizaci nebo nastavit hlášení",
"Export": "Exportovat",
"ExportAsImage": "Exportovat obrázek",
@@ -182,7 +184,7 @@
"Forums": "Fóra",
"FromReferrer": "z",
"GeneralInformation": "Obecné informace",
- "General": "Obecné",
+ "GeneralSettings": "Obecná nastavení",
"GetStarted": "Začít",
"GiveUsYourFeedback": "Dejte nám zpětnou vazbu!",
"Goal": "Cíl",
@@ -289,6 +291,7 @@
"PiwikIsACollaborativeProjectYouCanContributeAndDonate": "%1$sPiwik%2$s je společný projekt zajištěný členy %7$stýmem Piwiku%8$s, stejně jako mnoha dalšími přispěvateli z celého světa. <br\/> Pokud jste fanoušek Piwiku, můžete zjistit, %3$sjak se zapojit%4$s, nebo %5$spřispějte%6$s na vývoj Piwiku 3.0!",
"PiwikXIsAvailablePleaseNotifyPiwikAdmin": "%1$s je dostupný. Prosím, upozorněte %2$sadministrátora Piwiku%3$s.",
"PiwikXIsAvailablePleaseUpdateNow": "Je k dispozici Piwik %1$s. %2$s Prosím aktualizujte jej!%3$s (viz %4$s změny%5$s).",
+ "PleaseContactYourPiwikAdministrator": "Prosím, kontaktujte administrátora vašeho Pišiku.",
"PleaseSpecifyValue": "Prosím zapiště hodnotu pro '%s'.",
"PleaseUpdatePiwik": "Aktualizujte prosím svůj Piwik",
"Plugin": "Plugin",
@@ -329,7 +332,7 @@
"Rows": "Řádek",
"RowsToDisplay": "Řádků k zobrazení",
"Save": "Uložit",
- "SaveImageOnYourComputer": "K uložení obrázku na váš počítač klikněte na obrázek pravým tlačítkem myši a zvolte \"Uložit obrázek jako...\"",
+ "SaveImageOnYourComputer": "K uložení obrázku na svůj počítač klikněte na obrázek pravým tlačítkem myši a zvolte \"Uložit obrázek jako...\"",
"Search": "Hledat",
"Clear": "Vyčistit",
"SearchNoResults": "Žádné výsledky",
@@ -337,7 +340,7 @@
"SeeTheOfficialDocumentationForMoreInformation": "Pro více informací navštivte %1$soficiální dokumentaci%2$s.",
"SeeThisFaq": "Podívejte se na %1$stento často kladený dotaz%2$s.",
"Segment": "Část",
- "SelectYesIfYouWantToSendEmailsViaServer": "Zvolte \"Ano\" pokud chcete e-mail posílat pomocí uvedeného serveru místo lokální funkce PHP mail",
+ "SelectYesIfYouWantToSendEmailsViaServer": "Zvolte \"Ano\" pokud chcete email posílat pomocí uvedeného serveru místo lokální funkce PHP mail",
"Settings": "Nastavení",
"Shipping": "Doprava",
"Show": "zobrazit",
@@ -368,13 +371,13 @@
"TransitionsRowActionTooltip": "Podívejte se, co dělali návštěvníci před a po návštěvě této stránky",
"TransitionsRowActionTooltipTitle": "Otevřít přechody",
"TranslatorName": "Filip Bartmann, Jakub Baláš, Michal Čihař, <a href=\"https:\/\/www.openhub.net\/accounts\/svetlemodry\">Jaroslav Lichtblau<\/a>",
- "UniquePurchases": "Jedineční nakupující",
+ "UniquePurchases": "Jedinečné nákupy",
"Unknown": "Neznámý",
"Upload": "Nahrát",
"UsePlusMinusIconsDocumentation": "Použijte ikonu plus a mínus vlevo od navigace.",
"UserId": "ID uživatele",
"Username": "Uživatelské jméno",
- "UseSMTPServerForEmail": "Pro e-mail použít SMTP server",
+ "UseSMTPServerForEmail": "Pro email použít SMTP server",
"Value": "Hodnota",
"VBarGraph": "Svislý sloupcový graf",
"View": "Zobrazit",
@@ -393,8 +396,12 @@
"VisitType": "Typ návštěvy",
"VisitTypeExample": "Například pro výběr všech návštěvníků, kteří se vrátili na stránky včetně těch, co si v předcchozích návštěvách něco koupili, by API požadavek obsahoval %s",
"Warning": "Varování",
+ "Warnings": "Varování",
"WarningPhpVersionXIsTooOld": "PHP verze %s, kterou používáte již není podporována (EOL). Důrazně doporučujeme aktualizovat na novější verzi, protože stávající může obsahovat bezpečnostní a další problémy, které byly opraveny v novějších verzích PHP.",
"WarningPiwikWillStopSupportingPHPVersion": "Piwik přestane podporavat PHP %1$s v dalším vydání. Aktualizujte PHP alespoň na %2$s, než bude pozdě.",
+ "YouMustUpgradePhpVersionToReceiveLatestPiwik": "Pro aktualizaci aplikace Piwik na nejnovější verzi je nutné provést aktualizaci verze PHP.",
+ "PiwikCannotBeUpgradedBecausePhpIsTooOld": "Piwik nelze aktualizovat na nejnovější verzi, protože používaná verze PHP je příliš stará.",
+ "PleaseUpgradeYourPhpVersionSoYourPiwikDataStaysSecure": "Aktualizujte prosím PHP alespoň na verzi %s, aby zůstala analytická data v bezpečí.",
"WarningFileIntegrityNoManifest": "Test integrity nemůže být proveden z důvodů chybějícího souboru manifest.inc.php.",
"WarningFileIntegrityNoManifestDeployingFromGit": "Pokud nasazujete Piwik z Gitu, pak je tato zpráva normální.",
"WarningFileIntegrityNoMd5file": "Test integrity nemůže být dokončen z důvodů chybějící funkce md5_file().",
diff --git a/lang/da.json b/lang/da.json
index bfb7437601..5ea23d374a 100644
--- a/lang/da.json
+++ b/lang/da.json
@@ -134,12 +134,15 @@
"Edit": "Rediger",
"EncryptedSmtpTransport": "Indtast tranportlag krypteringen, som kræves af SMTP serveren.",
"Error": "Fejl",
+ "Errors": "Fejl",
"ErrorRequest": "Ups… der var et problem i løbet af anmodningen. Måske serveren havde et midlertidigt problem, eller måske du har anmodet om en rapport med for mange data. Prøv igen. Hvis fejlen opstår gentagne gange %1$skontakt din Piwik administrator%2$s for at få hjælp.",
"EvolutionOverPeriod": "Udvikling i perioden",
"EvolutionSummaryGeneric": "%1$s i %2$s sammenlignet med %3$s i %4$s. Udvikling: %5$s",
"ExceptionContactSupportGeneric": "Hvis du stadig har dette problem, %1$skontakt Piwik administrator%2$s for at få hjælp.",
"ExceptionCheckUserHasSuperUserAccessOrIsTheUser": "Brugeren skal være enten en superbruger eller brugeren '%s' selv.",
"ExceptionConfigurationFileNotFound": "Konfigurationsfilen (%s) blev ikke fundet.",
+ "ExceptionConfigurationFileExistsButNotReadable": "Konfigurationsfilen %s findes men Piwik kunne ikke læse den.",
+ "ExceptionConfigurationFilePleaseCheckReadableByUser": "Tjek venligst at %1$s er læsbar for brugeren '%2$s'.",
"ExceptionDatabaseVersion": "%1$s version er %2$s, men Piwik behøver mindst version %3$s.",
"ExceptionDatabaseVersionNewerThanCodebase": "Piwik kodebase kører den gamle version %1$s, og Piwik databasen er allerede blevet opgraderet til den nyere version %2$s.",
"ExceptionDatabaseVersionNewerThanCodebaseWait": "Måske er Piwik administratoren i øjeblikket ved at færdigbehandle opgraderingsprocessen. Prøv igen om et par minutter.",
@@ -168,6 +171,7 @@
"ExceptionReportNotFound": "Den ønskede rapport findes ikke.",
"ExceptionWidgetNotFound": "Den anmodede widget findes ikke.",
"ExceptionReportNotEnabled": "Den ønskede rapport er ikke aktiveret. Dette betyder normalt enten at udvidelsen, der definerer rapporten er deaktiveret eller at du har ikke tilladelse nok til at få adgang til rapporten.",
+ "ExceptionWidgetNotEnabled": "Den ønskede widget er ikke aktiveret. Dette betyder normalt enten at udvidelsen, der definerer denne widget er deaktiveret eller at du ikke har nok tilladelse til at få adgang til denne widget.",
"ExpandDataTableFooter": "Ændre visualiseringen eller konfigurer rapporten",
"Export": "Eksporter",
"ExportAsImage": "Eksporter som billede",
@@ -180,7 +184,7 @@
"Forums": "Forum",
"FromReferrer": "fra",
"GeneralInformation": "General Information",
- "General": "Generelt",
+ "GeneralSettings": "Generelle indstillinger",
"GetStarted": "Kom i gang",
"GiveUsYourFeedback": "Tilbagemelding!",
"Goal": "Mål",
@@ -284,8 +288,10 @@
"Password": "Adgangskode",
"Period": "Periode",
"Piechart": "Cirkeldiagram",
+ "PiwikIsACollaborativeProjectYouCanContributeAndDonate": "%1$sPiwik%2$s er et samarbejdsprojekt af %7$sPiwik holdets%8$s medlemmer samt mange andre bidragydere i hele verden. <br\/> Hvis du er en fan af Piwik, kan du hjælpe med: at finde ud af %3$shvordan du hjælper Piwik%4$s eller %5$sdoner nu%6$s til at hjælpe med at finansiere Piwik 3.0!",
"PiwikXIsAvailablePleaseNotifyPiwikAdmin": "%1$s er tilængelig. Kontakt venligst %2$sPiwik administrator%3$s.",
"PiwikXIsAvailablePleaseUpdateNow": "Piwik %1$s er tilgængelig. %2$sOpdater nu!%3$s (se %4$sændringer%5$s).",
+ "PleaseContactYourPiwikAdministrator": "Kontakt venligst din Piwik administrator.",
"PleaseSpecifyValue": "Angiv værdi for '%s'.",
"PleaseUpdatePiwik": "Opdater Piwik",
"Plugin": "Udvidelsesmodul",
@@ -390,8 +396,12 @@
"VisitType": "Besøgstype",
"VisitTypeExample": "F. eks., for at vælge alle besøgende, som er vendt tilbage til hjemmesiden, herunder dem, der har købt noget i deres tidligere besøg, vil API-anmodningen indeholde %s",
"Warning": "Advarsel",
+ "Warnings": "Advarsler",
"WarningPhpVersionXIsTooOld": "PHP version %s har nået slutningen af ​​sin levetid (EOL). Du opfordres kraftigt til at opgradere til den aktuelle version, fordi brug af denne version kan udsætte dig for sikkerhedshuller og fejl, som er blevet rettet i nyere versioner af PHP.",
"WarningPiwikWillStopSupportingPHPVersion": "Piwik ophører med at understøtte PHP %1$s i den næste store opdatering. Opgrader din PHP mindst PHP %2$s før det er for sent!",
+ "YouMustUpgradePhpVersionToReceiveLatestPiwik": "Du skal opgradere din PHP version for at kunne modtage seneste Piwik opdatering.",
+ "PiwikCannotBeUpgradedBecausePhpIsTooOld": "Piwik kan ikke opgraderes til seneste større version da din PHP version er for gammel.",
+ "PleaseUpgradeYourPhpVersionSoYourPiwikDataStaysSecure": "Opgrader venligst din PHP version til seneste PHP %s så dine Piwik analytics data forbliver sikre.",
"WarningFileIntegrityNoManifest": "Fil integritetstjek kunne ikke udføres på grund af manglende manifest.inc.php.",
"WarningFileIntegrityNoManifestDeployingFromGit": "Hvis du implementerer Piwik fra Git, er meddelelsen normal.",
"WarningFileIntegrityNoMd5file": "Fil integritetstjek kunne ikke gennemføres pga. manglende md5_file () funktion.",
diff --git a/lang/de.json b/lang/de.json
index 44c2c2ceab..9d3952ade4 100644
--- a/lang/de.json
+++ b/lang/de.json
@@ -134,6 +134,7 @@
"Edit": "Ändern",
"EncryptedSmtpTransport": "Geben Sie hier die von Ihrem SMTP-Server benötigte Verschlüsselung ein.",
"Error": "Fehler",
+ "Errors": "Fehler",
"ErrorRequest": "Oops… während der Anfrage ist ein Problem aufgetreten. Möglicherweise war der Server temporär überlastet, oder eventuell haben Sie einen Bericht mit zu vielen Daten angefordert. Bitte noch einmal versuchen. Wenn dieser Fehler wiederholt auftritt %1$skontaktieren Sie bitte Ihren Piwik Administrator%2$s, um Unterstützung zu erhalten.",
"EvolutionOverPeriod": "Entwicklung über den Zeitraum",
"EvolutionSummaryGeneric": "%1$s in %2$s verglichen mit %3$s in %4$s. Entwicklung: %5$s",
@@ -170,6 +171,7 @@
"ExceptionReportNotFound": "Der gesuchte Bericht existiert nicht.",
"ExceptionWidgetNotFound": "Das gesuchte Widget existiert nicht.",
"ExceptionReportNotEnabled": "Der gesuchte Bericht ist nicht aktiviert. Das bedeutet normalerweise entweder, dass das Plugin, welches den Bericht definiert, deaktiviert ist oder Sie haben nicht die benötigten Berechtigungen, um diesen Bericht einzusehen.",
+ "ExceptionWidgetNotEnabled": "Das gesuchte Widget ist nicht aktiviert. Das bedeutet normalerweise entweder, dass das Plugin, welches das Widget definiert, deaktiviert ist oder Sie haben nicht die benötigten Berechtigungen, um dieses Widget zu einzusehen.",
"ExpandDataTableFooter": "Ändern Sie die Darstellung oder konfigurieren den Bericht",
"Export": "Export",
"ExportAsImage": "Als Bild exportieren",
@@ -182,7 +184,7 @@
"Forums": "Forum",
"FromReferrer": "von",
"GeneralInformation": "Allgemeine Information",
- "General": "Allgemein",
+ "GeneralSettings": "Allgemeine Einstellungen",
"GetStarted": "Jetzt beginnen",
"GiveUsYourFeedback": "Feedback geben!",
"Goal": "Ziel",
@@ -286,8 +288,10 @@
"Password": "Passwort",
"Period": "Zeitraum",
"Piechart": "Kreisdiagramm",
+ "PiwikIsACollaborativeProjectYouCanContributeAndDonate": "%1$s Piwik %2$s ist ein gemeinschaftliches Projekt der %7$s Piwik Team%8$s Mitglieder, sowie viele andere, auf der Welt verteilte, Unterstützer. <br\/> Wenn Ihnen Piwik gefällt, können Sie helfen: Finden Sie heraus, %3$s wie Sie Piwik unterstützen können%4$s oder %5$s Spenden Sie jetzt%6$s und unterstützen Sie Piwik 3.0!",
"PiwikXIsAvailablePleaseNotifyPiwikAdmin": "%1$s ist verfügbar. Bitte benachrichtigen Sie den %2$sPiwik Administrator%3$s.",
"PiwikXIsAvailablePleaseUpdateNow": "Piwik %1$s ist verfügbar. %2$s Bitte aktualisieren Sie jetzt!%3$s (siehe %4$s Änderungen%5$s).",
+ "PleaseContactYourPiwikAdministrator": "Bitte kontaktieren Sie Ihren Piwik Administrator.",
"PleaseSpecifyValue": "Bitte geben Sie einen Wert für '%s' an.",
"PleaseUpdatePiwik": "Bitte Piwik aktualisieren",
"Plugin": "Plugin",
@@ -392,8 +396,12 @@
"VisitType": "Art des Besuchs",
"VisitTypeExample": "Um beispielsweise alle wiederkehrenden Besucher abzufragen, die Bestellungen getätigt haben, muss der API Aufruf folgendes enthalten: %s",
"Warning": "Warnung",
+ "Warnings": "Warnungen",
"WarningPhpVersionXIsTooOld": "Die von Ihnen eingesetzte PHP Version %s hat das Ende der Lebensdauer (EOL) erreicht. Es wird dringend angeraten, ein Update auf eine aktuelle Version durchzuführen, da der Einsatz dieser Version zu Sicherheitsrisiken und Fehlern führen kann, welche in neueren PHP Versionen korrigiert wurden.",
"WarningPiwikWillStopSupportingPHPVersion": "Piwik wird die Unterstützung für PHP %1$s in der nächsten Hauptversion einstellen. Aktualisieren Sie ihre PHP Version auf mindestens %2$s, bevor es zu spät ist!",
+ "YouMustUpgradePhpVersionToReceiveLatestPiwik": "Sie müssen ihre PHP Version aktualisieren, um das aktuellste Piwik Update zu erhalten.",
+ "PiwikCannotBeUpgradedBecausePhpIsTooOld": "Piwik kann nicht auf die letzte Hauptversion aktualisiert werden, weil Ihre PHP Version zu alt ist.",
+ "PleaseUpgradeYourPhpVersionSoYourPiwikDataStaysSecure": "Bitte aktualisieren Sie PHP auf mindestens Version %s damit Ihre Piwik analytics Daten weiterhin sicher sind.",
"WarningFileIntegrityNoManifest": "Aufgrund der fehlenden Datei manifest.inc.php konnte die Integritätsprüfung nicht durchgeführt werden.",
"WarningFileIntegrityNoManifestDeployingFromGit": "Wenn Sie Piwik von Git deployen ist diese Nachricht normal.",
"WarningFileIntegrityNoMd5file": "Durch die fehlende md5_file() Funktion konnte die Integritätsprüfung nicht durchgeführt werden.",
@@ -438,7 +446,7 @@
"EnableGraphsLabel": "Graphen anzeigen",
"EvolutionGraph": "Zeitdiagramm",
"HelpUsToImprovePiwikMobile": "Anonyme Nutzungsdaten in Piwik Mobile aktivieren?",
- "HowtoDeleteAnAccount": "Drücken Sie lange, um einen Account zu entfernen.",
+ "HowtoDeleteAnAccount": "Gedrückt halten, um einen Account zu entfernen.",
"HowtoDeleteAnAccountOniOS": "Von rechts nach links wischen, um einen Account zu löschen",
"HowtoLoginAnonymous": "Benutzername und Passwort leer lassen für anonymes anmelden",
"HttpIsNotSecureWarning": "Bei der Verwendung von HTTP wird ihr Piwik Authorisierungstoken (token_auth) im Klartext übertragen. Aus diesem Grund empfehlen wir HTTPS für eine sichere Übertragung von Daten über das Internet. Möchten Sie forfahren?",
@@ -501,6 +509,6 @@
"MetricsFor": "Metriken für %s",
"MultiRowEvolutionTitle": "Entwicklung von mehreren Zeilen",
"PickAnotherRow": "Wählen Sie eine andere Zeile zum vergleichen",
- "PickARow": "Wählen Sie eine Zeile zum vergleichen"
+ "PickARow": "Wählen Sie eine Zeile zum Vergleichen"
}
} \ No newline at end of file
diff --git a/lang/el.json b/lang/el.json
index f54dcf6c37..de1595af45 100644
--- a/lang/el.json
+++ b/lang/el.json
@@ -134,6 +134,7 @@
"Edit": "Επεξεργασία",
"EncryptedSmtpTransport": "Εισάγετε το κρυπτογραφημένο επίπεδο μεταφοράς που απαιτείται από τον διακομιστή SMTP σας.",
"Error": "Σφάλμα",
+ "Errors": "Σφάλματα",
"ErrorRequest": "Ουπς... υπήρξε ένα πρόβλημα κατά την αίτηση. Είναι πιθανόν ο διακομιστής να αντιμετώπισε ένα προσωρινό πρόβλημα ή να κάνατε μια αίτηση με πάρα πολλά δεδομένα. Παρακαλώ ξαναδοκιμάστε. Αν το σφάλμα επαναληφθεί ξανά %1$sεπικοινωνήστε με τον διαχειριστή σας του Piwik%2$s για βοήθεια.",
"EvolutionOverPeriod": "Εξέλιξη εντός της περιόδου",
"EvolutionSummaryGeneric": "%1$s στο %2$s σε σύγκριση με το %3$s στο %4$s. Εξέλιξη: %5$s",
@@ -170,6 +171,7 @@
"ExceptionReportNotFound": "Δεν υπάρχει η ζητούμενη αναφορά.",
"ExceptionWidgetNotFound": "Το ζητούμενο γραφικό συστατικό δεν υπάρχει.",
"ExceptionReportNotEnabled": "Η ζητούμενη αναφορά δεν είναι ενεργή. Αυτό συνήθως σημαίνει ότι είτε το πρόσθετο που ορίζει την αναφορά είναι ανενεργό είτε δεν έχετε την απαιτούμενη πρόσβαση για να την δείτε.",
+ "ExceptionWidgetNotEnabled": "Το αιτούμενο γραφικό συστατικό δεν είναι ενεργοποιημένο. Αυτό σημαίνει ότι είτε το πρόσθετο που ορίζει το γραφικό συστατικό είναι απενεργοποιημένο είτε δεν έχετε την απαιτούμενη άδεια για να προσπελάσετε το γραφικό συστατικό.",
"ExpandDataTableFooter": "Αλλάξτε την οπτική εμφάνιση ή διευθετήστε την αναφορά",
"Export": "Εξαγωγή",
"ExportAsImage": "Εξαγωγή ως εικόνα",
@@ -182,7 +184,7 @@
"Forums": "Φόρουμ",
"FromReferrer": "από",
"GeneralInformation": "Γενικές Πληροφορίες",
- "General": "Γενικά",
+ "GeneralSettings": "Γενικές ρυθμίσεις",
"GetStarted": "Ξεκινήστε",
"GiveUsYourFeedback": "Έχετε παρατηρήσεις;",
"Goal": "Στόχος",
@@ -289,6 +291,7 @@
"PiwikIsACollaborativeProjectYouCanContributeAndDonate": "Τι %1$sPiwik%2$s αποτελεί μια συλλογική προσπάθεια που σας παρέχει η %7$sομάδα μελών του Piwik%8$s καθώς επίσης και άλλοι συνεργάτες ανά την υφήλιο.<br\/>Αν είστε οπαδός του Piwik, μπορείτε να βοηθήσετε: δείτε πως να %3$sσυμμετέχετε στο Piwik%4$s ή %5$sκάνετε μια δωρεά%6$s για να χρηματοδοτήσετε την ανάπτυξη του Piwik 3.0!",
"PiwikXIsAvailablePleaseNotifyPiwikAdmin": "Το %1$s είναι διαθέσιμο. Παρακαλούμε ειδοποιήστε τον %2$sδιαχειριστή του Piwik σας%3$s.",
"PiwikXIsAvailablePleaseUpdateNow": "Είναι διαθέσιμο το Piwik %1$s. %2$s Άμεση ενημέρωση τώρα!%3$s (δείτε τις %4$s αλλαγές%5$s).",
+ "PleaseContactYourPiwikAdministrator": "Παρακαλούμε επικοινωνήστε με τον διαχειριστή του Piwik σας.",
"PleaseSpecifyValue": "Ορίστε μια τιμή για το «%s».",
"PleaseUpdatePiwik": "Αναβαθμίστε το Piwik",
"Plugin": "Πρόσθετο",
@@ -393,8 +396,12 @@
"VisitType": "Τύπος επίσκεψης",
"VisitTypeExample": "Για παράδειγμα, για να επιλέξετε όλους τους επισκέπτες που έχουν επιστρέψει στην ιστοσελίδα και να περιλάβετε αυτούς που έχουν αγοράσει κάτι στις προηγούμενες επισκέψεις, το αίτημα API θα περιέχει %s",
"Warning": "Προειδοποίηση",
+ "Warnings": "Προειδοποιήσεις",
"WarningPhpVersionXIsTooOld": "Η έκδοση PHP %s που χρησιμοποιείτε έχει φτάσει στο Τέλος Ζωής της (EOL). Συνιστάται να αναβαθμίσετε στην τρέχουσα έκδοση, καθώς η χρήση αυτή της έκδοσης μπορεί να σας εκθέσει σε προβλήματα ασφαλείας και σφάλματα που έχουν διορθωθεί στις πρόσφατες εκδόσεις της PHP.",
"WarningPiwikWillStopSupportingPHPVersion": "Το Piwik θα σταματήσει να υποστηρίζει την PHP %1$s στην επόμενη σημαντική έκδοσή του. Αναβαθμίστε την PHP τουλάχιστον στην έκδοση %2$s, προτού είναι αργά!",
+ "YouMustUpgradePhpVersionToReceiveLatestPiwik": "Πρέπει να αναβαθμίσετε την έκδοση της PHP σας προτού λάβετε την τελευταία ενημέρωση του Piwik.",
+ "PiwikCannotBeUpgradedBecausePhpIsTooOld": "Το Piwik δεν μπορεί να αναβαθμιστεί στην τελευταία κύρια έκδοση επειδή η έκδοση της PHP σας είναι πολύ παλιά.",
+ "PleaseUpgradeYourPhpVersionSoYourPiwikDataStaysSecure": "Ενημερώστε την έκδοση της PHP σας σε τουλάχιστον PHP %s ώστε τα δεδομένα αναλυτικών του Piwik σας να παραμείνουν ασφαλή.",
"WarningFileIntegrityNoManifest": "Ο έλεγχος ακεραιότητας αρχείου δεν μπορεί να πραγματοποιηθεί επειδή λείπει το αρχείο manifest.inc.php.",
"WarningFileIntegrityNoManifestDeployingFromGit": "Αν παίρνετε το Piwik από το Git, το μήνυμα αυτό είναι φυσιολογικό.",
"WarningFileIntegrityNoMd5file": "Ο έλεγχος ακεραιότητας αρχείου δεν μπορεί να ολοκληρωθεί γιατί είναι ανενεργή η συνάρτηση md5_file().",
diff --git a/lang/es.json b/lang/es.json
index 7de9883818..5904dde369 100644
--- a/lang/es.json
+++ b/lang/es.json
@@ -134,6 +134,7 @@
"Edit": "Editar",
"EncryptedSmtpTransport": "Ingrese el tipo de encriptación de su servidor SMTP.",
"Error": "Error",
+ "Errors": "Errores",
"ErrorRequest": "Oops... hubo un problema durante la petición. Tal vez el servidor tuvo un problema temporal, o tal vez pidió un informe con demasiada información. Por favor vuelva a intentarlo. Si el error ocurre repetidamente, %1$scontácte con su administrador Piwik%2$s para ayudarlo.",
"EvolutionOverPeriod": "Evolución en el periodo",
"EvolutionSummaryGeneric": "%1$s en %2$s comparado con %3$s en %4$s. Evolución: %5$s",
@@ -170,6 +171,7 @@
"ExceptionReportNotFound": "El informe solicitado no existe.",
"ExceptionWidgetNotFound": "El reproductor solicitado no existe.",
"ExceptionReportNotEnabled": "El informe solicitado no está disponible. Esto significa usualmente que el complemento que confecciona el informe está desactivado o no posee los suficientes permisos para acceder a este informe.",
+ "ExceptionWidgetNotEnabled": "El reproductor solicitado no está habilitado. Esto se debe o a que el complemento que define el reproducto está desactivado o no posee suficientes atributos para accder al mismo.",
"ExpandDataTableFooter": "Cambiar la visualización o modificar el informe",
"Export": "Exportar",
"ExportAsImage": "Exportar como imagen",
@@ -182,7 +184,7 @@
"Forums": "Foros",
"FromReferrer": "desde",
"GeneralInformation": "Información General",
- "General": "General",
+ "GeneralSettings": "Ajustes generales",
"GetStarted": "Comenzar",
"GiveUsYourFeedback": "¡Envíanos tus comentarios!",
"Goal": "Objetivo",
@@ -289,6 +291,7 @@
"PiwikIsACollaborativeProjectYouCanContributeAndDonate": "%1$sPiwik%2$s es un proyecto de colaboración traído para ti por los miembros del %7$sequipo de Piwik%8$s así como muchos otros colaboradores alrededor del mundo. <br\/> Si eres un fan de Piwik, puedes ayudar: descubrir %3$sCómo participar en Piwik%4$s, o %5$sdona ahora%6$s para ayudar a financiar Piwik 3.0!",
"PiwikXIsAvailablePleaseNotifyPiwikAdmin": "%1$s está disponible. Por favor alerte al %2$s administrador Piwik%3$s.",
"PiwikXIsAvailablePleaseUpdateNow": "Piwik %1$s está disponible. %2$s ¡Por favor, actualice ahora!%3$s (ver %4$scambios%5$s).",
+ "PleaseContactYourPiwikAdministrator": "Por favor contáctese con su administrador Piwik.",
"PleaseSpecifyValue": "Por favor especifique un valor para '%s'.",
"PleaseUpdatePiwik": "Por favor actualice su Piwik",
"Plugin": "Complemento",
@@ -393,8 +396,12 @@
"VisitType": "Tipo de visita",
"VisitTypeExample": "Por ejemplo, para seleccionar todos los visitantes que han vuelto al sitio, incluyendo a aquellos que han comprado algo en sus anteriores visitas, la solicitud de la API debe contener %s",
"Warning": "Advertencia",
+ "Warnings": "Advertencias",
"WarningPhpVersionXIsTooOld": "La versión %s de PHP que está utilizando ha alcanzado su End of LIfe (EOL). Necesitas urgentemente actualizar a una versión más reciente, ya que usando esta versión puede exponerlo a vulnerabilidades de seguridad y errores que han sido arreglados en versiones más recientes de PHP.",
"WarningPiwikWillStopSupportingPHPVersion": "Piwik abandonará el soporte para PHP %1$s en la siguiente versión. Actualiza PHP a la versión PHP %2$s, antes de que sea demasiado tarde!",
+ "YouMustUpgradePhpVersionToReceiveLatestPiwik": "Debe actualizar su versión de PHP para poder recibir las últimas actualizaciones de Piwik.",
+ "PiwikCannotBeUpgradedBecausePhpIsTooOld": "Piwik no puede actualizar a la última versión debido a que su versión PHP es demasiado anticuada.",
+ "PleaseUpgradeYourPhpVersionSoYourPiwikDataStaysSecure": "Por favor actualice su versión de PHP a por lo menos %s así sus datos de analíticas Piwik permanecen seguros.",
"WarningFileIntegrityNoManifest": "La verificación de integridad de archivos no se pudo realizar debido a que falta manifest.inc.php.",
"WarningFileIntegrityNoManifestDeployingFromGit": "Si está desplegando Piwik con Git, este mensaje es normal.",
"WarningFileIntegrityNoMd5file": "La verificación de integridad no pudo ser completada debido a que falta la función md5_file().",
diff --git a/lang/et.json b/lang/et.json
index 69b3e2b5f1..5ce1f06489 100644
--- a/lang/et.json
+++ b/lang/et.json
@@ -115,7 +115,6 @@
"Forums": "Foorumid",
"FromReferrer": "tuli",
"GeneralInformation": "Üldine info",
- "General": "Üldine",
"GetStarted": "Alusta kasutamist",
"GiveUsYourFeedback": "Tagasiside!",
"Goal": "Eesmärk",
diff --git a/lang/fi.json b/lang/fi.json
index a864ac39be..7ae85d6b7c 100644
--- a/lang/fi.json
+++ b/lang/fi.json
@@ -178,7 +178,6 @@
"Forums": "Foorumit",
"FromReferrer": "mistä",
"GeneralInformation": "Yleistä tietoa",
- "General": "Yleinen",
"GetStarted": "Aloita",
"GiveUsYourFeedback": "Anna palautetta!",
"Goal": "Tavoite",
diff --git a/lang/fr.json b/lang/fr.json
index c1c5b55dd8..3c2f50b500 100644
--- a/lang/fr.json
+++ b/lang/fr.json
@@ -14,7 +14,7 @@
"And": "et",
"API": "API",
"Apply": "Appliquer",
- "ArchivingInlineHelp": "Pour les sites à trafic moyen et fort, il est recommandé de désactiver l'archivage de Piwik depuis le navigateur. Nous vous recommandons de mettre en place une tâche planifiée (cron job) qui génère les rapports toutes les heures.",
+ "ArchivingInlineHelp": "Pour les sites au trafic moyen à fort, il est recommandé de désactiver l'archivage de Piwik depuis le navigateur. Nous vous recommandons de mettre en place une tâche planifiée (cron job) qui génère les rapports toutes les heures.",
"ArchivingTriggerDescription": "Recommandé pour les installations importantes de Piwik, vous devriez %1$s mettre en place une tâche planifiée (cron) %2$s pour générer les rapports automatiquement.",
"AuthenticationMethodSmtp": "Méthode d'authentification pour le serveur SMTP",
"AverageOrderValue": "Valeur Moyenne d'une Commande",
@@ -134,6 +134,7 @@
"Edit": "Éditer",
"EncryptedSmtpTransport": "Entrez la couche de chiffrement requise par votre serveur SMTP.",
"Error": "Erreur",
+ "Errors": "Erreurs",
"ErrorRequest": "Oups... Il y a eu un problème pendant le traitement de la requête. Peut être que le serveur a eu un soucis temporaire, ou peut être que vous avez demandé un rapport avec trop de données. Veuillez réssayer. Si cette erreur se répète veuillez %1$scontacter votre administrateur Piwik%2$s pour obtenir de l'aide.",
"EvolutionOverPeriod": "Évolution sur la période",
"EvolutionSummaryGeneric": "%1$s en %2$s comparé à %3$s en %4$s. Evolution: %5$s",
@@ -170,6 +171,7 @@
"ExceptionReportNotFound": "Le rapport demandé n'existe pas.",
"ExceptionWidgetNotFound": "Le gadget demandé n'existe pas.",
"ExceptionReportNotEnabled": "Le rapport demandé n'est pas activé. Ceci signifie d'habitude ou que le composant additionnel qui définit le rapport est désactivé ou bien que vous n'avez pas assez de permissions pour accéder à ce rapport.",
+ "ExceptionWidgetNotEnabled": "Le gadget demandé n'est pas activé. Ceci signifie généralement que le composant dont il fait partie est désactivé ou que vous ne possédez pas assez de permissions pour accéder à ce gadget.",
"ExpandDataTableFooter": "Modifier la visualisation ou configurer le rapport",
"Export": "Exporter",
"ExportAsImage": "Exporter au format Image",
@@ -182,7 +184,7 @@
"Forums": "Forums",
"FromReferrer": "de",
"GeneralInformation": "Informations Générales",
- "General": "Général",
+ "GeneralSettings": "Paramètres généraux",
"GetStarted": "Pour bien commencer",
"GiveUsYourFeedback": "Envoyez-nous vos commentaires !",
"Goal": "Objectif",
@@ -289,6 +291,7 @@
"PiwikIsACollaborativeProjectYouCanContributeAndDonate": "%1$sPiwik%2$s est un projet collaboratif réalisé pour vous par les membres de %7$sl'équipe Piwik%8$s ainsi que de nombreux autres contributeurs du monde entier.<br \/> Si vous êtes fan de Piwik, vous pouvez aider: trouvez %3$scomment participer à Piwik%4$s, ou %5$sdonnez maintenant%6$s pour aider à financer Piwik 3.0!",
"PiwikXIsAvailablePleaseNotifyPiwikAdmin": "%1$s est disponible. Veuillez informer %2$sl'administrateur Piwik%3$s.",
"PiwikXIsAvailablePleaseUpdateNow": "Piwik %1$s est maintenant disponible. %2$s Merci de mettre à jour!%3$s (voir %4$s les modifications%5$s).",
+ "PleaseContactYourPiwikAdministrator": "Merci de contacter votre administrateur Piwik.",
"PleaseSpecifyValue": "Merci de spécifier une valeur pour %s",
"PleaseUpdatePiwik": "Merci de mettre à jour Piwik",
"Plugin": "Plugin",
@@ -393,8 +396,12 @@
"VisitType": "Type de visite",
"VisitTypeExample": "Par exemple, pour sélectionner tous les visiteurs qui sont retournés sur le site web, en incluant ceux qui ont acheté quelque chose lors de leur dernière visite, la requête à l'API contiendrait %s",
"Warning": "Attention",
+ "Warnings": "Avertissements",
"WarningPhpVersionXIsTooOld": "La version de PHP que vous utilisez (%s) est en fin de support. Nous vous incitons vivement à upgrader vers une version plus récente. Votre version actuelle vous expose à des failles de sécurité et des bugs qui ont été corrigés dans les versions les plus récentes de PHP.",
"WarningPiwikWillStopSupportingPHPVersion": "Piwik ne prendra plus en charge PHP %1$s dans la prochaine version majeure. Mettez à jour votre PHP au minimum avec une version %2$s avant qu'il ne soit trop tard !",
+ "YouMustUpgradePhpVersionToReceiveLatestPiwik": "Vous devez mettre à niveau votre version de PHP afin de recevoir la dernière mise à jour Piwik.",
+ "PiwikCannotBeUpgradedBecausePhpIsTooOld": "Piwik ne peut pas être mis à jour à la dernière version majeure car votre version de PHP est trop ancienne.",
+ "PleaseUpgradeYourPhpVersionSoYourPiwikDataStaysSecure": "Merci de mettre à niveau votre version de PHP au minimum à PHP %s pour que vos statistiques Piwik restent sécurisées.",
"WarningFileIntegrityNoManifest": "Le contrôle d'intégrité n'a pu être effectué car le fichier manifest.inc.php est manquant.",
"WarningFileIntegrityNoManifestDeployingFromGit": "Si vous déployez Piwik depuis Git, ce message est normal.",
"WarningFileIntegrityNoMd5file": "Le contrôle d'intégrité n'a pu être effectué car la fonction md5_file() est manquante.",
@@ -423,7 +430,7 @@
"AccessUrlLabel": "URL d'accès à Piwik",
"Account": "Compte",
"Accounts": "Comptes",
- "AddAccount": "Ajouter le compte",
+ "AddAccount": "Ajouter un compte",
"AddPiwikDemo": "Ajouter une démo Piwik",
"Advanced": "Avancé",
"AnonymousAccess": "Accès anonyme",
@@ -492,10 +499,10 @@
},
"RowEvolution": {
"AvailableMetrics": "Métriques disponibles",
- "CompareDocumentation": "Cliquez sur le lien ci-dessous et ouvrez ce popup depuis une autre ligne du même tableau pour comparer plusieurs enregistrements.<br \/>Utilisez shift-clic pour marquer une ligne pour la comparaison sans ouvrir ce popup.",
+ "CompareDocumentation": "Cliquez sur le lien ci-dessous et ouvrez ce popup depuis une autre ligne du même tableau pour comparer plusieurs enregistrements.<br \/>Utilisez MAJ-clic pour marquer une ligne pour la comparaison sans ouvrir ce popup.",
"CompareRows": "Comparer les enregistrements",
"ComparingRecords": "Comparaison de %s lignes",
- "Documentation": "Cliquez sur les métriques pour les afficher dans un graphique d'évolution large. Utilisez shift-clic pour afficher plusieurs métriques en même temps.",
+ "Documentation": "Cliquez sur les métriques pour les afficher dans un graphique d'évolution large. Utilisez MAJ-clic pour afficher plusieurs métriques en même temps.",
"MetricBetweenText": "entre %1$s et %2$s",
"MetricChangeText": "%s au cours de la période",
"MetricMinMax": "%1$s est compris entre %2$s et %3$s sur la période",
diff --git a/lang/hi.json b/lang/hi.json
index f186ddc230..fc926915a0 100644
--- a/lang/hi.json
+++ b/lang/hi.json
@@ -166,7 +166,6 @@
"Forums": "फ़ड़",
"FromReferrer": "से",
"GeneralInformation": "सामान्य सूचना",
- "General": "सामान्य",
"GetStarted": "शुरू हो जाओ",
"GiveUsYourFeedback": "हमें प्रतिक्रिया दे!",
"Goal": "लक्ष्य",
diff --git a/lang/it.json b/lang/it.json
index b6ca374ee9..17ae0c92fa 100644
--- a/lang/it.json
+++ b/lang/it.json
@@ -134,6 +134,7 @@
"Edit": "Modifica",
"EncryptedSmtpTransport": "Inserisci la crittografia a livello di trasporto richiesta dal server SMTP.",
"Error": "Errore",
+ "Errors": "Errori",
"ErrorRequest": "Ooops... c'è stato un problema durante la richiesta. Forse il server ha avuto un problema temporaneo o forse hai richiesto un report con troppi dati. Si prega di provare nuovamente. Se questo errore si verifica ripetutamente, %1$scontatta il tuo amministratore di Piwik%2$s per assistenza.",
"EvolutionOverPeriod": "Evoluzione nel periodo",
"EvolutionSummaryGeneric": "%1$s in %2$s confrontato con %3$s in %4$s. Evoluzione: %5$s",
@@ -170,6 +171,7 @@
"ExceptionReportNotFound": "Il report richiesto non esiste.",
"ExceptionWidgetNotFound": "Il widget richiesto non esiste.",
"ExceptionReportNotEnabled": "Il report richiesto non è abilitato. Questo in genere significa che il plugin che definisce il report è disattivato o che tu non hai i permessi sufficienti per accedere a questo report.",
+ "ExceptionWidgetNotEnabled": "Il widget richiesto non è abilitato. Ciò significa, di solito, che il plugin che definisce il widget è disattivato o che tu non hai abbastanza permessi per accedere a questo widget.",
"ExpandDataTableFooter": "Cambia la visualizzazione o configura il report",
"Export": "Esporta",
"ExportAsImage": "Esporta come Immagine",
@@ -182,7 +184,7 @@
"Forums": "Forum",
"FromReferrer": "da",
"GeneralInformation": "Informazioni generali",
- "General": "Generale",
+ "GeneralSettings": "Impostazioni generali",
"GetStarted": "Inizia",
"GiveUsYourFeedback": "Suggerimenti?",
"Goal": "Goal",
@@ -289,6 +291,7 @@
"PiwikIsACollaborativeProjectYouCanContributeAndDonate": "%1$sPiwik%2$s è un progetto in collaborazione che ti viene fornito dai membri del %7$sPiwik team%8$s e da molti altri collaboratori di tutto il mondo. <br\/>Se sei un fan di Piwik, puoi aiutare anche tu: scopri %3$sCome partecipare a Piwik%4$s, o %5$sdona adesso%6$s per aiutare a finanziare Piwik 3.0!",
"PiwikXIsAvailablePleaseNotifyPiwikAdmin": "%1$s è disponibile. Avvisa l'%2$samministratore di Piwik%3$s.",
"PiwikXIsAvailablePleaseUpdateNow": "È disponibile la versione %1$s di Piwik. %2$sAggiorna ora!%3$s (%4$svedi le modifiche%5$s).",
+ "PleaseContactYourPiwikAdministrator": "Si prega di contattare l'amministratore di Piwik.",
"PleaseSpecifyValue": "Per favore specifica un valore per '%s'.",
"PleaseUpdatePiwik": "Per favore, aggiorna il tuo Piwik",
"Plugin": "Plugin",
@@ -393,8 +396,12 @@
"VisitType": "Tipo di visita",
"VisitTypeExample": "Ad esempio, per selezionare tutti i visitatori che sono ritornati al sito Web, compresi quelli che hanno comprato qualcosa nelle loro precedenti visite, la richiesta di API dovrebbe contenere %s",
"Warning": "Attenzione",
+ "Warnings": "Avvisi",
"WarningPhpVersionXIsTooOld": "La versione %s di PHP che stai utilizzando ha raggiunto il fine vita (EOL). Si invita caldamente ad aggiornare con urgenza all'ultima versione, perché l'uso di questa versione può esporti a vulnerabilità nella sicurezza e ai bug che sono stati corretti nelle versioni più recenti di PHP.",
"WarningPiwikWillStopSupportingPHPVersion": "Piwik cesserà di supportare PHP %1$s a partire dalla prossima versione maggiore. Aggiorna il tuo PHP almeno alla versione %2$s prima che sia troppo tardi!",
+ "YouMustUpgradePhpVersionToReceiveLatestPiwik": "Devi aggiornare la versione di PHP per poter ricevere l'ultimo aggiornamento di Piwik.",
+ "PiwikCannotBeUpgradedBecausePhpIsTooOld": "Non si è potuto aggiornare Piwik all'ultima versione maggiore perché la versione di PHP è troppo vecchia.",
+ "PleaseUpgradeYourPhpVersionSoYourPiwikDataStaysSecure": "Si prega di aggiornare la versione di PHP all'ultima %s così che i dati di analisi del tuo Piwik siano sicuri.",
"WarningFileIntegrityNoManifest": "Il controllo dell'integrità dei file non può essere eseguito per la mancanza del file manifest.inc.php",
"WarningFileIntegrityNoManifestDeployingFromGit": "Se stai sviluppando Piwik da Git, questo messaggio è normale.",
"WarningFileIntegrityNoMd5file": "Il controllo d'integrità dei file non ha potuto essere completato per la mancanza della funzione md5_file().",
diff --git a/lang/ja.json b/lang/ja.json
index 29af488328..0410f6a291 100644
--- a/lang/ja.json
+++ b/lang/ja.json
@@ -175,7 +175,6 @@
"Forums": "フォーラム",
"FromReferrer": "から",
"GeneralInformation": "全般の設定",
- "General": "一般",
"GetStarted": "始めましょう",
"GiveUsYourFeedback": "フィードバックをお願いします!",
"Goal": "目標",
diff --git a/lang/ko.json b/lang/ko.json
index 761a278d51..7af809f4b2 100644
--- a/lang/ko.json
+++ b/lang/ko.json
@@ -132,6 +132,7 @@
"Edit": "편집",
"EncryptedSmtpTransport": "SMTP 서버에 필요한 전송 레이어 암호화를 입력합니다.",
"Error": "에러",
+ "Errors": "에러",
"EvolutionOverPeriod": "기간동안 진행 과정",
"EvolutionSummaryGeneric": "%2$s의 %1$s와 %4$s의 %3$s 비교. 변화 추이: %5$s",
"ExceptionContactSupportGeneric": "만약 해당 문제가 계속 발생한다면 %1$sPiwik 관리자에게 연락하여 도움%2$s을 구하세요.",
@@ -161,6 +162,7 @@
"ExceptionUnreadableFileDisabledMethod": "설정 파일 {%1$s}를 로드할 수 없습니다. 서버 %2$s가 비활성화되었을 수 있습니다.",
"ExceptionReportNotFound": "요청된 보고서가 존재하지 않습니다.",
"ExceptionWidgetNotFound": "요청된 위젯이 존재하지 않습니다.",
+ "ExpandDataTableFooter": "보고서 시각화 혹은 설정 바꾸기",
"Export": "내보내기",
"ExportAsImage": "이미지로 내보내기",
"ExportThisReport": "다른 형식으로 데이터셋 내보내기",
@@ -171,6 +173,7 @@
"Forums": "포럼",
"FromReferrer": "소스",
"GeneralInformation": "일반 정보",
+ "GeneralSettings": "일반 설정",
"GetStarted": "시작하기",
"GiveUsYourFeedback": "피드백을 주세요!",
"Goal": "목표",
@@ -191,6 +194,7 @@
"Language": "언어",
"LastDays": "마지막 %s일간 (오늘 포함)",
"LastDaysShort": "마지막 %s일",
+ "LearnMore": "%1$s자세히 알아보기%2$s",
"Live": "라이브",
"Loading": "로딩중...",
"LoadingData": "데이터 로딩중...",
@@ -215,6 +219,7 @@
"Name": "이름",
"NbActions": "활동 수",
"NbSearches": "내부 검색 수",
+ "NeedMoreHelp": "도움이 필요한가요?",
"Never": "안함",
"NewReportsWillBeProcessedByCron": "Piwik 아카이브가 브라우저 표시를 트리거하지 않으면, 새로운 보고서는 crontab에 의해 처리됩니다.",
"NewUpdatePiwikX": "새로운 업데이트: Piwik %s",
@@ -230,6 +235,7 @@
"NotRecommended": "비추천",
"NotValid": "%s 사용할 수 없음",
"NumberOfVisits": "방문수",
+ "NUsers": "%s 사용자",
"NVisits": "%s회 방문",
"Ok": "확인",
"OneAction": "1회 활동",
@@ -272,6 +278,7 @@
"Price": "가격",
"ProductConversionRate": "제품 전환율",
"ProductRevenue": "제품 수익",
+ "Measurables": "측정가능한 것",
"PurchasedProducts": "구입한 제품",
"Quantity": "수량",
"RangeReports": "기간 지정",
diff --git a/lang/nb.json b/lang/nb.json
index f2ec153df6..b842f54c81 100644
--- a/lang/nb.json
+++ b/lang/nb.json
@@ -134,6 +134,7 @@
"Edit": "Rediger",
"EncryptedSmtpTransport": "Fyll inn transportlagkrypteringen som kreves av din SMTP-tjener.",
"Error": "Feil",
+ "Errors": "Feil",
"ErrorRequest": "Oi... Det oppstod et problem under forespørselen. Kanskje tjeneren hadde en midlertidig feil eller kanskje du ba om en rapport med for mye data. Prøv igjen. Hvis feilen oppstår gjentatte ganger, %1$skontakt din Piwik-administrator%2$s for assistanse.",
"EvolutionOverPeriod": "Utvikling i perioden",
"EvolutionSummaryGeneric": "%1$s i %2$s sammenlignet med %3$s i %4$s. Utvikling: %5$s",
@@ -170,6 +171,7 @@
"ExceptionReportNotFound": "Den etterspurte rapporten finnes ikke.",
"ExceptionWidgetNotFound": "Den etterspurte widgeten finnes ikke.",
"ExceptionReportNotEnabled": "Den etterspurte rapporten er ikke aktivert. Dette betyr vanligvis at enten er utvidelsen som definerer rapporten deaktivert, eller så har du ikke nok rettigheter til å vise rapporten.",
+ "ExceptionWidgetNotEnabled": "Denne widgeten er ikke aktivert. Det betyr vanligvis enten at utvidelsen som definerer widgeten er deaktivert, eller at du ikke har tillatelse til å se widgeten.",
"ExpandDataTableFooter": "Endre visualiseringen eller konfigurer rapporten",
"Export": "Eksporter",
"ExportAsImage": "Eksporter som bilde",
@@ -182,7 +184,7 @@
"Forums": "Forum",
"FromReferrer": "fra",
"GeneralInformation": "Generell informasjon",
- "General": "Generelt",
+ "GeneralSettings": "Generelle innstillinger",
"GetStarted": "Kom i gang",
"GiveUsYourFeedback": "Gi oss tilbakemeldinger!",
"Goal": "Mål",
@@ -289,6 +291,7 @@
"PiwikIsACollaborativeProjectYouCanContributeAndDonate": "%1$sPiwik%2$s er et samarbeidsprosjekt mellom %7$sPiwik-teamets%8$s medlemmer og mange andre bidragsytere over hele verden. <br\/>Hvis du liker Piwik, kan du hjelpe oss: finn ut %3$shvordan du deltar i Piwik%4$s, eller %5$sdoner nå%6$s for å støtte utviklingen av Piwik 3.0!",
"PiwikXIsAvailablePleaseNotifyPiwikAdmin": "%1$s er tilgjengelig. Vennligst gi beskjed til %2$sPiwik administrator%3$s.",
"PiwikXIsAvailablePleaseUpdateNow": "Piwik %1$s er tilgjengelig. %2$s Oppdater nå!%3$s (se %4$s endringer%5$s).",
+ "PleaseContactYourPiwikAdministrator": "Vennligst kontakt din Piwik-administrator.",
"PleaseSpecifyValue": "Oppgi en verdi for «%s».",
"PleaseUpdatePiwik": "Vennligst oppdater din Piwik",
"Plugin": "Utvidelse",
@@ -393,8 +396,12 @@
"VisitType": "Besøkstype",
"VisitTypeExample": "For eksempel: for å velge alle besøkere som har returnert til nettstedet, inkludert de som har kjøpt noe i deres tidligere besøk, må API-forespørselen inneholde %s",
"Warning": "Advarsel",
+ "Warnings": "Advarsler",
"WarningPhpVersionXIsTooOld": "PHP-versjonen du bruker (%s) er utdatert. Du bør oppgradere til en støttet versjon, siden den versjonen du bruker kan eksponere deg for sårbarheter og feil som har blitt fikset i nyere versjoner av PHP.",
"WarningPiwikWillStopSupportingPHPVersion": "Piwik vil slutte å støtte PHP %1$s i neste versjon. Oppgrader din PHP til minst PHP %2$s, før det er for sent!",
+ "YouMustUpgradePhpVersionToReceiveLatestPiwik": "Du må oppgradere din PHP-versjon for å kunne motta den siste Piwik-oppdateringen.",
+ "PiwikCannotBeUpgradedBecausePhpIsTooOld": "Piwik kan ikke oppgraderes til siste versjon fordi din PHP-versjon er for gammel.",
+ "PleaseUpgradeYourPhpVersionSoYourPiwikDataStaysSecure": "Vennligst oppgrader din PHP-versjon til siste PHP %s slik at dine Piwik-data forblir sikre.",
"WarningFileIntegrityNoManifest": "Klarte ikke å utføre integritetskontroll av filer fordi manifest.inc.php mangler.",
"WarningFileIntegrityNoManifestDeployingFromGit": "Hvis du installerer Piwik fra Git, er denne meldingen normal.",
"WarningFileIntegrityNoMd5file": "Klarte ikke utføre integritetskontroll av filer fordi funksjonen md5_file mangler.",
diff --git a/lang/nl.json b/lang/nl.json
index 0db9c72d77..c6714f9bfb 100644
--- a/lang/nl.json
+++ b/lang/nl.json
@@ -180,7 +180,6 @@
"Forums": "Forums",
"FromReferrer": "van",
"GeneralInformation": "Algemene informatie",
- "General": "Algemeen",
"GetStarted": "Aan de slag",
"GiveUsYourFeedback": "Geef ons commentaar!",
"Goal": "Doel",
diff --git a/lang/pl.json b/lang/pl.json
index 72fc354356..f2b48c924c 100644
--- a/lang/pl.json
+++ b/lang/pl.json
@@ -163,7 +163,6 @@
"Forums": "Forum",
"FromReferrer": "z",
"GeneralInformation": "Ogólne informacje",
- "General": "Ogólne",
"GetStarted": "Zacznij",
"GiveUsYourFeedback": "Zdaj relację!",
"Goal": "Cel",
diff --git a/lang/pt-br.json b/lang/pt-br.json
index 5c709dc22c..804559f524 100644
--- a/lang/pt-br.json
+++ b/lang/pt-br.json
@@ -134,6 +134,7 @@
"Edit": "Editar",
"EncryptedSmtpTransport": "Digite a criptografia de camada de transporte exigida pelo servidor SMTP.",
"Error": "Erro",
+ "Errors": "Erros",
"ErrorRequest": "Oops... houve um problema durante a solicitação. Talvez o servidor tenha tido um problema temporário ou talvez você tenha solicitado um relatório com dados demais. Por favor, tente novamente. Se esse erro ocorrer repetidamente, por favor %1$scontate o seu administrador do Piwik%2$s para assistência.",
"EvolutionOverPeriod": "Evolução no Período",
"EvolutionSummaryGeneric": "%1$s em %2$s em relação ao %3$s em %4$s. Evolução: %5$s",
@@ -170,6 +171,7 @@
"ExceptionReportNotFound": "O relatório solicitado não existe.",
"ExceptionWidgetNotFound": "O widget solicitado não existe.",
"ExceptionReportNotEnabled": "O relatório solicitado não está habilitado. Geralmente isto significa que o plugin que define o relatório está desativado ou você não tem permissão suficiente para acessar o mesmo.",
+ "ExceptionWidgetNotEnabled": "O widget solicitado não está habilitado. Geralmente isto significa que o plugin que define o widget está desativado ou você não tem permissão suficiente para acessar o mesmo.",
"ExpandDataTableFooter": "Alterar a visualização ou configurar o relatório",
"Export": "Exportar",
"ExportAsImage": "Exportar como imagem",
@@ -182,7 +184,7 @@
"Forums": "Fórum",
"FromReferrer": "origem",
"GeneralInformation": "Informações Gerais",
- "General": "Geral",
+ "GeneralSettings": "Configurações gerais",
"GetStarted": "Começar",
"GiveUsYourFeedback": "Dê o seu feedback!",
"Goal": "Objetivo",
@@ -286,8 +288,10 @@
"Password": "Senha",
"Period": "Período",
"Piechart": "Gráfico circular",
+ "PiwikIsACollaborativeProjectYouCanContributeAndDonate": "%1$sPiwik%2$s é um projeto colaborativo traduzido para você pelos membros da %7$sequipe do Piwik%8$s bem como muitos outros colaboradores ao redor do globo.<br\/> Se você é um fã do Piwik, pode ajudar: descubra %3$sComo participar no Piwik%4$s, ou %5$sdoe agora%6$s para ajudar a financiar o Piwik 3.0!",
"PiwikXIsAvailablePleaseNotifyPiwikAdmin": "%1$s está disponível. Por favor notifique o %2$sadministrator Piwik%3$s.",
"PiwikXIsAvailablePleaseUpdateNow": "Piwiki %1$s está disponível. %2$s Por favor atualize agora!%3$s (veja %4$sas mudanças%5$s).",
+ "PleaseContactYourPiwikAdministrator": "Por favor, contate o administrador do Piwik.",
"PleaseSpecifyValue": "Por favor, especifique um valor para '%s'.",
"PleaseUpdatePiwik": "Por favor atualize o seu Piwik",
"Plugin": "Plugin",
@@ -392,8 +396,12 @@
"VisitType": "Tipo de visita",
"VisitTypeExample": "Por exemplo, para selecionar todos os visitantes que voltaram para o site, incluindo aqueles que compraram algo em suas visitas anteriores, a requisição a API deve conter %s",
"Warning": "Aviso",
+ "Warnings": "Avisos",
"WarningPhpVersionXIsTooOld": "A versão %s do PHP que você está usando atingiu seu limite de vida (EOL). Encorajamos fortemente a atualizar para a versão mais atual, podendo a utilização desta versão expô-lo a vulnerabilidades de segurança e bugs que foram corrigidos em versões mais recentes do PHP.",
"WarningPiwikWillStopSupportingPHPVersion": "Piwik vai parar de suportar PHP %1$s na próxima versão principal. Atualize o seu PHP para, pelo menos, PHP %2$s, antes que seja tarde demais!",
+ "YouMustUpgradePhpVersionToReceiveLatestPiwik": "Você precisa atualizar sua versão do PHP para receber a última atualização do Piwik.",
+ "PiwikCannotBeUpgradedBecausePhpIsTooOld": "O Piwik não pode ser atualizado para a última versão maior porque sua versão do PHP é muito velha.",
+ "PleaseUpgradeYourPhpVersionSoYourPiwikDataStaysSecure": "Por favor, atualize sua versão de PHP para a última versão %s, assim seus dados analíticos no Piwik estarão seguro.",
"WarningFileIntegrityNoManifest": "O check de integridade do arquivo não pode ser feita enquanto estiver faltando manifest.inc.php.",
"WarningFileIntegrityNoManifestDeployingFromGit": "Se você estiver implantando Piwik a partir do repositório Git, esta mensagem é normal.",
"WarningFileIntegrityNoMd5file": "O check de integridade do arquivo não pode ser completado enquanto estiver faltando a função md5_file().",
diff --git a/lang/ru.json b/lang/ru.json
index 0afffae4eb..8931c2f339 100644
--- a/lang/ru.json
+++ b/lang/ru.json
@@ -134,12 +134,15 @@
"Edit": "Редактировать",
"EncryptedSmtpTransport": "Выберите тип шифрования транспортном уровне, требуемое вашим SMTP сервером.",
"Error": "Ошибка",
+ "Errors": "Ошибки",
"ErrorRequest": "Ой... возникла проблема во время выполнения запроса. Возможно причиной тому временная проблема на сервере, или Вами был запрошен отчет, содержащий большой объем данных. Пожалуйста, повторите попытку. Если ошибка повторяется, пожалуйста %1$sсвяжитесь с администратором Piwik%2$s.",
"EvolutionOverPeriod": "Эволюция за период",
"EvolutionSummaryGeneric": "%1$s в %2$s по сравнению с %3$s в %4$s. Изменения: %5$s",
"ExceptionContactSupportGeneric": "Если вы продолжаете получать эту ошибку, пожалуйста, %1$sобратитесь к администратору Piwik%2$s за помощью.",
"ExceptionCheckUserHasSuperUserAccessOrIsTheUser": "Пользователь должен быть либо суперпользователем, либо пользователем '%s'.",
"ExceptionConfigurationFileNotFound": "Конфигурационный файл {%s} не может быть найден.",
+ "ExceptionConfigurationFileExistsButNotReadable": "Файл конфигурации %s, похоже, существует, но Piwik не смог его прочитать.",
+ "ExceptionConfigurationFilePleaseCheckReadableByUser": "Пожалуйста, проверьте, что %1$s читается пользователем '%2$s'.",
"ExceptionDatabaseVersion": "Версия вашего %1$s - %2$s, но Piwik требует хотя бы %3$s.",
"ExceptionDatabaseVersionNewerThanCodebase": "Исполняемые файлы Piwik устаревшей версии %1$s, а база данных Piwik уже обновлена до новой версии %2$s.",
"ExceptionDatabaseVersionNewerThanCodebaseWait": "Возможно Ваш Piwik-администратор только что закончил процесс обновления. Попробуйте повторить позже.",
@@ -168,6 +171,7 @@
"ExceptionReportNotFound": "Запрашиваемый отчет не существует.",
"ExceptionWidgetNotFound": "Запрашиваемый виджет не существует.",
"ExceptionReportNotEnabled": "Запрошенный отчёт не включен. Это означает, как правило, что либо выключен плагин, который определяет этот отчет, либо нет прав доступа к этому отчёту.",
+ "ExceptionWidgetNotEnabled": "Запрошенный виджет не включен. Как правило это означает либо плагин, который определяет виджет деактивирован, либо вы не имеете достаточно прав доступа к этому виджет.",
"ExpandDataTableFooter": "Изменить визуализацию или настроить отчёт",
"Export": "Экспорт",
"ExportAsImage": "Экспортировать как изображение",
@@ -180,7 +184,7 @@
"Forums": "Форумы",
"FromReferrer": "источник",
"GeneralInformation": "Общая информация",
- "General": "Основное",
+ "GeneralSettings": "Общие настройки",
"GetStarted": "Приступить",
"GiveUsYourFeedback": "Оставьте нам отзыв!",
"Goal": "Достижение",
@@ -283,8 +287,10 @@
"Password": "Пароль",
"Period": "Период",
"Piechart": "Круговая диаграмма",
+ "PiwikIsACollaborativeProjectYouCanContributeAndDonate": "%1$sPiwik%2$s является совместным проектом %7$sкоманды Piwik%8$s, а также многих других авторов по всему земному шару. <br\/> Если вы поклонник Piwik, вы можете помочь: выяснить, %3$sКак принять участие в Piwik%4$s или %5$sсделать пожертвование%6$s, чтобы помочь в финансировании Piwik 3.0!",
"PiwikXIsAvailablePleaseNotifyPiwikAdmin": "Доступен %1$s. Пожалуйста, сообщите %2$sадминистратору Piwik%3$s.",
"PiwikXIsAvailablePleaseUpdateNow": "Piwik %1$s доступен для скачивания. %2$s Пожалуйста, обновитесь!%3$s (см. %4$s изменения%5$s).",
+ "PleaseContactYourPiwikAdministrator": "Пожалуйста, обратитесь к администратору Piwik.",
"PleaseSpecifyValue": "Пожалуйста, определите значение для '%s'.",
"PleaseUpdatePiwik": "Пожалуйста, обновите систему Веб-аналитики",
"Plugin": "Плагин",
@@ -389,8 +395,12 @@
"VisitType": "Тип визита",
"VisitTypeExample": "Например, чтобы выбрать всех посетителей, которые вернулисть на сайт, включая тех, кто уже купил что-то в свои предыдущие визиты, API-запрос будет содержать: %s",
"Warning": "Внимание",
+ "Warnings": "Предупреждения",
"WarningPhpVersionXIsTooOld": "Версия PHP %s, которую вы используете, завершила свой жизненый цикл (EOL). Настоятельно рекомендуем обновиться до текущей версии, т. к. использование устаревшей версии подвергает вас уязвимостям в безопасности и ошибкам, которые устранены в более свежей версии PHP.",
"WarningPiwikWillStopSupportingPHPVersion": "Piwik прекратит поддержку PHP %1$s в следующей версии. Обновите ваш PHP, по крайней мере, до версии PHP %2$s !",
+ "YouMustUpgradePhpVersionToReceiveLatestPiwik": "Вы должны обновить версию PHP, чтобы получить последнее обновление Piwik.",
+ "PiwikCannotBeUpgradedBecausePhpIsTooOld": "Piwik не может быть обновлён до последней основной версии, потому что ваша версия PHP является слишком старой.",
+ "PleaseUpgradeYourPhpVersionSoYourPiwikDataStaysSecure": "Пожалуйста, обновите версию PHP, по крайней мере до PHP %s, что бы Piwik оставался безопасным.",
"WarningFileIntegrityNoManifest": "Проверка целостности не может быть проведена из-за отсутствия manifest.inc.php.",
"WarningFileIntegrityNoManifestDeployingFromGit": "Если вы делаете деплой Piwik из Git, это сообщение является нормальным.",
"WarningFileIntegrityNoMd5file": "Проверка целостности не может быть проведена из-за отсутствия функции md5_file().",
diff --git a/lang/sk.json b/lang/sk.json
index 7f2e943715..4ce4536b3a 100644
--- a/lang/sk.json
+++ b/lang/sk.json
@@ -180,7 +180,6 @@
"Forums": "Fóra",
"FromReferrer": "z",
"GeneralInformation": "Všeobecné informácie",
- "General": "Všeobecné",
"GetStarted": "Začíname",
"GiveUsYourFeedback": "Spätná reakcia!",
"Goal": "Cieľ",
diff --git a/lang/sl.json b/lang/sl.json
index bfd9800c02..27c866d414 100644
--- a/lang/sl.json
+++ b/lang/sl.json
@@ -180,7 +180,6 @@
"Forums": "Forumi",
"FromReferrer": "od",
"GeneralInformation": "Splošne informacije",
- "General": "Splošno",
"GetStarted": "Pričnite",
"GiveUsYourFeedback": "Podajte nam povratno informacijo!",
"Goal": "Cilj",
diff --git a/lang/sq.json b/lang/sq.json
index 114c9b4c61..3dbea6635c 100644
--- a/lang/sq.json
+++ b/lang/sq.json
@@ -23,25 +23,26 @@
"Broken": "E dëmtuar",
"BrokenDownReportDocumentation": "Është zbërthyer në raporte të ndryshme, që tregohen me grafikë vijëzorë në fund të faqes. Grafikët mund t’i zmadhoni duke klikuar te raporti që dëshironi të shihni.",
"Cancel": "Anulojeni",
- "CannotUnzipFile": "S’mund të hapë kartelën zip %1$s: %2$s",
+ "CannotUnzipFile": "S’hapet dot kartela zip %1$s: %2$s",
"ChangePassword": "Ndryshoni fjalëkalimin",
"ChangeTagCloudView": "Ju lutemi, mbani parasysh që raportin mund ta shihni në mënyra të tjera nga re etiketash. Për ta bërë këtë, përdorni kontrollet në fund të raportit.",
+ "ChooseDate": "Zgjidhni datë, data e përzgjedhur tani është: %s",
"ChooseLanguage": "Zgjidhni gjuhën",
- "ChoosePeriod": "Zgjidhni periudhën",
+ "ChoosePeriod": "Zgjidhni periudhë",
"ClickHere": "Për më tepër të dhëna, klikoni këtu.",
"ClickToChangePeriod": "Klikoni sërish që të ndryshoni periudhën.",
"Close": "Mbylle",
"ClickToSearch": "Klikoni për kërkim",
"ColumnActionsPerVisit": "Veprime për Vizitë",
- "ColumnActionsPerVisitDocumentation": "Numri mesatar i veprimeve (parje faqesh, shkarkime ose klikime lidhjesh për gjetkë) që janë kryer gjatë vizitave.",
+ "ColumnActionsPerVisitDocumentation": "Numri mesatar i veprimeve (parje faqesh, shkarkime ose klikime lidhjesh për jashtë) që janë kryer gjatë vizitave.",
"ColumnAverageGenerationTime": "Kohë mesatare krijimi",
- "ColumnAverageGenerationTimeDocumentation": "Koha mesatare që u desh për krijimin e faqes. Kjo matje përfshin kohën që iu desh shërbyesit të prodhojë faqen web, plus kohën që iu desh vizitorit të shkarkojë përgjigjen nga shërbyesi. Një 'Kohë mesatare krijimi' e ulët nënkupton një sajt më të shpejtë për vizitorët tuaj!",
+ "ColumnAverageGenerationTimeDocumentation": "Koha mesatare që u desh për krijimin e faqes. Kjo vlerë përfshin kohën që iu desh shërbyesit të prodhojë faqen web, plus kohën që iu desh vizitorit të shkarkojë përgjigjen nga shërbyesi. Një 'Kohë mesatare krijimi' e ulët nënkupton një sajt më të shpejtë për vizitorët tuaj!",
"ColumnAverageTimeOnPage": "Kohë mesatarisht në faqe",
"ColumnAverageTimeOnPageDocumentation": "Sasia mesatare e kohës që vizitorët harxhuan në këtë faqe (vetëm te faqja, jo në krejt sajtin).",
"ColumnAvgTimeOnSite": "Kohë Mesatare te Sajti",
- "ColumnAvgTimeOnSiteDocumentation": "Zgjatje mesatare e një vizite.",
+ "ColumnAvgTimeOnSiteDocumentation": "Kohëzgjatje mesatare e një vizite.",
"ColumnBounceRate": "Mesatare Kthimesh",
- "ColumnBounceRateDocumentation": "Përqindja e vizitave gjatë të cilave pati vetëm një parje faqeje. Kjo do të thotë, që vizitori e braktisi sajtin drejt e pas faqes hyrëse.",
+ "ColumnBounceRateDocumentation": "Përqindja e vizitave gjatë të cilave pati vetëm një parje faqeje. Kjo do të thotë që vizitori e braktisi sajtin drejt e pas faqes hyrëse.",
"ColumnBounces": "Kthime",
"ColumnBouncesDocumentation": "Numër vizitash që filluan dhe mbaruan me këtë faqe. Kjo do të thotë që vizitori e braktisi sajtin pasi pa vetëm këtë faqe.",
"ColumnConversionRate": "Koeficient Shndërrimi",
@@ -58,11 +59,11 @@
"ColumnLabel": "Etiketë",
"ColumnMaxActions": "Veprime maksimum në një vizitë",
"ColumnNbActions": "Veprime",
- "ColumnNbActionsDocumentation": "Numri i veprimeve të kryera nga vizitorët tuaj. Veprimet mund të jenë parje faqesh, shkarkime ose klikime lidhjesh për diku gjetkë.",
+ "ColumnNbActionsDocumentation": "Numri i veprimeve të kryera nga vizitorët tuaj. Veprimet mund të jenë parje faqesh, shkarkime ose klikime lidhjesh për jashtë.",
"ColumnNbUniqVisitors": "Vizitorë unikë",
"ColumnNbUniqVisitorsDocumentation": "Numri, pa përsëdytje, i vizitorëve që vijnë në sajtin tuaj. Çdo përdorues numërohet vetëm një herë, edhe pse e viziton sajtin disa herë në ditë.",
"ColumnNbUsers": "Përdorues",
- "ColumnNbUsersDocumentation": "Numri i vizitorëve që kanë bërë hyrjen e autorizuar në sajtin tuaj. Ky është numri i përdoruesve unikë aktivë që kanë të caktuar një ID Përdoruesi (përmes funksionit për kod Gjurmimi 'setUserId').",
+ "ColumnNbUsersDocumentation": "Numri i vizitorëve që kanë bërë hyrjen e autorizuar në sajtin tuaj. Ky është numri i përdoruesve unikë aktivë që kanë të caktuar një ID Përdoruesi (përmes funksionit për kod Ndjekjeje 'setUserId').",
"ColumnNbVisits": "Vizita",
"ColumnNbVisitsDocumentation": "Nëse një vizitor vjen për herë të parë në sajtin tuaj, ose nëse e viziton një faqe pas më shumë se 30 minutash pasi ka parë faqen e fundit, kjo do të regjistrohet si vizitë e re.",
"ColumnPageBounceRateDocumentation": "Përqindje vizitash që zunë fill në këtë faqe dhe e braktisën sajtin menjëherë.",
@@ -83,7 +84,7 @@
"ColumnVisitsWithConversions": "Vizita me Shndërrime",
"Continue": "Vazhdo",
"ContinueToPiwik": "Vazhdoni te Piwik-u",
- "CurrentlyUsingUnsecureHttp": "Po e përdorni Piwik-un përmes HTTP jo të sigurt, çka mund të jetë e rrezikshme. Për shtim të sigurisë, këshillojmë ta rregulloni Piwik-un të përdorë SSL (HTTPS).",
+ "CurrentlyUsingUnsecureHttp": "Po e përdorni Piwik-un përmes HTTP-je jo të sigurt, çka mund të jetë e rrezikshme. Për shtim të sigurisë, këshillojmë ta rregulloni Piwik-un të përdorë SSL (HTTPS).",
"CreatedByUser": "krijuar nga %s",
"CurrentMonth": "Muaji i Tanishëm",
"CurrentWeek": "Java e Tanishme",
@@ -98,7 +99,7 @@
"Date": "Datë",
"DateRange": "Interval datash:",
"DateRangeFrom": "Prej",
- "DateRangeInPeriodList": "Interval datash",
+ "DateRangeInPeriodList": "interval datash",
"DateRangeTo": "Për",
"DaysHours": "%1$s ditë %2$s orë",
"DaysSinceFirstVisit": "Ditë që nga vizita e parë",
@@ -112,8 +113,8 @@
"Details": "Hollësi",
"Discount": "Ulje Çmimi",
"DisplaySimpleTable": "Shfaq një tabelë të thjeshtë",
- "DisplayTableWithGoalMetrics": "Shfaq një tabelë me matje Objektivash",
- "DisplayTableWithMoreMetrics": "Shfaq një tabelë me më tepër matje",
+ "DisplayTableWithGoalMetrics": "Shfaq një tabelë me vlera Objektivash",
+ "DisplayTableWithMoreMetrics": "Shfaq një tabelë me më tepër vlera",
"Documentation": "Dokumentim",
"Donate": "Dhurime",
"Done": "U bë",
@@ -125,17 +126,21 @@
"DownloadPleaseRemoveExisting": "Nëse doni të zëvendësohet, ju lutemi, hiqni kartelën ekzistuese.",
"Downloads": "Shkarkime",
"EcommerceOrders": "Porosi E-tregtie",
- "EcommerceVisitStatusDesc": "Shihni gjendjen e E-trgtisë në fund të vizitës",
+ "EcommerceVisitStatusDesc": "Shihni gjendjen e E-tregtisë në fund të vizitës",
"EcommerceVisitStatusEg": "Për shembull, për të përzgjedhur krejt vizitat që janë bërë një porosi E-tregti, kërkesa API do të duhej të përmbante %s",
"Edit": "Përpunojeni",
"EncryptedSmtpTransport": "Jepni fshehtëzimin e shtresës së mbartjes siç e kërkon shërbyesi juaj SMTP.",
"Error": "Gabim",
+ "Errors": "Gabime",
+ "ErrorRequest": "Hëm… pati një problem gjatë kërkesës. Ndoshta shërbyesi pati një problem të përkohshëm, ose ndoshta kërkuat një raport me shumë të dhëna. Ju lutemi, riprovoni. Nëse ky gabim përsëritet vazhdimisht, ju lutemi, %1$slidhuni me përgjegjësin e Piwik-ut tuaj%2$s për asistencë.",
"EvolutionOverPeriod": "Zhvillime përgjatë periudhës",
"EvolutionSummaryGeneric": "%1$s në %2$s krahasuar me %3$s te %4$s. Evolucion: %5$s",
"ExceptionCheckUserHasSuperUserAccessOrIsTheUser": "Përdoruesi duhet të jetë ose Superpërdorues, ose vetë përdoruesi '%s'.",
"ExceptionConfigurationFileNotFound": "S’u gjet kartela {%s} e formësimit.",
+ "ExceptionConfigurationFileExistsButNotReadable": "Kartela e formësimit %s duket se ekziston, por Piwik-u s’e lexoi dot.",
+ "ExceptionConfigurationFilePleaseCheckReadableByUser": "Ju lutemi, kontrolloni që %1$s është e lexueshme nga përdoruesi '%2$s'.",
"ExceptionDatabaseVersion": "Versioni juaj për %1$s është %2$s por Piwik-u lyp të paktën %3$s.",
- "ExceptionDatabaseVersionNewerThanCodebase": "Kodi bazë i Piwik-ut tuaj xhiron versionin e vjetër %1$s dhe kemi dalluar se Baza juaj e të Dhënave Piwik është përmirësuar tashmë me versionin më të ri %2$s.",
+ "ExceptionDatabaseVersionNewerThanCodebase": "Kodi bazë i Piwik-ut tuaj xhiron versionin e vjetër %1$s dhe kemi gjetur se Baza juaj e të Dhënave Piwik është përmirësuar tashmë me versionin më të ri %2$s.",
"ExceptionDatabaseVersionNewerThanCodebaseWait": "Ndoshta përgjegjësit e Piwik-ut tuaj janë duke përfunduar procesin e përmirësimit. Ju lutemi, riprovoni pas pak minutash.",
"ExceptionFileIntegrity": "Kontrolli i pacenueshmërisë dështoi: %s",
"ExceptionFilesizeMismatch": "Mospërputhje madhësie kartelash: %1$s (pritej gjatësi: %2$s, u gjet: %3$s)",
@@ -153,55 +158,59 @@
"ExceptionReportNotFound": "Raporti i kërkuar s’ekziston.",
"ExceptionWidgetNotFound": "Widget-i i kërkuar s’ekziston.",
"ExceptionReportNotEnabled": "Raporti i kërkuar s’është i aktivizuar. Kjo zakonisht do të thotë se ose shtojca që përcakton raportin është e çaktivizuar, ose se s’keni leje të mjaftueshme të përdorni këtë raport.",
+ "ExceptionWidgetNotEnabled": "Widget-i i domosdoshëm s’është i instaluar. Kjo do të thotë zakonisht se ose shtojca përcakton që widget-i të jetë i çaktivizuar, ose që ju nuk keni leje të mjaftueshme për të përdorur këtë widget.",
"ExpandDataTableFooter": "Ndryshoni vizualizimin ose formësoni raportin",
"Export": "Eksporto",
"ExportAsImage": "Eksportoje si Figurë",
"ExportThisReport": "Eksportojeni këtë grup të dhënash në formate të tjerë",
"Faq": "FAQ",
- "FileIntegrityWarningExplanation": "Kontrolli i pacënueshmërisë së kartelës dështoi dhe njoftoi për disa gabime. Kjo ka shumë të ngjarë të vijë për shkak të një ngarkimi të pjesshëm ose të pasuksesshëm të disa kartelave Piwik. Do të duhej të ringarkonit krejt kartelat e Piwik-ut në trajtë DYORE dhe të rifreskoni faqen derisa të mos tregojë më gabim.",
+ "FileIntegrityWarningExplanation": "Kontrolli i pacenueshmërisë së kartelës dështoi dhe njoftoi për disa gabime. Kjo ka shumë të ngjarë të vijë për shkak të një ngarkimi të pjesshëm ose të pasuksesshëm të disa kartelave Piwik. Do të duhej të ringarkonit krejt kartelat e Piwik-ut në trajtë DYORE dhe të rifreskoni faqen derisa të mos tregojë më gabim.",
"First": "I pari",
+ "Flatten": "Sheshoje",
"ForExampleShort": "p.sh.",
"Forums": "Forume",
"FromReferrer": "prej",
"GeneralInformation": "Të dhëna të Përgjithshme",
- "General": "Të përgjithshme",
- "GetStarted": "Get started",
- "GiveUsYourFeedback": "Na jepni Përshtypjet!",
+ "GeneralSettings": "Rregullime të përgjithshme",
+ "GetStarted": "Si t’ia fillohet",
+ "GiveUsYourFeedback": "Jepnani Përshtypjet!",
"Goal": "Objektiv",
"GoTo": "Shko te %s",
"GraphHelp": "Më tepër të dhëna rreth shfaqjes së grafikëve në Piwik.",
"HelloUser": "Tungjatjeta, %s!",
- "Help": "Nidhmë",
+ "Help": "Ndihmë",
"HelpTranslatePiwik": "Ndoshta do të donit të %1$sna ndihmonit të përmirësojmë përkthimet e Piwik-ut%2$s?",
- "Hide": "hide",
+ "Hide": "fshihe",
"HoursMinutes": "%1$s orë %2$s minuta",
"Id": "Id",
- "IfArchivingIsFastYouCanSetupCronRunMoreOften": "Duke pranuar që arkivimi në site-in tuaj është i shpejtë, mund ta rregulloni crontab-in të xhirojë më shpesh.",
+ "IfArchivingIsFastYouCanSetupCronRunMoreOften": "Duke pranuar që arkivimi në sajtin tuaj është i shpejtë, mund ta rregulloni crontab-in të xhirojë më shpesh.",
"InfoFor": "Të dhëna për %s",
- "InvalidDateRange": "Interval i Pavlefshëm Datash, Ju lutem, Riprovoni",
+ "Installed": "E instaluar",
+ "InvalidDateRange": "Interval i Pavlefshëm Datash, Ju lutemi, Riprovoni",
"InvalidResponse": "Të dhënat e marra janë të pavlefshme.",
"IP": "IP",
- "JsTrackingTag": "Kod JavaScript Gjurmimi",
+ "JsTrackingTag": "Kod Ndjekjeje JavaScript",
"Language": "Gjuhë",
"LastDays": "%s ditët e fundit (përfshirë të sotmen)",
"LastDaysShort": "%s ditët e fundit",
"LearnMore": "%1$smësoni më tepër%2$s",
+ "Live": "Live",
"Loading": "Po ngarkohet...",
"LoadingData": "Po ngarkohen të dhënat...",
- "LoadingPopover": "Loading %s...",
+ "LoadingPopover": "Po ngarkohet %s...",
"LoadingPopoverFor": "Po ngarkohet %s për",
"Locale": "sq_AL.UTF-8",
"Logout": "Dilni",
- "MainMetrics": "Matjet kryesore",
+ "MainMetrics": "Vlerat kryesore",
"Matches": "Përputhje",
"MediumToHighTrafficItIsRecommendedTo": "Për sajte me trafik të shumtë, këshillojmë t’i përpunoni raportet për ditën e sotme e shumta çdo gjysmë ore (%1$s sekonda) ose çdo një orë (%2$s sekonda).",
"Metadata": "Tejtëdhëna",
- "Metric": "Metric",
- "Metrics": "Metrics",
- "MetricsToPlot": "Matje për t’u hedhur në grafik",
- "MetricToPlot": "Matje për t’u hedhur në grafik",
+ "Metric": "Vlerë",
+ "Metrics": "Vlera",
+ "MetricsToPlot": "Vlera për t’u hedhur në grafik",
+ "MetricToPlot": "Vlerë për t’u hedhur në grafik",
"MinutesSeconds": "%1$s minuta %2$ss",
- "Mobile": "Mobile",
+ "Mobile": "Celular",
"Monthly": "Përmuaj",
"MonthlyReport": "përmuaj",
"MonthlyReports": "Raporte të përmuajshëm",
@@ -235,8 +244,8 @@
"OneVisit": "1 vizitë",
"OnlyEnterIfRequired": "Jepni emër përdoruesi vetëm nëse shërbyesi juaj SMTP lyp një të tillë.",
"OnlyEnterIfRequiredPassword": "Jepni fjalëkalim vetëm nëse shërbyesi juaj SMTP lyp një të tillë.",
- "OnlyUsedIfUserPwdIsSet": "E përdorur vetëm kur ka të caktuar një emër përdoruesi\/fjalëkalim, pyesni mundësuesin e llogarisë suaj nëse jeni i pasigurt se cilën metodë të përdorni.",
- "OpenSourceWebAnalytics": "Analizë Web me Burim të Hapët",
+ "OnlyUsedIfUserPwdIsSet": "E përdorur vetëm kur ka të caktuar një emër përdoruesi\/fjalëkalim, pyesni furnizuesin e llogarisë suaj, nëse jeni i pasigurt se cilën metodë të përdorni.",
+ "OpenSourceWebAnalytics": "platformë analizash të lira\/libre",
"OperationAtLeast": "E pakta",
"OperationAtMost": "E shumta",
"OperationContains": "Përmban",
@@ -253,8 +262,8 @@
"Options": "Mundësi",
"Or": "ose",
"Others": "Tjetër",
- "Outlink": "Lidhje për gjetiu",
- "Outlinks": "Lidhje për Jashtë",
+ "Outlink": "Lidhje për jashtë",
+ "Outlinks": "Lidhje për jashtë",
"OverlayRowActionTooltip": "Shihni të dhëna analitike drejt e te sajti juaj (hapet në skedë të re)",
"OverlayRowActionTooltipTitle": "Hapni Përmbledhje Faqeje",
"Overview": "Përmbledhje",
@@ -262,11 +271,13 @@
"Password": "Fjalëkalim",
"Period": "Periudhë",
"Piechart": "Qarkore",
+ "PiwikIsACollaborativeProjectYouCanContributeAndDonate": "%1$sPiwik%2$s është një projekt bashkëpunimi i sjellë për ju nga anëtarët e %7$sekipit të Piwik-ut%8$s, si dhe nga mjaft kontribues anembanë globit. <br\/> Nëse jeni një dashamirës i Piwik-ut, mund të ndihmoni: shihni se si %3$sTë merrni pjesë në Piwik%4$s, ose %5$sdhuroni që tani%6$s që të ndihmoni në financimin e Piwik 3.0!",
"PiwikXIsAvailablePleaseNotifyPiwikAdmin": "%1$s është gati. Ju lutemi, njoftoni %2$spërgjegjësin e Piwik-ut%3$s.",
- "PiwikXIsAvailablePleaseUpdateNow": "Mund të kihet Piwik %1$s. %2$s Ju lutem, përditësojeni tani!%3$s (shihni %4$s ndryshimet%5$s).",
+ "PiwikXIsAvailablePleaseUpdateNow": "Mund të kihet Piwik %1$s. %2$s Ju lutemi, përditësojeni tani!%3$s (shihni %4$s ndryshimet%5$s).",
+ "PleaseContactYourPiwikAdministrator": "Ju lutemi, lidhuni me përgjegjësin e instalimit tuaj Piwik.",
"PleaseSpecifyValue": "Ju lutemi, përcaktoni një vlerë për '%s'.",
"PleaseUpdatePiwik": "Ju lutemi, përditësoni Piwik-un tuaj",
- "Plugin": "Shtojca",
+ "Plugin": "Shtojcë",
"Plugins": "Shtojca",
"PoweredBy": "Bazuar në",
"Previous": "E mëparshmja",
@@ -280,8 +291,8 @@
"PurchasedProducts": "Produkte të Blerë",
"Quantity": "Sasi",
"RangeReports": "Intervale vetjakë datash",
- "ReadThisToLearnMore": "%1$sLexoni këtë, që të dini më shumë.%2$s",
- "Recommended": "(e këshilluar)",
+ "ReadThisToLearnMore": "%1$sLexoni këtë, që të mësoni më tepër.%2$s",
+ "Recommended": "E këshilluar",
"RecordsToPlot": "Regjistrime për t’u hedhur në grafik",
"Refresh": "Rifreskoje",
"RefreshPage": "Rifreskoje faqen",
@@ -295,7 +306,7 @@
"ReportsContainingTodayWillBeProcessedAtMostEvery": "Raportet për ditën e sotme (ose për çfarëdo Intervali Datash që përfshin ditën e sotme) do të përpunohen e shumta çdo",
"RearchiveTimeIntervalOnlyForTodayReports": "Kjo prek vetëm raportet për sot (ose çfarëdo Interval Datash që përfshin të sotmen)",
"ReportsWillBeProcessedAtMostEveryHour": "Ndaj raportet do të përpunohen e shumta çdo një orë.",
- "RequestTimedOut": "Kërkesës për të dhëna te %s i mbaroi koha. Ju lutem, riprovoni.",
+ "RequestTimedOut": "Kërkesës për të dhëna te %s i mbaroi koha. Ju lutemi, riprovoni.",
"Required": "%s i domosdoshëm",
"ReturningVisitor": "Vizitor i Mëparshëm",
"ReturningVisitorAllVisits": "Shihni krejt vizitat",
@@ -309,9 +320,9 @@
"Clear": "Pastroje",
"SearchNoResults": "S’ka përfundime",
"SeeAll": "shihini krejt",
- "SeeThisFaq": "Shihni %1$skëtë faq%2$s.",
+ "SeeThisFaq": "Shihni %1$skëtë FAQ%2$s.",
"Segment": "Segment",
- "SelectYesIfYouWantToSendEmailsViaServer": "Përzgjidhni \"Po\" nëse doni të dërgoni, ose keni për të dërguar, e-mail përmes një shërbyesi të emërtuar, në vend se përmes të një funksioni vendor poste",
+ "SelectYesIfYouWantToSendEmailsViaServer": "Përzgjidhni \"Po\", nëse doni të dërgoni, ose keni për të dërguar, email përmes një shërbyesi të emërtuar, në vend se përmes të një funksioni vendor poste",
"Settings": "Rregullime",
"Shipping": "Dërgesë",
"Show": "shfaqe",
@@ -325,7 +336,7 @@
"Source": "Burim",
"StatisticsAreNotRecorded": "Ndjekja e Vizitorëve Nga Piwik-u është e çaktivizuar! Riaktivizojeni ndjekjen duke dhënë vlerën record_statistics = 1 te kartela juaj config\/config.ini.php.",
"Subtotal": "Nëntotal",
- "Summary": "Përmbledhe",
+ "Summary": "Përmbledhje",
"Table": "Tabelë",
"TagCloud": "Re Etiketash",
"Tax": "Taksë",
@@ -340,12 +351,13 @@
"TrackingScopePage": "Faqe",
"TrackingScopeVisit": "Vizitë",
"TransitionsRowActionTooltip": "Shihni se ç’bënë vizitorët para dhe pas parjes së kësaj faqeje",
+ "TransitionsRowActionTooltipTitle": "Hap Shpërnguljet",
"TranslatorName": "Besnik Bleta",
"UniquePurchases": "Blerje Unike",
"Unknown": "I panjohur",
"Upload": "Ngarkoje",
- "UsePlusMinusIconsDocumentation": "Për lëvizje përdorni ikonën plus dhe minus majtas.",
- "UserId": "User ID",
+ "UsePlusMinusIconsDocumentation": "Për lëvizje përdorni ikonat plus dhe minus majtas.",
+ "UserId": "ID Përdoruesi",
"Username": "Emër përdoruesi",
"UseSMTPServerForEmail": "Për email përdor shërbyes SMTP",
"Value": "Vlerë",
@@ -364,22 +376,28 @@
"VisitsWith": "Vizita me %s",
"VisitorSettings": "Rregullimet për Vizitor",
"VisitType": "Lloj vizitori",
- "VisitTypeExample": "Për shembull, për përzgjedhjen e krejt vizitorëve që janë rikthyer te site-i web, përfshi ata që kanë blerë diçka gjatë vizitash të mëparshme, kërkesa API do të duhej të përmbante %s",
+ "VisitTypeExample": "Për shembull, për përzgjedhjen e krejt vizitorëve që janë rikthyer te sajti, përfshi ata që kanë blerë diçka gjatë vizitash të mëparshme, kërkesa API do të duhej të përmbante %s",
"Warning": "Sinjalizim",
+ "Warnings": "Sinjalizime",
"WarningPhpVersionXIsTooOld": "Versioni PHP %s që po përdorni, ka mbërritur në Fundin e Vet (EOL). Këshilloheni me forcë ta përmirësoni me një version të tanishëm, ngaqë përdorimi i këtij versioni mund t’ju lërë zbuluar përballë cenueshmërish sigurie dhe të metash që janë ndrequr në versione më të rinj të PHP-së.",
"WarningPiwikWillStopSupportingPHPVersion": "Piwik-u do të reshtë së mbuluari PHP %1$s në versionin pasues të rëndësishëm. Përmirësojeni PHP-në tuaj të paktën me PHP %2$s, para se të jetë shumë vonë!",
+ "YouMustUpgradePhpVersionToReceiveLatestPiwik": "Që të merrni përditësimin më të ri të Piwik-ut duhet të përmirësoni versionin tuaj të PHP-së.",
+ "PiwikCannotBeUpgradedBecausePhpIsTooOld": "Piwik-u s’përmirësohet dot me versionin më të ri kryesor, ngaqë versioni juaj për PHP-në është shumë i vjetër.",
+ "PleaseUpgradeYourPhpVersionSoYourPiwikDataStaysSecure": "Ju lutemi, përmirësoni versionin tuaj për PHP-në të paktën me PHP %s që kështu të dhënat tuaja analitike Piwik të mbeten të sigurta.",
"WarningFileIntegrityNoManifest": "Kontrolli i pacenueshmërisë së kartelës s’u krye dot për shkak të mungesës së manifest.inc.php.",
"WarningFileIntegrityNoManifestDeployingFromGit": "Nëse po kryeni instalim të Piwik-ut nga Git, ky mesazh është normal.",
- "WarningFileIntegrityNoMd5file": "Kontrolli i pacënueshmërisë së kartelës nuk u plotësua dot për shkak të mungesës së funksionit md5_file().",
- "WarningDebugOnDemandEnabled": "Mënyra gjurmues %1$s është e aktivizuar. Për arsye sigurie, kjo do të duhej të aktivizohej vetëm për një kohë të shkurtër. Që ta çaktivizoni, caktojeni %2$s si %3$s te %4$s",
+ "WarningFileIntegrityNoMd5file": "Kontrolli i pacenueshmërisë së kartelës nuk u plotësua dot për shkak të mungesës së funksionit md5_file().",
+ "WarningDebugOnDemandEnabled": "Mënyra ndjekës %1$s është e aktivizuar. Për arsye sigurie, kjo do të duhej të aktivizohej vetëm për një kohë të shkurtër. Që ta çaktivizoni, caktojeni %2$s si %3$s te %4$s.",
"Website": "Sajt",
"Weekly": "Përjavë",
+ "WeeklyReport": "përjavë",
"WeeklyReports": "Raporte të përjavshëm",
"WellDone": "Ju lumtë!",
"Widgets": "Widget-e",
"Widget": "Widget",
"XComparedToY": "%1$s krahasuar me %2$s",
"XFromY": "%1$s nga %2$s",
+ "YearlyReport": "përvit",
"YearlyReports": "Raporte të përvitshëm",
"YearsDays": "%1$s vite %2$s ditë",
"Yes": "Po",
@@ -397,17 +415,18 @@
"AddPiwikDemo": "Shtoni Demo Piwik-u",
"Advanced": "Të mëtejshme",
"AnonymousAccess": "Hyrje anonime",
- "AnonymousTracking": "Gjurmim anonim",
- "AskForAnonymousTrackingPermission": "Po u aktivizua, Piwik-u për Celular do të dërgojë te piwik.org të dhëna anonime përdorimi. Synimi është të përdoren këto të dhëna për të ndihmuar zhvilluesit e Piwik-ut për Celular të kuptojnë më mirë se si përdoret aplikacioni. Të dhënat që dërgohen janë: menu dhe rregullime të klikuara, emër dhe version OS-i, çfarëdo gabimi i shfaqur në Piwik-un për Celular. NUK do të gjurmojmë ndonjë të dhënë të statistikave tuaja. Këto të dhëna të anonime nuk do të bëhen kurrë publike. Gjurmimin anonim mund ta aktivizoni\/çaktivizoni kur të doni, te Rregullimet.",
+ "AnonymousTracking": "Ndjekje anonime",
+ "AskForAnonymousTrackingPermission": "Po u aktivizua, Piwik-u për Celular do të dërgojë te piwik.org të dhëna anonime përdorimi. Synimi është të përdoren këto të dhëna për të ndihmuar zhvilluesit e Piwik-ut për Celular të kuptojnë më mirë se si përdoret aplikacioni. Të dhënat që dërgohen janë: menu dhe rregullime të klikuara, emër dhe version OS-i, çfarëdo gabimi i shfaqur në Piwik-un për Celular. NUK do të ndjekim ndonjë të dhënë të statistikave tuaja. Këto të dhëna të anonime nuk do të bëhen kurrë publike. Ndjekjen anonime mund ta aktivizoni\/çaktivizoni kur të doni, te Rregullimet.",
"ChooseHttpTimeout": "Zgjidhni vlerë mbarimi kohe për HTTP-në",
- "ChooseMetric": "Zgjidhni matje",
+ "ChooseMetric": "Zgjidhni vlerë",
"ChooseReport": "Zgjidhni një raport",
"ChooseSegment": "Zgjidhni segment",
"ConfirmRemoveAccount": "Doni të hiqet kjo llogari?",
"DefaultReportDate": "Datë raporti",
"EmailUs": "Dërgonani email",
- "EnableGraphsLabel": "Shfaq graikë",
- "HelpUsToImprovePiwikMobile": "Do të donit të aktivizionit gjurmim anonim përdorimi në Piwik Mobile?",
+ "EnableGraphsLabel": "Shfaq grafikë",
+ "EvolutionGraph": "Grafik Hstoriku",
+ "HelpUsToImprovePiwikMobile": "Do të donit të aktivizonit ndjekje anonime përdorimi në Piwik Mobile?",
"HowtoDeleteAnAccount": "Që të hiqni një llogari, shtypeni për pak çaste.",
"HowtoDeleteAnAccountOniOS": "Rrëshqitni gishtin nga e djathta në të majtë që të fshihni një llogari",
"HowtoLoginAnonymous": "Për hyrje anonime, lërini të zbrazëta fushat për emrin e përdoruesit dhe fjalëkalimin",
@@ -419,6 +438,7 @@
"LoginCredentials": "Kredenciale",
"LoginToPiwikToChangeSettings": "Hyni te shërbyesi juaj Piwik që të krijoni dhe përditësoni sajte, përdorues ose për të ndryshuar Rregullime të Përgjithshme, të tilla si \"Raport për ngarkim si parazgjedhje\".",
"LoginUseHttps": "Përdor https",
+ "MultiChartLabel": "Shfaq grafikë vijëzorë",
"NavigationBack": "Mbrapsht",
"NetworkError": "Gabim Rrjeti",
"NetworkErrorWithStatusCode": "Pati një gabim \"%1$s\". Kërkesa pati si përgjigje gjendjen \"%2$s\". URL-ja qe \"%3$s\". Për më tepër të dhëna rreth gabimit dhe se si të zgjidhet, ju lutemi, kontrolloni URL-në që dhatë dhe regjistrat e gabimeve në këtë shërbyes.",
@@ -433,12 +453,13 @@
"NoWebsiteFound": "S’u gjet sajt",
"NoWebsitesShort": "S’ka Sajte",
"PullDownToRefresh": "Tërhiqeni poshtë që të rifreskohet…",
+ "PossibleSslError": "Mundet të bëhet fjalë për gabim dëshmie SSL",
"PossibleSslErrorExplanation": "Ndodhi një gabim që mund të jetë shkaktuar nga një dëshmi e pavlefshme ose e vetënënshkruar: \"%s\". Mund të arrini të bëni hyrjen, kur shpërfillni vleftësimin SSL, por është më pak i sigurt. Zgjedhjen për vleftësime SSL mund ta ndryshoni kur të doni, te Rregullimet.",
"IgnoreSslError": "Shpërfille Gabimin SSL",
"RatingDontRemindMe": "Mos ma kujto",
"RatingNotNow": "Jo tani",
"RatingNow": "OK, do ta vlerësoj tani",
- "RatingPleaseRateUs": "Aplikacioni Piwik Mobile është Software i Lirë, do tta vlerësonim vërtet, nëse ndaleni një minutë që ta vlerësoni këtë aplikacion te %1$s. Nëse keni sugjerime për veçori të reja ose njoftime të metash, ju lutemi, lidhuni me %2$s",
+ "RatingPleaseRateUs": "Aplikacioni Piwik Mobile është Software i Lirë, do ta vlerësonim vërtet, nëse ndaleni një minutë që ta vlerësoni këtë aplikacion te %1$s. Nëse keni sugjerime për veçori të reja ose njoftime të metash, ju lutemi, lidhuni me %2$s.",
"ReleaseToRefresh": "Lëshojeni që të rifreskohet…",
"Reloading": "Po ringarkohet…",
"RequestTimedOutShort": "Gabim Mbarimi Kohe Rrjeti",
@@ -448,6 +469,7 @@
"SearchWebsite": "Kërkoni sajte",
"ShowAll": "Shfaqi krejt",
"ShowLess": "Shfaq më pak",
+ "StaticGraph": "Grafik Përmbledhës",
"TopVisitedWebsites": "Sajtet më të vizituar",
"TryIt": "Provojeni!",
"UseSearchBarHint": "Këtu shfaqen vetëm %s sajtet e parë. Që të shihni sajtet e tjerë, ju lutemi, përdorni shtyllën e kërkimeve.",
@@ -457,13 +479,15 @@
"YouAreOffline": "Na ndjeni, jeni i palidhur në internet"
},
"RowEvolution": {
- "AvailableMetrics": "Matje të mundshme",
+ "AvailableMetrics": "Vlera të mundshme",
"CompareDocumentation": "Që të krahasoni disa zëra njëherësh, klikoni mbi lidhjen më poshtë dhe hapeni këtë flluskë për një tjetër rresht nga e njëjta tabelë.<br \/>Përdorni ndërthurjen Shift-klikim që t’i vini shenjë rreshtit për krahasim, pa hapur këtë flluskë.",
"CompareRows": "Krahasoni regjistrime",
"ComparingRecords": "Po krahasohen %s rreshta",
- "Documentation": "Klikoni mbi matjet që t’i shfaqni në grafik të mëdhenj evolucioni. Përdorni Shift-klikim që të shfaqni disa matje njëherësh..",
+ "Documentation": "Klikoni mbi vlerat që t’i shfaqni në grafik të mëdhenj evolucioni. Përdorni Shift-klikim që të shfaqni disa vlera njëherësh.",
"MetricBetweenText": "nga %1$s në %2$s",
- "MetricsFor": "Matje për %s",
+ "MetricChangeText": "%s ndryshim përgjatë periudhës",
+ "MetricMinMax": "%1$s lëvizi mes %2$s dhe %3$s përgjatë periudhës",
+ "MetricsFor": "Vlera për %s",
"MultiRowEvolutionTitle": "Evolucion i shumë rreshtave",
"PickAnotherRow": "Zgjidhni një tjetër rresht për krahasim",
"PickARow": "Zgjidhni një rresht për krahasim"
diff --git a/lang/sr.json b/lang/sr.json
index 4282a3d16b..76dc6128d6 100644
--- a/lang/sr.json
+++ b/lang/sr.json
@@ -1,5 +1,7 @@
{
"General": {
+ "12HourClock": "12-časovni sat",
+ "24HourClock": "24-časovni sat",
"AbandonedCarts": "Napuštene korpe",
"AboutPiwikX": "O programu Piwik %s",
"Action": "Akcija",
@@ -11,6 +13,7 @@
"AllWebsitesDashboard": "Svi sajtovi",
"And": "i",
"API": "API",
+ "Apply": "Primeni",
"ArchivingInlineHelp": "Za srednje i velike sajtove preporuka je da isključite ovu opciju i da podesite cron koji će procesirati Piwik izveštaje svaki sat",
"ArchivingTriggerDescription": "Preporučljivo za velike Piwik instalacije; potrebno je da %1$spodesite cron%2$s da procesira izveštaje automatski",
"AuthenticationMethodSmtp": "Način autentikacije za SMTP",
@@ -24,6 +27,7 @@
"CannotUnzipFile": "Ne mogu da raspakujem arhivu %1$s: %2$s",
"ChangePassword": "Promeni lozinku",
"ChangeTagCloudView": "Imajte na umu da izveštaj možete da vidite i u drugačijem obliku. Da biste to učinili, upotrebite kontrole na dnu izveštaja.",
+ "ChooseDate": "Izaberite datum, trenutno izabrani datum je %s",
"ChooseLanguage": "Izaberite jezik",
"ChoosePeriod": "Izaberite period",
"ClickHere": "Kliknite ovde za više informacija.",
@@ -82,6 +86,8 @@
"ConfigFileIsNotWritable": "U Piwik datoteku sa podešavanjima %1$s nije moguće pisati tako da neke od vaših izmena nije moguće sačuvati. %2$s Molimo vas da promenite dozvole nad ovom datotekom kako bi se u nju moglo pisati.",
"Continue": "Nastavak",
"ContinueToPiwik": "Nastavite rad sa Piwik-om.",
+ "CurrentlyUsingUnsecureHttp": "Trenutno koristite Piwik preko nebezbednog HTTP-a što može biti rizično. Predlažemo vam da podesite Piwik tako da koristite SSL (HTTPS) radi povećane bezbednosti.",
+ "CreatedByUser": "kreirao %s",
"CurrentMonth": "Tekući mesec",
"CurrentWeek": "Tekuća nedelja",
"CurrentYear": "Tekuća godina",
@@ -96,6 +102,7 @@
"DateRange": "Vremenski period:",
"DateRangeFrom": "Od",
"DateRangeFromTo": "Od %1$s do %2$s",
+ "DateRangeInPeriodList": "vremenski period",
"DateRangeTo": "Do",
"DaysHours": "%1$s dani %2$s sati",
"DaysSinceFirstVisit": "Dana od prve posete",
@@ -127,12 +134,15 @@
"Edit": "Izmeni",
"EncryptedSmtpTransport": "Upišite tip enkripcije koji zahteva vaš SMTP server.",
"Error": "Greška",
+ "Errors": "Greške",
"ErrorRequest": "Ups, došlo je do problema prilikom obrade zahteva. Možda server trenutno ima nekih problema ili ste zahtevali izveštaj sa previše podataka. Molimo vas da pokušate ponovo. Ako se ovaj problem često pojavljuje, %1$skontaktirajte Piwik administratora%2$s radi pomoći.",
"EvolutionOverPeriod": "Trend za period",
"EvolutionSummaryGeneric": "%1$s u %2$s u odnosu na %3$s u %4$s. Razvoj: %5$s",
"ExceptionContactSupportGeneric": "Ukoliko se ovo još uvek dešava, molimo vas %1$sda kontaktirate vašeg Piwik administratora%2$s za pomoć.",
"ExceptionCheckUserHasSuperUserAccessOrIsTheUser": "Korisnik treba da bude ili superkorisnik ili sam korisnik '%s'.",
"ExceptionConfigurationFileNotFound": "Datoteka sa podešavanjima {%s} nije nađena.",
+ "ExceptionConfigurationFileExistsButNotReadable": "Datoteka sa podešavanjima %s postoji ali Piwik ne može da je pročita.",
+ "ExceptionConfigurationFilePleaseCheckReadableByUser": "Molimo vas da proverite da li je %1$s dostupna za čitanje korisniku '%2$s'.",
"ExceptionDatabaseVersion": "Vaša %1$s verzija je %2$s ali Piwik zahteva barem %3$s.",
"ExceptionDatabaseVersionNewerThanCodebase": "Vaša Piwik aplikacija radi pod starom verzijom %1$s a otkrili smo da je Piwik baza već nadograđena na verziju %2$s.",
"ExceptionDatabaseVersionNewerThanCodebaseWait": "Možda vaš Piwik administrator baš sad završava proces nadogradnje. Molimo vas da pokušate ponovo za par minuta.",
@@ -161,6 +171,7 @@
"ExceptionReportNotFound": "Zahtevani izveštaj ne postoji.",
"ExceptionWidgetNotFound": "Zahtevani vidžet ne postoji.",
"ExceptionReportNotEnabled": "Zahtevani izveštaj nije omogućen. To obično znači da je ili dodatak koji definiše izveštaj deaktiviran ili nemate dovoljan nivo pristupa kako biste pristupili izveštaju.",
+ "ExceptionWidgetNotEnabled": "Zahtevani vidžet nije dostupan. To obično znači da ili je dodatak koji definiše vidžet deaktiviran ili nemate dovoljan nivo pristupa kako biste pristupili vidžetu.",
"ExpandDataTableFooter": "Promeni izgled ili podesi izveštaj",
"Export": "Izvoz",
"ExportAsImage": "Snimi kao sliku",
@@ -173,7 +184,7 @@
"Forums": "Forumi",
"FromReferrer": "od",
"GeneralInformation": "Opšte informacije",
- "General": "Osnovno",
+ "GeneralSettings": "Osnovna podešavanja",
"GetStarted": "Da počnemo",
"GiveUsYourFeedback": "Vaši utisci",
"Goal": "Cilj",
@@ -223,6 +234,7 @@
"Name": "Ime",
"NbActions": "Broj akcija",
"NbSearches": "Broj pretraga",
+ "NeedMoreHelp": "Da li vam je potrebna pomoć?",
"Never": "Nikad",
"NewReportsWillBeProcessedByCron": "Ako Piwik arhiviranje nije pokrenuto od strane brauzera, onda će nove izveštaje procesirati crontab",
"NewUpdatePiwikX": "Izašla je nova verzija: %s",
@@ -257,8 +269,11 @@
"OperationIsNot": "Nije",
"OperationLessThan": "Manje od",
"OperationNotEquals": "Različito od",
+ "OperationStartsWith": "Počinje sa",
+ "OperationEndsWith": "Završava se sa",
"OptionalSmtpPort": "Opciono. Podrazumevana vrednost za neenkriptovani i TLS SMTP server je 25, z 465 za SSL SMTP server.",
"Options": "Opcije",
+ "Or": "ili",
"OrCancel": "ili %1$s prekid %2$s",
"Others": "Ostalo",
"Outlink": "Izlazni link",
@@ -273,8 +288,10 @@
"Password": "Lozinka",
"Period": "Period",
"Piechart": "Grafikon",
+ "PiwikIsACollaborativeProjectYouCanContributeAndDonate": "%1$sPiwik%2$s je saradnički projekat %7$sPiwik tim%8$s članova kao i mnogih drugih učesnika širom sveta. <br\/> Ukoliko ste Piwik fan, možete da pomognete: pogledajte %3$sKako da učestvujete u Piwik-u%4$s, ili %5$sizvršite donaciju%6$s kako biste pomogli razvoju Piwik 3.0!",
"PiwikXIsAvailablePleaseNotifyPiwikAdmin": "%1$s je izašao. Obavestite %2$sPiwik administratora%3$s.",
"PiwikXIsAvailablePleaseUpdateNow": "Objavljen je Piwik %1$s. %2$s Molimo Vas da izvršite nadogradnju!%3$s (pogledajte %4$spromene%5$s).",
+ "PleaseContactYourPiwikAdministrator": "Molimo vas da kontaktirate vašeg Piwik administratora.",
"PleaseSpecifyValue": "Molimo vas da navedete vrednost za '%s'.",
"PleaseUpdatePiwik": "Molimo vas da nadogradite Piwik",
"Plugin": "Dodatak",
@@ -342,11 +359,15 @@
"TagCloud": "Oblak tagova",
"Tax": "Porez",
"TimeAgo": "pre %s",
+ "TimeFormat": "Format vremena",
"TimeOnPage": "Vreme na strani",
"Total": "Ukupno",
"TotalRatioTooltip": "Ovo je %1$s od %2$s %3$s.",
"TotalRevenue": "Ukupan prihod",
"TotalVisitsPageviewsActionsRevenue": "(Ukupno poseta %1$s, prikaza %2$s, akcija %3$s, zarada %4$s)",
+ "TrackingScopeAction": "Akcija",
+ "TrackingScopePage": "Stranica",
+ "TrackingScopeVisit": "Poseta",
"TransitionsRowActionTooltip": "Pogledajte šta su posetioci radili pre i posle posete ovoj stranici",
"TransitionsRowActionTooltipTitle": "Otvori tranzicije",
"TranslatorName": "<a href=\"https:\/\/www.linkedin.com\/in\/petar-benke-905a02b8\">Petar Benke<\/a>, Branislav Maksin, Nikola Stojković",
@@ -372,9 +393,15 @@
"Visitors": "Posetioci",
"VisitsWith": "Posete sa %s",
"VisitorSettings": "Parametri posetilaca",
+ "VisitType": "Tip posete",
"VisitTypeExample": "Na primer, kako biste obeležili sve posetioce koji su se vratili na sajt, uključujući i one koji su već nešto kupili, API zahtev bi sadržao %s",
"Warning": "Upozorenje",
+ "Warnings": "Upozorenja",
"WarningPhpVersionXIsTooOld": "PHP verzija %s koju koristite je zastarela. Molimo vas da hitno nadogradite PHP na najnoviju verziju jer ukoliko nastavite da koristite postojeću, izlažete se sigurnosnim rizicima i bagovima koji su već ispravljeni u novijim verzijama PHP-a.",
+ "WarningPiwikWillStopSupportingPHPVersion": "Piwik će prestati sa podrškom za PHP %1$s sledećom verzijom. Nadogradite vaš PHP na barem %2$s pre nego što bude bilo kasno!",
+ "YouMustUpgradePhpVersionToReceiveLatestPiwik": "Morate da nadogradite PHP kako biste mogli da prihvatite najnoviju verziju Piwik-a.",
+ "PiwikCannotBeUpgradedBecausePhpIsTooOld": "Nije moguća nadogradnja Piwik-a zato što je vaša PHP verzija previše stara.",
+ "PleaseUpgradeYourPhpVersionSoYourPiwikDataStaysSecure": "Molimo vas da nadogradite PHP barem na verziju %s kako bi vaši Piwik analitički podaci ostali bezbedni.",
"WarningFileIntegrityNoManifest": "Proveru integriteta datoteka nije moguće sprovesti zato što nedostaje datoteka manifest.inc.php.",
"WarningFileIntegrityNoManifestDeployingFromGit": "Ukoliko podižete Piwik iz Git-a, ova poruka je sasvim prirodna.",
"WarningFileIntegrityNoMd5file": "Proveru integriteta datoteka nije moguće okončati zato što nedostaje funkcija md5_file().",
@@ -394,6 +421,7 @@
"YearsDays": "%1$s godine %2$s dani",
"Yes": "Da",
"YouAreCurrentlyUsing": "Trenutno koristite Piwik %s.",
+ "YouAreViewingDemoShortMessage": "Trenutno koristite demo verziju Piwik-a.",
"YouMustBeLoggedIn": "Morate se prijaviti da biste pristupili ovim funkcijama",
"YourChangesHaveBeenSaved": "Vaše izmene su sačuvane"
},
diff --git a/lang/sv.json b/lang/sv.json
index 1b6f9f683d..d75ebfe627 100644
--- a/lang/sv.json
+++ b/lang/sv.json
@@ -180,7 +180,6 @@
"Forums": "Forum",
"FromReferrer": "från",
"GeneralInformation": "Allmän information",
- "General": "Allmänt",
"GetStarted": "Kom igång",
"GiveUsYourFeedback": "Lämna din feedback!",
"Goal": "Mål",
diff --git a/lang/ta.json b/lang/ta.json
index c30c630e76..42b8e609d1 100644
--- a/lang/ta.json
+++ b/lang/ta.json
@@ -94,7 +94,6 @@
"ForExampleShort": "எ.கா",
"FromReferrer": "இருந்து",
"GeneralInformation": "பொதுத்தகவல்",
- "General": "பொது",
"GiveUsYourFeedback": "எங்களுக்கு பின்னூட்டம் வழங்குங்கள்",
"GoTo": "%s க்கு போக",
"Help": "உதவி",
diff --git a/lang/tr.json b/lang/tr.json
index 1475840f3f..974c09e283 100644
--- a/lang/tr.json
+++ b/lang/tr.json
@@ -137,7 +137,6 @@
"Forums": "Forum",
"FromReferrer": "şuradan",
"GeneralInformation": "Genel Bilgiler",
- "General": "Genel",
"GetStarted": "Başla",
"GiveUsYourFeedback": "Geri Bildirim Verin!",
"Goal": "Hedef",
diff --git a/lang/uk.json b/lang/uk.json
index 31f5c63dd3..107a0e2541 100644
--- a/lang/uk.json
+++ b/lang/uk.json
@@ -134,12 +134,15 @@
"Edit": "Редагувати",
"EncryptedSmtpTransport": "Виберіть тип шифрування на транспортному рівні, необхідний Вашому SMTP серверу.",
"Error": "Помилка",
+ "Errors": "Помилок",
"ErrorRequest": "Ой... виникла проблема під час виконання запиту. Можливо причиною тому тимчасова проблема на сервері, або Вами був запитаний звіт, що містить великий обсяг даних. Будь ласка, спробуйте ще раз. Якщо це не спрацювало, будь ласка %1$sзв'яжіться з адміністратором Piwik%2$s.",
"EvolutionOverPeriod": "Еволюція за період",
"EvolutionSummaryGeneric": "%1$s в %2$s порівняно з %3$s в %4$s. Зміни: %5$s",
"ExceptionContactSupportGeneric": "Якщо Ви продовжуєте отримувати цю помилку, будь ласка, %1$sзверніться до адміністратора Piwik%2$s за допомогою.",
"ExceptionCheckUserHasSuperUserAccessOrIsTheUser": "Користувач повинен бути або суперкористувачем, або користувачем '%s'.",
"ExceptionConfigurationFileNotFound": "Конфігураційний файл {%s} не може бути знайдений.",
+ "ExceptionConfigurationFileExistsButNotReadable": "Файл конфігурації %s здається існує, але Piwik не може його прочитати.",
+ "ExceptionConfigurationFilePleaseCheckReadableByUser": "Будь ласка, перевірте, що %1$s читається користувачем '%2$s'.",
"ExceptionDatabaseVersion": "Версія Вашого %1$s - %2$s, але Piwik вимагає хоча б %3$s.",
"ExceptionDatabaseVersionNewerThanCodebase": "Виконувані файли Piwik застарілої версії %1$s, а база даних Piwik вже оновлена ​​до нової версії %2$s.",
"ExceptionDatabaseVersionNewerThanCodebaseWait": "Можливо Ваш Piwik-адміністратор щойно закінчив процес оновлення. Спробуйте повторити пізніше.",
@@ -180,7 +183,7 @@
"Forums": "Форуми",
"FromReferrer": "джерело",
"GeneralInformation": "Загальна інформація",
- "General": "Основне",
+ "GeneralSettings": "Загальні налаштування",
"GetStarted": "Приступити",
"GiveUsYourFeedback": "Залиште нам відгук!",
"Goal": "Досягнення",
@@ -286,6 +289,7 @@
"Piechart": "Кругова діаграма",
"PiwikXIsAvailablePleaseNotifyPiwikAdmin": "Доступний %1$s. Будь ласка повідомте %2$sадміністратору Piwik%3$s.",
"PiwikXIsAvailablePleaseUpdateNow": "Piwik %1$s доступний для завантаження. %2$s Будь ласка, оновіться!%3$s (див. %4$s зміни%5$s).",
+ "PleaseContactYourPiwikAdministrator": "Будь ласка, зверніться до адміністратора Piwik.",
"PleaseSpecifyValue": "Будь ласка, визначте значення для '%s'.",
"PleaseUpdatePiwik": "Будь ласка, оновіть систему Веб-аналітики",
"Plugin": "Модуль",
@@ -390,8 +394,12 @@
"VisitType": "Тип візиту",
"VisitTypeExample": "Наприклад, щоб вибрати всіх відвідувачів, які повернулись на сайт, включаючи тих, хто вже купив щось в свої попередні візити, API-запит буде містити: %s",
"Warning": "Увага",
+ "Warnings": "Застереження",
"WarningPhpVersionXIsTooOld": "Версія PHP %s, яку Ви використовуєте, завершила свій життєвий цикл (EOL). Настійно рекомендуємо оновитися до поточної версії, т. к. використання застарілої версії піддає Вас вразливості в безпеці і помилок, які усунуті в більш свіжій версії PHP.",
"WarningPiwikWillStopSupportingPHPVersion": "Piwik припинить підтримку PHP %1$s в наступної версії. Оновіть Ваш PHP, по крайній мірі, до версії PHP %2$s !",
+ "YouMustUpgradePhpVersionToReceiveLatestPiwik": "Ви повинні оновити версію PHP, щоб отримати останнє оновлення Piwik.",
+ "PiwikCannotBeUpgradedBecausePhpIsTooOld": "Piwik не може бути оновлений ​​до останньої основної версії, тому що ваша версія PHP є дуже старою.",
+ "PleaseUpgradeYourPhpVersionSoYourPiwikDataStaysSecure": "Будь ласка, оновіть версію PHP, принаймні до PHP %s так щоб ваші дані Piwik аналітики залишалися в безпеці.",
"WarningFileIntegrityNoManifest": "Перевірка цілісності не може бути проведена через відсутність manifest.inc.php.",
"WarningFileIntegrityNoManifestDeployingFromGit": "Якщо Ви робите розгортання Piwik з Git, це повідомлення є нормальним.",
"WarningFileIntegrityNoMd5file": "Перевірка цілісності не може бути проведена через відсутність функції md5_file().",
diff --git a/lang/vi.json b/lang/vi.json
index ce80ede12d..6174218d4f 100644
--- a/lang/vi.json
+++ b/lang/vi.json
@@ -171,7 +171,6 @@
"Forums": "Các diễn đàn",
"FromReferrer": "Mẫu",
"GeneralInformation": "Thông tin chung",
- "General": "Tổng quan",
"GetStarted": "Bắt đầu",
"GiveUsYourFeedback": "Thông tin phản hồi cho chúng tôi!",
"Goal": "Chỉ tiêu",
diff --git a/lang/zh-cn.json b/lang/zh-cn.json
index e72cf2a471..673b8bec64 100644
--- a/lang/zh-cn.json
+++ b/lang/zh-cn.json
@@ -1,7 +1,7 @@
{
"General": {
- "12HourClock": "12小时制式",
- "24HourClock": "24小时制式",
+ "12HourClock": "12 小时制式",
+ "24HourClock": "24 小时制式",
"AbandonedCarts": "丢弃的购物车",
"AboutPiwikX": "关于 Piwik %s",
"Action": "操作",
@@ -134,12 +134,15 @@
"Edit": "修改",
"EncryptedSmtpTransport": "输入您的SMTP服务器需要的传输层加密方式",
"Error": "错误",
+ "Errors": "错误",
"ErrorRequest": "抱歉...请求时出现问题。也许服务器存在暂时性的问题,或者你请求了太多的数据报告。 请再试一次。如果重复出现此错误,请%1$s联系您的Piwik管理员%2$s寻求援助。",
"EvolutionOverPeriod": "趋势分析",
"EvolutionSummaryGeneric": "%1$s 在 %2$s 对比 %3$s 在 %4$s。趋势: %5$s",
"ExceptionContactSupportGeneric": "如果您仍然有这个问题,请%1$s联系您的Piwik管理员%2$s寻求援助。",
"ExceptionCheckUserHasSuperUserAccessOrIsTheUser": "用户必须是超级用户或是'%s' 自己。",
"ExceptionConfigurationFileNotFound": "配置文件 {%s} 找不到。",
+ "ExceptionConfigurationFileExistsButNotReadable": "设置文件 %s 不能被 Piwik 读取,请检查文件权限。",
+ "ExceptionConfigurationFilePleaseCheckReadableByUser": "请检查用户”%2$s“具有读写 %1$s 的权限。",
"ExceptionDatabaseVersion": "您的 %1$s 版本为 %2$s ,但 Piwik 需求至少要 %3$s。",
"ExceptionDatabaseVersionNewerThanCodebase": "您的Piwik代码库运行旧版本%1$s,但是我们检测到您的Piwik数据库已经升级到新的版本%2$s。",
"ExceptionDatabaseVersionNewerThanCodebaseWait": "也许你的Piwik管理员正在完成升级过程。请在几分钟后再试一次。",
@@ -168,6 +171,7 @@
"ExceptionReportNotFound": "请求的报告不存在。",
"ExceptionWidgetNotFound": "所请求的插件不存在。",
"ExceptionReportNotEnabled": "请求的报告未启用。这通常意味着要么定义报表停用或您没有足够的权限来访问此报告的插件。",
+ "ExceptionWidgetNotEnabled": "请求的小工具未启用。 可能是该小工具被停用或者您没有权限访问该小工具。",
"ExpandDataTableFooter": "更改可视化或配置报告",
"Export": "导出",
"ExportAsImage": "导出为图片",
@@ -180,7 +184,7 @@
"Forums": "论坛",
"FromReferrer": "来自",
"GeneralInformation": "通用信息",
- "General": "通用",
+ "GeneralSettings": "通用设置",
"GetStarted": "开始",
"GiveUsYourFeedback": "意见反馈!",
"Goal": "目标",
@@ -284,8 +288,10 @@
"Password": "密码",
"Period": "统计时间",
"Piechart": "圆饼图",
+ "PiwikIsACollaborativeProjectYouCanContributeAndDonate": "%1$s Piwik %2$s 是由 %7$s Piwik 团队 %8$s 的成员以及全球许多其他贡献者赞助商的合作项目。<br\/>如果你是 Piwik 的粉丝,你可以帮助我们:找到 %3$s 怎样参与 Piwik 项目 %4$s,或者 %5$s 捐赠 %6$s 以便维持 Piwik 3.0 的开发!",
"PiwikXIsAvailablePleaseNotifyPiwikAdmin": "%1$s可用。请通知%2$sPiwik管理员%3$s。",
"PiwikXIsAvailablePleaseUpdateNow": "Piwik %1$s 已经发布。 %2$s 请立即更新!%3$s (查看 %4$s 与%5$s 的差异)。",
+ "PleaseContactYourPiwikAdministrator": "请联系您的 Piwik 管理员",
"PleaseSpecifyValue": "请为 '%s' 选择一个指标。",
"PleaseUpdatePiwik": "请更新 Piwik",
"Plugin": "插件",
@@ -390,8 +396,12 @@
"VisitType": "访问者类型",
"VisitTypeExample": "例如,要选择所有回头访客,包括那些以前购买过产品的,API 请求需要包含 %s",
"Warning": "警告",
+ "Warnings": "警告",
"WarningPhpVersionXIsTooOld": "您正在使用的PHP版本%s 已达到其生命周期结束(EOL)。我们强烈敦促升级到最新版本,因为使用这个版本可能会使您已修复在最近版本的PHP中的安全漏洞和错误。",
"WarningPiwikWillStopSupportingPHPVersion": "Piwik将停止下一个主要版本,支持PHP%1$s。升级你的PHP来至少PHP%2$s还为时不晚。",
+ "YouMustUpgradePhpVersionToReceiveLatestPiwik": "您需要升级您的 PHP 版本才能接收最新的 Piwik 更新。",
+ "PiwikCannotBeUpgradedBecausePhpIsTooOld": "您当前的 PHP 版本不兼容最新的 Piwik。",
+ "PleaseUpgradeYourPhpVersionSoYourPiwikDataStaysSecure": "请您将 PHP 版本升级到 %s 以上,以便保持您的 Piwik 统计数据安全。",
"WarningFileIntegrityNoManifest": "缺少 manifest.inc.php,所以文件完整性检查无法完成。",
"WarningFileIntegrityNoManifestDeployingFromGit": "如果从Git的部署Piwik,此消息是正常的。",
"WarningFileIntegrityNoMd5file": "缺少 md5_file() 函数,所以文件完整性检查无法完成。",
@@ -416,7 +426,7 @@
"YourChangesHaveBeenSaved": "修改已保存。"
},
"Mobile": {
- "AboutPiwikMobile": "关于Piwik Mobile",
+ "AboutPiwikMobile": "关于 Piwik 移动版",
"AccessUrlLabel": "Piwik 存取网址",
"Account": "账户",
"Accounts": "账号",
diff --git a/plugins/API/ProcessedReport.php b/plugins/API/ProcessedReport.php
index d957b1e717..d4fc8b7cba 100644
--- a/plugins/API/ProcessedReport.php
+++ b/plugins/API/ProcessedReport.php
@@ -790,10 +790,10 @@ class ProcessedReport
// Add % symbol to rates
if (strpos($columnName, '_rate') !== false) {
if (strpos($value, "%") === false) {
- return $value . "%";
+ return (100 * $value) . "%";
}
}
return $value;
}
-} \ No newline at end of file
+}
diff --git a/plugins/API/SegmentMetadata.php b/plugins/API/SegmentMetadata.php
index 95757638c2..1cce5fd3dd 100644
--- a/plugins/API/SegmentMetadata.php
+++ b/plugins/API/SegmentMetadata.php
@@ -10,6 +10,7 @@ namespace Piwik\Plugins\API;
use Piwik\Columns\Dimension;
use Piwik\Piwik;
+use Piwik\Plugin\Segment;
class SegmentMetadata
{
@@ -17,14 +18,41 @@ class SegmentMetadata
{
$segments = array();
+ /**
+ * Triggered to add custom segment definitions.
+ *
+ * **Example**
+ *
+ * public function addSegments(&$segments)
+ * {
+ * $segment = new Segment();
+ * $segment->setSegment('my_segment_name');
+ * $segment->setType(Segment::TYPE_DIMENSION);
+ * $segment->setName('My Segment Name');
+ * $segment->setSqlSegment('log_table.my_segment_name');
+ * $segments[] = $segment;
+ * }
+ *
+ * @param array &$segments An array containing a list of segment entries.
+ */
+ Piwik::postEvent('Segment.addSegments', array(&$segments));
+
foreach (Dimension::getAllDimensions() as $dimension) {
foreach ($dimension->getSegments() as $segment) {
- if ($segment->isRequiresAtLeastViewAccess()) {
- $segment->setPermission($isAuthenticatedWithViewAccess);
- }
+ $segments[] = $segment;
+ }
+ }
- $segments[] = $segment->toArray();
+ /** @var Segment[] $dimensionSegments */
+ $dimensionSegments = $segments;
+ $segments = array();
+
+ foreach ($dimensionSegments as $segment) {
+ if ($segment->isRequiresAtLeastViewAccess()) {
+ $segment->setPermission($isAuthenticatedWithViewAccess);
}
+
+ $segments[] = $segment->toArray();
}
foreach ($segments as &$segment) {
diff --git a/plugins/API/WidgetMetadata.php b/plugins/API/WidgetMetadata.php
index 8f0fb0330f..2d77e7698d 100644
--- a/plugins/API/WidgetMetadata.php
+++ b/plugins/API/WidgetMetadata.php
@@ -82,6 +82,7 @@ class WidgetMetadata
$item['order'] = $widget->getOrder();
$item['parameters'] = $widget->getParameters();
$item['uniqueId'] = $widget->getUniqueId();
+ $item['isWide'] = $widget->isWide();
$middleware = $widget->getMiddlewareParameters();
diff --git a/plugins/API/lang/nl.json b/plugins/API/lang/nl.json
index 6e4547944d..e26a99170f 100644
--- a/plugins/API/lang/nl.json
+++ b/plugins/API/lang/nl.json
@@ -8,6 +8,8 @@
"ReportingApiReference": "Rapportage API verwijzing",
"TopLinkTooltip": "Benader je Web Analyse data via een simpele API in josn, xml, enz.",
"UserAuthentication": "Gebruikers authenticatie.",
- "UsingTokenAuth": "Als u data wil %1$s opvragen via een script, een cronjob, enz. waarvoor authenticatie vereist is, %2$s moet u de parameter %3$s aan de API aanvraag URL's toevoegen"
+ "UsingTokenAuth": "Als u data wil %1$s opvragen via een script, een cronjob, enz. waarvoor authenticatie vereist is, %2$s moet u de parameter %3$s aan de API aanvraag URL's toevoegen",
+ "Glossary": "Samenvatting",
+ "LearnAboutCommonlyUsedTerms": "Leer over de standaard gebruikte termen om zo het meeste uit Piwik Analytics te halen: %1$s en %2$s."
}
} \ No newline at end of file
diff --git a/plugins/API/lang/ru.json b/plugins/API/lang/ru.json
index b1f33d003e..93987babb9 100644
--- a/plugins/API/lang/ru.json
+++ b/plugins/API/lang/ru.json
@@ -2,13 +2,13 @@
"API": {
"GenerateVisits": "Если у вас нет данных на сегодня, вы можете для начала сгенерировать немного статистики, используя плагин: %1$s. Включите плагин %2$s, кликните на ’Visitor Generator’ в панели администрирования Piwik.",
"KeepTokenSecret": "Этот token_auth является таким же секретным, как ваш логин и пароль. %1$s НЕ СООБЩАЙТЕ ЕГО НИКОМУ%2$s!",
- "LoadedAPIs": "%s API успешно загружен",
- "MoreInformation": "Чтобы узнать больше информации о Piwik API, пожалуйста, посмотрите раздел %1$s Introduction to Piwik API %2$s в %3$s Piwik API Reference %4$s.",
+ "LoadedAPIs": "%s API успешно загружены",
+ "MoreInformation": "Чтобы узнать больше информации о Piwik API, пожалуйста, посмотрите раздел %1$s Introduction to Piwik API %2$s и %3$s Piwik API Reference %4$s.",
"PluginDescription": "Все данные из Piwik доступны через простые API. Этот плагин является входной точкой для веб сервиса, который можно вызвать чтобы получить данные веб аналитики в xml, json, php, csv и др.",
"ReportingApiReference": "Сообщение справочной информации по API",
"TopLinkTooltip": "Получайте доступ к вашей веб-аналитике с помощью простого API и использования json, xml и др.",
"UserAuthentication": "Аутентификация пользователя",
- "UsingTokenAuth": "Если вам необходимо %1$s запрашивать данные в ваших скриптах, cron-задачах, или другого источника, то вам %2$s необходимо добавить следующий ключ %3$s к URL API-вызова, который требует аутентификации.",
+ "UsingTokenAuth": "Если вам необходимо %1$s запрашивать данные в ваших скриптах, cron-задачах или другого источника, то вам %2$s необходимо добавить следующий ключ %3$s к URL API-вызова, который требует аутентификации.",
"Glossary": "Глоссарий",
"LearnAboutCommonlyUsedTerms": "Изучите часто используемые термины, чтобы извлечь максимум пользы из Piwik Analytics: %1$s and %2$s."
}
diff --git a/plugins/API/lang/sq.json b/plugins/API/lang/sq.json
index 5c7bcb0f25..4b687493ae 100644
--- a/plugins/API/lang/sq.json
+++ b/plugins/API/lang/sq.json
@@ -3,13 +3,13 @@
"GenerateVisits": "Nëse nuk keni të dhëna për ditën e sotme, mund të prodhonit ca të dhëna duke përdorur shtojcën %1$s. Shtojcën %2$s mund ta aktivizoni, mandej klikoni mbi menunë 'Gjenerator Vizitorësh' te pjesa Përgjegjës Piwik-u.",
"KeepTokenSecret": "Ky token_auth është po aq i fshehtë sa të dhënat tuaja për hyrjen dhe fjalëkalimi juaj, %1$s mos ia jepni kujt%2$s!",
"LoadedAPIs": "U ngarkua me sukses API %s",
- "MoreInformation": "Për më tepër të dhëna rreth API-ve të Piwik-ut, ju lutem, hidhini një sy %1$s Hyrje në API-t e Piwik-ut %2$s dhe %3$s Referencë API-sh Piwik-u %4$s.",
- "PluginDescription": "Në Piwik krejt të dhënat janë të passhme përmes API-sh të thjeshta. Kjo shtojcë është pika e hyrjes për një shërbim web, të cilin mund ta vini në punë për të patur të dhënat tuaja të Analizës Web në format xml, json, php, csv, etj.",
+ "MoreInformation": "Për më tepër të dhëna rreth API-ve të Piwik-ut, ju lutemi, hidhini një sy %1$s Hyrje në API-t e Piwik-ut %2$s dhe %3$s Referencë API-sh Piwik-u %4$s.",
+ "PluginDescription": "Në Piwik krejt të dhënat janë të passhme përmes API-sh të thjeshta. Kjo shtojcë është pika e hyrjes për një shërbim web, të cilin mund ta vini në punë për të patur të dhënat tuaja të Analizave Web në format xml, json, php, csv, etj.",
"ReportingApiReference": "Referencë API Raportimesh",
"TopLinkTooltip": "Hyni programatikisht te të dhënat tuaja të Analizave Web përmes një API-je të thjeshtë json, xml, etj.",
"UserAuthentication": "Mirëfilltësim përdoruesi",
"UsingTokenAuth": "Nëse doni të %1$s kërkoni të dhëna brenda një programthi, një crontab-i, etj. %2$s lypset të shtoni parametrin %3$s te URL-të për thirrje API që lypin mirëfilltësim.",
"Glossary": "Fjalorth",
- "LearnAboutCommonlyUsedTerms": "Mësoni rreth termave që përdoren zakonisht, për të përfituar maksimumin prej Analizave Piwik Analytics: %1$s dhe %2$s."
+ "LearnAboutCommonlyUsedTerms": "Mësoni rreth termave që përdoren zakonisht, për të përfituar maksimumin prej Analizave Piwik: %1$s dhe %2$s."
}
} \ No newline at end of file
diff --git a/plugins/API/lang/sr.json b/plugins/API/lang/sr.json
index 11361f201f..bd0347f768 100644
--- a/plugins/API/lang/sr.json
+++ b/plugins/API/lang/sr.json
@@ -5,8 +5,11 @@
"LoadedAPIs": "Uspešno učitano API-ja: %s",
"MoreInformation": "Za više informacija o Piwik API-ju molimo vas da pogledate %1$s uvod u Piwik API %2$s i %3$s Piwik API referenc listu %4$s.",
"PluginDescription": "Svi podaci su u Piwik-u dostupni preko jednostavnih API-ja. Ovaj dodatak je ulazna tačka za veb servis koji možete pozivati kako biste dobili vaše analitičke podatke u XML, JSON, PHP, CSV i drugim formatima.",
+ "ReportingApiReference": "Referenca API-ja za izveštavanje",
"TopLinkTooltip": "Pristupite analitičkim podacima iz vašeg programa pomoću jednostavnog API-ja u json-u, xml-u itd.",
"UserAuthentication": "Autentifikacija korisnika",
- "UsingTokenAuth": "Ukoliko želite da %1$s dođete do podataka putem skripta, crontaba i slično %2$s potrebno je da dodate parametar %3$s API pozivima."
+ "UsingTokenAuth": "Ukoliko želite da %1$s dođete do podataka putem skripta, crontaba i slično %2$s potrebno je da dodate parametar %3$s API pozivima.",
+ "Glossary": "Rečnik",
+ "LearnAboutCommonlyUsedTerms": "Naučite najčešće koišćene termine kako biste izvukli maksimum iz Piwik analitike: %1$s i %2$s."
}
} \ No newline at end of file
diff --git a/plugins/API/templates/glossary.twig b/plugins/API/templates/glossary.twig
index fc593742c9..d7fd2d1de9 100644
--- a/plugins/API/templates/glossary.twig
+++ b/plugins/API/templates/glossary.twig
@@ -3,41 +3,43 @@
{% set title %}{{ 'API_Glossary'|translate }}{% endset %}
{% block content %}
- <h2 piwik-enriched-headline>{{ title }}</h2>
+ <div piwik-content-intro>
- {{ 'API_LearnAboutCommonlyUsedTerms'|translate(
- '<a href="#metrics">'~ 'General_Metrics'|translate ~ '</a>',
- '<a href="#reports">' ~ 'General_Reports'|translate ~ '</a>')|raw
- }}
+ <h2>{{ title|e('html_attr') }}</h2>
+ <p>
+ {{ 'API_LearnAboutCommonlyUsedTerms'|translate(
+ '<a href="#metrics">'~ 'General_Metrics'|translate ~ '</a>',
+ '<a href="#reports">' ~ 'General_Reports'|translate ~ '</a>')|raw
+ }}
- <!-- {{ metrics|length }} metrics, {{ reports|length }} reports -->
+ <!-- {{ metrics|length }} metrics, {{ reports|length }} reports -->
+ </p>
+ </div>
<a id="metrics"></a>
- <h2>{{ 'General_Metrics'|translate }}</h2>
- <table>
- {% for metric in metrics %}
- <tr>
- <td>
- <h3>{{ metric.name }}</h3>
- </td>
- <td>
- {{ metric.documentation|raw }}
-
- <br/><span style="color: #bbb;">{{ metric.id }} (API)</span>
- </td>
- </tr>
- {% endfor %}
- </table>
+ <div piwik-content-block content-title="{{ 'General_Metrics'|translate|e('html_attr') }}">
+ <table>
+ {% for metric in metrics %}
+ <tr>
+ <td>
+ <h3>{{ metric.name }}</h3>
+ </td>
+ <td>
+ {{ metric.documentation|raw }}
+
+ <br/><span style="color: #bbb;">{{ metric.id }} (API)</span>
+ </td>
+ </tr>
+ {% endfor %}
+ </table>
+ </div>
<a id="reports"></a>
- <h2>{{ 'General_Reports'|translate }}</h2>
-
-
- {% for report in reports %}
- <h3>{{ report.name }}</h3>
- <p>{{ report.documentation|raw }}</p>
- {% endfor %}
-
-
+ <div piwik-content-block content-title="{{ 'General_Reports'|translate|e('html_attr') }}">
+ {% for report in reports %}
+ <h3>{{ report.name }}</h3>
+ <p>{{ report.documentation|raw }}</p>
+ {% endfor %}
+ </div>
{% endblock %} \ No newline at end of file
diff --git a/plugins/API/tests/Unit/WidgetMetadataTest.php b/plugins/API/tests/Unit/WidgetMetadataTest.php
index 340a0fb6ea..71d9111ca9 100644
--- a/plugins/API/tests/Unit/WidgetMetadataTest.php
+++ b/plugins/API/tests/Unit/WidgetMetadataTest.php
@@ -63,7 +63,8 @@ class WidgetMetadataTest extends \PHPUnit_Framework_TestCase
'module' => 'CoreHome',
'action' => 'render'
),
- 'uniqueId' => 'widgetCoreHomerender'
+ 'uniqueId' => 'widgetCoreHomerender',
+ 'isWide' => false
), $metadata);
}
@@ -154,7 +155,8 @@ class WidgetMetadataTest extends \PHPUnit_Framework_TestCase
'module' => 'CoreHome',
'action' => 'render',
),
- 'uniqueId' => 'widgetCoreHomerender'
+ 'uniqueId' => 'widgetCoreHomerender',
+ 'isWide' => false
), $widget1);
$this->assertSame(array(
'name' => 'NestedName2',
@@ -176,7 +178,8 @@ class WidgetMetadataTest extends \PHPUnit_Framework_TestCase
'module' => 'CoreHome',
'action' => 'render',
),
- 'uniqueId' => 'widgetCoreHomerender'
+ 'uniqueId' => 'widgetCoreHomerender',
+ 'isWide' => false
), $widget2);
}
@@ -219,6 +222,7 @@ class WidgetMetadataTest extends \PHPUnit_Framework_TestCase
'action' => 'render',
),
'uniqueId' => 'widgetCoreHomerender',
+ 'isWide' => false
), array (
'name' => 'NestedName2',
'module' => 'CoreHome',
@@ -228,7 +232,8 @@ class WidgetMetadataTest extends \PHPUnit_Framework_TestCase
'module' => 'CoreHome',
'action' => 'render',
),
- 'uniqueId' => 'widgetCoreHomerender'
+ 'uniqueId' => 'widgetCoreHomerender',
+ 'isWide' => false
)
)
), $metadata);
diff --git a/plugins/Actions/lang/cs.json b/plugins/Actions/lang/cs.json
index e55c2038ff..b8c782e6a4 100644
--- a/plugins/Actions/lang/cs.json
+++ b/plugins/Actions/lang/cs.json
@@ -21,11 +21,12 @@
"ColumnSearchExits": "% Nalezených výstupů",
"ColumnSearchExitsDocumentation": "Procento návštěv, které opustily stránku po nalezení tohoto klíčového slova pomocí vyhledávače.",
"ColumnSearchResultsCount": "Počet nalezených výsledků",
- "ColumnSiteSearchKeywords": "Unikátních klíčových slov",
- "ColumnUniqueClicks": "Unikátních prokliků",
+ "ColumnSiteSearchKeywords": "Jedinečných klíčových slov",
+ "ColumnUniqueClicks": "Jedinečných prokliků",
"ColumnUniqueClicksDocumentation": "Počet návštěv, které klikly na tento odkaz. Pokud bylo na odkaz kliknuto vícekrát při jedné návštěvě, je kliknutí započítáno jen jednou.",
- "ColumnUniqueDownloads": "Unikátních stažení",
- "ColumnUniqueOutlinks": "Unikátní externí odkazy",
+ "ColumnUniqueDownloads": "Jedinečných stažení",
+ "ColumnUniqueOutlinks": "Jedinečné externí odkazy",
+ "ColumnIdPageview": "ID zobrazení stránky",
"DownloadsReportDocumentation": "V tomto hlášení můžete vidět soubory, které byly staženy. %s Které Piwik počítá jako stažené jsou jen ty, na které bylo kliknuto. Bez ohledu na to, jestli bylo stažení dokončeno nebo přerušeno. To Piwik neumí zjistit.",
"EntryPagesReportDocumentation": "Toto hlášení obsahuje informace o vstupních stránkách, které byly použity v daném období. Vstupní stránka je první stránka, kterou uživatel zobrazí při své návštěvě. %s URL vstupních stránek jsou zobrazeny jako strom složek.",
"EntryPageTitles": "Titulky vstupních stránek",
diff --git a/plugins/Actions/lang/da.json b/plugins/Actions/lang/da.json
index 92ce7c09f3..248ad62fef 100644
--- a/plugins/Actions/lang/da.json
+++ b/plugins/Actions/lang/da.json
@@ -26,6 +26,7 @@
"ColumnUniqueClicksDocumentation": "Antal besøg, der involverede et klik på linket. Hvis et link blev klikket flere gange under et besøg, tæller det kun én gang.",
"ColumnUniqueDownloads": "Unikke fil-hentninger",
"ColumnUniqueOutlinks": "Unikke udgående links",
+ "ColumnIdPageview": "Sidevisning ID",
"DownloadsReportDocumentation": "Rapporten viser, hvilke filer dine besøgende har hentet. %s Hvad Piwik tæller som en filhentning, er klikket på et link. Hvorvidt overførelsen er afsluttet eller ej ved Piwik ikke.",
"EntryPagesReportDocumentation": "Rapporten indeholder oplysninger om indgangs sider, der blev anvendt i den angivne periode. En indgangs side er den første side, en bruger får vist under sit besøg. %s Indgang siden vises som en mappe struktur.",
"EntryPageTitles": "Indgangssidetitler",
diff --git a/plugins/Actions/lang/de.json b/plugins/Actions/lang/de.json
index 52e3720409..7b918754a2 100644
--- a/plugins/Actions/lang/de.json
+++ b/plugins/Actions/lang/de.json
@@ -26,6 +26,7 @@
"ColumnUniqueClicksDocumentation": "Die Anzahl der Besuche, bei denen dieser Link angeklickt wurde. Falls der Link mehrmals pro Besuch angeklickt wurde, wird er nur einmal gezählt.",
"ColumnUniqueDownloads": "Eindeutige Downloads",
"ColumnUniqueOutlinks": "Eindeutige ausgehende Verweise",
+ "ColumnIdPageview": "Seitenansicht-ID",
"DownloadsReportDocumentation": "In diesem Bericht sehen Sie, welche Dateien Ihre Besucher heruntergeladen haben. %s Als Download wird in Piwik der Klick auf einen Downloadlink gewertet. Ob der Download abgeschlossen wurde oder nicht, ist Piwik nicht bekannt.",
"EntryPagesReportDocumentation": "Dieser Bericht enthält Informationen über die Einstiegsseiten. Die Einstiegsseite ist die erste Seite, die während eines Besuches aufgerufen wird. %s Die URLs werden als Ordnerstruktur angezeigt.",
"EntryPageTitles": "Titel der Einstiegsseite",
diff --git a/plugins/Actions/lang/el.json b/plugins/Actions/lang/el.json
index e80eb4151a..456509ecdc 100644
--- a/plugins/Actions/lang/el.json
+++ b/plugins/Actions/lang/el.json
@@ -26,6 +26,7 @@
"ColumnUniqueClicksDocumentation": "Ο αριθμός των επισκέψεων που περιλαμβάνουν ένα πάτημα σε αυτό το σύνδεσμο. Αν ο σύνδεσμος πατήθηκε πολλές φορές σε μια επίσκεψη, μετριέται μόνο μια φορά.",
"ColumnUniqueDownloads": "Μοναδικές λήψεις",
"ColumnUniqueOutlinks": "Μοναδικοί Εξωτερικοί σύνδεσμοι",
+ "ColumnIdPageview": "Αναγνωριστικό εμφάνισης σελίδας",
"DownloadsReportDocumentation": "Σε αυτή την αναφορά, μπορείτε να δείτε ποια αρχεία λάβανε οι επισκέπτες σας. %s Αυτό που μετράει το Piwik ως λήψη είναι το πάτημα σε σύνδεσμο λήψης. Αν η λήψη ολοκληρώθηκε ή όχι δεν είναι γνωστό για το Piwik.",
"EntryPagesReportDocumentation": "Αυτή η αναφορά περιέχει πληροφορίες σχετικά με τις σελίδες εισόδου που χρησιμοποιήθηκαν για τη συγκεκριμένη περίοδο. Μια σελίδα εισόδου είναι η πρώτη σελίδα που βλέπει ο χρήστης κατά την επίσκεψή του. %s Οι διευθύνσεις ιστοσελίδων εισόδου εμφανίζονται σε δομή φακέλου.",
"EntryPageTitles": "Τίτλοι σελίδας εισόδου",
diff --git a/plugins/Actions/lang/es.json b/plugins/Actions/lang/es.json
index 93759eddff..0f917d31c3 100644
--- a/plugins/Actions/lang/es.json
+++ b/plugins/Actions/lang/es.json
@@ -26,6 +26,7 @@
"ColumnUniqueClicksDocumentation": "Número de visitas que hicieron clic en este enlace. Si un enlace se le hace clic varias veces durante una sola visita, sólo se cuenta una vez.",
"ColumnUniqueDownloads": "Descargas únicas",
"ColumnUniqueOutlinks": "Enlaces externos únicos",
+ "ColumnIdPageview": "ID Páginas vistas",
"DownloadsReportDocumentation": "En este informe, puede ver que archivos han descargado sus visitantes. %s Lo que Piwik cuenta como descarga es el clic en un enlace de descarga. Si la descarga fue completada o no, Piwik no puede saberlo.",
"EntryPagesReportDocumentation": "Este informe contiene información sobre las entradas a las páginas que fueron usadas durante el periodo especificado. La página de entrada es la primera página que el usuario ve durante su visita. %s Las URLs de entrada son mostradas como una estructura de carpetas.",
"EntryPageTitles": "Títulos de páginas de entrada",
diff --git a/plugins/Actions/lang/fr.json b/plugins/Actions/lang/fr.json
index e63293a2b0..7be756a2e1 100644
--- a/plugins/Actions/lang/fr.json
+++ b/plugins/Actions/lang/fr.json
@@ -26,6 +26,7 @@
"ColumnUniqueClicksDocumentation": "Nombre de visites qui ont impliqué un clic sur ce lien. Si un lien a été cliqué plusieurs fois en une seule visite, il n'est compté qu'une seule fois.",
"ColumnUniqueDownloads": "Téléchargements uniques",
"ColumnUniqueOutlinks": "Liens sortants uniques",
+ "ColumnIdPageview": "ID de vue de page",
"DownloadsReportDocumentation": "Dans ce rapport vous pouvez voir quels fichiers les utilisateurs ont téléchargés. %s Ce que Piwik compte comme un téléchargement est un clic sur un lien de téléchargement. Le fait que le téléchargement ait été terminé ou non n'est pas connu de Piwik.",
"EntryPagesReportDocumentation": "Ce rapport contient des informations à propos des pages d'entrées qui ont été utilisées durant la période spécifiée. Une page d'entrée est lapremière page qu'un utilisateur voit pendant sa visite. %s Les URLs des pages d'entrée sont affichées dans une structure de dossier.",
"EntryPageTitles": "Titres de la page d'entrée",
diff --git a/plugins/Actions/lang/it.json b/plugins/Actions/lang/it.json
index 46383b7e2e..ebcd055eb0 100644
--- a/plugins/Actions/lang/it.json
+++ b/plugins/Actions/lang/it.json
@@ -26,6 +26,7 @@
"ColumnUniqueClicksDocumentation": "Il numero di visite che hanno coinvolto un click su questo link. Se un link è stato cliccato più volte nel corso di una visita, viene conteggiato una sola volta.",
"ColumnUniqueDownloads": "Download Unici",
"ColumnUniqueOutlinks": "Link esterni unici",
+ "ColumnIdPageview": "ID Pagina vista",
"DownloadsReportDocumentation": "In questo report è possibile vedere quali file sono stati scaricati dai tuoi visitatori. %s Ciò che Piwik conta come download è il click su un link per il download. Se il download è stato completato o meno, non è noto a Piwik.",
"EntryPagesReportDocumentation": "Questo report contiene informazioni sulle pagine di ingresso che sono state utilizzate durante il periodo specificato. Una pagina di ingresso è la prima pagina che un utente visualizza durante la sua visita. %s Gli URL di ingresso vengono visualizzati come una struttura di cartelle.",
"EntryPageTitles": "Titoli delle pagine in entrata",
diff --git a/plugins/Actions/lang/ko.json b/plugins/Actions/lang/ko.json
index 9c56c41765..6e1f3fb7da 100644
--- a/plugins/Actions/lang/ko.json
+++ b/plugins/Actions/lang/ko.json
@@ -25,6 +25,7 @@
"ColumnUniqueClicksDocumentation": "이 링크를 ​​클릭 한 방문자의 수입니다. 한번의 방문으로 여러 번 링크를 ​​클릭해도 한 번으로 계산됩니다.",
"ColumnUniqueDownloads": "고유 다운로드 수",
"ColumnUniqueOutlinks": "고유한 외부 링크 수",
+ "ColumnIdPageview": "페이비뷰 아이디",
"DownloadsReportDocumentation": "이 보고서는 방문자가 어떤 파일을 다운로드했는지에 대한 정보입니다. %s Piwik는 다운로드 링크의 클릭 수를 계산합니다. 하지만 다운로드가 완료되었는지 여부는 확인할 수 없습니다.",
"EntryPagesReportDocumentation": "이 보고서는 기간 중 진입 페이지 제목에 대한 정보입니다. 진입 페이지는 방문자가 먼저 본 페이지입니다. %s 진입 페이지의 URL은 폴더 구조로 표시됩니다.",
"EntryPageTitles": "진입 페이지 제목",
diff --git a/plugins/Actions/lang/nb.json b/plugins/Actions/lang/nb.json
index 742ac9ca33..aa77e778f0 100644
--- a/plugins/Actions/lang/nb.json
+++ b/plugins/Actions/lang/nb.json
@@ -26,6 +26,7 @@
"ColumnUniqueClicksDocumentation": "Antall besøk som involverte et klikk på denne lenken. Hvis lenken ble klikket flere ganger i løpet av et besøk, blir det kun talt én gang.",
"ColumnUniqueDownloads": "Unike nedlastinger",
"ColumnUniqueOutlinks": "Unike utlenker",
+ "ColumnIdPageview": "Sidevisnings-ID",
"DownloadsReportDocumentation": "I denne rapporten kan du se hvilke filer de besøkende har lastet ned. %s Hva Piwik teller som en nedlasting, er klikket på en nedlastingslink. Om nedlastingen ble fullført eller ikke er ikke kjent for Piwik.",
"EntryPagesReportDocumentation": "Denne rapporten inneholder informasjon om inngangssidene som ble brukt i løpet av den angitte perioden. En inngangsside er den første siden en bruker ser i løpet av besøket. %s Inngangs-URLen vises som en mappestruktur.",
"EntryPageTitles": "Titler på inngangssider",
diff --git a/plugins/Actions/lang/nl.json b/plugins/Actions/lang/nl.json
index ddf46a7996..fe7ea5052d 100644
--- a/plugins/Actions/lang/nl.json
+++ b/plugins/Actions/lang/nl.json
@@ -26,6 +26,7 @@
"ColumnUniqueClicksDocumentation": "Het aantal bezoeken dat een klik op deze link betrokken. Als een link is geklikt meerdere keren tijdens een bezoek, is het maar een keer geteld.",
"ColumnUniqueDownloads": "Unieke downloads",
"ColumnUniqueOutlinks": "Unieke Outlinks",
+ "ColumnIdPageview": "Paginaweergave ID",
"DownloadsReportDocumentation": "Dit rapport laat zien welke bestanden door de bezoekers zijn gedownload. %s Piwik telt een klik op een downloadlink als een download. Piwik kan niet zien of de download succesvol is uitgevoerd en afgerond.",
"EntryPagesReportDocumentation": "Dit rapport bevat informatie over de inkomende pagina's in de opgegeven periode. Een inkomende pagina is de eerste pagina waarop de bezoeker binnenkomt. %s De URL's van de inkomende pagina's worden getoond in een mapstructuur.",
"EntryPageTitles": "Inkomende paginatitels",
@@ -43,7 +44,7 @@
"PluginDescription": "Rapporteert over pagina weergaven en pagina titels. Het maakt het zoekgedrag op je website inzichtelijk, geeft rapporten weer over outlinks en downloads.",
"SiteSearchCategories1": "Dit rapport toont de categorieën die bezoekers hebben geselecteerd bij het zoeken op uw website.",
"SiteSearchCategories2": "Bijvoorbeeld, Ecommerce websites hebben vaak een categoriekeuze waarbij de zoekresultaten worden beperkt tot een specifieke categorie.",
- "SiteSearchFollowingPagesDoc": "Als bezoekers op uw website surfen, dan zoekt men vaak een bepaalde pagina, inhoud, produkt of dienst. Dit rapport laat de pagina's zien die het vaakst zijn aangeklikt na een interne zoekopdracht. Met andere woorden: de meeste gezochte pagina's door bezoekers die reeds op uw website zijn.",
+ "SiteSearchFollowingPagesDoc": "Als bezoekers op uw website surfen, dan zoekt men vaak een bepaalde pagina, inhoud, product of dienst. Dit rapport laat de pagina's zien die het vaakst zijn aangeklikt na een interne zoekopdracht. Met andere woorden: de meeste gezochte pagina's door bezoekers die reeds op uw website zijn.",
"SiteSearchIntro": "Het volgen van het zoekgedrag dat bezoekers op uw website vertonen is een zeer effectieve manier om er achter te komen wat het publiek op uw website zoekt. Het kan u aan nieuwe ideeën helpen om nieuwe content te maken of nieuwe Ecommerceprodukten toe te passen die helpen om de bezoekersbeleving op uw website te verhogen.",
"SiteSearchKeyword": "Zoekwoord (Site search)",
"SiteSearchKeywordsDocumentation": "Dit rapport toont een lijst met sleutelwoorden waarop bezoekers hebben gezocht met de interne zoekoptie van uw website.",
diff --git a/plugins/Actions/lang/ru.json b/plugins/Actions/lang/ru.json
index 61d49c8364..5044e99d41 100644
--- a/plugins/Actions/lang/ru.json
+++ b/plugins/Actions/lang/ru.json
@@ -1,53 +1,54 @@
{
"Actions": {
"AvgGenerationTimeTooltip": "В среднем по %1$s хит(ов) %2$s между %3$s и %4$s",
- "ColumnClickedURL": "URL кликов",
+ "ColumnClickedURL": "Кликнуные ссылки",
"ColumnActionURL": "URL действия",
"ColumnClicks": "Клики",
"ColumnClicksDocumentation": "Количество кликов по этой ссылке.",
"ColumnDownloadURL": "Ссылка для загрузки",
"ColumnEntryPageTitle": "Заголовок начальной страницы",
"ColumnEntryPageURL": "URL начальной страницы",
- "ColumnExitPageTitle": "заголовок страницы выхода",
+ "ColumnExitPageTitle": "Заголовок страницы выхода",
"ColumnExitPageURL": "URL страницы выхода",
"ColumnNoResultKeyword": "Ключевое слово без результатов в поиске",
"ColumnPageName": "Название страницы",
"ColumnPagesPerSearch": "Страницы результатов поиска",
"ColumnPagesPerSearchDocumentation": "Посетители будут пользоваться поиском на вашем сайте и иногда нажимать \"next\" (след. страница), чтобы просмотреть больше результатов. Это среднее число страниц с результатами поиска для этого ключевого слова.",
- "ColumnPageURL": "URL страниц",
+ "ColumnPageURL": "URL страницы",
"ColumnSearchCategory": "Искать категорию",
"ColumnSearches": "Поиски",
"ColumnSearchesDocumentation": "Число посещений, когда посетитель искал именно это ключевое слово через поиск на сайте.",
"ColumnSearchExits": "% Уходы с поиска",
- "ColumnSearchExitsDocumentation": "Процент посещений, когда посетитель ушел с сайта после поиска на вашем сайте именно этого ключевого слова.",
- "ColumnSearchResultsCount": "Счетчик результатов",
+ "ColumnSearchExitsDocumentation": "Процент посещений, когда посетитель ушёл с сайта после поиска на вашем сайте именно этого ключевого слова.",
+ "ColumnSearchResultsCount": "Счётчик результатов поиска",
"ColumnSiteSearchKeywords": "Уникальные ключевые слова",
"ColumnUniqueClicks": "Уникальные клики",
- "ColumnUniqueClicksDocumentation": "Кол-во посещений, когда была кликнута эта ссылка. Если ссылка была кликнута несколько раз в течение одного и того же посещения, это учитывается лишь раз.",
+ "ColumnUniqueClicksDocumentation": "Количество посещений, когда была кликнута эта ссылка. Если ссылка была кликнута несколько раз в течение одного и того же посещения, это учитывается лишь раз.",
"ColumnUniqueDownloads": "Уникальные загрузки",
"ColumnUniqueOutlinks": "Уникальные исходящие ссылки",
- "DownloadsReportDocumentation": "В этом отчете вы можете видеть файлы, которые скачивали ваши посетители. %s За скачивание считается клик по соответствующей ссылке. Однако закончил ли посетитель скачивание остается неизвестным. За скачивание считается также открытие картинок и других расширений файлов.",
- "EntryPagesReportDocumentation": "Этот отчет содержит информацию о страницах входа за определенный период. Входная страница – это первая страница сайта, которую пользователь просматривает за посещение. %s Входящие ссылки отображаются в папочном виде.",
- "EntryPageTitles": "Заголовки страниц входа",
- "EntryPageTitlesReportDocumentation": "Этот отчет содержит информацию о заголовках входных страниц, на которые попадали посетители в конкретный период.",
- "ExitPagesReportDocumentation": "Этот отчет содержит информацию о страницах выхода за определенный период. Страница выхода – это последняя страница сайта, на которой побывал посетитель. %s Ссылки этих страниц отображаются в виде древовидной структуры.",
+ "ColumnIdPageview": "ID просмотра",
+ "DownloadsReportDocumentation": "В этом отчёте вы можете видеть файлы, которые скачивали ваши посетители. %s За скачивание считается клик по соответствующей ссылке. Однако закончил ли посетитель скачивание остается неизвестным. За скачивание считается также открытие картинок и других расширений файлов.",
+ "EntryPagesReportDocumentation": "Этот отчёт содержит информацию о страницах входа за определенный период. Входная страница — это первая страница сайта, которую пользователь просматривает за посещение. %s Входящие ссылки отображаются в виде папок.",
+ "EntryPageTitles": "Заголовки начальной страницы",
+ "EntryPageTitlesReportDocumentation": "Этот отчёт содержит информацию о заголовках входных страниц, на которые попадали посетители в конкретный период.",
+ "ExitPagesReportDocumentation": "Этот отчёт содержит информацию о страницах выхода за определенный период. Страница выхода — это последняя страница сайта, на которой побывал посетитель. %s Ссылки этих страниц отображаются в виде папок.",
"ExitPageTitles": "Заголовки страниц выхода",
- "ExitPageTitlesReportDocumentation": "Этот отчет содержит информацию о заголовках выходных страниц, с которых посетитель ушел с сайта в конкретный период.",
+ "ExitPageTitlesReportDocumentation": "Этот отчёт содержит информацию о заголовках выходных страниц, с которых посетитель ушел с сайта в конкретный период.",
"LearnMoreAboutSiteSearchLink": "Узнайте больше об отслеживании использования поиска на вашем сайте.",
"OneSearch": "1 поиск",
- "OutlinkDocumentation": "Исходящая ссылка – ссылка, которая уводит посетителя с вашего сайта (на другой домен).",
- "OutlinksReportDocumentation": "Этот отчет показывает иерархический список исходящих ссылок, на которые пользователь кликнул.",
- "PagesReportDocumentation": "Этот отчет содержит информацию об адресах страниц, на которых побывали посетители вашего сайта. %s Таблица организовано иерархично – URL-ы отображаются папочной структурой.",
- "PageTitlesReportDocumentation": "Этот отчет содержит информацию о заголовках посещенных страниц. %1$s Заголовок страницы это HTML-тег %2$s, который браузеры отображают в заголовке окна (вкладки).",
+ "OutlinkDocumentation": "Исходящая ссылка — ссылка, которая уводит посетителя с вашего сайта (на другой домен).",
+ "OutlinksReportDocumentation": "Этот отчёт показывает иерархический список исходящих ссылок, на которые кликнул пользователь.",
+ "PagesReportDocumentation": "Этот отчёт содержит информацию об адресах страниц, на которых побывали посетители вашего сайта. %s Таблица иерархично организована — URL-ы отображаются структурой папок.",
+ "PageTitlesReportDocumentation": "Этот отчёт содержит информацию о заголовках посещенных страниц. %1$s Заголовок страницы это HTML-тег %2$s, который браузеры отображают в заголовке окна (вкладки).",
"PageUrls": "URL-ы страниц",
"PluginDescription": "Отчёты о просмотрах и заголовках страниц. Позволяют оценить поисковый дижок внутреннего сайта. Автоматически отслеживает клики по внешним ссылкам и скачиванию файлов.",
- "SiteSearchCategories1": "Этот отчет показывает список категорий, которые выбрали посетители при поиске на вашем сайте.",
+ "SiteSearchCategories1": "Этот отчёт показывает список категорий, которые выбрали посетители при поиске на вашем сайте.",
"SiteSearchCategories2": "Например, сайты электронной коммерции обычно имеют выбор «Категорий», чтобы посетителям было удобно их сортировать и искать.",
- "SiteSearchFollowingPagesDoc": "Когда посетители ищут что-то на вашем сайте, они хотят найти определенную страницу, контент, продукт или услугу. Этот отчет отображает страницы, по которым посетители кликают наиболее часто при поиске. Иными словами, это список страниц, которые ищутся наиболее часто на вашем сайте.",
- "SiteSearchIntro": "Отслеживание поиска на вашем сайте – эффективный способ узнать, чем именно интересуется ваша аудитория. Это может помочь найти идеи для нового контента, новых продуктов и улучшить взаимодействие посетителей с вашим сайта в целом.",
+ "SiteSearchFollowingPagesDoc": "Когда посетители ищут что-то на вашем сайте, они хотят найти определенную страницу, контент, продукт или услугу. Этот отчёт отображает страницы, по которым посетители кликают наиболее часто при поиске. Иными словами — это список страниц, которые ищутся наиболее часто на вашем сайте.",
+ "SiteSearchIntro": "Отслеживание поиска на вашем сайте — эффективный способ узнать, чем именно интересуется ваша аудитория. Это может помочь найти идеи для нового контента, новых продуктов и улучшить взаимодействие посетителей с вашим сайта в целом.",
"SiteSearchKeyword": "Ключевое слово (поиск по сайту)",
- "SiteSearchKeywordsDocumentation": "Эти отчет показывает список ключевых слов, которые посетители искали на вашем сайте через ваш поиск.",
- "SiteSearchKeywordsNoResultDocumentation": "Этот отчет отображает список ключевых слов, по которым не было ничего найдено на вашем сайте: возможно, стоит улучшить поисковый алгоритм на вашем сайте или посетители ищут то, чего на вашем сайте нет?",
+ "SiteSearchKeywordsDocumentation": "Этот отчёт показывает список ключевых слов, которые посетители искали на вашем сайте через ваш поиск.",
+ "SiteSearchKeywordsNoResultDocumentation": "Этот отчёт отображает список ключевых слов, по которым не было ничего найдено на вашем сайте: возможно, стоит улучшить поисковый алгоритм на вашем сайте или посетители ищут то, чего на вашем сайте (пока) нет?",
"SubmenuPagesEntry": "Страницы входа",
"SubmenuPagesExit": "Страницы выхода",
"SubmenuPageTitles": "Заголовки",
diff --git a/plugins/Actions/lang/sq.json b/plugins/Actions/lang/sq.json
index 8bb5f58157..e951e11de9 100644
--- a/plugins/Actions/lang/sq.json
+++ b/plugins/Actions/lang/sq.json
@@ -1,6 +1,6 @@
{
"Actions": {
- "AvgGenerationTimeTooltip": "Mesatare e bazuar në %1$s klikim(e) %2$s mes %3$s dhe %4$s",
+ "AvgGenerationTimeTooltip": "Mesatare e bazuar në %1$s hit(e) %2$s mes %3$s dhe %4$s",
"ColumnClickedURL": "URL të klikuara",
"ColumnActionURL": "URL Veprimi",
"ColumnClicks": "Klikime",
@@ -20,37 +20,38 @@
"ColumnSearchesDocumentation": "Numri i vizitave nga të cilat pati kërkime për këtë fjalëkyç te motori i kërkimit në sajtin tuaj.",
"ColumnSearchExits": "% Largime Nga Kërkimi",
"ColumnSearchExitsDocumentation": "Përqindja e vizitave që përfunduan me largim nga sajti pas kërkimit për këtë Fjalëkyç te motori i Kërkimeve në Sajtin tuaj.",
- "ColumnSearchResultsCount": "Numërim Përfundimesh Kërkimi",
+ "ColumnSearchResultsCount": "Numër Përfundimesh Kërkimi",
"ColumnSiteSearchKeywords": "Fjalëkyçe Unikë",
"ColumnUniqueClicks": "Klikime Unike",
"ColumnUniqueClicksDocumentation": "Numri i vizitave që kanë sjellë klikim mbi këtë lidhje. Nëse një lidhje është klikuar shumë herë gjatë një vizite, llogaritet vetëm një herë.",
"ColumnUniqueDownloads": "Shkarkime Unike",
"ColumnUniqueOutlinks": "Lidhje për Jashtë Unike",
+ "ColumnIdPageview": "ID Parjeje Faqeje",
"DownloadsReportDocumentation": "Në këtë raport, mund të shihni cilat kartela kanë shkarkuar vizitorët tuaj. %s Ato çka Piwik-u numëron si shkarkim është çdo klikim mbi një lidhje shkarkimi. Por Piwik-u s’mund ta dijë a u plotësua apo jo shkarkimi.",
"EntryPagesReportDocumentation": "Ky raport përmban të dhëna rreth faqesh hyrjesh që janë përdorur gjatë një periudhe të caktuar. Faqe hyrjeje është faqja e parë që sheh një vizitor gjatë vizitës së tij. %s URL-të e hyrjeve shfaqen sipas një strukture dosjeje.",
"EntryPageTitles": "Tituj faqesh hyrje",
- "EntryPageTitlesReportDocumentation": "Ky raport përmban të dhëna rreth titujve të faqeve hyrje që janë përdorur gjatë periudhës së dhënë.",
+ "EntryPageTitlesReportDocumentation": "Ky raport përmban të dhëna rreth titujsh faqesh hyrje që janë përdorur gjatë periudhës së dhënë.",
"ExitPagesReportDocumentation": "Ky raport përmban të dhëna rreth faqesh daljesh që janë kryer gjatë një periudhe të caktuar. Faqe daljeje është faqja e fundit që sheh një vizitor gjatë vizitës së tij. %s URL-të e daljeve shfaqen sipas një strukture dosjeje.",
"ExitPageTitles": "Tituj faqesh dalje",
"ExitPageTitlesReportDocumentation": "Ky raport përmban të dhëna rreth titujve të faqeve dalje që janë përdorur gjatë periudhës së dhënë.",
- "LearnMoreAboutSiteSearchLink": "Mësoni më tepër rreth Gjurmimit se si e përdorin vizitorët motorin tuaj të Kërkimeve.",
+ "LearnMoreAboutSiteSearchLink": "Mësoni më tepër rreth Ndjekjes së përdorimit që vizitorët i bëjnë motorit tuaj të Kërkimeve.",
"OneSearch": "1 kërkim",
- "OutlinkDocumentation": "Një lidhje e jashtme është një lidhje që e shpie përdoruesin diku jashtë sajtit tuaj (te një tjetër përkatësi).",
- "OutlinksReportDocumentation": "Ky raport shfaq një listë hierarkike URL-sh të jashtme që janë klikuar nga vizitorët tuaj.",
+ "OutlinkDocumentation": "Një lidhje për jashtë është një lidhje që e shpie përdoruesin diku jashtë sajtit tuaj (te një tjetër përkatësi).",
+ "OutlinksReportDocumentation": "Ky raport shfaq një listë hierarkike URL-sh lidhjesh për jashtë që janë klikuar nga vizitorët tuaj.",
"PagesReportDocumentation": "Ky raport përmban të dhëna rreth URL faqesh që janë vizituar. %s Tabela është e sistemuar në mënyrë hierarkike, URL-të tregohen si strukturë dosjeje.",
"PageTitlesReportDocumentation": "Ky raport përmban të dhëna rreth titujve të faqeve që janë vizituar. %1$s Titulli i faqes është Etiketa HTML %2$s që shfaqin shumica e shfletuesve te titulli i dritares.",
"PageUrls": "URL faqesh",
- "PluginDescription": "Raporte rreth parjes së faqeve dhe titujve të tyre. Ju lejon të matni motorin e brendshëm të kërkimeve të sajtit tuaj. Gjurmon vetvetiu klikimet drejt lidhjesh të jashtme dhe shkarkime kartelash.",
+ "PluginDescription": "Raporte rreth parjes së faqeve dhe titujve të tyre. Ju lejon të matni motorin e brendshëm të kërkimeve të sajtit tuaj. Ndjek vetvetiu klikimet drejt lidhjesh të jashtme dhe shkarkime kartelash.",
"SiteSearchCategories1": "Ky raport paraqet kategoritë që vizitorët kanë përzgjedhur kur bënë një Kërkim te sajti juaj.",
"SiteSearchCategories2": "Për shembull, sajtet për e-tregti kanë zakonisht një përzgjedhës \"Kategorish\", që kështu vizitorët të mund t’i ngushtojnë kërkimet e tyre nga krejt produktet te një Kategori specifike.",
"SiteSearchFollowingPagesDoc": "Kur vizitorët kërkojnë te sajti juaj, ata shohin për një faqe, lëndë, produkt ose shërbim të veçantë. Ky raport paraqet faqet që qenë klikuar më shumë pas një kërkimi të brendshëm. Me fjalë të tjera, listën e faqeve më të kërkuara nga vizitorët tashmë brenda sajtit tuaj.",
- "SiteSearchIntro": "Gjurmimi i kërkimeve që bëjnë vizitorët në sajtin tuaj është një rrugë shumë e efektshme për të mësuar më tepër rreth çka po kërkon publiku juaj, mund t’ju ndihmojë të gjeni ide për lëndë të re, produkte të reja e-tregtie që mund të jenë duke u kërkuar nga blerës potencialë, dhe përgjithësisht të përmirësoni për vizitorët punimin e sajtit tuaj.",
+ "SiteSearchIntro": "Ndjekja e kërkimeve që bëjnë vizitorët në sajtin tuaj është një rrugë shumë e efektshme për të mësuar më tepër rreth çka po kërkon publiku juaj, mund t’ju ndihmojë të gjeni ide për lëndë të re, produkte të reja e-tregtie që mund të jenë duke u kërkuar nga blerës potencialë, dhe përgjithësisht të përmirësoni për vizitorët punimin e sajtit tuaj.",
"SiteSearchKeyword": "Fjalëkyç (Kërkim te Sajti)",
"SiteSearchKeywordsDocumentation": "Ky raport paraqet Fjalëkyçe Kërkimesh që vizitorët kanë bërë me Motorin tuaj të brendshëm të Kërkimeve.",
"SiteSearchKeywordsNoResultDocumentation": "Ky raport paraqet Fjalëkyçe Kërkimesh që nuk patën ndonjë përfundim kërkimi: ndoshta algoritmi i motorit të kërkimit mund të përmirësohet, ose ndoshta vizitorët tuaj po kërkonin për lëndë që nuk gjendet (ende) në sajtin tuaj?",
"SubmenuPagesEntry": "Faqe hyrjesh",
"SubmenuPagesExit": "Faqe daljesh",
- "SubmenuPageTitles": "Titull faqesh",
+ "SubmenuPageTitles": "Tituj faqesh",
"SubmenuSitesearch": "Kërkim te Sajti",
"WidgetEntryPageTitles": "Tituj Faqesh Hyrje",
"WidgetExitPageTitles": "Tituj Faqesh Dalje",
diff --git a/plugins/Actions/lang/sr.json b/plugins/Actions/lang/sr.json
index 0a671837ad..a8d3fa72e3 100644
--- a/plugins/Actions/lang/sr.json
+++ b/plugins/Actions/lang/sr.json
@@ -2,6 +2,7 @@
"Actions": {
"AvgGenerationTimeTooltip": "Prosek zasnovan na %1$s pogodaka %2$s između %3$s i %4$s",
"ColumnClickedURL": "Kliknutih linkova",
+ "ColumnActionURL": "URL akcije",
"ColumnClicks": "Klikovi",
"ColumnClicksDocumentation": "Broj klikova na ovaj link.",
"ColumnDownloadURL": "Download link",
@@ -25,6 +26,7 @@
"ColumnUniqueClicksDocumentation": "Broj poseta koje uključuju klik na ovaj link. Ako je link kliknut više puta tokom jedne posete, računa se samo jedan klik.",
"ColumnUniqueDownloads": "Jedinstvenih preuzimanja",
"ColumnUniqueOutlinks": "Jedinstveni izlazni linkovi",
+ "ColumnIdPageview": "ID prikaza stranice",
"DownloadsReportDocumentation": "U ovom izveštaju možete videti koje su fajlove posetioci kliknuli. %s Ono što Piwik računa kao download jeste klik na link za skidanje fajla. Bilo da je fajl skinut ili ne, to nije poznato Piwik-u.",
"EntryPagesReportDocumentation": "Ovaj izveštaj sadrži informacije o ulaznim stranicama koje su korišćene tokom određenog perioda. Izlazna stranica je prva stranica koju posetilac gleda tokom svoje posete. %s Ulazni lijkovi su prikazani u vidu foldera.",
"EntryPageTitles": "Naslovi ulaznih stranica",
@@ -60,6 +62,7 @@
"WidgetPageUrlsFollowingSearch": "Stranice",
"WidgetSearchCategories": "Kategorije za pretragu",
"WidgetSearchKeywords": "Ključne reči",
- "WidgetSearchNoResultKeywords": "Ključne reči bez rezultata pretrage"
+ "WidgetSearchNoResultKeywords": "Ključne reči bez rezultata pretrage",
+ "ActionType": "Tip akcije"
}
} \ No newline at end of file
diff --git a/plugins/Annotations/lang/ru.json b/plugins/Annotations/lang/ru.json
index 2c11fa8e3c..d1adc5f97e 100644
--- a/plugins/Annotations/lang/ru.json
+++ b/plugins/Annotations/lang/ru.json
@@ -1,22 +1,22 @@
{
"Annotations": {
- "AddAnnotationsFor": "Добавить заметки для %s...",
- "AnnotationOnDate": "Заметка на %1$s: %2$s",
+ "AddAnnotationsFor": "Добавить примечания для %s...",
+ "AnnotationOnDate": "Примечание на %1$s: %2$s",
"Annotations": "Примечания",
- "ClickToDelete": "Удалить это примечание.",
- "ClickToEdit": "Редактировать заметку.",
- "ClickToEditOrAdd": "Изменить или добавить новые заметки.",
- "ClickToStarOrUnstar": "Поставить или снять отметку.",
- "CreateNewAnnotation": "Создать заметку",
- "EnterAnnotationText": "Введите свою заметку",
- "HideAnnotationsFor": "Спрятать заметки для %s...",
+ "ClickToDelete": "Удалить примечание.",
+ "ClickToEdit": "Редактировать примечание.",
+ "ClickToEditOrAdd": "Изменить или добавить новые примечания.",
+ "ClickToStarOrUnstar": "Поставить или снять примечание.",
+ "CreateNewAnnotation": "Создать новое примечание...",
+ "EnterAnnotationText": "Введите свою заметку...",
+ "HideAnnotationsFor": "Спрятать примечания для %s...",
"IconDesc": "Просмотреть заметки для данного диапазона дат.",
"IconDescHideNotes": "Спрятать заметки для данного диапазона дат.",
- "InlineQuickHelp": "Вы можете создавать заметки для того, чтобы отмечать важные события в истории вашего сайта (такие как новый пост в блоге или редизайн).",
- "LoginToAnnotate": "Войдите для создания заметок.",
- "NoAnnotations": "Нет заметок в данном диапазоне дат.",
- "PluginDescription": "Позволяет прикрепить заметки к различным дням, чтобы отметить изменения, внесённые в ваш сайт. Создавая заметки, вы будете знать, почему посещения изменились именно так.",
- "ViewAndAddAnnotations": "Просмотреть и добавить заметки для %s...",
- "YouCannotModifyThisNote": "Вы не можете изменить эту заметку, так как вы не являетесь её автором. Также у вас нет прав администратора."
+ "InlineQuickHelp": "Вы можете создавать примечания для того, чтобы отмечать важные события в истории вашего сайта (такие как новый пост в блоге или редизайн).",
+ "LoginToAnnotate": "Войдите для создания примечаний.",
+ "NoAnnotations": "Нет примечаний в данном диапазоне дат.",
+ "PluginDescription": "Позволяет прикрепить заметки к различным дням, чтобы отметить изменения, внесённые в ваш сайт. Создавая примечания вы будете знать, почему посещения изменились именно так.",
+ "ViewAndAddAnnotations": "Просмотреть и добавить примечания для %s...",
+ "YouCannotModifyThisNote": "Вы не можете изменить это примечание, так как вы не являетесь её автором или у вас нет прав администратора."
}
} \ No newline at end of file
diff --git a/plugins/Annotations/lang/sq.json b/plugins/Annotations/lang/sq.json
index ed836f6c6f..95588c2875 100644
--- a/plugins/Annotations/lang/sq.json
+++ b/plugins/Annotations/lang/sq.json
@@ -12,11 +12,11 @@
"HideAnnotationsFor": "Fshihi shënimet për %s...",
"IconDesc": "Shihni shënimet për këtë interval datash.",
"IconDescHideNotes": "Fshihi shënimet për këtë interval datash.",
- "InlineQuickHelp": "Mund të krijoni shënime për të vënë një shenjë te ngjarje speciale (fjala vjen, një postim i ri blogu, ose rihartim sajti), për të ruajtur analiza të të dhënave tuaja ose për të ruajtur çfarëdo gjëje tjetër që mendoni se është e rëndësishme.",
+ "InlineQuickHelp": "Mund të krijoni shënime për të vënë një shenjë te akt special (fjala vjen, një postim i ri blogu, ose rihartim sajti), për të ruajtur analiza të të dhënave tuaja ose për të ruajtur çfarëdo gjëje tjetër që mendoni se është e rëndësishme.",
"LoginToAnnotate": "Që të krijoni një shënim, bëni hyrjen.",
"NoAnnotations": "S’ka shënime për këtë interval datash.",
- "PluginDescription": "Ju lejon të bashkëngjitni shënime në ditë të ndryshme, për t’u vënë shenjë ndryshimeve të bëra te sajti juaj, të ruani analiza që bëni dhe që lidhen me të dhënat tuaja, si dhe për të ndarë me kolegët mendimet tuaja. Duke bërë shënime në të dhënat tuaja, siguroni që të mbani mend pse të dhënat tuaja duken ashtu si duken.",
+ "PluginDescription": "Ju lejon të bashkëngjitni shënime në ditë të ndryshme, për t’u vënë shenjë ndryshimeve të bëra te sajti juaj, të ruani analiza që bëni dhe që lidhen me të dhënat tuaja, si dhe për të ndarë me kolegët mendimet tuaja. Duke bërë shënime në të dhënat tuaja, do të bëni të mundur të mbani mend pse të dhënat tuaja duken ashtu si duken.",
"ViewAndAddAnnotations": "Shihni dhe shtoni shënime për %s...",
- "YouCannotModifyThisNote": "Nuk e ndryshoni dot këtë shënim, ngaqë nuk e krijuat ju, dhe as keni të drejta përgjegjësi për këtë sajt."
+ "YouCannotModifyThisNote": "S’e ndryshoni dot këtë shënim, ngaqë nuk e krijuat ju, dhe as keni të drejta përgjegjësi për këtë sajt."
}
} \ No newline at end of file
diff --git a/plugins/AnonymousPiwikUsageMeasurement b/plugins/AnonymousPiwikUsageMeasurement
-Subproject c7fd2972773b2b20c4162e9c27eb4cea74cf3c3
+Subproject 6df957b544737818064b311327902e3774fa85c
diff --git a/plugins/Contents/lang/ko.json b/plugins/Contents/lang/ko.json
index 121856bf06..bb817d1920 100644
--- a/plugins/Contents/lang/ko.json
+++ b/plugins/Contents/lang/ko.json
@@ -6,6 +6,8 @@
"ContentName": "콘텐츠 이름",
"ContentPiece": "콘텐츠 조각",
"ContentTarget": "콘텐츠 목표",
- "Contents": "콘텐츠"
+ "Contents": "콘텐츠",
+ "InteractionsMetricDocumentation": "(배너나 광고의 '클릭')과 상호작용한 콘텐츠 블록의 횟수입니다.",
+ "ImpressionsMetricDocumentation": "배너나 광고와 같은 콘텐츠 블록이 보여진 횟수입니다."
}
} \ No newline at end of file
diff --git a/plugins/Contents/lang/sq.json b/plugins/Contents/lang/sq.json
index 6c63ba16a0..b6199654a6 100644
--- a/plugins/Contents/lang/sq.json
+++ b/plugins/Contents/lang/sq.json
@@ -1,6 +1,6 @@
{
"Contents": {
- "PluginDescription": "Gjurmimi i lëndës dhe i banerave ju lejon të matni punimin (parje, klikime, CTR) të çfarëdo pjese të lëndës në faqet tuaja (Banner ad, figurë, çfarëdo objekti).",
+ "PluginDescription": "Ndjekja e lëndës dhe e banerave ju lejon të matni punimin (parje, klikime, CTR) të çfarëdo pjese të lëndës në faqet tuaja (Banner ad, figurë, çfarëdo objekti).",
"Impressions": "Përshtypje",
"Interactions": "Ndërveprime",
"Interaction": "Ndërveprim",
@@ -9,7 +9,8 @@
"ContentPiece": "Copëz Lënde",
"ContentTarget": "Lëndë e Synuar",
"Contents": "Lëndë",
- "InteractionsMetricDocumentation": "Numri i herëve që për një bllok lënde ka patur ndërveprime (p.sh., një 'klikim' mbi një banderolë apo reklamë).",
- "ImpressionsMetricDocumentation": "Numri i herëve që një bllok lënde, i tillë si banderolë apo reklamë, është shfaqur në një faqe."
+ "InteractionsMetricDocumentation": "Numri i herëve kur për një bllok lënde ka patur ndërveprime (p.sh., një 'klikim' mbi një banderolë apo reklamë).",
+ "ImpressionsMetricDocumentation": "Numri i herëve që një bllok lënde, i tillë si banderolë apo reklamë, është shfaqur në një faqe.",
+ "InteractionRateMetricDocumentation": "Përpjesëtimi i përshtypjeve nga lënda kundrejt ndërveprimeve."
}
} \ No newline at end of file
diff --git a/plugins/Contents/lang/sr.json b/plugins/Contents/lang/sr.json
index 14c1c78659..bcc66d691f 100644
--- a/plugins/Contents/lang/sr.json
+++ b/plugins/Contents/lang/sr.json
@@ -8,6 +8,9 @@
"ContentName": "Naziv sadržaja",
"ContentPiece": "Sadržaj",
"ContentTarget": "Cilj sadržaja",
- "Contents": "Sadržaji"
+ "Contents": "Sadržaji",
+ "InteractionsMetricDocumentation": "Broj interakcija sa blokom sadržaja (npr., klik na baner ili reklamu).",
+ "ImpressionsMetricDocumentation": "Broj prikaza bloka sadržaja poput banera i reklama na stranici.",
+ "InteractionRateMetricDocumentation": "Odnos prikaza i interakcija sadržaja."
}
} \ No newline at end of file
diff --git a/plugins/CoreAdminHome/lang/ar.json b/plugins/CoreAdminHome/lang/ar.json
index 88382dfa4e..7b2062254a 100644
--- a/plugins/CoreAdminHome/lang/ar.json
+++ b/plugins/CoreAdminHome/lang/ar.json
@@ -1,5 +1,6 @@
{
"CoreAdminHome": {
+ "AddNewTrustedHost": "أضف مُضِيفاً موثوقاً جديداً",
"Administration": "الإدارة",
"ArchivingSettings": "بيانات الأرشفة",
"BrandingSettings": "إعدادات العلامة التجارية",
@@ -14,6 +15,7 @@
"ImageTrackingIntro3": "للقائمة الكاملة بالخيارات التي يمكنك استخدامها بواسطة متتبع الصورة، انظر %1$sمستندات واجهة تطبيقات التتبع%2$s.",
"ImageTrackingLink": "رابط صورة التتبع",
"ImportingServerLogs": "جاري استيراد سجلات الملقم",
+ "InvalidPluginsYouCanUninstall": "يمكنك تحديث أو إلغاء تثبيت هذه الإضافات عبر صفحة %1$sإدارة الإضافات%2$s",
"JavaScriptTracking": "التتبع بجافاسكريبت",
"JSTracking_CampaignNameParam": "باراميتر اسم الحملة",
"JSTracking_CustomCampaignQueryParam": "استخدم أسماء باراميترات استعلام مخصصة لاسم الحملة وكلماتها الدلالية",
@@ -23,21 +25,29 @@
"JSTracking_MergeAliasesDesc": "بحيث تكون النقرات على الروابط إلى روابط مماثلة Alias URL (مثل. %s) لن تعتبر كـ'روابط صادرة'.",
"JSTracking_MergeSubdomains": "تتبع كل الزوار القادمين من النطاقات الفرعية ل",
"JSTracking_MergeSubdomainsDesc": "بحيث إذا زار أحدهم %1$s و %2$s، سيتم احتسابه كزائر فريد وحيد.",
+ "JSTracking_PageCustomVars": "تتبع متغير مخصص لكل عملية عرض صفحة",
"JSTracking_PageCustomVarsDesc": "على سبيل المثال، مع اسم المتغير \"فئة\" وقيمته \"الصفحات البيضاء\".",
+ "JSTracking_VisitorCustomVars": "تتبع متغيرات مخصصة عند زيارة هذا الزائر",
"JSTracking_VisitorCustomVarsDesc": "على سبيل المثال، باسم متغير \"النوع\" وقيمته \"العميل\".",
"JSTrackingIntro2": "ما أن تحصل على كود التتبع لموقعك، انسخه وألصقه في كافة الصفحات التي ترغب من بايويك أن يتتبعها.",
"JSTrackingIntro4": "إذا لم تكن ترغب في استخدام جافاسكريبت لتتبع زوارك، قم %1$sبتوليد رابط تتبع بالصورة أدناه%2$s.",
"LogoUpload": "اختر شعاراً لرفعه",
"MenuDiagnostic": "التشخيص",
"MenuGeneralSettings": "الإعدادات العامة",
- "MenuManage": "الإدارة",
+ "MenuSystem": "النظام",
"OptOutComplete": "اكتمل إلغاء الاشتراك: لن يتم احتساب زياراتك لهذا الموقع بواسطة أدوات تحليلات ويب الخاصة بنا.",
"OptOutCompleteBis": "لاحظ أنك في حالة مسح الكوكيز Coockies، فإنك بذلك تحذف الكوكيز الخاصة بإلغاء الاشتراك، أو في حالة تغيير جهاز الكمبيوتر أو المتصفح، فستحتاج لإعادة هذا الإجراء مرة أخرى.",
"OptOutExplanation": "Piwik ملتزم بالخصوصية على الإنترنت. لمنح زوارك اختيار إلغاء الاشتراك في تحليلات ويب من Piwik، يمكنك إضافة كود HTML التالي على أحد صفحات موقعك. على سبيل المثال في صفحة سياسة الخصوصية.",
"OptOutExplanationBis": "سيقوم هذا الكود بعرض iFrame يحتوي رابطاً لزوارك لإلغاء اشتراكهم في Piwik من خلال ضبط كوكيز في متصفحهم. %1$s انقر هنا %2$s لمشاهدة المحتويات التي سيتم عرضها في النافذة الفرعية iFrame.",
"OptOutForYourVisitors": "إلغاء الاشتراك في Piwik لزوارك",
"PiwikIsInstalledAt": "بايويك مثبت في المسار",
+ "PluginSettings": "إعدادات الإضافة",
+ "PluginSettingsIntro": "يمكنك هنا تغيير إعدادات أي من إضافات الطرف الثالث التالية:",
+ "PluginSettingsSaveFailed": "فَشِل حفظ إعدادات الإضافة",
+ "PluginSettingsSaveSuccess": "تم تحديث إعدادات الإضافة.",
+ "SettingsSaveSuccess": "تم تحديث الإعدادات.",
"SendPluginUpdateCommunication": "أرسل بريداً عند توفر تحديث للإضافة",
+ "SendPluginUpdateCommunicationHelp": "سيتم إرسال بريد إلى المستخدم الفائق عند توفر نسخة جديدة لإضافة ما.",
"TrackAGoal": "تتبع هدف",
"TrackingCode": "كود التتبع",
"TrustedHostConfirm": "هل ترغب حقاً في تغيير اسم المُضيف الموثوق لدى بايويك؟",
diff --git a/plugins/CoreAdminHome/lang/bg.json b/plugins/CoreAdminHome/lang/bg.json
index f2f8f94021..e10c93e072 100644
--- a/plugins/CoreAdminHome/lang/bg.json
+++ b/plugins/CoreAdminHome/lang/bg.json
@@ -43,7 +43,6 @@
"LogoUploadHelp": "Моля, качете файла в %1$s формати с минимална височина %2$s пиксела.",
"MenuDiagnostic": "Диагностика",
"MenuGeneralSettings": "Основни настройки",
- "MenuManage": "Управление",
"OptOutComplete": "Отказът е приет; вашите посещения в този уебсайт няма да бъдат записвани от Инструмента за Уеб анализ.",
"OptOutCompleteBis": "Запомнете, че ако изтриете вашите бисквитки или ако смените компютъра или уеб браузъра ще е нужно да направите процедурата за отказ отново.",
"OptOutExplanation": "Piwik е ангажиран с осигуряването на поверителност в Интернет. За да позволите на потребителите си да се откажат от Piwik Web Analytics, можете да добавите нужният HTML код в една от вашите уеб страници, например в раздела Поверителност.",
diff --git a/plugins/CoreAdminHome/lang/bs.json b/plugins/CoreAdminHome/lang/bs.json
index 874794ec3f..1cec5e26dc 100644
--- a/plugins/CoreAdminHome/lang/bs.json
+++ b/plugins/CoreAdminHome/lang/bs.json
@@ -3,7 +3,6 @@
"Administration": "Administracija",
"EmailServerSettings": "Postavke email servera",
"MenuDiagnostic": "Dijagnostika",
- "MenuGeneralSettings": "Opšte postavke",
- "MenuManage": "Upravljaj"
+ "MenuGeneralSettings": "Opšte postavke"
}
} \ No newline at end of file
diff --git a/plugins/CoreAdminHome/lang/cs.json b/plugins/CoreAdminHome/lang/cs.json
index 23e133f082..c7a13c16f7 100644
--- a/plugins/CoreAdminHome/lang/cs.json
+++ b/plugins/CoreAdminHome/lang/cs.json
@@ -8,9 +8,9 @@
"ClickHereToOptIn": "Klikněte zde pro přihlášení.",
"ClickHereToOptOut": "Klikněte zde pro vyloučení.",
"CustomLogoFeedbackInfo": "Pokud přizpůsobíte logo Piwiku, možná by vás zajímalo, jak skrýt odkaz %1$s v horním menu, Pokud to chcete provést, zakažte plugin zpětné vazby na stránce %2$sSpravovat zásuvné moduly%3$s.",
- "CustomLogoHelpText": "Můžete přizpůsobit logo Piwiku, které bude zobrazeno v uživatelském rozhraní a v e-mailových hlášeních.",
+ "CustomLogoHelpText": "Můžete přizpůsobit logo Piwiku, které bude zobrazeno v uživatelském rozhraní a v emailových hlášeních.",
"DevelopmentProcess": "Přestože náš %1$sproces vývoje%2$s zahrnuje tisíce automatizovaných testů, beta testeři hrají klíčovou roli v naší politice nevýskytu chyb.",
- "EmailServerSettings": "Nastavení e-mailového serveru",
+ "EmailServerSettings": "Nastavení emailového serveru",
"ForBetaTestersOnly": "Pouze pro beta testery",
"ImageTracking": "Sledování obrázkem",
"ImageTrackingIntro1": "Pokud má návštěvník vypnutý JavaScript nebo nemůže být JavaScript použit, můžete využít obrázku k měření a sledování Vaší návštěvnosti.",
@@ -37,7 +37,7 @@
"JSTracking_MergeAliases": "Ve \"hlášení externích odkazů\" skrýt kliknutí na známé aliasy",
"JSTracking_MergeAliasesDesc": "Takže kliky na URL aliasů (např. %s) nebudou počítány jako externí odkazy.",
"JSTracking_MergeSubdomains": "Sledovat všechny návštěvníky na všech subdoménách",
- "JSTracking_MergeSubdomainsDesc": "Pokud uživatel navštíví %1$s a %2$s, budou zaznamenáni jako unikátní uživatelé.",
+ "JSTracking_MergeSubdomainsDesc": "Pokud uživatel navštíví %1$s a %2$s, budou zaznamenáni jako jedineční uživatelé.",
"JSTracking_PageCustomVars": "Sledovat vlastní proměnnou pro každé zobrazení stránky",
"JSTracking_PageCustomVarsDesc": "Například proměnná s názvem 'Kategorie' a hodnotou \"White papers\"",
"JSTracking_VisitorCustomVars": "Sledovat vlastní proměnné pro tohoto návštěvníka",
@@ -55,11 +55,12 @@
"LogoUploadHelp": "Prosím, nahrajte soubor v jednom z následujících formátů: %1$s, s minimální výškou %2$s pixelů.",
"MenuDiagnostic": "Diagnostika",
"MenuGeneralSettings": "Hlavní nastavení",
- "MenuManage": "Správa",
+ "MenuSystem": "Systém",
"MenuDevelopment": "Vývoj",
+ "MenuMeasurables": "Měřitelné",
"OptOutComplete": "Vyloučení hotovo. Vaše návštěvy nebudou sledovány nástrojem webové analýzy.",
"OptOutCompleteBis": "Poznámka: pokud smažete cookie, odstraníte vylučovací cookie nebo zmměníte počítač nebo prohlížeč, budete muset provést proceduru vyloučení znovu.",
- "OptOutDntFound": "Nejste sledováni, protože váš prohlížeč hlásí, že si to nepřejete. Jedná se o nastavení prohlížeče, takže se nebudete moci přihlásit, dokud nezakážete funkci nesledovat.",
+ "OptOutDntFound": "Nejste sledováni, protože váš prohlížeč hlásí, že si to nepřejete. Jedná se o nastavení prohlížeče, takže se nebudete moci přihlásit, dokud nezakážete funkci 'nesledovat'.",
"OptOutExplanation": "Piwik se zaměřuje na poskytování soukromí na internetu. Pokud chcete dát svým návštěvníkům možnost odhlásit se z webových analýz Piwikem, můžete na nějakou stránku (třeba stránku o soukromí) umístit následující HTML kód.",
"OptOutExplanationBis": "Tento kód zobrazí iframe s odkazem, který nastaví u návštěvníka vynechávací cookie. %1$s Klikněte zde%2$s pro zobrazení obsahu iframe.",
"OptOutForYourVisitors": "Piwik vyloučení pro Vaše návštěvníky",
@@ -71,8 +72,10 @@
"PluginSettingsIntro": "Zde můžete změnit nastavení pro následující zásuvné moduly třetích stran:",
"PluginSettingsValueNotAllowed": "Hodnota pro pole \"%1$s\" zásuvného modulu \"%2$s\" není povolena",
"PluginSettingsSaveFailed": "Nepodařilo se uložit nastavení zásuvného modulu",
- "SendPluginUpdateCommunication": "Pokud bude k dispozici aktualizace pluginu, odeslat e-mail.",
- "SendPluginUpdateCommunicationHelp": "Super-uživatelům bude odeslán e-mail, pokud bude k dispozici aktualizace zásuvného modulu.",
+ "PluginSettingsSaveSuccess": "Nastavení zásuvného modulu aktualizována.",
+ "SettingsSaveSuccess": "Nastavení aktualizována.",
+ "SendPluginUpdateCommunication": "Pokud bude k dispozici aktualizace pluginu, odeslat email.",
+ "SendPluginUpdateCommunicationHelp": "Super-uživatelům bude odeslán email, pokud bude k dispozici aktualizace zásuvného modulu.",
"StableReleases": "Piwik je důležitý nástroj pro měření, doporučujeme vždy používat nejnovější vydání. Pokud používáte nejnovější beta verzi a našli jste chyby, prosíme o jejich nahlášení %1$spřímo zde %2$s.",
"LtsReleases": "LTS (verze s dlouhodobou podporou) dostávají pouze bezpečnostní a jiné opravy chyb.",
"SystemPluginSettings": "Systémová nastavení zásuvných modulů",
@@ -86,7 +89,7 @@
"WithOptionalRevenue": "s volitelným příjmem",
"YouAreOptedIn": "Aktuálně nejste vyloučen.",
"YouAreOptedOut": "Aktuálně jste vyloučeni.",
- "YouMayOptOut": "Zde se můžete zakázat uložení cookie s identifikačním číslem přiděleným vašemu počítači a tím zamezit provozovateli tohoto webu shromažďovat a analyzovat statistické údaje.",
+ "YouMayOptOut": "Zde můžete zakázat uložení cookie s identifikačním číslem přiděleným svému počítači a tím zamezit provozovateli tohoto webu shromažďovat a analyzovat statistické údaje.",
"YouMayOptOutBis": "Pokud jste se rozhodli že ne, klikněte na přiložený odkaz pro uložení deaktivačního cookie ve svém prohlížeči.",
"OptingYouOut": "Vylučování, prosím čekejte...",
"ProtocolNotDetectedCorrectly": "Nyní si prohlížíte Piwik zabezpečeným SSL spojením za použití HTTPS, ale Piwik na serveru detekoval pouze nezabezpečené připojení.",
diff --git a/plugins/CoreAdminHome/lang/da.json b/plugins/CoreAdminHome/lang/da.json
index 3102fccccc..5294cef0e1 100644
--- a/plugins/CoreAdminHome/lang/da.json
+++ b/plugins/CoreAdminHome/lang/da.json
@@ -55,8 +55,9 @@
"LogoUploadHelp": "Overfør en fil i %1$s formater med en højde på mindst %2$s pixels.",
"MenuDiagnostic": "Diagnosticering",
"MenuGeneralSettings": "Generelle indstillinger",
- "MenuManage": "Administrere",
+ "MenuSystem": "System",
"MenuDevelopment": "Udvikling",
+ "MenuMeasurables": "Målbare",
"OptOutComplete": "Opt-out udført; dine besøg på hjemmesiden bliver ikke registreret af analyseværktøjet.",
"OptOutCompleteBis": "Bemærk, at hvis du sletter dine cookies, sletter opt-out-cookien, eller hvis du skifter computer eller browser, skal du udføre opt-out-proceduren igen.",
"OptOutDntFound": "Sporing er ikke aktiv, fordi din browser har meddelt, at du ikke vil spores. Det er en browser indstilling. For at begynde at sporing igen, skal du deaktivere den såkaldte \"Do Not Track\" indstillingen i dine browserindstillinger.",
@@ -71,6 +72,8 @@
"PluginSettingsIntro": "Her kan du ændre indstillingerne for følgende 3. parts udvidelsesmoduler:",
"PluginSettingsValueNotAllowed": "Værdien for feltet \"%1$s\" i udvidelsen \"%2$s\" er ikke tilladt",
"PluginSettingsSaveFailed": "Kunne ikke gemme udvidelsesmodul indstillinger",
+ "PluginSettingsSaveSuccess": "Udvidelse indstillinger opdateret.",
+ "SettingsSaveSuccess": "Indstillinger opdateret.",
"SendPluginUpdateCommunication": "Send en e-mail når der er en opdatering til et plugin",
"SendPluginUpdateCommunicationHelp": "En e-mail vil blive sendt til Superbrugere, når der er en ny version tilgængelig for denne programudvidelse.",
"StableReleases": "Hvis Piwik er en kritisk del af virksomheden, anbefaler vi at man bruger den nyeste stabile udgave. Hvis man bruger den nyeste beta, og finder en fejl eller har et forslag, %1$sse her%2$s.",
diff --git a/plugins/CoreAdminHome/lang/de.json b/plugins/CoreAdminHome/lang/de.json
index ea85f65019..f1abc14fa7 100644
--- a/plugins/CoreAdminHome/lang/de.json
+++ b/plugins/CoreAdminHome/lang/de.json
@@ -55,8 +55,9 @@
"LogoUploadHelp": "Bitte laden Sie eine Datei in den Formaten %1$s mit einer minimalen Höhe von %2$s Pixeln hoch.",
"MenuDiagnostic": "Diagnose",
"MenuGeneralSettings": "Allgemeine Einstellungen",
- "MenuManage": "Verwalten",
+ "MenuSystem": "System",
"MenuDevelopment": "Entwicklung",
+ "MenuMeasurables": "Messgrößen",
"OptOutComplete": "Deaktivierung durchgeführt! Ihre Besuche auf dieser Website werden von der Webanalyse nicht mehr erfasst.",
"OptOutCompleteBis": "Bitte beachten Sie, dass auch der Piwik-Deaktivierungs-Cookie dieser Website gelöscht wird, wenn Sie die in Ihrem Browser abgelegten Cookies entfernen. Außerdem müssen Sie, wenn Sie einen anderen Computer oder einen anderen Webbrowser verwenden, die Deaktivierungsprozedur nochmals absolvieren.",
"OptOutDntFound": "Das Tracking ist bei Ihnen derzeit nicht aktiv, denn Ihr Browser hat uns mitgeteilt, dass Sie kein Tracking wünschen. Hierbei handelt es sich um eine Browsereinstellung. Um das Tracking wieder zu aktivieren, müssen Sie die sogenannte \"Do Not Track\"-Einstellung in Ihren Browsereinstellungen deaktivieren.",
@@ -71,6 +72,8 @@
"PluginSettingsIntro": "Hier können Sie die Einstellungen für folgende Drittanbieter Plugins ändern:",
"PluginSettingsValueNotAllowed": "Der Wert für die Einstellung \"%1$s\" im Plugin \"%2$s\" ist nicht erlaubt.",
"PluginSettingsSaveFailed": "Speichern der Plugin-Einstellungen fehlgeschlagen.",
+ "PluginSettingsSaveSuccess": "Einstellungen der Erweiterung wurden aktualisiert",
+ "SettingsSaveSuccess": "Einstellungen aktualisiert",
"SendPluginUpdateCommunication": "Sende mir eine E-Mail wenn eine neue Plugin-Aktualisierung zur Verfügung steht",
"SendPluginUpdateCommunicationHelp": "Der Hauptadministrator wird per E-Mail benachrichtigt, sobald eine neue Version eines Plugins zur Verfügung steht.",
"StableReleases": "Sollte Piwik eine wichtige Komponente Ihres Unternehmens sein, empfehlen wir Ihnen den letzen stabilen Release zu verwenden. Sollten Sie die letze Beta Version verwenden und einen Fehler finden oder einen Vorschlag haben, %1$slesen Sie bitte hier%2$s.",
diff --git a/plugins/CoreAdminHome/lang/el.json b/plugins/CoreAdminHome/lang/el.json
index f20cd02fb7..5cfe480161 100644
--- a/plugins/CoreAdminHome/lang/el.json
+++ b/plugins/CoreAdminHome/lang/el.json
@@ -55,8 +55,9 @@
"LogoUploadHelp": "Παρακαλώ ανεβάστε ένα αρχείο σε %1$s μορφή με ελάχιστο ύψος %2$s pixel.",
"MenuDiagnostic": "Διαγνωστικά",
"MenuGeneralSettings": "Γενικές ρυθμίσεις",
- "MenuManage": "Διαχείριση",
+ "MenuSystem": "Σύστημα",
"MenuDevelopment": "Ανάπτυξη",
+ "MenuMeasurables": "Μετρήσιμα",
"OptOutComplete": "Η απενεργοποίηση ολοκληρώθηκε. Οι επισκέψεις σας σε αυτή την ιστοσελίδα δεν θα καταγράφονται από το εργαλείο Στατιστικών Ιστού.",
"OptOutCompleteBis": "Σημειώστε ότι αν εκκαθαρίσετε τα cookies σας ή διαγράψετε το cookie απενεργοποιήσης ή αλλάξετε υπολογιστές ή φυλλομετρητές Ιστού, θα χρειαστεί να επαναλάβετε ξανά την διαδικασία απενεργοποιήσης.",
"OptOutDntFound": "Δεν παρακολουθήστε αυτή τη στιγμή επειδή το πρόγραμμα πλοήγησής σας δίνει οδηγία να μην είστε υπό παρακολούθηση. Αυτό αποτελεί ρύθμιση στο πρόγραμμα πλοήγησης έτσι ώστε να μην συμπεριλαμβάνεστε στην παρακολούθηση εκτός αν απενεργοποιήσετε το χαρακτηριστικό 'Όχι παρακολούθηση'.",
@@ -71,6 +72,8 @@
"PluginSettingsIntro": "Εδώ μπορείτε να αλλάξετε τις ρυθμίσεις των παρακάτω πρόσθετων από τρίτους:",
"PluginSettingsValueNotAllowed": "Η τιμή για το πεδίο \"%1$s\" στο πρόσθετο \"%2$s\" δεν είναι επιτρεπτή.",
"PluginSettingsSaveFailed": "Υπήρξε αποτυχία κατά την αποθήκευση των ρυθμίσεων των πρόσθετων",
+ "PluginSettingsSaveSuccess": "Οι ρυθμίσεις του πρόσθετου ενημερώθηκαν.",
+ "SettingsSaveSuccess": "Οι ρυθμίσεις ενημερώθηκαν.",
"SendPluginUpdateCommunication": "Αποστολή e-mail όταν υπάρχει διαθέσιμη ενημέρωση για ένα πρόσθετο",
"SendPluginUpdateCommunicationHelp": "Ένα e-mail θα στέλνεται στους Υπερ-Χρήστες όταν θα υπάρχει διαθέσιμη νέα έκδοση για ένα πρόσθετο.",
"StableReleases": "Αν το Piwik αποτελεί ένα κρίσιμο κομμάτι της επιχείρησής σας, συνιστούμε να χρησιμοποιείτε την τελευταία σταθερή έκδοση. Αν χρησιμοποιείτε την τελευταία δοκιμαστική έκδοση και βρείτε ένα σφάλμα ή έχετε να κάνετε μια πρόταση, παρακαλώ %1$sδείτε εδώ%2$s.",
diff --git a/plugins/CoreAdminHome/lang/es.json b/plugins/CoreAdminHome/lang/es.json
index 4f19b725e1..9e4da185d3 100644
--- a/plugins/CoreAdminHome/lang/es.json
+++ b/plugins/CoreAdminHome/lang/es.json
@@ -1,5 +1,6 @@
{
"CoreAdminHome": {
+ "AddNewTrustedHost": "Agregar un nuevo host de confianza",
"Administration": "Administración",
"ArchivingSettings": "Configuración de archivado",
"BrandingSettings": "Configuración del Branding",
@@ -54,8 +55,9 @@
"LogoUploadHelp": "Sube un archivo en formato %1$s con una altura mínima de %2$s píxeles.",
"MenuDiagnostic": "Diagnóstico",
"MenuGeneralSettings": "Configuración general",
- "MenuManage": "Administrar",
+ "MenuSystem": "Sistema",
"MenuDevelopment": "Desarrollo",
+ "MenuMeasurables": "Medibles",
"OptOutComplete": "Opt-out completado; sus visitas a este sitio de internet no serán grabadas por la herramienta de Análisis de internet.",
"OptOutCompleteBis": "Tenga en cuenta que si elimina sus cookies, elimina la cookie opt-out, o si cambia de ordenador o navegador, deberá llevar a cabo el procedimiento opt-out otra vez.",
"OptOutDntFound": "No está siendo rastreado desde que su navegador está informando que esa es su elección. Esta es una opción de su navegador, así que no será posible hasta tanto no deshabilite la función 'No rastrear'.",
@@ -70,6 +72,8 @@
"PluginSettingsIntro": "Aquí puede cambiar la configuración de los siguientes complementos de terceros:",
"PluginSettingsValueNotAllowed": "El valor del campo \"%1$s\" del complemento \"%2$s\" no es permitido",
"PluginSettingsSaveFailed": "Error al guardar la configuración del complemento",
+ "PluginSettingsSaveSuccess": "Ajustes del complemento actualizado.",
+ "SettingsSaveSuccess": "Ajustes actualizados.",
"SendPluginUpdateCommunication": "Envíe un correo electrónico cuando la actualización del complemento esté disponible",
"SendPluginUpdateCommunicationHelp": "Se enviará un correo electrónico a los Super Usuarios cuando haya disponible una nueva versión de un complemento.",
"StableReleases": "Si Piwik es una parte crítica de su negocio, le recomendamos que utilice la última versión estable. Si usa la última versión beta y encuentra un error o tiene alguna sugerencia, por favor %1$sver aquí%2$s.",
@@ -88,6 +92,7 @@
"YouMayOptOut": "Puede escojer no tener un único número de identificación de la cookie de análisis de internet asignado a su ordenador para prevenir la agregación y el análisis de datos recogidos en este sitio de internet.",
"YouMayOptOutBis": "Para escoger esto, por favor haga clic debajo para recibir una cookie opt-out (para no ser seguido).",
"OptingYouOut": "Opción a salir, por favor espere...",
- "ProtocolNotDetectedCorrectly": "Actualmente estás usando Piwik sobre una conexión SSL (usando HTTPs), pero Piwik solo puede detectar una conexión insegura en el servidor."
+ "ProtocolNotDetectedCorrectly": "Actualmente estás usando Piwik sobre una conexión SSL (usando HTTPs), pero Piwik solo puede detectar una conexión insegura en el servidor.",
+ "ProtocolNotDetectedCorrectlySolution": "Para asegurarse que Piwik peticiona y satisface de manera segura su contenido a través de HTTPS, puede modificar su archivo %1$s o configurar los datos de su proxy o puede agregar la siguiente línea %2$s bajo la sección %3$s. %4$sAprenda más%5$s"
}
} \ No newline at end of file
diff --git a/plugins/CoreAdminHome/lang/et.json b/plugins/CoreAdminHome/lang/et.json
index 5c71b8e01e..0bf39f0ec4 100644
--- a/plugins/CoreAdminHome/lang/et.json
+++ b/plugins/CoreAdminHome/lang/et.json
@@ -17,7 +17,6 @@
"LogoUpload": "Vali üleslaadimiseks Logo",
"MenuDiagnostic": "Diagnostika",
"MenuGeneralSettings": "Põhiseaded",
- "MenuManage": "Halda",
"OptOutForYourVisitors": "Piwiku külastajate väljaarvamine",
"PiwikIsInstalledAt": "Piwik on paigaldatud",
"TrackAGoal": "Kogu infot eesmärgi kohta",
diff --git a/plugins/CoreAdminHome/lang/fa.json b/plugins/CoreAdminHome/lang/fa.json
index a43409850f..01c29c5740 100644
--- a/plugins/CoreAdminHome/lang/fa.json
+++ b/plugins/CoreAdminHome/lang/fa.json
@@ -34,7 +34,6 @@
"FaviconUpload": "یک Favicon انتخاب کنید تا آپلود شود.",
"MenuDiagnostic": "برشناختی",
"MenuGeneralSettings": "تنضیمات اصلی",
- "MenuManage": "مدیریت",
"OptOutComplete": "انتخاب کردن در خارج کامل بازدیدکننده داشته است خود را به این وب سایت توسط وب ابزار تجزیه و تحلیل می شود ثبت نخواهد شد.",
"OptOutCompleteBis": "توجه داشته باشید که اگر کوکی های خود را به شما روشن، حذف بخش از کوکی برای نگهداری اطلاعات استفاده از انتخاب کردن، و یا اگر شما تغییر کامپیوتر و یا مرورگر وب، شما نیاز به انجام دوباره روش انتخاب کردن.",
"OptOutExplanation": "Piwik به ارائه حریم خصوصی در اینترنت اختصاص داده شده است. به منظور ارائه به بازدید کنندگان خود را با انتخاب از امید بستن به خارج از تجزیه و تحلیل وب سایت Piwik، شما می توانید از کد HTML زیر را در یک صفحه وب سایت خود را اضافه کنید، برای مثال در یک صفحه سیاست حفظ حریم خصوصی است.",
diff --git a/plugins/CoreAdminHome/lang/fi.json b/plugins/CoreAdminHome/lang/fi.json
index 4a77c87d7b..9b4e2be213 100644
--- a/plugins/CoreAdminHome/lang/fi.json
+++ b/plugins/CoreAdminHome/lang/fi.json
@@ -51,7 +51,6 @@
"LogoUploadHelp": "Lähetä tiedosto formaatissa %1$s ja %2$s pikselin vähimmäiskorkeudella.",
"MenuDiagnostic": "Vianmääritys",
"MenuGeneralSettings": "Yleiset asetukset",
- "MenuManage": "Hallinnoi",
"MenuDevelopment": "Kehitys",
"OptOutComplete": "Olet poistanut itsesi seurannasta; käyntejä tälle sivulle ei seurata.",
"OptOutCompleteBis": "Huomioi, että jos poistat evästeet, poistat tämän sivun asettaman evästeen, vaihdat tietokonetta tai selainta, sinun täytyy suorittaa tämä uudelleen.",
diff --git a/plugins/CoreAdminHome/lang/fr.json b/plugins/CoreAdminHome/lang/fr.json
index 016168de64..26a32d9bb4 100644
--- a/plugins/CoreAdminHome/lang/fr.json
+++ b/plugins/CoreAdminHome/lang/fr.json
@@ -55,8 +55,9 @@
"LogoUploadHelp": "Veuillez télécharge un file dans un des formats suivants %1$s avec une hauteur minimale de %2$s pixels.",
"MenuDiagnostic": "Diagnostic",
"MenuGeneralSettings": "Paramètres généraux",
- "MenuManage": "Gérer",
+ "MenuSystem": "Système",
"MenuDevelopment": "Développement",
+ "MenuMeasurables": "Éléments mesurables",
"OptOutComplete": "Cookie d'exclusion installé. Vos visites sur ce site web ne seront PAS enregistrées par notre outil d'analyse web.",
"OptOutCompleteBis": "Note: si vous nettoyez vos cookies et supprimez le cookie d'exclusion, ou bien si vous changez d'ordinateur et\/ou de navigateur, il vous faudra de nouveau effectuer la procédure d'exclusion.",
"OptOutDntFound": "Vous n'êtes pas suivi parce que votre navigateur transmet que vous ne voulez pas l'être. Ceci est un paramètre de votre navigateur et vous ne serez pas en mesure de participer avant d'avoir désactivé la fonctionnalité \"ne pas suivre\".",
@@ -67,10 +68,12 @@
"PersonalPluginSettings": "Paramètres personnel de plugins",
"PluginSettingChangeNotAllowed": "Vous n'êtes pas autorisé(e) à modifier la valeur du paramètre \"%1$s\" du plugin \"%2$s\"",
"PluginSettingReadNotAllowed": "Vous n'êtes pas autorisé(e) à voir la valeur du paramètre \"%1$s\" dans le plugin \"%2$s\"",
- "PluginSettings": "Paramètres du composant",
+ "PluginSettings": "Paramètres des plugins",
"PluginSettingsIntro": "Vous pouvez ici modifier les paramètres des composants tierce partie suivants :",
"PluginSettingsValueNotAllowed": "La valeur pour le champ \"%1$s\" du composant \"%2$s\" n'est pas autorisée.",
"PluginSettingsSaveFailed": "Erreur lors de l'enregistrement des paramètres",
+ "PluginSettingsSaveSuccess": "Paramètres du plugins mis à jour.",
+ "SettingsSaveSuccess": "Paramètres mis à jour.",
"SendPluginUpdateCommunication": "Envoyer un courriel lorsqu'une mise à jour d'un composant est disponible",
"SendPluginUpdateCommunicationHelp": "Un courriel sera envoyé aux super utilisateurs quand une nouvelle version de plugin sera disponible.",
"StableReleases": "Si Piwik représente une part critique de vos affaires, nous vous recommandons d'utiliser la dernière version stable. Si vous utilisez la dernière version et que vous trouverez un bug ou avez une suggestion, %1$scliquez ici%2$s svp.",
diff --git a/plugins/CoreAdminHome/lang/he.json b/plugins/CoreAdminHome/lang/he.json
index b1b66f9b6f..e6153e70d4 100644
--- a/plugins/CoreAdminHome/lang/he.json
+++ b/plugins/CoreAdminHome/lang/he.json
@@ -13,7 +13,6 @@
"LogoUpload": "בחירת קובץ לוגו",
"MenuDiagnostic": "אבחון",
"MenuGeneralSettings": "הגדרות כלליות",
- "MenuManage": "ניהול",
"OptOutForYourVisitors": "התחמקות מ-Piwik עבור גולשיך",
"PiwikIsInstalledAt": "Piwik מותקן ב",
"TrackAGoal": "עקיבה אחר יעד",
diff --git a/plugins/CoreAdminHome/lang/hi.json b/plugins/CoreAdminHome/lang/hi.json
index 4b5a9e6cc9..d1a03912eb 100644
--- a/plugins/CoreAdminHome/lang/hi.json
+++ b/plugins/CoreAdminHome/lang/hi.json
@@ -42,7 +42,6 @@
"LogoUpload": "अपलोड करने के लिए किसी लोगो को चुनें",
"MenuDiagnostic": "डायग्नोस्टिक",
"MenuGeneralSettings": "सामान्य सेटिंग्स",
- "MenuManage": "नियंत्रित करें",
"OptOutComplete": "ऑप्ट-आउट कम्पलीट: इस वेबसाइट के लिए अपने दौरे वेब विश्लेषिकी उपकरण द्वारा दर्ज नहीं किया जाएगा.",
"OptOutCompleteBis": "आप अपने कुकी साफ़ करें, अगर कुकी को हटा सकते हैं, या आप कंप्यूटर या वेब ब्राउज़र को बदलते हैं, तो आप फिर से ऑप्ट-आउट कार्यविधि को पूरा करने की आवश्यकता होगी.",
"OptOutDntFound": "आप अपने ब्राउज़र आप नहीं करना चाहते हैं कि रिपोर्ट कर रहा है के बाद से नज़र रखी जा रही नहीं कर रहे हैं । आप ' ट्रैक न करें' सुविधा का प्रयोग नहीं जब तक आप चुनते में करने में सक्षम नहीं होगा, तो यह आपके ब्राउजर की एक सेटिंग है।",
diff --git a/plugins/CoreAdminHome/lang/hu.json b/plugins/CoreAdminHome/lang/hu.json
index 75f63d7aca..8726104f1f 100644
--- a/plugins/CoreAdminHome/lang/hu.json
+++ b/plugins/CoreAdminHome/lang/hu.json
@@ -54,7 +54,6 @@
"LogoUploadHelp": "A feltöltött fájlnak %1$s formátumban, minimum %2$s pixel magasnak kell lennie.",
"MenuDiagnostic": "Diagnosztika",
"MenuGeneralSettings": "Alapbeállítások",
- "MenuManage": "Kezelés",
"MenuDevelopment": "Fejlesztés",
"OptOutComplete": "Követés kikapcsolva; a látogatások semmilyen statisztikában nem fognak szerepelni.",
"OptOutCompleteBis": "Megjegyzés: abban az esetben, ha a követést tiltó süti törlődik, más számítógépről vagy böngészőből látogatja meg a weboldalt, a követést ismét le kell tiltania.",
diff --git a/plugins/CoreAdminHome/lang/id.json b/plugins/CoreAdminHome/lang/id.json
index 5406543bcd..952fe49300 100644
--- a/plugins/CoreAdminHome/lang/id.json
+++ b/plugins/CoreAdminHome/lang/id.json
@@ -45,7 +45,6 @@
"LogoUploadHelp": "Harap mengunggah berkas dalam bentuk %1$s dengan tinggi minimal %2$s pixel.",
"MenuDiagnostic": "Diagnosis",
"MenuGeneralSettings": "Pengaturan Umum",
- "MenuManage": "Kelola",
"OptOutComplete": "Jangan-Lacak selesai. Bila Anda mengunjungi situs ini, Anda tidak akan terekam oleh perangkat Analisis Ramatraya.",
"OptOutCompleteBis": "Perhatikan bahwa jika Anda menghapus kuki Anda, menghapus kuki Jangan-Lacak, atau jika Anda mengganti komputer atau peramban ramatraya, Anda perlu melakukan prosedur Jangan-Lacak lagi.",
"OptOutExplanation": "Piwik berdedikasi untuk menyediakan privasi Internet. Agar pengunjung Anda memiliki pilihan untuk tidak terekam oleh Analisis Ramatraya Piwik, Anda dapat menambahkan kode HTML di salah satu halaman situs Anda, misalnya di halaman Kebijakan Privasi.",
diff --git a/plugins/CoreAdminHome/lang/it.json b/plugins/CoreAdminHome/lang/it.json
index 39f3c15d56..614dfdf171 100644
--- a/plugins/CoreAdminHome/lang/it.json
+++ b/plugins/CoreAdminHome/lang/it.json
@@ -55,8 +55,9 @@
"LogoUploadHelp": "Caricate un file nei formati %1$s con un'altezza minima di %2$s pixel",
"MenuDiagnostic": "Diagnostica",
"MenuGeneralSettings": "Impostazioni generali",
- "MenuManage": "Gestione",
+ "MenuSystem": "Sistema",
"MenuDevelopment": "Sviluppo",
+ "MenuMeasurables": "Misurabili",
"OptOutComplete": "Opt-out completato. Le tue visite a questo sito non verranno registrate dallo strumento di Web Analytics.",
"OptOutCompleteBis": "Nota che se cancelli i tuoi cookie, cancelli anche il cookie di opt-out, e se cambi computer o browser web, devi fare la procedura di opt-out nuovamente.",
"OptOutDntFound": "Non vieni tracciato poiché il tuo browser comunica che non lo desideri. Questa è un'impostazione del tuo browser, dunque non potrai effettuare l'opt-in finchè non disabiliti la funzionalità \"Non Tracciare\".",
@@ -71,6 +72,8 @@
"PluginSettingsIntro": "Qui puoi cambiare le impostazioni dei seguenti plugin di terze parti:",
"PluginSettingsValueNotAllowed": "Il valore contenuto nel campo \"%1$s\" nel plugin \"%2$s\" non è consentito",
"PluginSettingsSaveFailed": "Salvataggio delle impostazioni del plugin fallito",
+ "PluginSettingsSaveSuccess": "Impostazioni del plugin aggiornate.",
+ "SettingsSaveSuccess": "Impostazioni aggiornate.",
"SendPluginUpdateCommunication": "Manda un'email quando è disponibile l'aggiornamento di un plugin",
"SendPluginUpdateCommunicationHelp": "Verrà inviata una email ai Super User quando è disponibile una nuova versione di un plugin.",
"StableReleases": "Se Piwik rappresenta una parte fondamentale nella vostra attività, vi raccomandiamo di utilizzare l'ultima versione stabile. Se utilizzate l'ultima versione beta e riscontrate un bug o avete dei suggerimenti, per favore %1$sguardate qui%2$s.",
diff --git a/plugins/CoreAdminHome/lang/ja.json b/plugins/CoreAdminHome/lang/ja.json
index 6793b30dc4..c8235e76ee 100644
--- a/plugins/CoreAdminHome/lang/ja.json
+++ b/plugins/CoreAdminHome/lang/ja.json
@@ -53,7 +53,6 @@
"LogoUploadHelp": "%1$s ピクセル以上の高さで %2$s 形式のファイルをアップロードしてください",
"MenuDiagnostic": "診断",
"MenuGeneralSettings": "全般の設定",
- "MenuManage": "管理",
"MenuDevelopment": "開発",
"OptOutComplete": "オプトアウトが完了しました。 このウェブサイトへのあなたの訪問は、ウェブ解析ツールで記録されません。",
"OptOutCompleteBis": "Cookie をクリアしてオプトアウト Cookie を削除したり、コンピュータやブラウザを変更した場合は、オプトアウト手続きを再度実行する必要があることに注意してください。",
diff --git a/plugins/CoreAdminHome/lang/ko.json b/plugins/CoreAdminHome/lang/ko.json
index 0e7d79e8bc..1347d6ca5d 100644
--- a/plugins/CoreAdminHome/lang/ko.json
+++ b/plugins/CoreAdminHome/lang/ko.json
@@ -22,14 +22,21 @@
"JSTracking_CustomCampaignQueryParamDesc": "중요: %1$s Piwik는 자동으로 구글 분석 파라메터를 감지합니다.%2$s",
"JSTracking_DisableCookies": "모든 추적 쿠키 비활성화",
"JSTracking_EnableDoNotTrack": "클라이언트에서 DoNotTrack 탐지 활성화",
+ "JSTracking_EnableDoNotTrack_AlreadyEnabled": "주의: 서버 쪽 DoNotTrack 지원이 활성화되었기에, 이 옵션은 아무런 영향이 없습니다.",
+ "JSTracking_VisitorCustomVars": "이 방문자를 위한 추적 맞춤 변수",
+ "JSTracking_VisitorCustomVarsDesc": "예를 들어, 변수 이름으로 \"Type\"이고 값은 \"Customer\"입니다.",
+ "JSTrackingIntro2": "당신의 웹사이트를 위한 자바스크립트 추적 코드를 가졌다면, Piwik가 추적이 가능하도록 모든 페이지에 해당 코드를 복사 및 붙여넣기 해주세요.",
"JSTrackingIntro3": "대부분의 웹사이트, 블로그, CMS 등에서 쉽게 사용할 수 있도록 플러그인 형태로 제공되고 있습니다. (%1$sPiwik 통합 플러그인 리스트%2$s 보기) 만약 플러그인이 제공되지 않는다면, 웹사이트 템플릿을 고쳐 \"footer\" 파일에 해당 코드를 넣어 해결할 수 있습니다.",
+ "JSTrackingIntro4": "만약 방문자 추적을 위해 자바스크립트를 사용하고 싶지 않으시다면, 아래의 %1$s이미지 추적 링크 생성%2$s을 해주세요.",
"JSTrackingIntro5": "만약 페이지 뷰에 대한 것 이상을 원할 경우, %1$sPiwik 자바스크립트 트래킹 문서%2$s 내 여러 가능한 함수 리스트를 참고하세요. 이 함수들을 통해 목표나 맞춤 변수, 상거래 주문 및 담겨져있기만 한 카트 등을 추적할 수 있습니다.",
+ "LogoUploadFailed": "업로드된 파일에 문제가 있습니다. 적합한 포멧을 가진 파일인지 확인해주세요.",
"LogoUpload": "업로드 할 로고 선택",
"FaviconUpload": "업로드 할 파비콘 선택",
"MenuDiagnostic": "진단",
"MenuGeneralSettings": "일반 설정",
- "MenuManage": "관리",
+ "MenuSystem": "시스템",
"MenuDevelopment": "개발",
+ "MenuMeasurables": "측정가능한 것",
"OptOutComplete": "차단 완료; 당신의 방문한 이 웹사이트는 이제 웹 분석 도구에 기록되지 않습니다.",
"OptOutCompleteBis": "Cookie를 삭제하여 차단 Cookie를 삭제하거나 컴퓨터 또는 브라우저를 변경 한 경우는 차단 절차를 다시 수행해야 한다는 점 유의하세요.",
"OptOutExplanation": "Piwik은 인터넷에서 개인 정보 제공에 최선을 다하고 있습니다. 방문자에 Piwik 웹 분석의 차단 옵션을 제공하기 위해 웹 사이트의 1페이지 (개인 정보 보호 정책 페이지 등)에 다음 HTML 코드를 추가 할 수 있습니다.",
@@ -39,7 +46,10 @@
"PersonalPluginSettings": "나만의 플러그인 설정",
"PluginSettings": "플러그인 설정",
"PluginSettingsIntro": "다음 나열된 서드 파티 플러그인의 설정을 바꿀 수 있다:",
+ "PluginSettingsValueNotAllowed": "플러그인 \"%2$s\" 내 \"%1$s\" 항목값은 허용되지 않습니다.",
"PluginSettingsSaveFailed": "플러그인 설정 저장 실패",
+ "PluginSettingsSaveSuccess": "플러그인 설정이 갱신되었습니다.",
+ "SettingsSaveSuccess": "설정이 갱신되었습니다.",
"SendPluginUpdateCommunication": "플러그인 업데이트가 가능할 때 이메일 알림",
"SendPluginUpdateCommunicationHelp": "플러그인의 새로운 버전이 나타날 경우 수퍼 유저에게 메일로 알려집니다.",
"StableReleases": "\"만약 Piwik가 당신의 비지니스에 상당히 중요한 요소라면 최근 안정 버전을 사용하시는 것을 추천합니다. 만약 최근 베타 버전을 사용 중 버그를 찾으셨거나 제안하실 사항이 있으시다면, %1$s여기를 봐주세요%2$s.",
diff --git a/plugins/CoreAdminHome/lang/nb.json b/plugins/CoreAdminHome/lang/nb.json
index 8c89e22b14..25283471a9 100644
--- a/plugins/CoreAdminHome/lang/nb.json
+++ b/plugins/CoreAdminHome/lang/nb.json
@@ -55,8 +55,9 @@
"LogoUploadHelp": "Vennligst last opp en fil i %1$s-formatet med en minimumshøyde på %2$s piksler.",
"MenuDiagnostic": "Diagnostikk",
"MenuGeneralSettings": "Generelle innstillinger",
- "MenuManage": "Administrer",
+ "MenuSystem": "System",
"MenuDevelopment": "Utvikling",
+ "MenuMeasurables": "Områder",
"OptOutComplete": "Opt-out ferdig; dine besøk til dette nettstedet vil ikke spores av webstatistikkverktøyet.",
"OptOutCompleteBis": "Merk at hvis du sletter dine datakapsler (cookies), sletter denne opt-out-kapselen, eller hvis du endrer datamaskin eller nettleser, er du nødt til å gjennomføre denne prosedyren igjen.",
"OptOutDntFound": "Du spores ikke siden din nettleser rapporterer at du ikke vil det. Dette er en innstilling i din nettleser, så du vil ikke være i stand til å delta før du deaktiverer «Ikke spor meg»-funksjonen.",
@@ -71,6 +72,8 @@
"PluginSettingsIntro": "Her kan du endre innstillinger for følgende 3. parts utvidelser:",
"PluginSettingsValueNotAllowed": "Verdien for feltet «%1$s» i utvidelsen «%2$s» er ikke tillatt",
"PluginSettingsSaveFailed": "Klarte ikke å lagre innstillinger for utvidelser",
+ "PluginSettingsSaveSuccess": "Utvidelsesinnstillingene ble oppdaterte.",
+ "SettingsSaveSuccess": "Innstillingene ble oppdaterte.",
"SendPluginUpdateCommunication": "Send en e-post når en oppdatering for en utvidelse er tilgjengelig",
"SendPluginUpdateCommunicationHelp": "En e-post vil bli sendt til superbrukere når det er en ny versjon tilgjengelig for en utvidelse.",
"StableReleases": "Hvis Piwik er en kritisk del av din forretning anbefaler vi at du bruker den nyeste stabile versjonen. Hvis du bruker den nyeste betaen og du finner en feil eller har et forbedringsforslag, vennligst %1$sse her%2$s.",
diff --git a/plugins/CoreAdminHome/lang/nl.json b/plugins/CoreAdminHome/lang/nl.json
index e12c716c73..5ae86c22a9 100644
--- a/plugins/CoreAdminHome/lang/nl.json
+++ b/plugins/CoreAdminHome/lang/nl.json
@@ -55,7 +55,6 @@
"LogoUploadHelp": "Upload een bestand in %1$s formaten met een minimum hoogte van %2$s pixels.",
"MenuDiagnostic": "Diagnose",
"MenuGeneralSettings": "Algemene instellingen",
- "MenuManage": "Beheer",
"MenuDevelopment": "Ontwikkeling",
"OptOutComplete": "Opt-out ingesteld; Uw bezoeken aan deze website zullen niet worden geregistreerd in de Web Analytics tool.",
"OptOutCompleteBis": "Als u uw cookies verwijderd, de opt-out cookie verwijderd of wisselt van computer of webbrowser, dan zult u deze opt-out procedure opnieuw moeten uitvoeren.",
@@ -87,6 +86,7 @@
"YouAreOptedOut": "U bent momenteel afgemeld.",
"YouMayOptOut": "Je kunt ervoor kiezen om geen uniek cookie identificatie nummer van je computer te hebben, zodat er op deze website van uw apparaat geen data verzameld of geanalyseerd kan worden.",
"YouMayOptOutBis": "Om hiervoor te kiezen kunt u hieronder klikken om een opt-out cookie te ontvangen.",
- "OptingYouOut": "Opt-out inschakelen, even geduld."
+ "OptingYouOut": "Opt-out inschakelen, even geduld.",
+ "ProtocolNotDetectedCorrectly": "Op dit moment bezoek je Piwik over een beveiligde SSL verbinding (https), alleen heeft Piwik geen beveiligde verbinding op de server kunnen vinden."
}
} \ No newline at end of file
diff --git a/plugins/CoreAdminHome/lang/pl.json b/plugins/CoreAdminHome/lang/pl.json
index 06e87d64dd..fa7f1ab840 100644
--- a/plugins/CoreAdminHome/lang/pl.json
+++ b/plugins/CoreAdminHome/lang/pl.json
@@ -51,7 +51,6 @@
"LogoUploadHelp": "Prześlij plik w formatach %1$s i o minimalnej wysokości %2$s pikseli.",
"MenuDiagnostic": "Diagnostyka",
"MenuGeneralSettings": "Konfiguracja ogólna",
- "MenuManage": "Zarządzaj",
"MenuDevelopment": "Rozwój",
"OptOutComplete": "Pełna dezaktywacja. Nie będziesz odnotowywany przez narzędzie statystyk i analityki.",
"OptOutCompleteBis": "Prosimy zauważyć, że jeśli usuniesz swoje pliki ciasteczek cookies, zostaną skasowane ciasteczka wyłączające śledzenie, lub jeśli zmienisz komputer czy przeglądarkę, będziesz musiał powtórzyć procedurę wyłączenia analizy statystycznej raz jeszcze.",
diff --git a/plugins/CoreAdminHome/lang/pt-br.json b/plugins/CoreAdminHome/lang/pt-br.json
index c28980c099..7a502810fe 100644
--- a/plugins/CoreAdminHome/lang/pt-br.json
+++ b/plugins/CoreAdminHome/lang/pt-br.json
@@ -55,8 +55,9 @@
"LogoUploadHelp": "Por favor faça o upload de um arquivo nos formatos %1$s com uma altura mínima de %2$s pixels.",
"MenuDiagnostic": "Diagnostico",
"MenuGeneralSettings": "Configurações Gerais",
- "MenuManage": "Gerenciar",
+ "MenuSystem": "Sistema",
"MenuDevelopment": "Desenvolvimento",
+ "MenuMeasurables": "Mensuráveis",
"OptOutComplete": "Opt-out completo; suas visitas a este site não vai ser gravado pela ferramenta de Web Analytics.",
"OptOutCompleteBis": "Note que se você limpar os cookies, excluir o cookie de opt-out, ou se mudar de computador ou navegadores da Web, você vai precisar realizar o procedimento opt-out novamente.",
"OptOutDntFound": "Você não está sendo monitorado desde que o seu navegador está informando que você não quer isso. Essa é uma configuração do seu navegador portanto você não será capaz de aceitar ser rastreado até que você desative o recurso \"Do Not Track\".",
@@ -71,6 +72,8 @@
"PluginSettingsIntro": "Aqui você pode alterar as configurações dos seguintes plugins de terceiros:",
"PluginSettingsValueNotAllowed": "O valor para o campo \"%1$s\" no plugin \"%2$s\" inão é permitido",
"PluginSettingsSaveFailed": "Falhou ao salvar as configurações do plugin",
+ "PluginSettingsSaveSuccess": "Configurações do plugin atualizadas.",
+ "SettingsSaveSuccess": "Configurações atualizadas.",
"SendPluginUpdateCommunication": "Envie um e-mail quando uma atualização de plugin estiver disponível",
"SendPluginUpdateCommunicationHelp": "Um e-mail será enviado para os Super Usuários quando houver uma nova versão disponível para um plugin.",
"StableReleases": "Se o Piwik é uma parte crítica do seu negócio, recomendamos que você use a última versão estável. Se você usar a versão beta mais recente e encontrar uma falha ou tiver alguma sugestão, por favor, %1$sveja aqui%2$s.",
diff --git a/plugins/CoreAdminHome/lang/pt.json b/plugins/CoreAdminHome/lang/pt.json
index cecdc2c942..f9a2dac52e 100644
--- a/plugins/CoreAdminHome/lang/pt.json
+++ b/plugins/CoreAdminHome/lang/pt.json
@@ -26,7 +26,6 @@
"FaviconUpload": "Selecione um Favicon para carregar",
"MenuDiagnostic": "Diagnóstico",
"MenuGeneralSettings": "Definições gerais",
- "MenuManage": "Gerir",
"MenuDevelopment": "Desenvolvimento",
"OptOutComplete": "Opt-out completo; as suas visitas a este site não serão gravadas pela ferramenta de Web Analytics.",
"OptOutCompleteBis": "Note que se você apagar os cookies, apagar o cookie de opt-out, ou se você mudar de computador ou navegadores Web, vai precisar de realizar o procedimento de opt-out novamente.",
diff --git a/plugins/CoreAdminHome/lang/ro.json b/plugins/CoreAdminHome/lang/ro.json
index a31494c3f0..575350133b 100644
--- a/plugins/CoreAdminHome/lang/ro.json
+++ b/plugins/CoreAdminHome/lang/ro.json
@@ -48,7 +48,6 @@
"LogoUploadHelp": "Te rugam sa incarci un fisier cu formaturile %1$s, cu o inaltime minima de %2$s pixeli.",
"MenuDiagnostic": "Diagnosticare",
"MenuGeneralSettings": "Setări generale",
- "MenuManage": "Administrare",
"OptOutComplete": "Dezabonare completa; vizitele tale pe acest site nu vor fi contorizate de tool-ul de Web Analytics.",
"OptOutCompleteBis": "Aminteste-ti ca daca dai clear la cookie-uri, stergi cookie-ul de dezabonare sau daca schimbi calculatoarele sau browserele web, tot vei fi nevoit sa te dezabonezi iarasi.",
"OptOutExplanation": "Piwik este dedicat sa furnizeze intimitate\/privacy pe Internet. Pentru a lasa vizitatorilor tai optiunea de dezabonare de la Piwik Web Analytics, poti adauga urmatorul cod HTML pe una dintre paginile siteului tau, de exemplu pe pagina de Privacy Policy.",
diff --git a/plugins/CoreAdminHome/lang/ru.json b/plugins/CoreAdminHome/lang/ru.json
index 905ccd69c0..97074b028b 100644
--- a/plugins/CoreAdminHome/lang/ru.json
+++ b/plugins/CoreAdminHome/lang/ru.json
@@ -6,22 +6,22 @@
"BrandingSettings": "Настройки логотипа",
"ReleaseChannel": "Канал выпуска",
"ClickHereToOptIn": "Кликните, чтобы вы учитывались в аналитике.",
- "ClickHereToOptOut": "Кликните, чтобы отказаться от учета вас в аналитике.",
+ "ClickHereToOptOut": "Кликните, чтобы вы не учитывались в аналитике.",
"CustomLogoFeedbackInfo": "Если вы используйете свой логотип, вам, возможно, также понадобится скрыть ссылку %1$s в верхнем меню. Для этого просто отключите плагин Feedback (обратная связь) на странице %2$sУправление плагинами%3$s.",
- "CustomLogoHelpText": "Вы можете добавить свой логотип, который будет отображаться отчетах.",
+ "CustomLogoHelpText": "Вы можете добавить свой логотип, который будет отображаться отчётах.",
"DevelopmentProcess": "В то время как наш %1$sпроцесс разработки%2$s включает в себя тысячи автоматизированных тестов, бета-тестеры играют ключевую роль в достижении \"No bug policy\" в Piwik.",
"EmailServerSettings": "Настройки сервера электронной почты",
"ForBetaTestersOnly": "Только для бета-тестеров",
"ImageTracking": "Отслеживание через изображение",
- "ImageTrackingIntro1": "Когда посетитель отключил JavaScript, или когда JavaScript не может быть использовано, вы можете использовать ссылку на изображение для отслеживания посетителей.",
- "ImageTrackingIntro2": "Создайте ссылку ниже и разместите сгенерированный HTML на страницах. Если вы используете это в качестве запасного варианта для отслеживания без JavaScript, вы можете его окружить его в тег %1$s.",
+ "ImageTrackingIntro1": "Когда посетитель отключил JavaScript, или когда JavaScript не может быть использован, вы можете использовать ссылку на изображение для отслеживания посетителей.",
+ "ImageTrackingIntro2": "Создайте ссылку и разместите сгенерированный HTML на страницах. Если вы используете это в качестве запасного варианта для отслеживания без JavaScript, вы можете его окружить его в тег %1$s.",
"ImageTrackingIntro3": "Весь список опций, которые можно использовать с изображением-ссылкой отслеживания смотрите в %1$sTracking API Documentation%2$s.",
"ImageTrackingLink": "Ссылка на изображение для отслеживания",
"ImportingServerLogs": "Импортирование логов сервера",
"ImportingServerLogsDesc": "Альтернативой отслеживания посетителей через браузер (вместо JavaScript или ссылки на изображение) является постоянно импортировать логи сервера. Узнать больше о %1$sServer Log File Analytics%2$s.",
"InvalidPluginsWarning": "Следующие плагины не совместимы с %1$s и не могут быть загружены: %2$s.",
"InvalidPluginsYouCanUninstall": "Вы можете обновить или удалить эти плагины на странице %1$sУправления плагинами%2$s.",
- "JavaScriptTracking": "JavaScript-отслеживание",
+ "JavaScriptTracking": "JavaScript отслеживание",
"JSTracking_CampaignKwdParam": "Параметр Ключевого слова кампании",
"JSTracking_CampaignNameParam": "Параметр Имени кампании",
"JSTracking_CodeNoteBeforeClosingHead": "Удостоверьтесь, что этот код находится на каждой странице вашего вебсайта. Мы рекомендуем вставлять его сразу перед закрытием тега %1$s.",
@@ -39,24 +39,25 @@
"JSTracking_MergeSubdomains": "Отслеживать посетителей через все поддомены сайта",
"JSTracking_MergeSubdomainsDesc": "Если один посетитель заходил на %1$s и %2$s, то посещения будут учитываться как уникальный посетитель.",
"JSTracking_PageCustomVars": "Отслеживать пользовательские переменные для каждого вида страницы",
- "JSTracking_PageCustomVarsDesc": "Например, имя переменной «Категория», а значение – «Официальные документы».",
+ "JSTracking_PageCustomVarsDesc": "Например, имя переменной «Категория», а значение — «Официальные документы».",
"JSTracking_VisitorCustomVars": "Отслеживать пользовательские переменные для посетителя",
- "JSTracking_VisitorCustomVarsDesc": "Например, имя переменной «Тип», а значение – «Клиент».",
- "JSTrackingIntro1": "Вы можете отслеживать посетителей разными способами. Мы рекомендуем использовать для этого JavaScript. Чтобы использовать это метод вы должны убедиться, что этот код размещён на каждой странице.",
- "JSTrackingIntro2": "Как только вы получили Javascript код для вашего сайта, скопируйте и вставьте его на все страницы вашего сайта, на которых вы хотите отслеживать посетителей.",
- "JSTrackingIntro3": "В большинстве CMS, блогах, сайтах и т.д. вы можете использовать готовый плагин, чтобы сделать технические правки на сайте вместо вас. (Смотрите %1$sсписок плагинов для интеграции с Piwik%2$s.) Если пока нет подходящего плагина - вы можете отредактировать шаблон сайта и добавить этот код в \"подвал\" файла.",
+ "JSTracking_VisitorCustomVarsDesc": "Например, имя переменной «Тип», а значение — «Клиент».",
+ "JSTrackingIntro1": "Вы можете отслеживать посетителей разными способами. Мы рекомендуем использовать для этого JavaScript. Чтобы использовать данный метод вы должны убедиться, что этот код размещён на каждой странице.",
+ "JSTrackingIntro2": "Как только вы получили JavaScript-код для вашего сайта, скопируйте и вставьте его на все страницы вашего сайта, на которых вы хотите отслеживать посетителей.",
+ "JSTrackingIntro3": "В большинстве CMS, блогах, сайтах и т.д. вы можете использовать готовый плагин, чтобы сделать технические правки на сайте вместо вас. (Смотрите %1$sсписок плагинов для интеграции с Piwik%2$s.) Если пока нет подходящего плагина — вы можете отредактировать шаблон сайта и добавить этот код в файл «футера» .",
"JSTrackingIntro4": "Если вы не хотите или не можете использовать JavaScript, %1$sвоспользуйтесь отслеживанием посетителей через изображение%2$s.",
"JSTrackingIntro5": "Если вы хотите больше, чем простое отслеживание страниц, пожалуйста, ознакомьтесь с %1$sPiwik Javascript Tracking documentation%2$s для просмотра всех функций. С помощью этих функций вы можете отслеживать цели, пользовательские переменные, заказы электронной коммерции, неоформленные заказы и многое другое.",
- "LogoNotWriteableInstruction": "Чтобы использовать собственное лого вместо стандартного Piwik, откройте для записи эту папку: %1$s Piwik нужен доступ на запись к вашим лого, храняшимся в файлах %2$s.",
+ "LogoNotWriteableInstruction": "Чтобы использовать собственное лого вместо стандартного Piwik, откройте для записи эту папку: %1$s Piwik' нужен доступ на запись к вашим лого, храняшимся в файлах %2$s.",
"FileUploadDisabled": "Загрузка файлов не включена в вашей конфигурации PHP. Для загрузки другого логотипа выставите %s в php.ini и перезапустите веб-сервер.",
"LogoUploadFailed": "Загруженный файл не может быть обработан. Пожалуйста, проверьте, что файл имеет нужный формат.",
"LogoUpload": "Выберите лого для загрузки",
- "FaviconUpload": "Выбрать Favicon для загрузки",
- "LogoUploadHelp": "Пожалуйста, закачивайте файлы в %1$s форматах, минимальное ограничение по высоте – %2$s пикселей.",
+ "FaviconUpload": "Выберите Favicon для загрузки",
+ "LogoUploadHelp": "Пожалуйста, закачивайте файлы в %1$s форматах, минимальное ограничение по высоте — %2$s пикселей.",
"MenuDiagnostic": "Диагностика",
"MenuGeneralSettings": "Основные настройки",
- "MenuManage": "Управление",
+ "MenuSystem": "Система",
"MenuDevelopment": "Разработка",
+ "MenuMeasurables": "Единицы измерения",
"OptOutComplete": "Исключение из политики конфиденциальности завершено; ваши посещения на данный сайт не будут учитываться системой веб аналитики. Мы уважаем ваш выбор.",
"OptOutCompleteBis": "Заметьте, что если вы очистите cookies браузера, то, скорее всего, удалится и исключительный cookie, или если вы поменяете компьютер или браузер, то необходимо будет пройти процедуру исключения снова.",
"OptOutDntFound": "Ваши действия не отслеживались, так как ваш браузер сообщает, что вы не хотите этого. Это настройка вашего браузера, поэтому у вас не будет возможности включить ее до тех пор, пока вы не отключите опцию \"Не отслеживать\".",
@@ -71,6 +72,8 @@
"PluginSettingsIntro": "Здесь вы можете изменить настройки для следующих плагинов:",
"PluginSettingsValueNotAllowed": "Значение для поля \"%1$s\" в плагине \"%2$s\" не разрешено",
"PluginSettingsSaveFailed": "Ошибка при сохранении настроек плагина",
+ "PluginSettingsSaveSuccess": "Настройки плагинов обновлены.",
+ "SettingsSaveSuccess": "Настройки обновлены.",
"SendPluginUpdateCommunication": "Отправить email с уведомлением, когда для плагина будет доступна новая версия",
"SendPluginUpdateCommunicationHelp": "Письмо будет отправлено суперпользователю когда будет доступна новая версия плагина.",
"StableReleases": "Если Piwik является важной частью вашего бизнеса, мы рекомендуем использовать последнюю стабильную версию. Если вы используете последнюю бета версию, и вы нашли ошибку или есть предложение, пожалуйста, %1$sперейдите по ссылке%2$s.",
diff --git a/plugins/CoreAdminHome/lang/sk.json b/plugins/CoreAdminHome/lang/sk.json
index e9f1511ade..658df4956d 100644
--- a/plugins/CoreAdminHome/lang/sk.json
+++ b/plugins/CoreAdminHome/lang/sk.json
@@ -10,7 +10,6 @@
"LogoUpload": "Vyberte logo pre načítanie",
"MenuDiagnostic": "Diagnostika",
"MenuGeneralSettings": "Všeobecné nastavenie",
- "MenuManage": "Spravovať",
"TrackAGoal": "Sledovať cieľ",
"TrackingCode": "Kód sledovania",
"TrustedHostConfirm": "Ste si istí, že chcete zmeniť dôveryhodné hostname pre Piwik?",
diff --git a/plugins/CoreAdminHome/lang/sl.json b/plugins/CoreAdminHome/lang/sl.json
index d864275440..6809cc9255 100644
--- a/plugins/CoreAdminHome/lang/sl.json
+++ b/plugins/CoreAdminHome/lang/sl.json
@@ -22,7 +22,6 @@
"FaviconUpload": "Izberite Favicon datoteko za prenos",
"MenuDiagnostic": "Diagnostika",
"MenuGeneralSettings": "Splošne nastavitve",
- "MenuManage": "Upravljaj",
"MenuDevelopment": "Razvoj",
"OptOutExplanation": "Piwik želi zagotoviti zasebnost na internetu. Če želite svojim obiskovalcem omogočiti 'opt-out' iz Piwik spletne analitike, potem lahko dodate naslednjo HTML kodo na vašo spletno stran, npr. na stran 'Varovanje zasebnosti'.",
"OptOutForYourVisitors": "'Opt-out' za vaše obiskovalce",
diff --git a/plugins/CoreAdminHome/lang/sq.json b/plugins/CoreAdminHome/lang/sq.json
index 3db2572545..518eb8e25a 100644
--- a/plugins/CoreAdminHome/lang/sq.json
+++ b/plugins/CoreAdminHome/lang/sq.json
@@ -2,30 +2,97 @@
"CoreAdminHome": {
"AddNewTrustedHost": "Shtoni një strehë të re të besuar",
"Administration": "Administrim",
+ "ArchivingSettings": "Rregullime arkivimi",
"BrandingSettings": "Rregullime marke",
+ "ReleaseChannel": "Kanal hedhjesh në qarkullim",
"ClickHereToOptIn": "Klikoni këtu për të kryer \"opt in\"",
- "ClickHereToOptOut": "Klikoni këtu për të kryer \"opt out\"",
- "CustomLogoFeedbackInfo": "Nëse e përshtatni logon e Piwik-ut, mund t’ju interesonte edhe fshehja lidhjes %1$s te menuja në krye. Për ta bërë këtë, mund të çaktivizoni shtojcën e Përshtypjeve te faqja e %2$sAdministrimit të Shtojcëve%3$s.",
- "CustomLogoHelpText": "Logon e Piwik-ut, që do të shfaqet në ndërfaqen e përdoruesit dhe raportet email.",
+ "ClickHereToOptOut": "Klikoni këtu për të kryer \"opt out\".",
+ "CustomLogoFeedbackInfo": "Nëse e përshtatni logon e Piwik-ut, mund t’ju interesonte edhe fshehja lidhjes %1$s te menuja në krye. Për ta bërë këtë, mund të çaktivizoni shtojcën e Përshtypjeve te faqja e %2$sAdministrimit të Shtojcave%3$s.",
+ "CustomLogoHelpText": "Logon e Piwik-ut, që do të shfaqet në ndërfaqen e përdoruesit dhe raportet email, mund ta personalizoni.",
+ "DevelopmentProcess": "Edhe pse %1$sprocesi ynë i zhvillimit%2$s përfshin mijëra prova të automatizuara, Testuesit Beta luajnë një rol kyç në arritjen e \"No bug policy\" te Piwik-u.",
"EmailServerSettings": "Rregullime shërbyesi email",
"ForBetaTestersOnly": "Vetëm për testues beta",
+ "ImageTracking": "Ndjekje Figurash",
+ "ImageTrackingIntro1": "Kur një vizitor e ka JavaScript-in të çaktivizuar, ose kur JavaScript-i s’përdoret dot, mund të përdorni një lidhje ndjekjeje figurash për të ndjekur vizitorët.",
+ "ImageTrackingIntro2": "Prodhojeni lidhjen më poshtë dhe kopjojeni dhe hidheni te faqja HTML-në e prodhuar. Nëse këtë e përdorni për rastet kur nuk funksionon ndjekja përmes JavaScript-it, mund ta vendosni brenda etiketash %1$s.",
+ "ImageTrackingIntro3": "Për krejt listën e mundësive që mund të përdorni me një lidhje ndjekjeje figurash, shihni %1$sDokumentimin e API-t të Ndjekjeve%2$s.",
+ "ImageTrackingLink": "Lidhje Ndjekjeje Figurash",
+ "ImportingServerLogs": "Importim Regjistrash Shërbyesi",
+ "ImportingServerLogsDesc": "Një alternativë kundrejt ndjekjes së vizitorëve përmes shfletuesit (ose përmes JavaScript-it, ose përmes një lidhjeje figurash) është importimi i vazhdueshëm i regjistrave të shërbyesit. Mësoni më tepër rreth %1$sAnalizave me bazë Kartelash Regjistër të Shërbyesit%2$s.",
+ "InvalidPluginsWarning": "Shtojcat vijuese s’janë të përputhshme me %1$s dhe s’u ngarkuan dot: %2$s.",
+ "InvalidPluginsYouCanUninstall": "Këto shtojca mund t’i përditësoni ose çinstaloni që nga faqja %1$sAdministroni Shtojca%2$s.",
+ "JavaScriptTracking": "Ndjekje me JavaScript",
+ "JSTracking_CampaignKwdParam": "Parametër Fjalëkyçesh Fushatash",
+ "JSTracking_CampaignNameParam": "Parametër Emrash Fushatash",
+ "JSTracking_CodeNoteBeforeClosingHead": "Bëni të mundur që ky kod të gjendet në çdo faqe të sajtit tuaj. Këshillojmë ta ngjitni mu para etiketës mbyllëse %1$s.",
+ "JSTracking_CustomCampaignQueryParam": "Përdorni emra vetjakë parametrash kërkese për emra & fjalëkyçe të fushatës",
+ "JSTracking_CustomCampaignQueryParamDesc": "Shënim: %1$sPiwik-u do të zbulojë vetvetiu parametra Google Analytics.%2$s",
+ "JSTracking_DisableCookies": "Çaktivizo krejt cookie-t e ndjekjeve",
+ "JSTracking_DisableCookiesDesc": "Çaktivizon krejt cookie-t Piwik. Cookie-t ekzistuese Piwik për këtë sajt do të fshihen me parjen pasuese të faqeve.",
+ "JSTracking_EnableDoNotTrack": "Aktivizoni zbulim MosMëGjurmo në anën e klientit",
+ "JSTracking_EnableDoNotTrack_AlreadyEnabled": "Shënim: Mbulimi i MosMëGjurmo-së në anën e shërbyesit është i aktivizuar, ndaj kjo mundësi nuk do të ketë efekt.",
+ "JSTracking_EnableDoNotTrackDesc": "Pra nuk do të dërgohen kërkesa ndjekjeje, nëse vizitorët dëshirojnë të mos gjurmohen.",
+ "JSTracking_GroupPageTitlesByDomain": "Paraprije titullin e faqes me përkatësinë e sajtit, kur kryhet ndjekje",
+ "JSTracking_GroupPageTitlesByDomainDesc1": "Pra, nëse dikush viziton faqen 'Rreth' te blog.%1$s, do të regjistrohet si 'blog \/ Rreth'. Kjo është rruga më e lehtë për të patur një përmbledhje të trafikut tuaj sipas nënpërkatësish.",
+ "JSTracking_MergeAliases": "Te raporti \"Lidhje për jashtë\", fshihni klikime mbi URL të njohura si aliase të",
+ "JSTracking_MergeAliasesDesc": "Pra, klikimet mbi lidhjet për te URL Aliasesh (p.sh. %s) nuk do të numërohen si \"Lidhje për jashtë\".",
+ "JSTracking_MergeSubdomains": "Ndiqi vizitorët nëpër krejt nënpërkatësitë e",
+ "JSTracking_MergeSubdomainsDesc": "Pra, nëse një vizitor viziton %1$s dhe %2$s, ai do të numërohet si një vizitor i vetëm.",
+ "JSTracking_PageCustomVars": "Ndiqni për çdo parje faqeje një ndryshore vetjake",
+ "JSTracking_PageCustomVarsDesc": "Për shembull, me emër ndryshoreje \"Kategori\" dhe vlerë \"Artikuj Gazete\".",
+ "JSTracking_VisitorCustomVars": "Ndiqni ndryshore vetjake për këtë vizitor",
+ "JSTracking_VisitorCustomVarsDesc": "Për shembull, me emër ndryshoreje \"Lloj\" dhe vlerë \"Klient\".",
+ "JSTrackingIntro1": "Vizitorët në sajtin tuaj mund t’i ndiqni në mjaft rrugë të ndryshme. Rruga e këshilluar për ta bërë është përmes JavaScript-it. Për të përdorur këtë metodë, duhet të garantoni që çdo faqe e sajtit tuaj të përmbajë një copëz kodi JavaScript, të cilin mund ta prodhoni nga këtu.",
+ "JSTrackingIntro2": "Pasi të keni kodin JavaScript të ndjekjes për sajtin tuaj, kopjojeni dhe hidheni te krejt faqet që dëshironi të ndiqni me Piwik.",
+ "JSTrackingIntro3": "Në shumicën e sajteve, blogjeve, CMS-ve, etj, mund të përdorni një shtojcë të gatshme për të kryer pjesën teknike të kësaj. (Shihni %1$slistën tonë të shtojcave që mund të përdoren për të integruar Piwik-un%2$s.) Nëse nuk gjeni një shtojcë, mund të përpunoni gjedhet e sajtit tuaj dhe ta shtoni këtë kod te kartela \"footer\".",
+ "JSTrackingIntro4": "Nëse s’doni të përdorni JavaScript-in për ndjekje vizitorësh, %1$sprodhoni më poshtë një lidhje ndjekjeje figurash%2$s.",
+ "JSTrackingIntro5": "Nëse dëshironi të bëni më shumë se sa thjesht ndjekje parjesh të faqeve, ju lutemi, hidhini një sy %1$sdokumentimit të Ndjekjeve Piwik me Javascript%2$s për listën e plotë të funksioneve të mundshëm. Duke përdorur këto funksione mund të ndiqni objektiva, ndryshore vetjake, porosi e-tregtie, shporta të braktisura, etj.",
+ "LogoNotWriteableInstruction": "Që të përdorni logon tuaj vetjake në vend të asaj parazgjedhje të Piwik-ut, jepni të drejta shkrimi mbi këtë drejtori: %1$s Piwik-u lyp hyrje shkrimi për logot tuaja të depozituara në kartelat %2$s.",
+ "FileUploadDisabled": "Ngarkimi i kartelave s’është i aktivizuar te formësimi juaj për PHP-në. Që të ngarkoni logon tuaj vetjake, ju lutemi, caktoni %s te php.ini dhe rinisni shërbyesin tuaj web.",
+ "LogoUploadFailed": "Kartela e ngarkuar s’mund të përpunohej dot. Ju lutemi, kontrolloni nëse kartela ka një format të vlefshëm.",
"LogoUpload": "Përzgjidhni një Logo për ta ngarkuar",
+ "FaviconUpload": "Përzgjidhni për ngarkim një Favikonë",
+ "LogoUploadHelp": "Ju lutemi, ngarkoni një kartelë në formatet %1$s me lartësi minimum prej %2$s piksel.",
"MenuDiagnostic": "Diagnostikim",
"MenuGeneralSettings": "Rregullime të përgjithshme",
- "MenuManage": "Administroni",
+ "MenuSystem": "Sistem",
+ "MenuDevelopment": "Zhvillim",
+ "MenuMeasurables": "Të matshme",
"OptOutComplete": "\"Opt-out\" u plotësua; vizitat tuaja në këtë sajt s’do të regjistrohen nga mjeti Analiza Web.",
"OptOutCompleteBis": "Mbani parasysh që nëse i hiqni cookie-t tuaja, fshini cookie-in për \"opt-out\", ose ndërroni kompjuter apo shfletues Web, do t’ju duhet të kryeni sërish procedurën për \"opt-out\".",
+ "OptOutDntFound": "Nuk po ndiqeni, ngaqë shfletuesi juaj njofton se nuk doni të ndiqeni. Ky është një rregullim te shfletuesi juaj, ndaj s’do të jeni në gjendje të zgjidhni të kundërtën, para se të çaktivizoni veçorinë 'Mos Më Gjurmo'.",
"OptOutExplanation": "Piwik-u është i përkushtuar ndaj mundësimit të privatësisë në Internet. Për t’u dhënë mundësinë e zgjedhjes së \"opt-out\" te Analizat Web Piwik, mund të shtoni kodin HTML vijues te një nga faqet e sajtit tuaj, për shembull te faqja e Rregullave të Privatësisë.",
"OptOutExplanationBis": "Ky kod do të shfaqë një Iframe që përmban një lidhje me të cilën vizitorët të mund të zgjedhin \"opt-out\" për Piwik-un, duke depozituar një \"opt-out cookie\" në shfletuesin e tyre. %1$s Klikoni këtu%2$s që të shihni lëndën që do të shfaqet nga iFrame-i.",
"OptOutForYourVisitors": "\"Opt-out\" i Piwik-ut për vizitorët tuaj",
"PiwikIsInstalledAt": "Piwik-u është instaluar te",
- "TrustedHostConfirm": "Jeni i sigurt se doni të ndryshoni emërstrehën e besuar të Piwik-ut?",
+ "PersonalPluginSettings": "Rregullime Personale për Shtojcën",
+ "PluginSettingChangeNotAllowed": "Nuk keni leje të ndryshoni vlerën e rregullimit \"%1$s\" te shtojca \"%2$s\"",
+ "PluginSettingReadNotAllowed": "Nuk keni leje të lexoni vlerën e rregullimit \"%1$s\" te shtojca \"%2$s\"",
+ "PluginSettings": "Rregullime Shtojce",
+ "PluginSettingsIntro": "Prej këtu mund të ndryshoni rregullimet për shtojcat vijuese nga palë të 3ta:",
+ "PluginSettingsValueNotAllowed": "Vlera për fushën \"%1$s\" te shtojca \"%2$s\" nuk është vlerë e lejuar",
+ "PluginSettingsSaveFailed": "Dështoi ruajtja e rregullimeve të shtojcës",
+ "PluginSettingsSaveSuccess": "Rregullimet e shtojcës u përditësuan.",
+ "SettingsSaveSuccess": "Rregullimet u përditësuan.",
+ "SendPluginUpdateCommunication": "Dërgo një email kur ka gati një përditësim shtojce",
+ "SendPluginUpdateCommunicationHelp": "Superpërdoruesve do t’u dërgohet një email kur për këtë shtojcë të ketë gati një version të ri.",
+ "StableReleases": "Nëse Piwik-u është pjesë kritike e biznesit tuaj, ju këshillojmë të përdorni versionin më të ri të qëndrueshëm. Nëse përdorni versionin më të ri beta dhe gjeni një të metë ose keni një sugjerim, ju lutemi %1$sshihni këtu%2$s.",
+ "LtsReleases": "Versionet LTS (Long Term Support) përmbajnë vetëm ndreqje sigurie dhe të metash.",
+ "SystemPluginSettings": "Rregullime Shtojce Sistemi",
+ "TrackAGoal": "Ndiqni një objektiv",
+ "TrackingCode": "Kod Ndjekjeje",
+ "TrustedHostConfirm": "Jeni i sigurt se doni të ndryshoni strehëemrin e besuar të Piwik-ut?",
"TrustedHostSettings": "Strehëemër e Besuar Piwik",
- "UseCustomLogo": "Përdorni një logo të përshtatur",
+ "UpdateSettings": "Rregullime përditësimesh",
+ "UseCustomLogo": "Përdorni një logo vetjake",
"ValidPiwikHostname": "Strehëemër e Vlefshme Piwik",
+ "WithOptionalRevenue": "me të ardhura opsionale",
"YouAreOptedIn": "Tani jeni nën \"opt-in\"",
"YouAreOptedOut": "Tani jeni nën \"opt-out\"",
"YouMayOptOut": "Mundet edhe të zgjidhni të mos ju përshoqërohet një numër unik identifikimi \"cookie\" analizash web për kompjuterin tuaj, për të shmangur mbledhjen dhe analizimin e të dhënave të mbledhura në këtë sajt.",
- "YouMayOptOutBis": "Për ta bërë këtë zgjedhje, ju lutem klikoni më poshtë që të merrni një \"cookie\" \"opt-out\"."
+ "YouMayOptOutBis": "Për ta bërë këtë zgjedhje, ju lutem klikoni më poshtë që të merrni një \"cookie\" \"opt-out\".",
+ "OptingYouOut": "Po liheni jashtë kësaj, ju lutemi, pritni…",
+ "ProtocolNotDetectedCorrectly": "Jeni duke e parë Piwik-un përmes një lidhjeje të sigurt SSL (po përdorni https), por Piwik-u mund të zbulojë vetëm një lidhje jo të sigurt me shërbyesin.",
+ "ProtocolNotDetectedCorrectlySolution": "Që ta bëni Piwik-un të kërkojë dhe shërbejë lëndën tuaj përmes HTTPS-je, mund të përpunoni kartelën tuaj %1$s dhe ose të formësoni rregullime ndërmjetësi, ose mund të shtoni rreshtin %2$s nën ndarjen %3$s. %4$sMësoni më tepër%5$s"
}
} \ No newline at end of file
diff --git a/plugins/CoreAdminHome/lang/sr.json b/plugins/CoreAdminHome/lang/sr.json
index f5707fff06..c0f58a2b86 100644
--- a/plugins/CoreAdminHome/lang/sr.json
+++ b/plugins/CoreAdminHome/lang/sr.json
@@ -4,6 +4,7 @@
"Administration": "Administracija",
"ArchivingSettings": "Podešavanja arhiviranja",
"BrandingSettings": "Podešavanje brendiranja",
+ "ReleaseChannel": "Kanal realizacije",
"ClickHereToOptIn": "Kliknite za uključenje.",
"ClickHereToOptOut": "Kliknite za izuzeće.",
"CustomLogoFeedbackInfo": "Ako podesite Piwik logo, možda biste bili zainteresovani da sakrijete %1$s link iz glavnog menija. Da to uradite, možete isključiti Feedback plugin iz %2$sOrganizuj Plugin-ove%3$s.",
@@ -23,6 +24,7 @@
"JavaScriptTracking": "Praćenje pomoću JavaScript-a",
"JSTracking_CampaignKwdParam": "Parametar ključne reči kampanje",
"JSTracking_CampaignNameParam": "Parametar naziva kampanje",
+ "JSTracking_CodeNoteBeforeClosingHead": "Postarajte se da se ovaj kod nalazi na svakoj stranici vašeg sajta. Predlažemo da ga ubacite neposredno pre zatvarajućeg %1$s taga.",
"JSTracking_CustomCampaignQueryParam": "Korišćenje korisnički definisanih parametara za nazive i ključne reči kampanje",
"JSTracking_CustomCampaignQueryParamDesc": "%1$sPiwik će automatski prepoznati Google Analytics parametre.%2$s",
"JSTracking_DisableCookies": "Isključi sve kolačiće koji služe za praćenje",
@@ -47,13 +49,15 @@
"JSTrackingIntro5": "Ukoliko želite da pratite više od prikaza stranica, pogledajte %1$sPiwik dokumentaciju za JavaScript praćenje%2$s za sve raspoložive funkcije. Pomoću tih funkcija možete pratiti ciljeve, korisnički definisane promenljive, elektronske porudžbine, napuštene korpe i još puno toga.",
"LogoNotWriteableInstruction": "Ukoliko želite da koristite sopstveni logotip umesto Piwik logotipa, dodelite pravila upisivanja sledećem direktorijumu: %1$s Piwik-u je potrebna dozvola upisivanja za vaše logotipe koji se nalaze u datotekama %2$s.",
"FileUploadDisabled": "Otpremanje datoteka nije omogućeno u podešavanjima za vaš PHP. Da biste otpremili sopstveni logotip, molimo vas da postavite %s u php.ini i restartujete veb server.",
+ "LogoUploadFailed": "Datoteku nije moguće obraditi. Molimo vas da proverite da li je format datoteke validan.",
"LogoUpload": "Izaberite logo za kačenje",
"FaviconUpload": "Izaberite ikonicu koju želite da postavite",
"LogoUploadHelp": "Molimo vas da postavite datoteku u %1$s formatima minimalne visine %2$s piksela.",
"MenuDiagnostic": "Dijagnostika",
"MenuGeneralSettings": "Osnovna podešavanja",
- "MenuManage": "Upravljanje",
+ "MenuSystem": "Sistem",
"MenuDevelopment": "Razvoj",
+ "MenuMeasurables": "Može da se meri",
"OptOutComplete": "Opt-out je kompletiran; vaše posete ovom sajtu neće biti zabeležene od strane alata za web analitiku.",
"OptOutCompleteBis": "Imajte na umu da ako obrišete kolačiće ili promenite računar ili brauzer, da ćete morati ponovo da prođete kroz ovu proceduru.",
"OptOutDntFound": "Vaše akcije se ne beleže pošto vaš brauzer kaže da vi to ne želite. U pitanju je podešavanje u vašem brauzeru tako da nećete moći da se prijavite sve dok ne isključite 'Nemoj da me pratiš' opciju.",
@@ -68,9 +72,12 @@
"PluginSettingsIntro": "Ovde možete promeniti podešavanja sledećih dodataka:",
"PluginSettingsValueNotAllowed": "Vrednost za polje \"%1$s\" u dodatku \"%2$s\" nije dozvoljena",
"PluginSettingsSaveFailed": "Greška prilikom snimanja podešavanja dodataka",
+ "PluginSettingsSaveSuccess": "Podešavanja dodatka su ažurirana.",
+ "SettingsSaveSuccess": "Podešavanja su ažurirana.",
"SendPluginUpdateCommunication": "Pošalji mejl svaki put kada se pojavi nova verzija dodatka",
"SendPluginUpdateCommunicationHelp": "Mejl će biti poslat superkorisnicima kad god se pojavi nova verzija ovog dodatka.",
"StableReleases": "Ukoliko Piwik čini kritičan deo vašeg poslovanja, preporučujemo vam da koristite poslednju stabilnu verziju. Ukoliko koristite poslednju beta verziju i nađete bag ili imate predlog, molimo vas %1$spogledajte ovde%2$s.",
+ "LtsReleases": "LTS (dugoročno podržane) verzije primaju samo sigurnosne i ispravke bagova.",
"SystemPluginSettings": "Sistemska podešavanja dodataka",
"TrackAGoal": "Praćenje cilja",
"TrackingCode": "Kod za praćenje",
@@ -84,6 +91,8 @@
"YouAreOptedOut": "Trenutno ste izuzeti iz statistike.",
"YouMayOptOut": "Možete da izaberete da nemate jedinstven identifikacioni broj vezan za vaš računar.",
"YouMayOptOutBis": "Ukoliko želite tako, molimo vas da kliknete ispod kako biste primili opt-out kolačić.",
- "OptingYouOut": "Prijavljivanje, molimo vas sačekajte..."
+ "OptingYouOut": "Prijavljivanje, molimo vas sačekajte...",
+ "ProtocolNotDetectedCorrectly": "Trenutno pristupate Piwik-u preko bezbedne SSL konekcije (korišćenjem HTTPS-a) ali Piwik detektuje samo nebezbednu konekciju sa serverom.",
+ "ProtocolNotDetectedCorrectlySolution": "Da biste bili sigurni da Piwik na bezbedan način zahteva i opslužuje sadržaje preko HTTPS-a, možete da izmenite datoteku %1$s i onda u njoj ili da podesite proksi server ili da dodate liniju %2$s u okviru sekcije %3$s. %4$sPročitajte više%5$s"
}
} \ No newline at end of file
diff --git a/plugins/CoreAdminHome/lang/sv.json b/plugins/CoreAdminHome/lang/sv.json
index 9d70b5bfc4..df7657baaf 100644
--- a/plugins/CoreAdminHome/lang/sv.json
+++ b/plugins/CoreAdminHome/lang/sv.json
@@ -55,7 +55,6 @@
"LogoUploadHelp": "Ladda upp en fil i %1$s format med en minsta höjd på %2$s pixlar.",
"MenuDiagnostic": "Diagnostik",
"MenuGeneralSettings": "Allmänna inställningar",
- "MenuManage": "Hantera",
"MenuDevelopment": "Utveckling",
"OptOutComplete": "Exkludering utförd; dina besök på denna webbplatsen kommer inte att spåras av webbanalys-verktyget.",
"OptOutCompleteBis": "Observera att om du rensar cookies, tar bort cookien för exkludering eller om du byter dator eller webbläsare måste du utföra exkluderingen igen.",
diff --git a/plugins/CoreAdminHome/lang/ta.json b/plugins/CoreAdminHome/lang/ta.json
index 613a8d72d0..08ae64b1f2 100644
--- a/plugins/CoreAdminHome/lang/ta.json
+++ b/plugins/CoreAdminHome/lang/ta.json
@@ -26,7 +26,6 @@
"LogoUpload": "முத்திரையை தேர்வு செய்க",
"MenuDiagnostic": "ஆய்ந்தறிதல்",
"MenuGeneralSettings": "பொது அமைப்புகள்",
- "MenuManage": "மேலாண்மை",
"OptOutComplete": "விலகுதல் முழுமையடைந்தது; இந்த வலைத்தளத்தில் உங்களது வருகைகள் இணைய பகுப்பாய்வு கருவி மூலம் பதிவு செய்யப்பட மாட்டாது.",
"OptOutForYourVisitors": "பிவிக் உங்கள் வருகையாளர்களை தவிர்க்க",
"PiwikIsInstalledAt": "பிவிக் நிறுவப்பட்ட இடம்",
diff --git a/plugins/CoreAdminHome/lang/th.json b/plugins/CoreAdminHome/lang/th.json
index 101d044d4a..a07f648efb 100644
--- a/plugins/CoreAdminHome/lang/th.json
+++ b/plugins/CoreAdminHome/lang/th.json
@@ -4,7 +4,6 @@
"EmailServerSettings": "การตั้งค่าเซิร์ฟเวอร์อีเมล์",
"LogoUpload": "เลือกรูปโลโก้ที่ต้องการอัพโหลด",
"MenuGeneralSettings": "ตั้งค่าทั่วไป",
- "MenuManage": "จัดการ",
"OptOutComplete": "เลือกที่จะไม่ครบถ้วนเมื่อคุณเยี่ยมชมเว็บไซต์นี้จะไม่ถูกบันทึกโดยเครื่องมือวิเคราะห์เว็บ",
"OptOutCompleteBis": "โปรดทราบว่า หากคุณลบคุกกี้ของคุณให้ลบคุกกี้ไม่เข้าร่วมหรือถ้าคุณเปลี่ยนเครื่องคอมพิวเตอร์หรือเว็บเบราเซอร์คุณ จะต้องดำเนินการขั้นตอนการยกเลิกการเลือกอีกครั้ง",
"OptOutExplanation": "Piwik มีความมุ่งมั่นที่จะให้ความเป็นส่วนตัวบนอินเทอร์เน็ต เพื่อให้ผู้เข้าชมให้กับทางเลือกของการเลือกออกของ Piwik วิเคราะห์เว็บคุณสามารถเพิ่มรหัส HTML ต่อไปนี้บนหน้าหนึ่งของเว็บไซต์ของคุณ ตัวอย่างเช่น ในหน้านโยบายความเป็นส่วนตัว",
diff --git a/plugins/CoreAdminHome/lang/tl.json b/plugins/CoreAdminHome/lang/tl.json
index 826f66be46..7c72ff7e86 100644
--- a/plugins/CoreAdminHome/lang/tl.json
+++ b/plugins/CoreAdminHome/lang/tl.json
@@ -49,7 +49,6 @@
"LogoUploadHelp": "Mangyaring mag-upload ng isang file sa format na %1$s na may pinakamababang taas na %2$s na pixel.",
"MenuDiagnostic": "Dyagnostiko",
"MenuGeneralSettings": "Pangkalahatang mga setting",
- "MenuManage": "Pamahalaan",
"MenuDevelopment": "Pag-unlad",
"OptOutComplete": "Ang pag-opt-out ay kumpleto na; ang iyong mga pagbisita sa website na ito ay hindi maitatala sa Web Analytics na tool.",
"OptOutCompleteBis": "Tandaan na kung tinanggal mo ang iyong cookies, burahin ang opt-out cookie, o kapag nagbago ka ng computer o Web browser, kailangan mong isagawang muli ang opt-out cookie",
diff --git a/plugins/CoreAdminHome/lang/tr.json b/plugins/CoreAdminHome/lang/tr.json
index d811a2a762..72f318fd41 100644
--- a/plugins/CoreAdminHome/lang/tr.json
+++ b/plugins/CoreAdminHome/lang/tr.json
@@ -45,7 +45,6 @@
"LogoUploadHelp": "Lütfen %1$s formatlarında ve minimum %2$s piksel yüksekliğinde bir dosya yükleyin.",
"MenuDiagnostic": "tehşis",
"MenuGeneralSettings": "Genel Ayarlar",
- "MenuManage": "yönetmek",
"MenuDevelopment": "Geliştirme",
"OptOutComplete": "İzleme durumunuz pasif edildi, artık sizin ziyaretleriniz kayıt altına alınmayacak.",
"OptOutExplanation": "Bu yazılım kendini internette gizlilik sağlamaya adamıştır. Ekteki html kodunu sitenize ekleyerek ziyaretçilerinize izlenmeme (opsiyonel olarak) seçeneği sunabilirsiniz. Örnek olarak bunu Gizlilik Politikanız sayfasında sunabilirsiniz.",
diff --git a/plugins/CoreAdminHome/lang/uk.json b/plugins/CoreAdminHome/lang/uk.json
index df0b5a552f..994366cb89 100644
--- a/plugins/CoreAdminHome/lang/uk.json
+++ b/plugins/CoreAdminHome/lang/uk.json
@@ -55,7 +55,6 @@
"LogoUploadHelp": "Будь ласка, закачуйте файли в %1$s форматах, мінімальне обмеження по висоті – %2$s пікселів.",
"MenuDiagnostic": "Діагностика",
"MenuGeneralSettings": "Основні налаштування",
- "MenuManage": "Управління",
"MenuDevelopment": "Розробка",
"OptOutComplete": "Виняток з політики конфіденційності завершено; ваші відвідування на даний сайт не враховуватимуться системою веб аналітики. Ми поважаємо ваш вибір.",
"OptOutCompleteBis": "Зауважте, що якщо ви очистите cookies браузера, то, швидше за все, видалитсья і винятковий cookie, або якщо ви поміняєте комп'ютер або браузер, то необхідно буде пройти процедуру виключення знову.",
diff --git a/plugins/CoreAdminHome/lang/vi.json b/plugins/CoreAdminHome/lang/vi.json
index f3b13f92fd..d49b0816a6 100644
--- a/plugins/CoreAdminHome/lang/vi.json
+++ b/plugins/CoreAdminHome/lang/vi.json
@@ -46,7 +46,6 @@
"LogoUploadHelp": "Xin vui lòng tải lên file dưới định dạng %1$s với chiều cao tối thiểu là %2$s pixels",
"MenuDiagnostic": "chẩn đoán",
"MenuGeneralSettings": "cài đặt chung",
- "MenuManage": "Quản lý",
"OptOutComplete": "Việc không tham gia hoàn tất; Việc thăm trang web này của bạn sẽ không được ghi lại bởi các công cụ Web Analytics.",
"OptOutCompleteBis": "Ghi nhớ rằng nếu bạn xóa cookies hoặc xóa cookie opt-out (quảng cáo, spam), hay nếu bạn tùy chỉnh máy tính hoặc trình duyệt của bạn, bạn sẽ phải tiến hành các thao tác opt-out (chặn spam, quảng cáo) lại một lần nữa.",
"OptOutExplanation": "Piwik được sử dụng để cung cấp quyền riêng tư trên Internet. Để cung cấp cho những khách ghé thăm trang web của bạn các lựa chọn chặn Piwik Web Analytics, bạn có thể thêm vào mã HTML sau trên trang web của bạn, ví dụ tùy chỉnh trong trang Quyền Riêng tư.",
diff --git a/plugins/CoreAdminHome/lang/zh-cn.json b/plugins/CoreAdminHome/lang/zh-cn.json
index e2c1b19591..e1352766e9 100644
--- a/plugins/CoreAdminHome/lang/zh-cn.json
+++ b/plugins/CoreAdminHome/lang/zh-cn.json
@@ -55,7 +55,6 @@
"LogoUploadHelp": "请上传 %1$s 格式的文件,最小高度 %2$s 点。",
"MenuDiagnostic": "检测",
"MenuGeneralSettings": "一般设置",
- "MenuManage": "管理",
"MenuDevelopment": "展开",
"OptOutComplete": "主动退出 成功; 网站分析工具将不会统计您对这个网站的访问。",
"OptOutCompleteBis": "如果您清空了cookies、删除了主动退出cookie、或者更换了电脑或者浏览器,您需要重新执行主动退出的操作。",
diff --git a/plugins/CoreAdminHome/lang/zh-tw.json b/plugins/CoreAdminHome/lang/zh-tw.json
index ed8f285f51..f143189c72 100644
--- a/plugins/CoreAdminHome/lang/zh-tw.json
+++ b/plugins/CoreAdminHome/lang/zh-tw.json
@@ -4,7 +4,6 @@
"EmailServerSettings": "設定郵件伺服器",
"JavaScriptTracking": "JS追蹤程式碼",
"MenuDiagnostic": "診斷",
- "MenuGeneralSettings": "一般設定",
- "MenuManage": "管理"
+ "MenuGeneralSettings": "一般設定"
}
} \ No newline at end of file
diff --git a/plugins/CoreAdminHome/templates/home.twig b/plugins/CoreAdminHome/templates/home.twig
index 4a56027e2c..b090ae0465 100644
--- a/plugins/CoreAdminHome/templates/home.twig
+++ b/plugins/CoreAdminHome/templates/home.twig
@@ -19,14 +19,10 @@
{% if isSuperUser %}
<div class="row">
<div class="col s12 {% if isFeedbackEnabled %}m4{% else %}m6{% endif %}">
- <div piwik-content-block content-title="{{ 'CoreHome_SystemSummaryWidget'|translate }}">
- <div piwik-widget-loader='{"module":"CoreHome","action":"getSystemSummary"}'></div>
- </div>
+ <div piwik-widget-loader='{"module":"CoreHome","action":"getSystemSummary"}'></div>
</div>
<div class="col s12 {% if isFeedbackEnabled %}m4{% else %}m6{% endif %}">
- <div piwik-content-block content-title="{{ 'Installation_SystemCheck'|translate }}">
- <div piwik-widget-loader='{"module":"Installation","action":"getSystemCheck"}'></div>
- </div>
+ <div piwik-widget-loader='{"module":"Installation","action":"getSystemCheck"}'></div>
</div>
{% if isFeedbackEnabled %}
<div class="col s12 m4">
@@ -39,9 +35,7 @@
{% endif %}
{% if isMarketplaceEnabled %}
- <div piwik-content-block content-title="Latest Marketplace Updates">
- <div piwik-widget-loader='{"module":"CorePluginsAdmin","action":"getNewPlugins", "isAdminPage": "1"}'></div>
- </div>
+ <div piwik-widget-loader='{"module":"CorePluginsAdmin","action":"getNewPlugins", "isAdminPage": "1"}'></div>
{% endif %}
{{ postEvent('Template.adminHome') }}
@@ -61,16 +55,12 @@
<div class="row">
{% if hasDonateForm %}
<div class="col s12 {% if hasPiwikBlog %}m6{% endif %}">
- <div piwik-content-block content-title="{{ 'CoreHome_SupportPiwik'|translate }}">
- <div piwik-widget-loader='{"module":"CoreHome","action":"getDonateForm","widget": "0"}'></div>
- </div>
+ <div piwik-widget-loader='{"module":"CoreHome","action":"getDonateForm","widget": "0"}'></div>
</div>
{% endif %}
{% if hasPiwikBlog %}
<div class="col s12 {% if hasDonateForm %}m6{% endif %}">
- <div piwik-content-block content-title="Piwik.org Blog">
- <div piwik-widget-loader='{"module":"RssWidget","action":"rssPiwik"}'></div>
- </div>
+ <div piwik-widget-loader='{"module":"RssWidget","action":"rssPiwik"}'></div>
</div>
{% endif %}
</div>
diff --git a/plugins/CoreHome/Controller.php b/plugins/CoreHome/Controller.php
index 4cd94020ab..9a554fb2b8 100644
--- a/plugins/CoreHome/Controller.php
+++ b/plugins/CoreHome/Controller.php
@@ -11,7 +11,6 @@ namespace Piwik\Plugins\CoreHome;
use Exception;
use Piwik\API\Request;
use Piwik\Common;
-use Piwik\DataTable\Renderer\Json;
use Piwik\Date;
use Piwik\FrontController;
use Piwik\Notification\Manager as NotificationManager;
@@ -29,6 +28,7 @@ use Piwik\UpdateCheck;
use Piwik\Url;
use Piwik\View;
use Piwik\ViewDataTable\Manager as ViewDataTableManager;
+use Piwik\Widget\WidgetConfig;
class Controller extends \Piwik\Plugin\Controller
{
@@ -86,7 +86,33 @@ class Controller extends \Piwik\Plugin\Controller
{
Piwik::checkUserHasSomeViewAccess();
- return $widget->render();
+ $config = new WidgetConfig();
+ $widget::configure($config);
+
+ $content = $widget->render();
+
+ if ($config->getName() && Common::getRequestVar('showtitle', '', 'string') === '1') {
+ if (strpos($content, '<h2') !== false
+ || strpos($content, ' content-title=') !== false
+ || strpos($content, ' piwik-enriched-headline') !== false
+ || strpos($content, '<h1') !== false ) {
+ // already includes title
+ return $content;
+ }
+
+ if (strpos($content, 'piwik-content-block') === false
+ && strpos($content, 'class="card"') === false
+ && strpos($content, "class='card'") === false
+ && strpos($content, 'class="card-content"') === false
+ && strpos($content, "class='card-content'") === false) {
+ $view = new View('@CoreHome/_singleWidget');
+ $view->title = $config->getName();
+ $view->content = $content;
+ return $view->render();
+ }
+ }
+
+ return $content;
}
function redirectToCoreHomeIndex()
diff --git a/plugins/CoreHome/CoreHome.php b/plugins/CoreHome/CoreHome.php
index e7d8c52185..4c5abc8071 100644
--- a/plugins/CoreHome/CoreHome.php
+++ b/plugins/CoreHome/CoreHome.php
@@ -257,6 +257,7 @@ class CoreHome extends \Piwik\Plugin
$translationKeys[] = 'Intl_Year_Short';
$translationKeys[] = 'General_MultiSitesSummary';
$translationKeys[] = 'General_SearchNoResults';
+ $translationKeys[] = 'CoreHome_ChooseX';
$translationKeys[] = 'CoreHome_YouAreUsingTheLatestVersion';
$translationKeys[] = 'CoreHome_IncludeRowsWithLowPopulation';
$translationKeys[] = 'CoreHome_ExcludeRowsWithLowPopulation';
diff --git a/plugins/CoreHome/angularjs/content-block/content-block.directive.js b/plugins/CoreHome/angularjs/content-block/content-block.directive.js
index ab4f2e5082..852e74015d 100644
--- a/plugins/CoreHome/angularjs/content-block/content-block.directive.js
+++ b/plugins/CoreHome/angularjs/content-block/content-block.directive.js
@@ -16,7 +16,7 @@
function piwikContentBlock(piwik){
- var contentTopPosition = null;
+ var adminContent = null;
return {
restrict: 'A',
@@ -47,24 +47,33 @@
scope.feature = scope.contentTitle;
}
- if (contentTopPosition !== false) {
- if (contentTopPosition === null) {
- var $content = $('#content.admin');
- if ($content.size()) {
- // cache top position for further content blocks
- contentTopPosition = $content.offset().top;
- } else {
- contentTopPosition = false;
- }
+ if (adminContent === null) {
+ // cache admin node for further content blocks
+ adminContent = $('#content.admin');
+ }
+
+ var contentTopPosition = false;
+
+ if (adminContent.size()) {
+ contentTopPosition = adminContent.offset().top;
+ }
+
+ if (contentTopPosition || contentTopPosition === 0) {
+ var parents = element.parentsUntil('.col', '[piwik-widget-loader]');
+ var topThis;
+ if (parents.size()) {
+ // when shown within the widget loader, we need to get the offset of that element
+ // as the widget loader might be still shown. Would otherwise not position correctly
+ // the widgets on the admin home page
+ topThis = parents.offset().top;
+ } else {
+ topThis = element.offset().top;
}
- if (contentTopPosition || contentTopPosition === 0) {
- var topThis = element.offset().top;
- if ((topThis - contentTopPosition) < 17) {
- // we make sure to display the first card with no margin-top to have it on same as line as
- // navigation
- element.css('marginTop', '0');
- }
+ if ((topThis - contentTopPosition) < 17) {
+ // we make sure to display the first card with no margin-top to have it on same as line as
+ // navigation
+ element.css('marginTop', '0');
}
}
diff --git a/plugins/CoreHome/angularjs/reporting-menu/reportingmenu-model.js b/plugins/CoreHome/angularjs/reporting-menu/reportingmenu-model.js
index 83a714ceb7..ca26581da0 100644
--- a/plugins/CoreHome/angularjs/reporting-menu/reportingmenu-model.js
+++ b/plugins/CoreHome/angularjs/reporting-menu/reportingmenu-model.js
@@ -82,7 +82,7 @@
category.subcategories = [];
- var goalsGroup = false;
+ var categoryGroups = false;
angular.forEach(pages, function (page, key) {
if (page.category.id === categoryId) {
@@ -92,25 +92,25 @@
subcategory.active = true;
}
- if (page.widgets && page.widgets[0] && page.category.id === 'Goals_Goals' && isNumeric(page.subcategory.id)) {
+ if (page.widgets && page.widgets[0] && isNumeric(page.subcategory.id)) {
// we handle a goal
- if (!goalsGroup) {
- goalsGroup = angular.copy(subcategory);
- goalsGroup.name = $filter('translate')('Goals_ChooseGoal');
- goalsGroup.isGroup = true;
- goalsGroup.subcategories = [];
- goalsGroup.order = 10;
+ if (!categoryGroups) {
+ categoryGroups = angular.copy(subcategory);
+ categoryGroups.name = $filter('translate')('CoreHome_ChooseX', [category.name]);
+ categoryGroups.isGroup = true;
+ categoryGroups.subcategories = [];
+ categoryGroups.order = 10;
}
if (subcategory.active) {
- goalsGroup.name = subcategory.name;
- goalsGroup.active = true;
+ categoryGroups.name = subcategory.name;
+ categoryGroups.active = true;
}
var goalId = page.subcategory.id;
subcategory.tooltip = subcategory.name + ' (id = ' + goalId + ' )';
- goalsGroup.subcategories.push(subcategory);
+ categoryGroups.subcategories.push(subcategory);
return;
}
@@ -118,12 +118,12 @@
}
});
- if (goalsGroup && goalsGroup.subcategories && goalsGroup.subcategories.length <= 3) {
- angular.forEach(goalsGroup.subcategories, function (subcategory) {
+ if (categoryGroups && categoryGroups.subcategories && categoryGroups.subcategories.length <= 5) {
+ angular.forEach(categoryGroups.subcategories, function (subcategory) {
category.subcategories.push(subcategory);
});
- } else if(goalsGroup) {
- category.subcategories.push(goalsGroup);
+ } else if(categoryGroups) {
+ category.subcategories.push(categoryGroups);
}
category.subcategories = sortMenuItems(category.subcategories);
diff --git a/plugins/CoreHome/angularjs/reporting-page/reportingpage-model.js b/plugins/CoreHome/angularjs/reporting-page/reportingpage-model.js
index 9683228b4f..132233c069 100644
--- a/plugins/CoreHome/angularjs/reporting-page/reportingpage-model.js
+++ b/plugins/CoreHome/angularjs/reporting-page/reportingpage-model.js
@@ -47,7 +47,11 @@
return true;
}
- return widget.viewDataTable && widget.viewDataTable === 'tableAllColumns';
+ if ('undefined' !== typeof widget.isWide && widget.isWide) {
+ return true;
+ }
+
+ return widget.viewDataTable && (widget.viewDataTable === 'tableAllColumns' || widget.viewDataTable === 'sparklines' || widget.viewDataTable === 'graphEvolution');
}
function buildPage(page)
@@ -69,13 +73,7 @@
reportsToIgnore = reportsToIgnore.concat(getRelatedReports(widget));
- if (widget.viewDataTable && widget.viewDataTable === 'graphEvolution') {
- evolutionReports.push(widget);
- } else if (widget.viewDataTable && widget.viewDataTable === 'sparklines') {
- sparklineReports.push(widget);
- } else {
- widgets.push(widget);
- }
+ widgets.push(widget);
});
widgets = sortWidgets(widgets);
diff --git a/plugins/CoreHome/angularjs/reporting-page/reportingpage.directive.html b/plugins/CoreHome/angularjs/reporting-page/reportingpage.directive.html
index 85739f4c45..0273a78a16 100644
--- a/plugins/CoreHome/angularjs/reporting-page/reportingpage.directive.html
+++ b/plugins/CoreHome/angularjs/reporting-page/reportingpage.directive.html
@@ -4,14 +4,6 @@
<div ng-show="hasNoPage">{{ 'CoreHome_NoSuchPage'|translate }}</div>
- <div class="row" ng-repeat="evolutionReport in pageModel.evolutionReports">
- <div class="col s12 fullWidgetColumn" piwik-widget="evolutionReport"></div>
- </div>
-
- <div class="row" ng-repeat="sparklineReport in pageModel.sparklineReports">
- <div class="col s12 fullWidgetColumn" piwik-widget="sparklineReport"></div>
- </div>
-
<div class="row" ng-repeat="widget in pageModel.widgets">
<div class="col s12 fullWidgetColumn" ng-if="!widget.group" piwik-widget="widget"></div>
diff --git a/plugins/CoreHome/angularjs/widget-bydimension-container/widget-bydimension-container.directive.less b/plugins/CoreHome/angularjs/widget-bydimension-container/widget-bydimension-container.directive.less
index c665289d52..698d2ca5ea 100644
--- a/plugins/CoreHome/angularjs/widget-bydimension-container/widget-bydimension-container.directive.less
+++ b/plugins/CoreHome/angularjs/widget-bydimension-container/widget-bydimension-container.directive.less
@@ -13,52 +13,52 @@
max-width: 380px;
}
}
+}
- .entityList {
+.entityList {
- ul {
- li {
- margin: 4px 0;
- padding: 0 0 0 16px;
- line-height: 22px;
- border-left: 2px solid @theme-color-background-base;
+ ul {
+ li {
+ margin: 4px 0;
+ padding: 0 0 0 16px;
+ line-height: 22px;
+ border-left: 2px solid @theme-color-background-base;
- :hover {
- opacity: 0.8;
- }
- &:hover:not(.activeDimension) {
- border-color: @theme-color-header-background;
- border-left-width: 1px;
- padding-left: 17px;
- }
-
- &.activeDimension {
- border-color: @theme-color-header-background;
+ :hover {
+ opacity: 0.8;
+ }
+ &:hover:not(.activeDimension) {
+ border-color: @theme-color-header-background;
+ border-left-width: 1px;
+ padding-left: 17px;
+ }
- .dimension {
- font-weight: bold;
- }
- }
+ &.activeDimension {
+ border-color: @theme-color-header-background;
.dimension {
- cursor: pointer;
- border-bottom: 1px solid #d0d0d0;
- color: @theme-color-text-contrast;
- border: 0;
+ font-weight: bold;
}
}
- &.listCircle {
- font-weight: normal;
- list-style: none;
- padding: 4px 0;
- margin-top: 8px;
- }
- &.listCircle li a {
- color: #000;
+ .dimension {
+ cursor: pointer;
+ border-bottom: 1px solid #d0d0d0;
+ color: @theme-color-text-contrast;
+ border: 0;
}
+ }
+ &.listCircle {
+ font-weight: normal;
+ list-style: none;
+ padding: 4px 0;
+ margin-top: 8px;
+ }
+ &.listCircle li a {
+ color: #000;
}
}
+
} \ No newline at end of file
diff --git a/plugins/CoreHome/javascripts/broadcast.js b/plugins/CoreHome/javascripts/broadcast.js
index 9034c9eef5..3ec2a0821d 100644
--- a/plugins/CoreHome/javascripts/broadcast.js
+++ b/plugins/CoreHome/javascripts/broadcast.js
@@ -315,6 +315,15 @@ var broadcast = {
}
}
+ var updatedUrl = new RegExp('&updated=([0-9]+)');
+ var updatedCounter = updatedUrl.exec(currentSearchStr);
+ if (!updatedCounter) {
+ currentSearchStr += '&updated=1';
+ } else {
+ updatedCounter = 1 + parseInt(updatedCounter[1]);
+ currentSearchStr = currentSearchStr.replace(new RegExp('(&updated=[0-9]+)'), '&updated=' + updatedCounter);
+ }
+
if (strHash && currentHashStr.length != 0) {
var params_hash_vals = strHash.split("&");
for (var i = 0; i < params_hash_vals.length; i++) {
diff --git a/plugins/CoreHome/javascripts/dataTable.js b/plugins/CoreHome/javascripts/dataTable.js
index 3cdc9e709d..e364251f9b 100644
--- a/plugins/CoreHome/javascripts/dataTable.js
+++ b/plugins/CoreHome/javascripts/dataTable.js
@@ -1742,6 +1742,35 @@ $.extend(DataTable.prototype, UIControl.prototype, {
// 'this' report must be hidden in datatable output
thisReport = $('.datatableRelatedReports span:hidden', domElem)[0];
+ function replaceReportTitleAndHelp(domElem, relatedReportName) {
+ if (!domElem || !domElem.length) {
+ return;
+ }
+
+ var $headline = domElem.prev('h2');
+ if (!$headline.size()) {
+ return;
+ }
+
+ var $title = $headline.find('.title:not(.ng-hide)');
+ if ($title.size()) {
+ $title.text(relatedReportName);
+
+ var scope = $title.scope();
+
+ if (scope) {
+ var $doc = domElem.find('.reportDocumentation');
+ if ($doc.size()) {
+ scope.inlineHelp = $.trim($doc.html());
+ }
+ scope.featureName = $.trim(relatedReportName);
+ setTimeout(function (){
+ scope.$apply();
+ }, 1);
+ }
+ }
+ }
+
hideShowRelatedReports(thisReport);
var relatedReports = $('.datatableRelatedReports span', domElem);
@@ -1753,22 +1782,8 @@ $.extend(DataTable.prototype, UIControl.prototype, {
relatedReports.each(function () {
var clicked = this;
$(this).unbind('click').click(function (e) {
- var url = $(this).attr('href');
-
- // if this url is also the url of a menu item, better to click that menu item instead of
- // doing AJAX request
- var menuItem = null;
- $("#root").find(">.nav a").each(function () {
- if ($(this).attr('href') == url) {
- menuItem = this;
- return false
- }
- });
-
- if (menuItem) {
- $(menuItem).click();
- return;
- }
+ var $this = $(this);
+ var url = $this.attr('href');
// modify parameters
self.resetAllFilters();
@@ -1781,11 +1796,17 @@ $.extend(DataTable.prototype, UIControl.prototype, {
delete self.param.pivotBy;
delete self.param.pivotByColumn;
+ var relatedReportName = $this.text();
+
// do ajax request
- self.reloadAjaxDataTable(true, function (newReport) {
- var newDomElem = self.dataTableLoaded(newReport, self.workingDivId);
- hideShowRelatedReports(clicked);
- });
+ self.reloadAjaxDataTable(true, (function (relatedReportName) {
+
+ return function (newReport) {
+ var newDomElem = self.dataTableLoaded(newReport, self.workingDivId);
+ hideShowRelatedReports(clicked);
+ replaceReportTitleAndHelp(newDomElem, relatedReportName);
+ }
+ })(relatedReportName));
});
});
},
diff --git a/plugins/CoreHome/lang/ar.json b/plugins/CoreHome/lang/ar.json
index 5e2c16522a..36ac2bff0e 100644
--- a/plugins/CoreHome/lang/ar.json
+++ b/plugins/CoreHome/lang/ar.json
@@ -1,13 +1,16 @@
{
"CoreHome": {
"CategoryNoData": "لا توجد بيانات في هذه الفئة. حاول أن \"تضمن كافة الكثافات\".",
+ "ChangeVisualization": "تغيير العرض",
"CheckForUpdates": "بحث عن تحديثات",
"CheckPiwikOut": "تفحص بايويك!",
"ClickToEditX": "إضغط لتحرير %s",
+ "CloseSearch": "إغلاق البحث",
"CloseWidgetDirections": "يمكنك إغلاق عنصر الواجهة هذا بالضغط على علامة 'X' أعلى العنصر.",
"DataForThisReportHasBeenPurged": "بيانات هذا التقرير أقدم من %s شهور وتم التخلص منها.",
"DataTableExcludeAggregateRows": "صفوف الإجمالي معروضة، %s اخفها",
"DataTableIncludeAggregateRows": "الصفوف المجمَّعة مخفيَّة %s إعرضها",
+ "DataTableHowToSearch": "إضغط إدخال أو اضغط على رمز البحث لتبحث",
"Default": "الافتراضي",
"DonateCall1": "لن يكلفك بايويك قرشاً في استخدامه أبداً، ولكن ذلك لا يعني أنه لا يكلفنا شيئاً في تطويره.",
"DonateCall2": "يحتاج بايويك إلى دعمك المستمر لينمو ويزدهر.",
@@ -25,10 +28,11 @@
"InjectedHostWarningIntro": "أنت الآن تصل إلى Piwik من %1$s ، إلا أن Piwik قد تم إعداده للعمل على هذا العنوان : %2$s .",
"JavascriptDisabled": "يجب تفعيل برمجيات جافا في سبيل استخدام Piwik في الوضع القياسي.<br\/> ومع ذلك، يبدو أن برمجيات جافا إما معطلة أو غير مدعمة في متصفح ويب الخاص بك.<br\/>لاستخدام العرض القياسي، قم بتفعيل JavaScript من خلال تغيير إعدادات متصفحك، ثم %1$sحاول مرة أخرى%2$s.<br\/>",
"MainNavigation": "التصفح الرئيس",
- "MakeADifference": "اصنع فرقاً: %1$sتبرع الآن%2$s لتمويل بايويك 2.0!",
+ "MakeADifference": "اصنع فرقاً: %1$sتبرع الآن%2$s لتمويل بايويك 3.0!",
"MakeOneTimeDonation": "بديلاً عن ذلك، قم بالتبرع مرة واحدة",
"Menu": "القائمة",
"NoPrivilegesAskPiwikAdmin": "لقد سجلت الدخول بصفتك '%1$s' ولكن يبدو أنه لا توجد أي صلاحيات لك في Piwik. %2$s اسأل مدير Piwik (انقر لمراسلته)%3$s gلمنحك صلاحيات \"المشاهدة\" لموقع ما.",
+ "OnlyForSuperUserAccess": "عنصر الواجهة هذا يُعرَض للمستخدمين من فئة المستخدم الفائق فقط.",
"PageOf": "%1$s من %2$s",
"PeriodRange": "نطاق",
"ReportGeneratedOn": "تم إنشاء التقرير في %s",
@@ -48,7 +52,15 @@
"YouAreUsingTheLatestVersion": "أنت الآن تستخدم احدث إصدار من Piwik!",
"ClickRowToExpandOrContract": "إضغط هذا الصف لتوسيع أو طيّ الجدول الفرعي.",
"UndoPivotBySubtable": "حصل تمركُز لهذا التقرير %s تراجع عن التمركز",
+ "NoSuchPage": "هذه الصفحة غير موجودة",
"PivotBySubtable": "هذا التقرير ليس متمركزاً %1$s ، إجعله متمركزاً على %2$s",
+ "SystemSummaryWidget": "ملخص النظام",
+ "SystemSummaryNWebsites": "%d مواقع ويب",
+ "SystemSummaryNSegments": "%d قطاعات",
+ "SystemSummaryNActivatedPlugins": "%d الإضافات المفعّلة",
+ "SystemSummaryPiwikVersion": "نسخة Piwik",
+ "SystemSummaryMysqlVersion": "نسخة MySQL",
+ "SystemSummaryPhpVersion": "نسخة PHP",
"QuickAccessTitle": "إبحث عن %s . استخدم مفاتيح الأسهم لتصفح نتائج البحث. اختصار: إضغط 'f' للبحث.",
"MenuEntries": "بنود (مدخلات) القائمة",
"Segments": "فئات",
diff --git a/plugins/CoreHome/lang/bg.json b/plugins/CoreHome/lang/bg.json
index c68267fab1..e6d4681d4d 100644
--- a/plugins/CoreHome/lang/bg.json
+++ b/plugins/CoreHome/lang/bg.json
@@ -23,7 +23,6 @@
"InjectedHostSuperUserWarning": "Възможно е конфигурацията на Piwik да е неправилна (това се случва когато Piwik е бил изместен на нов сървър или друг адрес). Вие можете или %1$sда щракнете тук и да добавите %2$s като валиден Piwik адрес (ако сте сигурни в достоверността му)%3$s, или %4$sда щракнете тук и да посетите %5$s, за да достъпите Piwik безпасно%6$s.",
"InjectedHostWarningIntro": "В момента достъпвате Piwik от %1$s, но Piwik е настроен да работи чрез този адрес: %2$s.",
"JavascriptDisabled": "JavaScript трябва да бъде разрешен за да използвате Piwik в стандартен изглед.<br \/>Същото е ако JavaScript не е разрешен или браузъра не го поддържа.<br \/>За да използвате стандартен изглед разрешете JavaScript от настройките на Вашия браузър и %1$sопитайте отново%2$s.<br \/>",
- "MakeADifference": "Открийте разликата: %1$sДарете%2$s за фонд Piwik 2.0!",
"MakeOneTimeDonation": "Направете еднократно дарение",
"Menu": "Меню",
"NoPrivilegesAskPiwikAdmin": "Вие се логнахте в като '%1$s' но изглежда че нямате разрешение от Piwik. %2$s Попитайте Вашият Piwik администратор (клик на email)%3$s да Ви даде \"поглед\" достъп до сайта.",
diff --git a/plugins/CoreHome/lang/ca.json b/plugins/CoreHome/lang/ca.json
index 9aab453c1e..59e9fed42e 100644
--- a/plugins/CoreHome/lang/ca.json
+++ b/plugins/CoreHome/lang/ca.json
@@ -15,7 +15,6 @@
"InjectedHostSuperUserWarning": "Pot ser que el Piwik estigui mal configurat (per exemple, si el Piwik s'ha mogut a un nou servidor o URL). Podeu %1$sfer click aquí i afegir %2$s com el nom de la màquina vàlid (si hi confieu)%3$s, o bé %4$s fer click aquí %5$s per accedir al piwik de forma segura%6$s.",
"InjectedHostWarningIntro": "Esteu accedint al Piwik desde %1$s, però el Piwik està configurat per escoltar a l'adreça: %2$s.",
"JavascriptDisabled": "S'ha de tenir el Javascript activat per vistualitzar la vista estàndar del Piwik.<br\/> No obstant això, sembla que el Javascript esta deshabilitat or no està suportat pel vostre navegador<br\/> Per utilitzar la vista estàndarc, activeu el Javascript canviant les opcions del navegador i %1$storneu-ho a probar%2$s.<br \/>",
- "MakeADifference": "Contribuieu a les millores: %1$sDonar ara%2$s per col·laborar amb Piwik 2.0!",
"NoPrivilegesAskPiwikAdmin": "Esteu identificat com a '%1$s' però sembla que no teniu cap permís establert al Piwik. %2$s Pregunteu al vostre administrador de Piwik (feu click per enviar un email)%3$s que us dongui access per veure un lloc web.",
"PageOf": "%1$s de %2$s",
"PeriodRange": "Rang",
diff --git a/plugins/CoreHome/lang/cs.json b/plugins/CoreHome/lang/cs.json
index 1707c1e886..e582315197 100644
--- a/plugins/CoreHome/lang/cs.json
+++ b/plugins/CoreHome/lang/cs.json
@@ -1,15 +1,18 @@
{
"CoreHome": {
"CategoryNoData": "V této kategorii nejsou k dispozici žádná data. Zkuste \"Zobrazit všechny výsledky\".",
+ "ChangeVisualization": "Změnit vizualizaci",
"CheckForUpdates": "Zkontrolovat aktualizace",
"CheckPiwikOut": "Vyzkoušejte Piwik!",
"ClickToEditX": "Klikněte pro úpravu %s",
+ "CloseSearch": "Zavřít vyhledávání",
"CloseWidgetDirections": "Tento widget můžete zavřít kliknutím na ikonu X na horní části widgetu.",
"DataForThisReportHasBeenPurged": "Data pro toto hlášení jsou starší než %s měsíců a byla odstraněna.",
"DataTableExcludeAggregateRows": "Agregované řádky jsou zobrazeny %s Skrýt",
"DataTableIncludeAggregateRows": "Agregované řádky jsou skryty %s Zobrazit",
+ "DataTableHowToSearch": "Pro hledání stiskněte enter, nebo klikněte na ikonu vyhledávání",
"Default": "výchozí",
- "DonateCall1": "Piwik Vás nic nestojí, ale to neznemená, že nás vývoj nic nestojí.",
+ "DonateCall1": "Piwik lze používat zadarmo, to ale neznamená, že jeho vývoj nic nestojí.",
"DonateCall2": "Piwik potřebuje Vaši podporu, aby mohl růst a prosperovat.",
"DonateCall3": "Pokud se domníváte, že vám Piwik pomohl, %1$szvažte dar%2$s.",
"DonateFormInstructions": "Klikněte na posuvník ke zvolení částky, poté klikněte na tlačítko Subscribe.",
@@ -20,12 +23,12 @@
"IncludeRowsWithLowPopulation": "Řádky s nízkou populací jsou skryty %s Zobrazit všechny řádky",
"InjectedHostEmailBody": "Ahoj. Dnes jsem se snažil dostat do \\Piwiku a dostal jsem varování o neznámém ménu hostitele.",
"InjectedHostEmailSubject": "K piwiku bylo přistupováno s neznámým jménem hostitele %s",
- "InjectedHostNonSuperUserWarning": "%1$sKlikněte zde pro bezpečný přístup k Piwiku%2$s a odstranění tohoto varování. Pokud chcete upozornit administrátora na tento problém, (%3$sklikněte zde pro odeslání e-mailu%4$s).",
+ "InjectedHostNonSuperUserWarning": "%1$sKlikněte zde pro bezpečný přístup k Piwiku%2$s a odstranění tohoto varování. Pokud chcete upozornit administrátora na tento problém, (%3$sklikněte zde pro odeslání emailu%4$s).",
"InjectedHostSuperUserWarning": "Piwik může být špatně nakonfigurován, například pokud byl přesunut na nový server nebo URL. Můžete %1$skliknout zde a přidat %2$s jako platné jméno hostitele Piwiku (pokud mu důvěřujete)%3$s, nebo %4$s klikněte zde%5$s pro bezpečný přístup k Piwiku%6$s.",
"InjectedHostWarningIntro": "Nyní přistupujete k Piwiku z %1$s, ale byl nakonfigurován, aby naslouchal na následující adrese: %2$s.",
"JavascriptDisabled": "Musíte mít zapnutý JavaScript, jinak Piwik nezobrazíte.<br \/> Nebo jen není Váš prohlížeč mezi podporovanými.<br \/>Pro běžné zobrazení zapněte JavaScript ve svém prohlížeči, poté %1$szkuste znovu%2$s.<br \/>",
"MainNavigation": "Hlavní navigace",
- "MakeADifference": "Udělej změnu: %1$sPřispěj na vývoj%2$s nové verze Piwik 2.0",
+ "MakeADifference": "Podpoř nás: %1$sPřispěj na vývoj%2$s nové verze Piwik 3.0!",
"MakeOneTimeDonation": "Provést jednorázový dar.",
"Menu": "Menu",
"NoPrivilegesAskPiwikAdmin": "Jste přihlášen jako '%1$s' ale zdá se, že nemáte v Piwiku žádná práva. %2$s Zeptejte se Vašeho Piwik administrátora (klikem na email)%3$s aby Vám dal 'view' přístup na stránku.",
@@ -49,7 +52,15 @@
"YouAreUsingTheLatestVersion": "Používáte nejnovější verzi Piwiku.",
"ClickRowToExpandOrContract": "Klikněte na tento řádek pro rozbalení nebo zbalení podtabulky.",
"UndoPivotBySubtable": "Toto hlášení bylo zaměřeno %s Vrátit zpět",
+ "NoSuchPage": "Tato stránka neexistuje",
"PivotBySubtable": "Toto hlášení není zaměřené %1$s Zaměřit na %2$s",
+ "SystemSummaryWidget": "Souhrn systému",
+ "SystemSummaryNWebsites": "%d webových stránek",
+ "SystemSummaryNSegments": "%d segmentů",
+ "SystemSummaryNActivatedPlugins": "%d aktivovaných zásuvných modulů",
+ "SystemSummaryPiwikVersion": "Verze Piwiku",
+ "SystemSummaryMysqlVersion": "Verze MySQL",
+ "SystemSummaryPhpVersion": "Verze PHP",
"QuickAccessTitle": "Výsledky hledání pro %s. Pro navigaci ve výsledcích vyhledávání použijte šipky. Zkratka: Zmáčknout 'f' pro hledání.",
"MenuEntries": "Položky menu",
"Segments": "Segmenty",
diff --git a/plugins/CoreHome/lang/da.json b/plugins/CoreHome/lang/da.json
index 4fe64216fb..7b1abfa46d 100644
--- a/plugins/CoreHome/lang/da.json
+++ b/plugins/CoreHome/lang/da.json
@@ -1,13 +1,16 @@
{
"CoreHome": {
"CategoryNoData": "Ingen data i kategorien. Prøv at 'Inkluder hele populationen'.",
+ "ChangeVisualization": "Skift visualisering",
"CheckForUpdates": "Søg efter opdateringer",
"CheckPiwikOut": "Tjek Piwik!",
"ClickToEditX": "Klik for at redigere %s",
+ "CloseSearch": "Luk søgning",
"CloseWidgetDirections": "Luk modulet ved at klikke på 'X' ikonet øverst.",
"DataForThisReportHasBeenPurged": "Data til rapporten er er mere end %s måneder gamle og er blevet ryddet op.",
"DataTableExcludeAggregateRows": "Samlede rækker vises %s Skjul dem",
"DataTableIncludeAggregateRows": "Samlede rækker er skjult %s Vis dem",
+ "DataTableHowToSearch": "Tryk enter og klik på søgeikonet for at søge",
"Default": "standard",
"DonateCall1": "Piwik vil altid ikke koste noget at bruge, men det betyder ikke, at det ikke koster os noget at lave.",
"DonateCall2": "Piwik har brug for din fortsatte støtte til at vokse og trives.",
@@ -25,7 +28,6 @@
"InjectedHostWarningIntro": "Du tilgår Piwik fra %1$s, men Piwik er konfigureret til at køre på denne adresse: %2$s.",
"JavascriptDisabled": "JavaSript skal være aktiveret for at Piwik kan bruges i standardvisning. JavaScript er enten deaktiveret eller ikke understøttet i netlæseren.<br \/>For at bruge standardvisning, aktiver JavaScript i indstillingerne for netlæseren, og %1$s prøv igen %2$s.<br \/>",
"MainNavigation": "Hovednavigation",
- "MakeADifference": "Gør en forskel: %1$sGiv et bidrag nu%2$s og støt Piwik 2.0!",
"MakeOneTimeDonation": "Foretag engangsdonation, i stedet.",
"Menu": "Menu",
"NoPrivilegesAskPiwikAdmin": "Du er logget på som '%1$s' men det ser ikke ud som du har adgang til Piwik. %2$s Spørg Piwik administratoren (klik for at sende e-mail)%3$s for at give dig 'se' adgang til et websted.",
diff --git a/plugins/CoreHome/lang/de.json b/plugins/CoreHome/lang/de.json
index 0b360898bf..920bdbeedc 100644
--- a/plugins/CoreHome/lang/de.json
+++ b/plugins/CoreHome/lang/de.json
@@ -1,13 +1,16 @@
{
"CoreHome": {
"CategoryNoData": "Keine Daten in dieser Kategorie. Probieren Sie \"Gesamte Daten einbeziehen\"",
+ "ChangeVisualization": "Visualisierung ändern",
"CheckForUpdates": "Nach Aktualisierungen suchen",
"CheckPiwikOut": "Sieh dir Piwik an!",
"ClickToEditX": "Klicken Sie um %s zu bearbeiten",
+ "CloseSearch": "Suche schließen",
"CloseWidgetDirections": "Sie können das Widget schließen, indem Sie auf das 'X' oben im Widget klicken.",
"DataForThisReportHasBeenPurged": "Die Daten für diesen Bericht sind älter als %s Monate und wurden gelöscht",
"DataTableExcludeAggregateRows": "Aggregierte Zeilen werden angezeigt %s Ausschließen",
"DataTableIncludeAggregateRows": "Aggregierte Zeilen sind ausgeschlossen %s Wieder anzeigen",
+ "DataTableHowToSearch": "Drücken Sie Enter oder klicken Sie auf das Such-Symbol um eine Suche zu starten.",
"Default": "Standard",
"DonateCall1": "Die Nutzung von Piwik wird immer kostenlos bleiben, was aber nicht heißt, dass es uns nichts kostet, es zu erstellen.",
"DonateCall2": "Piwik braucht Ihre dauerhafte Unterstützung um zu wachsen und zu gedeihen.",
@@ -25,7 +28,7 @@
"InjectedHostWarningIntro": "Sie betreten Piwik aktuell von %1$s, allerdings wurde Piwik so konfiguriert, dass es unter dieser Adresse läuft: %2$s.",
"JavascriptDisabled": "JavaScript muss aktiviert sein, um die Standardansicht von Piwik zu benutzen.<br\/>Es scheint jedoch so, als wäre JavaScript bei Ihnen deaktiviert bzw. würde nicht von Ihrem Browser unterstützt.<br \/>Um die Standardansicht zu benutzen, aktivieren Sie JavaScript in Ihren Browseroptionen und %1$sversuchen Sie es erneut%2$s.<br \/>",
"MainNavigation": "Hauptnavigation",
- "MakeADifference": "Machen Sie den Unterschied: %1$sSpenden Sie jetzt%2$s und unterstützen Sie so Piwik 2.0!",
+ "MakeADifference": "Machen Sie den Unterschied: %1$sSpenden Sie jetzt%2$s um die Entwicklung von Piwik 3.0 möglich zu machen!",
"MakeOneTimeDonation": "Stattdessen einmalig spenden.",
"Menu": "Menü",
"NoPrivilegesAskPiwikAdmin": "Sie sind angemeldet als '%1$s', aber es wurden keine Berechtigungen für diesen Benutzer in Piwik gesetzt. %2$s Bitte fragen Sie Ihren Piwik Administrator (klicken für E-Mail)%3$s um Zugriff auf die Webseite zu erhalten.",
@@ -49,7 +52,15 @@
"YouAreUsingTheLatestVersion": "Sie verwenden die aktuelle Version von Piwik!",
"ClickRowToExpandOrContract": "Klicken Sie auf diese Zeile um die Untertabelle anzuzeigen oder zu verbergen.",
"UndoPivotBySubtable": "Pivot erstellt für diesen Bericht %s Pivot rückgängig machen",
+ "NoSuchPage": "Diese Seite existiert nicht",
"PivotBySubtable": "Kein Pivot erstellt für diesen Bericht %1$s Pivot erstellen mit %2$s",
+ "SystemSummaryWidget": "Systemzusammenfassung",
+ "SystemSummaryNWebsites": "%d Websites",
+ "SystemSummaryNSegments": "%d Segmente",
+ "SystemSummaryNActivatedPlugins": "%d aktivierte Plugins",
+ "SystemSummaryPiwikVersion": "Piwik Version",
+ "SystemSummaryMysqlVersion": "MySQL Version",
+ "SystemSummaryPhpVersion": "PHP-Version",
"QuickAccessTitle": "Suche nach '%s'. Benutzen Sie die Pfeiltasten um durch die Ergebnisse zu navigieren. Tastenkürzel: Drücken Sie 'f' um zu suchen.",
"MenuEntries": "Menüeinträge",
"Segments": "Segmente",
diff --git a/plugins/CoreHome/lang/el.json b/plugins/CoreHome/lang/el.json
index 70c240687e..b56a737a6c 100644
--- a/plugins/CoreHome/lang/el.json
+++ b/plugins/CoreHome/lang/el.json
@@ -1,13 +1,16 @@
{
"CoreHome": {
"CategoryNoData": "Ανεπαρκή δεδομένα στη κατηγορία. Δοκιμάστε να συμπεριλάβετε όλο το πλήθος.",
+ "ChangeVisualization": "Αλλαγή οπτικοποίησης",
"CheckForUpdates": "Έλεγχος για ενημερώσεις",
"CheckPiwikOut": "Δοκιμάστε το Piwik!",
"ClickToEditX": "Κάντε κλικ για να επεξεργαστείτε το %s",
+ "CloseSearch": "Κλείσιμο αναζήτησης",
"CloseWidgetDirections": "Μπορείτε να κλείσετε αυτή τη λειτουργία κάνοντας κλικ στο εικονίδιο 'X' στην κορυφή του widget.",
"DataForThisReportHasBeenPurged": "Τα δεδομένα για αυτή την αναφορά είναι περισσότερα από %s μήνες και κόπηκαν.",
"DataTableExcludeAggregateRows": "Οι συγκεντρωτικές εγγραφές είναι ορατές %s Απόκρυψη",
"DataTableIncludeAggregateRows": "Συγκεντρωτικές εγγραφές είναι κρυφές %s Προβολή",
+ "DataTableHowToSearch": "Πατήστε Enter ή κάντε κλικ στο εικονίδιο της αναζήτησης για αναζήτηση",
"Default": "προεπιλογή",
"DonateCall1": "Το Piwik θα είναι πάντα δωρεάν, αλλά αυτό δεν σημαίνει ότι δεν κοστίζει τίποτα για να φτιαχτεί.",
"DonateCall2": "Το Piwik χρειάζεται τη συνεχή υποστήριξή σας για να αναπτυχθεί και να ευδοκιμήσει.",
@@ -25,7 +28,7 @@
"InjectedHostWarningIntro": "Θα έχετε πρόσβαση τώρα στο Piwik από το %1$s, αλλά το Piwik έχει ρυθμιστεί να τρέχει σε αυτή τη διεύθυνση: %2$s.",
"JavascriptDisabled": "Η JavaScript πρέπει να ενεργοποιηθεί για να χρησιμοποιήσετε το Piwik στη βασική του μορφή.<br \/>Ωστόσο, φαίνεται ότι η JavaScript είναι είτε απενεργοποιημένη ή δεν υποστηρίζεται από τον φυλλομετρητή σας.<br \/>Για τη χρήση της βασικής μορφής, ενεργοποιήστε τη JavaScript αλλάζοντας της ρυθμίσεις του φυλλομετρητή σας και %1$sδοκιμάστε ξανά%2$s.<br \/>",
"MainNavigation": "Κεντρική πλοήγηση",
- "MakeADifference": "Κάντε τη διαφορά: %1$sΔωρίστε τώρα%2$s για τη χρηματοδότηση του Piwik 2.0!",
+ "MakeADifference": "Κάντε τη διαφορά: %1$sΚάντε δωρεά%2$s για να χρηματοδοτήσετε το Piwik 3.0!",
"MakeOneTimeDonation": "Εναλλακτικά, κάντε μια εφάπαξ δωρεά.",
"Menu": "Μενού",
"NoPrivilegesAskPiwikAdmin": "Έχετε κάνει είσοδο ως '%1$s', αλλά φαίνεται ότι δεν σας έχει δοθεί κάποιο δικαίωμα από το Piwik. %2$s Ζητήστε από το διαχειριστή του Piwik σας (κλικ για αποστολή e-mail)%3$s να σας δώσει δικαίωμα 'ανάγνωσης' στον ιστοτόπο.",
@@ -49,7 +52,15 @@
"YouAreUsingTheLatestVersion": "Χρησιμοποιείτε την τελευταία έκδοση του Piwik!",
"ClickRowToExpandOrContract": "Πατήστε στη γραμμή για να επεκταθεί ή να κρυφτεί ο υποπίνακας.",
"UndoPivotBySubtable": "Η αναφορά θεμελιώθηκε %s Αναίρεση της θεμελίωσης",
+ "NoSuchPage": "Η σελίδα δεν υπάρχει",
"PivotBySubtable": "Η αναφορά αυτή δεν στηρίζεται %1$s Pivot από %2$s",
+ "SystemSummaryWidget": "Περίληψη συστήματος",
+ "SystemSummaryNWebsites": "%d ιστοτόποι",
+ "SystemSummaryNSegments": "%d τμήματα",
+ "SystemSummaryNActivatedPlugins": "%d ενεργά πρόσθετα",
+ "SystemSummaryPiwikVersion": "Έκδοση του Piwik",
+ "SystemSummaryMysqlVersion": "Έκδοση της MySQL",
+ "SystemSummaryPhpVersion": "Έκδοση της PHP",
"QuickAccessTitle": "Αναζήτηση για %s. Χρησιμοποιήστε τα βελάκια για να πλοηγηθείτε μεταξύ των αποτελεσμάτων αναζήτησης. Συντόμευση πληκτρολογίου: πατήστε 'f' για αναζήτηση.",
"MenuEntries": "Καταχωρήσεις μενού",
"Segments": "Τμήματα",
diff --git a/plugins/CoreHome/lang/en.json b/plugins/CoreHome/lang/en.json
index 1fb4542be3..500d67868c 100644
--- a/plugins/CoreHome/lang/en.json
+++ b/plugins/CoreHome/lang/en.json
@@ -7,6 +7,7 @@
"ClickToEditX": "Click to edit %s",
"CloseSearch": "Close search",
"CloseWidgetDirections": "You can close this widget by clicking on the 'X' icon at the top of the widget.",
+ "ChooseX": "Choose %1$s",
"DataForThisReportHasBeenPurged": "The data for this report is more than %s months old and has been purged.",
"DataTableExcludeAggregateRows": "Aggregate rows are shown %s Hide them",
"DataTableIncludeAggregateRows": "Aggregate rows are hidden %s Show them",
@@ -28,7 +29,7 @@
"InjectedHostWarningIntro": "You are now accessing Piwik from %1$s, but Piwik has been configured to run at this address: %2$s.",
"JavascriptDisabled": "JavaScript must be enabled in order for you to use Piwik in standard view.<br \/>However, it seems JavaScript is either disabled or not supported by your browser.<br \/>To use standard view, enable JavaScript by changing your browser options, then %1$stry again%2$s.<br \/>",
"MainNavigation": "Main navigation",
- "MakeADifference": "Make a difference: %1$sDonate now%2$s to fund Piwik 2.0!",
+ "MakeADifference": "Make a difference: %1$sDonate now%2$s to fund Piwik 3.0!",
"MakeOneTimeDonation": "Make a one time donation, instead.",
"Menu": "Menu",
"NoPrivilegesAskPiwikAdmin": "You are logged in as '%1$s' but it seems you don't have any permission set in Piwik. %2$s Ask your Piwik administrator (click to email)%3$s to give you 'view' access to a website.",
diff --git a/plugins/CoreHome/lang/es.json b/plugins/CoreHome/lang/es.json
index 9ef4b121ed..26b169e73a 100644
--- a/plugins/CoreHome/lang/es.json
+++ b/plugins/CoreHome/lang/es.json
@@ -1,13 +1,16 @@
{
"CoreHome": {
"CategoryNoData": "No hay datos en esta categoría. Intente \"Incluir toda la población\".",
+ "ChangeVisualization": "Cambiar visualización",
"CheckForUpdates": "Comprobar actualizaciones",
"CheckPiwikOut": "Compruebe a Piwik ahora!",
"ClickToEditX": "Clic para editar %s",
+ "CloseSearch": "Cerrar búsqueda",
"CloseWidgetDirections": "Puede cerrar este reproductor haciendo clic en el icono \"X\" en la parte superior del mismo.",
"DataForThisReportHasBeenPurged": "Los datos para este informe tienen más de %s meses de antigüedad y han sido purgados.",
"DataTableExcludeAggregateRows": "Mostrar filas acumuladas %s Ocultarlas",
"DataTableIncludeAggregateRows": "Filas agregadas están ocultas %s Mostrarlas",
+ "DataTableHowToSearch": "Presione intro o clic en el ícono de búsqueda para precisamente buscar",
"Default": "predeterminado",
"DonateCall1": "​Piwik siempre será gratis, pero eso no significa que no nos cueste nada hacerlo.",
"DonateCall2": "Piwik necesita su apoyo para crecer y prosperar.",
@@ -25,7 +28,7 @@
"InjectedHostWarningIntro": "Está accediendo a Piwik desde %1$s, pero Piwik ha sido configurado para ejecutarse en esta dirección: %2$s.",
"JavascriptDisabled": "JavaScript debe estar habilitado para que pueda utilizar la vista estándar de Piwik .<br \/>Sin embargo, para ser que JavaScript está deshabilitado o no es respaldado por su navegador. <br \/>Para usar la vista estándar, habilite JavaScript cambiando las opciones de su navegador, luego%1$sintente nuevamente%2$s.<br \/>",
"MainNavigation": "Menú de navegación",
- "MakeADifference": "Marque la diferencia: %1$sDone ahora%2$s para financiar Piwik 2.0!",
+ "MakeADifference": "Haz la diferencia %1$sDonate now%2$s para fundar Piwik 3.0!",
"MakeOneTimeDonation": "Entonces, haga una sola donación",
"Menu": "Menú",
"NoPrivilegesAskPiwikAdmin": "Ha iniciado sesión como '%1$s', pero parece que no posee ningún permiso configurado en Piwik. %2$s Consulta al administrador de su Piwik (clic para enviar correo electrónico)%3$s para que le otorgue acceso para 'ver' en el sitio de internet.",
@@ -49,7 +52,15 @@
"YouAreUsingTheLatestVersion": "¡Está utilizando la última versión de Piwik!",
"ClickRowToExpandOrContract": "Clic en esta fila para expandir o contraer la subtabla.",
"UndoPivotBySubtable": "Este informe ha sido girado %s Deshacer giro",
+ "NoSuchPage": "Esta página no existe",
"PivotBySubtable": "Este informe no es girado %1$s Giro por %2$s",
+ "SystemSummaryWidget": "Resumen del sistema",
+ "SystemSummaryNWebsites": "%d sitios de internet",
+ "SystemSummaryNSegments": "%d segmentos",
+ "SystemSummaryNActivatedPlugins": "%d complementos activados",
+ "SystemSummaryPiwikVersion": "Versión Piwik",
+ "SystemSummaryMysqlVersion": "Versión MySQL",
+ "SystemSummaryPhpVersion": "Versión de PHP",
"QuickAccessTitle": "Buscar por %s. Utilice las teclas de dirección para navegar a través de los resultados. Atajo de teclado: Click 'f' para buscar.",
"MenuEntries": "Menú de entrada",
"Segments": "Segmentos",
diff --git a/plugins/CoreHome/lang/et.json b/plugins/CoreHome/lang/et.json
index 75197d163a..009ee32f7b 100644
--- a/plugins/CoreHome/lang/et.json
+++ b/plugins/CoreHome/lang/et.json
@@ -10,7 +10,6 @@
"FlattenDataTable": "Antud raport on hierarhiline %s Tee see lamedaks",
"HowMuchIsPiwikWorth": "Kui palju on Piwik sulle väärt?",
"IncludeRowsWithLowPopulation": "Ebapopulaarsed read on peidetud %s Kuva kõik read",
- "MakeADifference": "Aita kaasa: %1$sAnneta%2$s Piwik 2.0 arendamiseks!",
"MakeOneTimeDonation": "Või tee hoopis ühekordne annetus.",
"PageOf": "%1$s \/ %2$s",
"PeriodRange": "vahemik",
diff --git a/plugins/CoreHome/lang/fa.json b/plugins/CoreHome/lang/fa.json
index a7883a0f5b..3124d1d1da 100644
--- a/plugins/CoreHome/lang/fa.json
+++ b/plugins/CoreHome/lang/fa.json
@@ -14,7 +14,6 @@
"HowMuchIsPiwikWorth": "چقدر پیویک برای شما ارزش دارد؟",
"InjectedHostEmailBody": "درود، من امروز برای دسترسی به پیویک تلاش کردم و هشدار نام هاست نامشخص را دریافت کردم.",
"InjectedHostEmailSubject": "دسترسی به پیویک توسط یک میزبان ناشناخته انجام شده است: %s",
- "MakeADifference": "یک تفاوت ایجاد کنید: %1$sبه پیویک هدیه بدهید%2$s تا در پیویک 2.0 سرمایه گذاری کنیم!",
"MakeOneTimeDonation": "یک بار کمک مالی انجام دهید.",
"NoPrivilegesAskPiwikAdmin": "شما به عنوان %1$s وارد شده اید , اما به نظر می رسد که شما اجازه دسترسی به هیچ بخشی از پیویک را ندارید. %2$s از مدیریت پیویک تان بخواهید (برای ارسال ایمیل کلیک کنید)%3$s تا به شما دسترسی \"مشاهده\" یک وبسایت را بدهد.",
"PageOf": "%1$s از %2$s",
diff --git a/plugins/CoreHome/lang/fi.json b/plugins/CoreHome/lang/fi.json
index c95c884d4d..aa7e79828e 100644
--- a/plugins/CoreHome/lang/fi.json
+++ b/plugins/CoreHome/lang/fi.json
@@ -25,7 +25,6 @@
"InjectedHostWarningIntro": "Käytät Piwikiä osoitteesta %1$s, mutta Piwik on konfiguroitu ajettavaksi tässä osoitteessa: %2$s.",
"JavascriptDisabled": "JavaScriptin täytyy olla käytössä normaalinäkymässä.<br \/>JavaScript ei ole päällä tai ei ole tuettu selaimessasi.<br \/>Ota JavaScript käyttöön selaimesi asetuksista ja %1$syritä uudelleen%2$s.<br\/>",
"MainNavigation": "Päänavigointi",
- "MakeADifference": "Ole mukana vaikuttamassa: %1$sTee lahjoitus%2$s Piwik 2.0 version rahoittamiseksi!",
"MakeOneTimeDonation": "Lahjoita kertasumma.",
"Menu": "Valikko",
"NoPrivilegesAskPiwikAdmin": "Olet kirjautuneena sisään käyttäjänä '%1$s', mutta sinulla ei ole mitään oikeuksia Piwikissä. %2$sPyydä Piwikin ylläpitäjää (klikkaa avataksesi sähköpostin)%3$s antamaan katseluoikeudet verkkosivuun.",
diff --git a/plugins/CoreHome/lang/fr.json b/plugins/CoreHome/lang/fr.json
index e000f700ca..cb00094658 100644
--- a/plugins/CoreHome/lang/fr.json
+++ b/plugins/CoreHome/lang/fr.json
@@ -1,13 +1,16 @@
{
"CoreHome": {
"CategoryNoData": "Aucune donnée pour cette catégorie. Essayez \"d'inclure toute la population\".",
+ "ChangeVisualization": "Changer la visualisation",
"CheckForUpdates": "Vérifier les mises à jour",
"CheckPiwikOut": "Vérifiez sur Piwik!",
"ClickToEditX": "Cliquer pour éditer %s",
+ "CloseSearch": "Recherche précise",
"CloseWidgetDirections": "Vous pouvez fermer ce gadget en cliquant sur l'icône en forme de \"X\" en haut du gadget.",
"DataForThisReportHasBeenPurged": "Les données pour ce rapport ont plus de %s mois et ont été purgées.",
"DataTableExcludeAggregateRows": "Les lignes agrégées sont affichées %s Les cacher",
"DataTableIncludeAggregateRows": "Les lignes agrégées sont cachées %s Les afficher",
+ "DataTableHowToSearch": "Appuyez sur Entrée ou cliquez sur l'icône pour rechercher",
"Default": "par défaut",
"DonateCall1": "Piwik ne vous coûtera jamais rien à utiliser, mais cela ne veut pas dire que ça ne nous coûte rien pour le réaliser.",
"DonateCall2": "Piwik a besoin de votre support pour continuer croître et prospérer.",
@@ -25,7 +28,7 @@
"InjectedHostWarningIntro": "Vous accédez maintenant à Piwik depuis %1$s, mais Piwik a été configuré pour s'exécuter à cette adresse : %2$s.",
"JavascriptDisabled": "JavaScript doit être activé pour que vous puissiez utiliser Piwik de manière basique.<br \/>Cependant, il semble que JasvaScript ne soit pas supporté ou soit désactivé sur votre navigateur.<br \/>Pour utiliser l'interface basique, activez JavaScript en modifiant les options de votre navigateur, ensuite %1$sessayez encore%2$s.<br \/>",
"MainNavigation": "Navigation principale",
- "MakeADifference": "Faites une différence : %1$sDonnez Maintenant%2$s pour financer Piwik 2.0!",
+ "MakeADifference": "Faites une différence : %1$sFaites une don maintenant%2$s pour financer Piwik 3.0!",
"MakeOneTimeDonation": "Faire un don unique à la place.",
"Menu": "Menu",
"NoPrivilegesAskPiwikAdmin": "Vous êtes connecté en tant que '%1$s' mais il semble que nous n'ayez aucune permission définie dans Piwik. %2$s Demandez à votre administrateur (cliquez pour envoyer un e-mail)%3$s de vous donner l'accès 'Consultation' à un site web.",
@@ -49,7 +52,15 @@
"YouAreUsingTheLatestVersion": "Vous utilisez la dernière version de Piwik!",
"ClickRowToExpandOrContract": "Cliquez sur cette rangée pour afficher ou masquer le sous-tableau",
"UndoPivotBySubtable": "Ce rapport a été pivoté %s Annuler le pivot",
+ "NoSuchPage": "Cette page n'existe pas",
"PivotBySubtable": "Ce rapport n'a pas été pivoté %1$s Pivoter par %2$s",
+ "SystemSummaryWidget": "Résumé",
+ "SystemSummaryNWebsites": "%d sites web",
+ "SystemSummaryNSegments": "%d segments",
+ "SystemSummaryNActivatedPlugins": "%d plugins activés",
+ "SystemSummaryPiwikVersion": "Version de Piwik",
+ "SystemSummaryMysqlVersion": "Version de MySQL",
+ "SystemSummaryPhpVersion": "Version de PHP",
"QuickAccessTitle": "Recherche pour %s. Utilisez les flèches de navigation pour parcourir les résultats de recherche. Raccourci : appuyez sur 'f' pour rechercher.",
"MenuEntries": "Entrées de menu",
"Segments": "Segments",
diff --git a/plugins/CoreHome/lang/hi.json b/plugins/CoreHome/lang/hi.json
index 62b280843e..aea7e274fc 100644
--- a/plugins/CoreHome/lang/hi.json
+++ b/plugins/CoreHome/lang/hi.json
@@ -24,7 +24,6 @@
"InjectedHostSuperUserWarning": "Piwik गलत हो सकता है (उदाहरण के लिए, अगर Piwik हाल ही में एक नया सर्वर या यूआरएल के लिए ले जाया गया था)आप या तो यहाँ %1$sक्लिक करें और परिचारक नाम वैध Piwik (यदि आप इसे पर भरोसा है अगर)%3$s के %4$s रूप में जोड़े%2$s, या यहाँ क्लिक करें और %5$sसुरक्षित रूप से Piwik तक पहुँच सकते हैं%6$s.",
"InjectedHostWarningIntro": "%2$sअब आप%1$s Piwik से पहुँच रहे हैं, लेकिन Piwik इस पते पर चलाने के लिए समाकृति किया गया है:",
"JavascriptDisabled": "आप मानक दृश्य में Piwik का उपयोग करने के लिए जावास्क्रिप्ट क्रम में सक्षम होना चाहिए. <br \/> हालांकि, ऐसा लगता है कि या तो जावास्क्रिप्ट आपके ब्राउज़र से अक्षम या समर्थित नहीं है.<br \/>मानक दृश्य का उपयोग करने के लिए, अपने ब्राउज़र के विकल्प बदलकर JavaScript सक्षम करें, तब %1$s फिर कोशिश करें %2$s. <br\/>",
- "MakeADifference": "एक फर्क: निधि Piwik 2.0 के लिए %1$sअभी दान करे%2$s!",
"MakeOneTimeDonation": "इसके बजाय, एक समय दान करें.",
"NoPrivilegesAskPiwikAdmin": "आप '%1$s' के रूप में लॉग इन किया है, लेकिन यह आपको Piwik में निर्धारित कोई भी अनुमति नहीं है लगता है. एक वेबसाइट पर 'दृश्य' पहुंच देने के लिए आपके %2$sPiwik व्यवस्थापक (ईमेल के लिए क्लिक करें)%3$s से पूछो.",
"PageOf": "%1$s का %2$s",
diff --git a/plugins/CoreHome/lang/id.json b/plugins/CoreHome/lang/id.json
index 78b2c44760..853e3e51f1 100644
--- a/plugins/CoreHome/lang/id.json
+++ b/plugins/CoreHome/lang/id.json
@@ -22,7 +22,6 @@
"InjectedHostSuperUserWarning": "Piwik mungkin salah konfigurasi (sebagai contoh, bila Piwik baru saja dipindah ke peladen atau URL baru). Anda dapat memilih %1$sklik di sini dan menambah%2$s sebagai nama inang Piwik sahih (bila Anda mempercayai ini)%3$s, atau %4$sklik di sini dan menuju %5$s akses Piwik secara aman%6$s.",
"InjectedHostWarningIntro": "Sekarang Anda mengakses Piwik dari %1$s, tetapi Piwik telah diatur untuk berjalan di alamat ini: %2$s.",
"JavascriptDisabled": "JavaScript harus diaktifkan untuk melihat Piwik di tampilan standar. <br \/>Namun, tampaknya JavaScript dimatikan atau tidak didukung oleh peramban Anda. <br \/>Untuk menggunakan tampilan standar, aktifkan JavaScript dengan mengubah pengaturab peramban Anda, lalu %1$scoba lagi%2$s. <br \/>",
- "MakeADifference": "Buat perbedaan: %1$sMenyumbang sekarang%2$s untuk mendanai Piwik 2.0!",
"MakeOneTimeDonation": "Buat satu kali sumbangan saja.",
"NoPrivilegesAskPiwikAdmin": "Anda masuk sebagai '%1$s' tetapi sepertinya Anda tidak memiliki izin apapun di Piwik. %2$s Tanyakan kepada pengelola Piwik Anda (klik untuk kirim surel)%3$s untuk memberikan akses 'Lihat' ke situs.",
"PageOf": "%1$s dari %2$s",
diff --git a/plugins/CoreHome/lang/it.json b/plugins/CoreHome/lang/it.json
index 982758714a..a19b2c1377 100644
--- a/plugins/CoreHome/lang/it.json
+++ b/plugins/CoreHome/lang/it.json
@@ -1,13 +1,16 @@
{
"CoreHome": {
"CategoryNoData": "Non ci sono dati in questa categoria. Prova ad includere tutte le categorie.",
+ "ChangeVisualization": "Cambia la visualizzazione",
"CheckForUpdates": "Cerca aggiornamenti",
"CheckPiwikOut": "Controlla Piwik!",
"ClickToEditX": "Clicca per modificare %s",
+ "CloseSearch": "Chiudi la ricerca",
"CloseWidgetDirections": "Potete chiudere questo widget cliccando sull'icona 'X' nella parte alta del widget stesso.",
"DataForThisReportHasBeenPurged": "I dati di questo report hanno più di un mese %s e sono stati eliminati.",
"DataTableExcludeAggregateRows": "Le righe di aggregazione vengono visualizzate %s Nascondile",
"DataTableIncludeAggregateRows": "Le righe di aggregazione sono nascoste %s Visualizzale",
+ "DataTableHowToSearch": "Premi Invio o clicca sull'icona per cercare",
"Default": "predefinito",
"DonateCall1": "Piwik non costerà mai nulla a voi per il suo utilizzo, ma ciò non significa che non costi nulla a noi svilupparlo.",
"DonateCall2": "Piwik ha bisogno del vostro costante supporto per crescere e prosperare.",
@@ -25,7 +28,7 @@
"InjectedHostWarningIntro": "Stai accedendo a Piwik da %1$s ma Piwik è stato configuraato per girare a questo indirizzo: %2$s.",
"JavascriptDisabled": "JavaScript deve essere abilitato per poter utilizzare Piwik in visualizzazione standard.<br \/>Tuttavia, sembra che JavaScript sia disabilitato o non supportato dal tuo browser.<br \/> Per utilizzare la visualizzazione standard, attiva JavaScript modificando le opzioni del browser, quindi %1$sprova ancora%2$s.<br \/>",
"MainNavigation": "Navigazione principale",
- "MakeADifference": "Fa' la differenza: %1$sDona adesso%2$s per finanziare Piwik 2.0!",
+ "MakeADifference": "Fai la differenza: %1$sDona adesso%2$s per finanziare Piwik 3.0!",
"MakeOneTimeDonation": "Fa' una donazione unica.",
"Menu": "Menu",
"NoPrivilegesAskPiwikAdmin": "Ti sei registrato come '%1$s', ma a quanto pare non disponi di alcuna autorizzazione in Piwik. %2$sContatta l'amministratore Piwik (clicca per e-mail)%3$s per avere un accesso che ti consenta di 'vedere' un sito web.",
@@ -49,7 +52,15 @@
"YouAreUsingTheLatestVersion": "Stai utilizzando l'ultima versione di Piwik!",
"ClickRowToExpandOrContract": "Clicca su questa riga per espandere o restringere la sotto-tabella.",
"UndoPivotBySubtable": "Questo report è stato imperniato al Pivot %s Undo",
+ "NoSuchPage": "Questa pagina non esiste",
"PivotBySubtable": "Questo report non è imperniato al Pivot %1$s da %2$s",
+ "SystemSummaryWidget": "Riepilogo Sistema",
+ "SystemSummaryNWebsites": "%d siti web",
+ "SystemSummaryNSegments": "%d segmenti",
+ "SystemSummaryNActivatedPlugins": "%d plugin attivati",
+ "SystemSummaryPiwikVersion": "Versione di Piwik",
+ "SystemSummaryMysqlVersion": "Versione MySQL",
+ "SystemSummaryPhpVersion": "Versione PHP",
"QuickAccessTitle": "Ricerca per %s. Utilizza i tasti freccia per navigare tra i risultati della ricerca. Scorciatoia: premi 'f' per cercare.",
"MenuEntries": "Ingressi da menù",
"Segments": "Segmenti",
diff --git a/plugins/CoreHome/lang/ja.json b/plugins/CoreHome/lang/ja.json
index aaef3cb874..496e0b644a 100644
--- a/plugins/CoreHome/lang/ja.json
+++ b/plugins/CoreHome/lang/ja.json
@@ -24,7 +24,6 @@
"InjectedHostSuperUserWarning": "Piwik が誤って構成された可能性があります。( Piwik が最近新しいサーバーや URL に移動された等) 有効な Piwik ホスト名 (信用できる場合) として、%1$sclick here and add %2$s %3$s, または、 %4$sclick here and go to %5$s to access Piwik safely%6$s 。",
"InjectedHostWarningIntro": "現在 %1$s から Piwik にアクセスしていますが、 Piwik は以下のアドレスで実行するように設定されています。: %2$s",
"JavascriptDisabled": "Piwik を標準ビューで使用するには JavaScript が有効である必要がありますが、<br \/>あなたのブラウザでは無効になっているか、サポートされないようです。<br \/>標準ビューで使用するために、ブラウザのオプションを変更して JavaScript を有効にしてから<br \/>%1$s再試行してください%2$s。<br \/>",
- "MakeADifference": "ぜひ、新しい変化を生み出してください : Piwik 2.0 基金に %1$sDonate now%2$s !",
"MakeOneTimeDonation": "代わりに寄与をする",
"Menu": "メニュー",
"NoPrivilegesAskPiwikAdmin": "'%1$s'としてログインしていますが、権限が設定されていないようです。 %2$s Piwikの管理者(クリックしてEメール)%3$s に'表示'の権限を与えてもらってください。",
diff --git a/plugins/CoreHome/lang/ko.json b/plugins/CoreHome/lang/ko.json
index ab5ea33ff9..7252cc00ac 100644
--- a/plugins/CoreHome/lang/ko.json
+++ b/plugins/CoreHome/lang/ko.json
@@ -1,13 +1,16 @@
{
"CoreHome": {
"CategoryNoData": "이 카테고리 안에 데이터가 없습니다. \"모든 집단 포함\"을 시도해보세요.",
+ "ChangeVisualization": "시각화 바꾸기",
"CheckForUpdates": "업데이트 확인",
"CheckPiwikOut": "Piwik 출시 확인!",
"ClickToEditX": "%s 수정하기",
+ "CloseSearch": "검색 닫기",
"CloseWidgetDirections": "위젯의 상단에있는 'X'아이콘을 클릭하여 이 위젯을 닫을 수 있습니다.",
"DataForThisReportHasBeenPurged": "이 보고서의 데이터는 %s 개월 이상 되었기 때문에 제거되었습니다.",
"DataTableExcludeAggregateRows": "요약 행 표시 %s 숨기기",
"DataTableIncludeAggregateRows": "요약 행 숨기기 %s 보이기",
+ "DataTableHowToSearch": "검색하려면 엔터키를 누르거나 검색 아이콘을 클릭하세요",
"Default": "기본",
"DonateCall1": "Piwik을 사용하는데 당신의 비용이 들지는 않을 것입니다. 그렇다고 우리가 이것을 만드는데 비용이 들지 않다는 의미는 아닙니다.",
"DonateCall2": "Piwik은 성장하고 번영하기 위해 당신의 지속적인 지원이 필요합니다.",
@@ -24,10 +27,12 @@
"InjectedHostSuperUserWarning": "Piwik이 잘못 구성된 것 같습니다 (예를 들어, Piwik이 최근에 새로운 서버 또는 URL로 이동됨). 유효한 Piwik 호스트네임을 (신뢰하는 경우) %1$s이곳을 클릭하여 추가%2$s할 수 있습니다 %3$s, 또는 %4$s이곳을 클릭하여 이동%5$s하는 것으로 Piwik의 안전한 %6$s로 접근할 수 있습니다.",
"InjectedHostWarningIntro": "당신은 지금 %1$s에서 Piwik에 접근하고 있지만 Piwik은 다음 주소로 실행되도록 구성되어 있습니다: %2$s",
"JavascriptDisabled": "Piwik의 표준보기를 이용하려면 JavaScript가가 활성화되어 있어야 합니다.<br \/>하지만, 당신의 브라우저는 활성화되어있지 않거나 지원되지 않는 것 같습니다.<br \/>표준보기를 이용하려면 브라우저 옵션을 변경하여 JavaScript를 활성화하고 <br \/> %1$s다시 시도하세요%2$s.<br \/>",
- "MakeADifference": "개발 지원: Piwik 2.0에 %1$s기부해 주세요%2$s!",
+ "MainNavigation": "주요 네비게이션",
+ "MakeADifference": "개발 지원: Piwik 3.0에 %1$s기부해 주세요%2$s!",
"MakeOneTimeDonation": "또는, 한 번만 기부합니다.",
"Menu": "메뉴",
"NoPrivilegesAskPiwikAdmin": "'%1$s'로 로그인되었지만 권한이 설정되어 있지 않습니다. %2$s Piwik 관리자(클릭 이메일) %3$s에 '보기'권한을 부여 받으세요.",
+ "OnlyForSuperUserAccess": "이 위젯은 슈퍼 유저 접근 권한이 있는 유저의 기본 대시보드에만 나타납니다.",
"PageOf": "%1$s \/ %2$s",
"PeriodRange": "기간",
"ReportGeneratedOn": "%s에 생성된 보고서",
@@ -47,7 +52,15 @@
"YouAreUsingTheLatestVersion": "Piwik 최신 버전을 사용하고 있습니다!",
"ClickRowToExpandOrContract": "하위 테이블의 행을 확장하거나 축소하기 위해 클릭하세요.",
"UndoPivotBySubtable": "이 보고서는 %s Undo pivot에 의해 결정되었습니다.",
+ "NoSuchPage": "해당 페이지는 존재하지 않습니다.",
"PivotBySubtable": "이 보고서는 %1$s Pivot이 %2$s에 의해 결정되지 않았습니다.",
+ "SystemSummaryWidget": "시스템 요약",
+ "SystemSummaryNWebsites": "%d개 웹사이트",
+ "SystemSummaryNSegments": "%d개 세그멘트",
+ "SystemSummaryNActivatedPlugins": "%d개 활성화된 플러그인",
+ "SystemSummaryPiwikVersion": "Piwik 버전",
+ "SystemSummaryMysqlVersion": "MySQL 버전",
+ "SystemSummaryPhpVersion": "PHP 버전",
"QuickAccessTitle": "%s 검색. 검색 결과를 확인할 때 방향키를 사용하세요. 단축키: 'f'는 검색",
"MenuEntries": "메뉴",
"Segments": "세그멘트",
diff --git a/plugins/CoreHome/lang/nb.json b/plugins/CoreHome/lang/nb.json
index 1930bab3d0..163ae42380 100644
--- a/plugins/CoreHome/lang/nb.json
+++ b/plugins/CoreHome/lang/nb.json
@@ -1,13 +1,16 @@
{
"CoreHome": {
"CategoryNoData": "Ingen data i denne kategorien. Prøv å velge «Inkluder hele populasjonen».",
+ "ChangeVisualization": "Endre visualisering",
"CheckForUpdates": "Se etter oppdateringer",
"CheckPiwikOut": "Sjekk ut Piwik!",
"ClickToEditX": "Klikk for å redigere %s",
+ "CloseSearch": "Lukk søk",
"CloseWidgetDirections": "Du kan lukke dette elementet ved å klikke på X-ikonet over widgeten.",
"DataForThisReportHasBeenPurged": "Dataene for denne rapporten er mer enn %s måneder gamle og har blitt fjernet.",
"DataTableExcludeAggregateRows": "Aggregerte rader vises %s Skjul dem",
"DataTableIncludeAggregateRows": "Aggregerte rader er skjult %s Vis dem",
+ "DataTableHowToSearch": "Trykk enter eller klikk på søkeikonet for å søke",
"Default": "standard",
"DonateCall1": "Det vil aldri koste noe å bruke Piwik, men det betyr ikke at det ikke koster oss noe å lage.",
"DonateCall2": "Piwik trenger din fortsatte støtte for å vokse og blomstre.",
@@ -25,7 +28,6 @@
"InjectedHostWarningIntro": "Du har tilgang til Piwik fra %1$s, men Piwik er konfigurert til å kjøre på adressen: %2$s",
"JavascriptDisabled": "JavaScript må være aktivert for at du skal kunne bruke Piwik i standardvisning.<br \/>Det ser ut til at JavaScript enten er deaktivert eller ikke støttet av din nettleser.<br \/>For å bruke standardvisning, må du aktivere JavaScript i nettleserinnstillingene og deretter %1$sprøve igjen%2$s.<br \/>",
"MainNavigation": "Hovednavigasjon",
- "MakeADifference": "Gjør en forskjell: %1$sDoner nå%2$s for å finansiere Piwik 2.0!",
"MakeOneTimeDonation": "Bidra med en engangsdonasjon i stedet.",
"Menu": "Meny",
"NoPrivilegesAskPiwikAdmin": "Du er logget inn som «%1$s», men det ser ut til at du ikke har noen rettigheter satt i Piwik. %2$s Be din Piwik-administrator (klikk for å sende e-post)%3$s å gi deg «vis»-tilgang til et nettsted.",
@@ -49,7 +51,15 @@
"YouAreUsingTheLatestVersion": "Du bruker den nyeste versjonen av Piwik!",
"ClickRowToExpandOrContract": "Klikk denne raden for utvide eller slå sammen undertabellen.",
"UndoPivotBySubtable": "Denne rapporten er pivotert %s Angre pivot",
+ "NoSuchPage": "Denne siden finnes ikke",
"PivotBySubtable": "Denne rapporten er ikke pivotert %1$s Pivot etter %2$s",
+ "SystemSummaryWidget": "Systemsammendrag",
+ "SystemSummaryNWebsites": "%d nettsteder",
+ "SystemSummaryNSegments": "%d segmenter",
+ "SystemSummaryNActivatedPlugins": "%d aktiverte utvidelser",
+ "SystemSummaryPiwikVersion": "Piwik-versjon",
+ "SystemSummaryMysqlVersion": "MySQL-versjon",
+ "SystemSummaryPhpVersion": "PHP-versjon",
"QuickAccessTitle": "Søk etter %s. Bruk piltastene for å navigere i søkeresultatene. Snarvei: trykk «f» for å søke.",
"MenuEntries": "Menyvalg",
"Segments": "Segmenter",
diff --git a/plugins/CoreHome/lang/nl.json b/plugins/CoreHome/lang/nl.json
index 1b0dbf8d48..693966f2dd 100644
--- a/plugins/CoreHome/lang/nl.json
+++ b/plugins/CoreHome/lang/nl.json
@@ -1,13 +1,16 @@
{
"CoreHome": {
"CategoryNoData": "Geen data in deze categorie. Probeer \"Toon alle data\".",
+ "ChangeVisualization": "Verander visualisatie",
"CheckForUpdates": "Controleer op updates",
"CheckPiwikOut": "Kijk eens naar Piwik!",
"ClickToEditX": "Klik om %s te bewerken",
+ "CloseSearch": "Sluit zoeken",
"CloseWidgetDirections": "Je kunt deze widget sluiten door op het 'X' icoon bovenaan de widget te klikken.",
"DataForThisReportHasBeenPurged": "De data voor dit rapport was meer dan %s maanden oud en is reeds opgeschoond.",
"DataTableExcludeAggregateRows": "Geagregeerde rijen worden getoond %s Verberg ze",
"DataTableIncludeAggregateRows": "Geagregeerde rijen zijn verborgen %s Toon ze",
+ "DataTableHowToSearch": "Druk op enter of klik op het zoek icoon om te zoeken.",
"Default": "standaard",
"DonateCall1": "Piwik zal altijd gratis zijn om te gebruiken, maar dat wil niet zeggen dat het niks kost om te maken.",
"DonateCall2": "Piwik heeft uw voortdurende steun nodig om te groeien.",
@@ -25,10 +28,10 @@
"InjectedHostWarningIntro": "Je bezoekt nu Piwik van %1$s, maar Piwik is geconfigureerd om op dit adres te draaien: %2$s.",
"JavascriptDisabled": "JavaScript moet ingeschakeld zijn om Piwik in standaard weergave te bekijken. <br\/> Het lijkt erop dat JavaScript is uitgeschakeld of niet ondersteund wordt door uw browser.<br\/> Om de standaard weergave te gebruiken, schakel JavaScript in door uw browser instellingen te wijzigen, probeer het daarna %1$s opnieuw %2$s.<br\/>",
"MainNavigation": "Hoofd navigatie",
- "MakeADifference": "Maak een verschil: %1$sDoneer nu%2$s om Piwik 2.0 te steunen!",
"MakeOneTimeDonation": "Doe een eennmalige donatie in de plaats.",
"Menu": "Menu",
"NoPrivilegesAskPiwikAdmin": "U bent aangemeld as '%1$s'. Maar het lijkt er op dat u geen rechten hebt op Piwik te bezoeken. %2$sVraag aan uw webmaster (klik hier voor e-mail)%3$s of hij u de juiste rechten wilt geven om de statistieken te bekijken.",
+ "OnlyForSuperUserAccess": "Het widget wordt alleen getoond in het standaard dashbord aan gebruikers met Super User toegang.",
"PageOf": "%1$s of %2$s",
"PeriodRange": "Datumbereik",
"ReportGeneratedOn": "Rapport aangemaakt op %s",
@@ -48,7 +51,15 @@
"YouAreUsingTheLatestVersion": "Je gebruikt de laatste versie van Piwik!",
"ClickRowToExpandOrContract": "Klik deze regel om de tabel te openen of te sluiten.",
"UndoPivotBySubtable": "Dit rapport wordt als een draaitabel getoond, %s schakel de draaitabel uit.",
+ "NoSuchPage": "Deze pagina bestaat niet.",
"PivotBySubtable": "Dit rapport wordt niet als een draaitabel getoond, %1$s maak een draaitabel op basis van %2$s",
+ "SystemSummaryWidget": "Systeem samenvatting",
+ "SystemSummaryNWebsites": "%d websites",
+ "SystemSummaryNSegments": "%d segmenten",
+ "SystemSummaryNActivatedPlugins": "%d geactiveerde plugins",
+ "SystemSummaryPiwikVersion": "Piwik versie",
+ "SystemSummaryMysqlVersion": "MySQL versie",
+ "SystemSummaryPhpVersion": "PHP versie",
"QuickAccessTitle": "Zoeken naar %s. Gebruik de pijltjestoetsen om door de zoekopdrachten te navigeren. Shortcut: Druk 'f' om te zoeken.",
"MenuEntries": "Menu-items",
"Segments": "Segmenten",
diff --git a/plugins/CoreHome/lang/pt-br.json b/plugins/CoreHome/lang/pt-br.json
index 2727c13cc2..8a33ec75f5 100644
--- a/plugins/CoreHome/lang/pt-br.json
+++ b/plugins/CoreHome/lang/pt-br.json
@@ -1,13 +1,16 @@
{
"CoreHome": {
"CategoryNoData": "Sem dados nesta categoria. Tente \"Incluir toda a população\".",
+ "ChangeVisualization": "Mudar visualização",
"CheckForUpdates": "Verificar atualizações",
"CheckPiwikOut": "Verificar saída do Piwik",
"ClickToEditX": "Clique para editar %s",
+ "CloseSearch": "Fechar busca",
"CloseWidgetDirections": "Você pode fechar esta ferramenta clicando no ícone \"X\" na parte superior do widget.",
"DataForThisReportHasBeenPurged": "Os dados para este relatório possuem mais de %s meses e foram excluídos.",
"DataTableExcludeAggregateRows": "Agregar linhas é mostrados %s Esconder-los.",
"DataTableIncludeAggregateRows": "Linhas agregadas estão ocultas %s Clique para exibir",
+ "DataTableHowToSearch": "Pressione enter ou clique no ícone de busca para buscar",
"Default": "Padrão",
"DonateCall1": "Piwik sempre custará nada para usar, mas isso não significa que não nos custa nada para fazê-lo.",
"DonateCall2": "Piwik precisa do seu apoio continuado para crescer e prosperar.",
@@ -25,7 +28,6 @@
"InjectedHostWarningIntro": "Você está agora acessando Piwik de %1$s, mas Piwik foi configurado para ser executado neste endereço: %2$s.",
"JavascriptDisabled": "JavaScript deve ser habilitado para que você possa usar o Piwik como visualização padrão. <br\/>Contudo, parece que JavaScript ou está desabilidado ou não é suportado pelo seu navegador. <br\/>Para usar a visualização padrão, habilite o JavaScript mudando as opções do seu navegador, então %1$stente novamente%2$s.<br\/>",
"MainNavigation": "Navegação principal",
- "MakeADifference": "Faça a diferença:%1$sDoe agora%2$s para o fundo Piwik 2.0!",
"MakeOneTimeDonation": "Em vez disso, faça uma doação.",
"Menu": "Menu",
"NoPrivilegesAskPiwikAdmin": "Você está logado como '%1$s', mas parece que você não tem nenhuma permissão definida no Piwik. %2$s Pergunte ao seu administrador Piwik (clique para e-mail) %3$s para lhe dar acesso de 'visão' para um site.",
@@ -49,6 +51,13 @@
"ClickRowToExpandOrContract": "Clique nesta linha para expandir ou contrair a subtabela.",
"UndoPivotBySubtable": "Este relatório foi articulado %s desfazer articulação",
"PivotBySubtable": "Este relatório não foi articulado %1$s Articular por %2$s",
+ "SystemSummaryWidget": "Resumo do Sistema",
+ "SystemSummaryNWebsites": "%d websites",
+ "SystemSummaryNSegments": "%d segmentos",
+ "SystemSummaryNActivatedPlugins": "%d plugins ativos",
+ "SystemSummaryPiwikVersion": "Versão do Piwik",
+ "SystemSummaryMysqlVersion": "Versão do MySQL",
+ "SystemSummaryPhpVersion": "Versão do PHP",
"QuickAccessTitle": "Buscar por %s. Use as setas do teclado para navegar pelos resultados da pesquisa. Atalho: Pressione 'f' para pesquisar.",
"MenuEntries": "Itens do menu",
"Segments": "Segmentos",
diff --git a/plugins/CoreHome/lang/ro.json b/plugins/CoreHome/lang/ro.json
index b9b620bd85..91ca9a6dee 100644
--- a/plugins/CoreHome/lang/ro.json
+++ b/plugins/CoreHome/lang/ro.json
@@ -23,7 +23,6 @@
"InjectedHostSuperUserWarning": "Piwik poate sa fie configurat greșit (de exemplu, dacă Piwik a fost recent mutat pe un server nou sau la un URL nou). Poți fie să %1$s dai click aici și să adaugi %2$s ca un hostname valid de Piwik (dacă ai încredere)%3$s, sau %4$s să dai click aici și să te duci la %5$s pentru a accesa Piwik în siguranță%6$s.",
"InjectedHostWarningIntro": "Acum accesati Piwik de la %1$s, dar Piwik a fost configurat sa ruleze la aceasta adresa: %2$s.",
"JavascriptDisabled": "Trebuie sa aveti JavaScript activat pentru a putea utiliza Piwik in modul de vizualizare standard.<br \/> Se pare ca JavaScript ori nu este activat, ori nu este suportat de browserul dvs.<br \/> Pentru a utiliza modul de vizualizare standard, activati JavaScript modificand optiunile browserului dvs, apoi %1$sincercati din nou%2$s.<br \/>",
- "MakeADifference": "Fa o diferenta: %1$sDoneaza acum%2$s pentru a sponsoriza Piwik 2.0!",
"MakeOneTimeDonation": "În schimb, donează o dată (fără subscriere).",
"NoPrivilegesAskPiwikAdmin": "Sunteti logat ca '%1$s' dar se pare ca nu aveti nici o permisiune setata in Piwik. %2$s Solicitati administratorului dvs al Piwik (click pentru email)%3$s sa va permita accesul tip 'vizualizare' pentru un site.",
"PageOf": "%1$s din %2$s",
diff --git a/plugins/CoreHome/lang/ru.json b/plugins/CoreHome/lang/ru.json
index a47c8f93df..385b0a23c7 100644
--- a/plugins/CoreHome/lang/ru.json
+++ b/plugins/CoreHome/lang/ru.json
@@ -1,13 +1,16 @@
{
"CoreHome": {
"CategoryNoData": "Нет данных в этой категории. Попробуйте \"Включить все показатели\".",
+ "ChangeVisualization": "Сменить представление",
"CheckForUpdates": "Проверить на обновления",
"CheckPiwikOut": "Проверить Piwik на обновления!",
"ClickToEditX": "Редактировать %s",
+ "CloseSearch": "Закрыть поиск",
"CloseWidgetDirections": "Вы можете закрыть этот виджет, нажав на значок 'X' в верхней части виджета.",
"DataForThisReportHasBeenPurged": "Данные для этого отчета хранятся более %s месяцев и были почищены.",
"DataTableExcludeAggregateRows": "Выбранные строки отображены %s Скрыть их",
"DataTableIncludeAggregateRows": "Выбранные строки скрыты %s Показать их",
+ "DataTableHowToSearch": "Нажмите ввод или щелкните значок поиска для поиска",
"Default": "по умолчанию",
"DonateCall1": "Piwik всегда будет бесплатным для использования, но это не значит, что нам это ничего не стоит.",
"DonateCall2": "Piwik нуждается в вашей постоянной поддержке, чтобы расти и процветать.",
@@ -25,10 +28,11 @@
"InjectedHostWarningIntro": "Сейчас вы заходите в Piwik на %1$s, но Piwik был настроен на этом адресе: %2$s.",
"JavascriptDisabled": "JavaScript должен быть разрешен для корректного стандартного отображения Piwik.<br \/>Если Вы читаете это сообщение, значит JavaScript запрещен, либо не поддерживается вашим браузером.<br \/>Для использования стандартного вида, разрешите JavaScript в настройках вашего браузера, потом %1$sпопробуйте обновить страницу%2$s.<br \/>",
"MainNavigation": "Основная навигация",
- "MakeADifference": "Внесите свой вклад: %1$sПожертвуйте сейчас%2$s для финансирования Piwik 2.0!",
+ "MakeADifference": "Внесите свой вклад: %1$sПожертвуйте сейчас%2$s для финансирования Piwik 3.0!",
"MakeOneTimeDonation": "Сделать только пожертвование (без подписки).",
"Menu": "Меню",
"NoPrivilegesAskPiwikAdmin": "Вы авторизованы как '%1$s', но, кажется, для вас не установлены права в Piwik. %2$s Попросите вашего администратора (кликните, чтобы написать письмо)%3$s дать вам доступ на \"просмотр\" к статистике сайта.",
+ "OnlyForSuperUserAccess": "Этот виджет отображается в панели управления по умолчанию только для суперпользователя.",
"PageOf": "%1$s из %2$s",
"PeriodRange": "Период",
"ReportGeneratedOn": "Отчет был составлен %s",
@@ -47,6 +51,14 @@
"WebAnalyticsReports": "Отчеты веб аналитики",
"YouAreUsingTheLatestVersion": "У вас последняя версия Piwik!",
"ClickRowToExpandOrContract": "Нажмите на эту строку, чтобы растянуть или сжать подтаблицу.",
+ "NoSuchPage": "Запрашиваемая страница не существует.",
+ "SystemSummaryWidget": "Системный отчёт",
+ "SystemSummaryNWebsites": "%d веб-сайтов",
+ "SystemSummaryNSegments": "%d сегментов",
+ "SystemSummaryNActivatedPlugins": "%d активированных плагинов",
+ "SystemSummaryPiwikVersion": "Версия Piwik",
+ "SystemSummaryMysqlVersion": "Версия MySQL",
+ "SystemSummaryPhpVersion": "Версия PHP",
"QuickAccessTitle": "Поиск %s. Используйте клавиши со стрелками для переходов в пределах результатов поиска. Быстрый доступ: нажмите 'f' для поиска.",
"MenuEntries": "Пункты меню",
"Segments": "Сегменты",
diff --git a/plugins/CoreHome/lang/sk.json b/plugins/CoreHome/lang/sk.json
index 28e1f15b83..862f9e743c 100644
--- a/plugins/CoreHome/lang/sk.json
+++ b/plugins/CoreHome/lang/sk.json
@@ -24,7 +24,6 @@
"InjectedHostSuperUserWarning": "Piwik môže byť zle nakonfigurovaný (napr., ak bol práve Piwik presunutý na nový server alebo URL). Môžete buďto %1$s kliknúť sem a pridať %2$s ako platné Piwik hostname (ak tomu dôverujete)%3$s, alebo %4$s kliknúť sem a vsúpiť %5$s do Piwiku bezpečne%6$s.",
"InjectedHostWarningIntro": "Práve vstupujete do Piwiku z %1$s, ale Piwik bol nakonfigurovaný aby bežal na tejto adrese: %2$s.",
"JavascriptDisabled": "JavaScript musí byť povolený za účelom používania Piwiku v štandardnom prezeraní.<br \/> Ale vyzerá to tak, že JavaScript je buďto vypnutý alebo nie je podporovaný Vašim perhliadačom.<br \/> Pre štandardné prezeranie zmente nastavenia Vášho prehliadača a povoľte JavaScript , potom %1$s skúste znova%2$s.<br \/>",
- "MakeADifference": "Urobte rozdiel: %1$sTeraz prispejte finančne%2$s podporiť Piwik 2.0!",
"MakeOneTimeDonation": "Jednorázovo finančne podporiť.",
"Menu": "Menu",
"NoPrivilegesAskPiwikAdmin": "Ste prihlásený ako '%1$s' ale vyzerá to tak , že nemáte žiadne povolenie do Piwiku. %2$s Spýtajte sa Vášho Piwik administrátora (Kliknite pre email)%3$s aby Vám dal 'prezerací' prístup na webstránku.",
diff --git a/plugins/CoreHome/lang/sq.json b/plugins/CoreHome/lang/sq.json
index 204ab60827..5cdd9531b6 100644
--- a/plugins/CoreHome/lang/sq.json
+++ b/plugins/CoreHome/lang/sq.json
@@ -1,17 +1,68 @@
{
"CoreHome": {
"CategoryNoData": "Pa të dhëna për këtë kategori. Provoni të \"Përfshini tërë popullatën\".",
+ "ChangeVisualization": "Ndryshoni vizualizimin",
"CheckForUpdates": "Kontrollo për përditësime",
"CheckPiwikOut": "Provojeni Piwik-un!",
"ClickToEditX": "Klikoni që të përpunoni %s",
+ "CloseSearch": "Mbylle kërkimin",
+ "CloseWidgetDirections": "Këtë widget mund ta mbyllni duke klikuar mbi ikonën 'X' në krye të widget-it.",
"DataForThisReportHasBeenPurged": "Të dhënat e këtij raporti janë më të vjetra se %s muaj dhe u pastruan.",
+ "DataTableExcludeAggregateRows": "Grumbulli i rreshtave është i shfaqur %s Fshihini",
+ "DataTableIncludeAggregateRows": "Grumbulli i rreshtave është i fshehur %s Shfaqini",
+ "DataTableHowToSearch": "Shtypni Enter ose klikoni ikonën e kërkimit që të kërkoni",
"Default": "parazgjedhje",
+ "DonateCall1": "Përdorimi i Piwik-ut s’do t’ju kushtojë kurrë një dysh, por kjo s’do të thotë që neve nuk na kushton krijimi i tij.",
+ "DonateCall2": "Piwik-u lyp përkrahjen tuaj që të rritet dhe lulëzojë.",
+ "DonateCall3": "Nëse jeni të idesë se Piwik-u i ka shtuar vlerën biznesit tuaj apo përpjekjes tuaj, %1$sju lutemi shihni mundësinë e dhurimit për të!%2$s",
+ "DonateFormInstructions": "Klikoni mbi rrëshqitësin që të përzgjidhni një vlerë, mandej klikoni Pajtohuni, që të dhuroni.",
+ "ExcludeRowsWithLowPopulation": "Po shfaqen krejt rreshtat %s Përjashtoni popullatat e ulëta",
+ "ExternalHelp": "Ndihmë (hapet në skedë të re)",
+ "FlattenDataTable": "Raporti është hierarkik %s Bëjeni të sheshtë",
+ "HowMuchIsPiwikWorth": "Sa vlen Piwik-u për ju?",
+ "IncludeRowsWithLowPopulation": "Janë fshehur rreshta me popullatë të ulët %s Shfaqi krejt rreshtat",
+ "InjectedHostEmailBody": "Tungjatjeta, provova të hyj në Piwik sot dhe ndesha sinjalizimin për strehëemër të panjohur.",
+ "InjectedHostEmailSubject": "Te Piwik-u u hy me një strehëemër të panjohur: %s",
+ "InjectedHostNonSuperUserWarning": "%1$sKlikoni këtu që të hyni te Piwik-u pa rrezik%2$s dhe që të hiqet ky sinjalizim. Mund të doni edhe të lidheni me përgjegjësin e instalimit tuaj të Piwik-ut dhe t’ia bëni të ditur këtë problem (%3$sklikoni këtu që t’ia dërgoni me email%4$s).",
+ "InjectedHostSuperUserWarning": "Piwik-u mund të jetë i keqformësuar (për shembull, në rast se Piwik-u tani së fundi u kalua në një shërbyes të ri ose URL të re). Mundeni ose %1$stë klikoni këtu dhe ta shtoni %2$s si një strehëemër të vlefshëm Piwik (nëse i zini besë)%3$s, ose %4$stë klikoni këtu dhe të kaloni te %5$s për hyrje të parrezik në Piwik%6$s.",
+ "InjectedHostWarningIntro": "Po hyni në Piwik që prej %1$s, por Piwik-u qe formësuar të xhirojë në këtë adresë: %2$s.",
"JavascriptDisabled": "Që të mund të përdorni Piwik-un në parjen standarde duhet të aktivizohet JavaScript-i.<br \/>Por ja që duket se ose JavaScript-i është i çaktivizuar, ose nuk mbulohet nga shfletuesi juaj.<br \/>Që të përdorni parjen standarde, aktivizoni JavaScript-in duke ndryshuar mundësitë përkatëse te shfletuesi juaj, mandej %1$sriprovoni%2$s.<br \/>",
+ "MainNavigation": "Lëvizja kryesore",
+ "MakeADifference": "Sillni një ndryshim: %1$sDhuroni tani%2$s që të financohet Piwik 3.0!",
+ "MakeOneTimeDonation": "Ose bëni një dhurim njëherësh.",
+ "Menu": "Menu",
"NoPrivilegesAskPiwikAdmin": "Jeni i futur si '%1$s' por duket se s’keni leje të rregulluara për ju në Piwik. %2$s Kërkojini administratorit tuaj te Piwik (klikoni që t’i dërgoni email)%3$s që t’ju japë të drejta 'parjesh' te një sajt.",
+ "OnlyForSuperUserAccess": "Ky widget u shfaqet te pulti parazgjedhje vetëm përdoruesve që kanë hyrje si Superpërdorues.",
"PageOf": "%1$s nga %2$s",
+ "PeriodRange": "Interval",
+ "ReportGeneratedOn": "Raport i prodhuar më %s",
+ "ReportGeneratedXAgo": "Raport i prodhuar %s më parë",
+ "SharePiwikLong": "Njatjeta! Sapo gjeta një program të lirë shumë të mirë: Piwik-un!\n\nPiwik-u do t’ju lejojë të ndiqni falas vizitorët në sajtin tuaj. Duhet ta provoni medoemos!",
+ "SharePiwikShort": "Piwik! Analiza web të lira\/libre. Ruani pronësinë e të dhënave tuaja.",
+ "ShareThis": "Ndajeni me të tjerët këtë",
"ShowJSCode": "Shfaqe kodin JavaScript që duhet futur",
+ "SkipToContent": "Kalo te lënda",
+ "SubscribeAndBecomePiwikSupporter": "Vazhdoni te një faqe e sigurt pagesash me kartë krediti (Paypal) që të bëheni një Përkrahës i Piwik-ut!",
+ "SupportPiwik": "Përkrahni Piwik-un!",
+ "TableNoData": "S’ka të dhëna për këtë tabelë.",
"ThereIsNoDataForThisReport": "Nuk ka të dhëna për këtë raport.",
+ "UnFlattenDataTable": "Raporti është i sheshtë %s Bëjeni hierarkik",
+ "ViewAllPiwikVideoTutorials": "Shihini krejt Përkujdesoret Video për Piwik-un",
"WebAnalyticsReports": "Raporte Analizash Web",
- "Segments": "Segmente"
+ "YouAreUsingTheLatestVersion": "Po përdorni versionin më të ri të Piwik-ut!",
+ "ClickRowToExpandOrContract": "Klikoni mbi këtë rresht që të zgjeroni ose tkurrni nëntabelën.",
+ "NoSuchPage": "Kjo faqe s’ekziston",
+ "SystemSummaryWidget": "Përmbledhje Sistemi",
+ "SystemSummaryNWebsites": "%d sajte",
+ "SystemSummaryNSegments": "%d segmente",
+ "SystemSummaryNActivatedPlugins": "%d shtojca të aktivizuara",
+ "SystemSummaryPiwikVersion": "Version Piwik-u",
+ "SystemSummaryMysqlVersion": "Version MySQL-je",
+ "SystemSummaryPhpVersion": "Version PHP-je",
+ "QuickAccessTitle": "Kërkoni për %s. Përdorni tastet shigjetë që të lëvizni nëpër përfundimet e kërkimit. Shkurtore tastiere: Shtypni 'f' që të kërkohet.",
+ "MenuEntries": "Zëra menuje",
+ "Segments": "Segmente",
+ "AdblockIsMaybeUsed": "Në rast se përdorni ndonjë bllokues reklamash, ju lutemi çaktivizojeni për këtë sajt, që të siguroni punën pa probleme të Piwik-ut.",
+ "ChangeCurrentWebsite": "Zgjidhni një sajt, sajti i përzgjedhur tani: %s"
}
} \ No newline at end of file
diff --git a/plugins/CoreHome/lang/sr.json b/plugins/CoreHome/lang/sr.json
index 08b2322557..b0c9f0a94f 100644
--- a/plugins/CoreHome/lang/sr.json
+++ b/plugins/CoreHome/lang/sr.json
@@ -1,13 +1,16 @@
{
"CoreHome": {
"CategoryNoData": "Nema podataka u ovoj kategoriji. Probajte sa \"Uključi celu populaciju\".",
+ "ChangeVisualization": "Promenite način prikaza",
"CheckForUpdates": "Proveri da li se pojavila nova verzija",
"CheckPiwikOut": "Proverite!",
"ClickToEditX": "Kliknite kako biste izmenili %s",
+ "CloseSearch": "Zatvori pretragu",
"CloseWidgetDirections": "Možete zatvoriti ovaj vidžet tako što ćete kliknuti na sličicu 'X' na vrhu.",
"DataForThisReportHasBeenPurged": "Podaci za ovaj izveštaj su više od %s meseci stari te su obrisani.",
"DataTableExcludeAggregateRows": "Zbirni redovi su prikazani %s Sakrij ih",
"DataTableIncludeAggregateRows": "Zbirni redovi su sakriveni %s Prikaži ih",
+ "DataTableHowToSearch": "Pritisnite Enter ili kliknite na sličicu kako biste pokrenuli pretragu",
"Default": "podrazumevano",
"DonateCall1": "Piwik vas nikada neće ništa koštati ali to ne znači da nas Piwik ništa ne košta dok ga pravimo.",
"DonateCall2": "Piwiku je potrebna vaša stalna podrška kako bi rastao i napredovao.",
@@ -24,10 +27,12 @@
"InjectedHostSuperUserWarning": "Piwik možda nije podešen kako treba (na primer, premešten je na novi server ili URL). Možete ili da %1$skliknete ovde i dodate %2$s kao validan naziv hosta (ukoliko mu verijete)%3$s, ili da %4$skliknete ovde i %5$s pristupite bezbedno Piwik-u%6$s.",
"InjectedHostWarningIntro": "Sada pristupate Piwik-u sa %1$s, ali je Piwik podešen da radi sa ove adrese: %2$s.",
"JavascriptDisabled": "JavaScript mora bidi uključen kako biste standardno koristili Piwik.<br \/>Izgleda da je JavaScript ili isključen ili nije podržan od strane vašeg brauzera.<br \/>Kako biste omogućili standardni prikaz, uključite JavaScript kroz podešavanja vašeg brauzera a onda %1$spokušajte ponovo%2$s.<br \/>",
- "MakeADifference": "Budi drugačiji: %1$sDoniraj%2$s za Piwik 2.0!",
+ "MainNavigation": "Glavna navigacija",
+ "MakeADifference": "Budite drugačiji: %1$sDonirajte%2$s za Piwik 3.0!",
"MakeOneTimeDonation": "Možete izvršiti i jednokratnu donaciju.",
"Menu": "Meni",
"NoPrivilegesAskPiwikAdmin": "Prijavljeni ste kao '%1$s' ali izgleda da nemate postavljena nikakva ovlašćenja. %2$s Tražite od Piwik administratora (kliknite za poruku)%3$s da vam dozvoli 'prikaz' na sajtu.",
+ "OnlyForSuperUserAccess": "Ovaj vidžet se prikazuje na podrazumevanoj konzoli samo superkorisnicima.",
"PageOf": "%1$s od %2$s",
"PeriodRange": "Period",
"ReportGeneratedOn": "Izveštaj generisan %s",
@@ -47,6 +52,19 @@
"YouAreUsingTheLatestVersion": "Koristite poslednju verziju Piwik-a",
"ClickRowToExpandOrContract": "Kliknite ovaj red kako biste proširili ili skupili tabelu.",
"UndoPivotBySubtable": "Ovaj izveštaj je pivotiran %s Otkaži pivot",
- "PivotBySubtable": "Ovaj izveštaj nije pivotiran %1$s Pivotiraj sa %2$s"
+ "NoSuchPage": "Ova stranica ne postoji",
+ "PivotBySubtable": "Ovaj izveštaj nije pivotiran %1$s Pivotiraj sa %2$s",
+ "SystemSummaryWidget": "Sumarno",
+ "SystemSummaryNWebsites": "%d sajtova",
+ "SystemSummaryNSegments": "%d segmenata",
+ "SystemSummaryNActivatedPlugins": "%d aktiviranih dodataka",
+ "SystemSummaryPiwikVersion": "Verzija Piwik-a",
+ "SystemSummaryMysqlVersion": "Verzija MySQL-a",
+ "SystemSummaryPhpVersion": "Verzija PHP-a",
+ "QuickAccessTitle": "Pretraga za %s. Koristite tastere sa strelicama kako biste se kretali kroz rezultate pretrage. Prečica: pritisnite 'f' za pretragu.",
+ "MenuEntries": "Stavke menija",
+ "Segments": "Segmenti",
+ "AdblockIsMaybeUsed": "Ukoliko koristite bloker reklama, molimo vas da ga isključite na ovom sajtu kako biste bili sigurni da Piwik radi bez ikakvih problema.",
+ "ChangeCurrentWebsite": "Izaberite sajt, trenutno izabrani sajt je %s"
}
} \ No newline at end of file
diff --git a/plugins/CoreHome/lang/sv.json b/plugins/CoreHome/lang/sv.json
index 499c815014..94131423ae 100644
--- a/plugins/CoreHome/lang/sv.json
+++ b/plugins/CoreHome/lang/sv.json
@@ -25,7 +25,6 @@
"InjectedHostWarningIntro": "Du ansluter till Piwik från %1$s, men Piwik har konfigurerats att köras från den här adressen: %2$s.",
"JavascriptDisabled": "JavaScript måste vara aktiverat för att du ska kunna använda Piwik i standardläge.<br \/>Det verkar dock som att JavaScript antingen är inaktiverat eller att det inte stöds av din webbläsare..<br \/>För att använda standardläget, aktivera JavaScript genom att ändra din webbläsares inställningar, %1$sförsök sen igen%2$s.<br \/>",
"MainNavigation": "Huvudmenu",
- "MakeADifference": "Gör skillnad: %1$sDonera nu%2$s för att finansiera Piwik 2.0!",
"MakeOneTimeDonation": "Donera en engångssumma istället.",
"Menu": "Meny",
"NoPrivilegesAskPiwikAdmin": "Du är inloggad som '%1$s' men det verkar som om du inte har några rättigheter satta i Piwik. %2$s Fråga din Piwik administratör (klicka för att e-posta)%3$s för att få läsrättighet till en webbplats.",
diff --git a/plugins/CoreHome/lang/ta.json b/plugins/CoreHome/lang/ta.json
index b0f89a192c..90e6110cf8 100644
--- a/plugins/CoreHome/lang/ta.json
+++ b/plugins/CoreHome/lang/ta.json
@@ -9,7 +9,6 @@
"InjectedHostEmailBody": "வணக்கம், நான் இன்று Piwik அணுக முயற்சிசெய்யும் போது அறியப்படாத புரவலன்பெயர் எச்சரிக்கையை எதிர்கொண்டேன்.",
"InjectedHostEmailSubject": "piwik தெரியாத இந்த புரவலன் பேரில் இருந்து அணுகப்பட்டுள்ளது: %s",
"InjectedHostWarningIntro": "நீங்கள் இப்போது பிவிக்கை %1$s -ல் இருந்து இயக்குகிறீர்கள், ஆனால் பிவிக்கானது %2$s -முகவரியிலிருந்து இயங்க கட்டமைக்கப்பட்டுள்ளது.",
- "MakeADifference": "மாற்றுக : %1$s இப்போது அன்பளிக்க %2$s Piwik 2.0 இன் வளர்ச்சிக்கு!",
"MakeOneTimeDonation": "இல்லையேல் ஒருமுறை மட்டும் நன்கொடை செலுத்துங்கள்.",
"NoPrivilegesAskPiwikAdmin": "நீங்கள் '%1$s' -ஆக உள்நுழைந்துள்ளீர்கள், ஆனால் உங்களுக்கு பார்வை அனுமதி வழங்கப்படவில்லை. %2$s உங்களுடைய பிவிக் நிர்வாகியிடம் (மின்னஞ்சல் அனுப்ப)%3$s வலைதளத்தைப் \"பார்வையிட\" அனுமதி கேளுங்கள்.",
"PageOf": "%2$s ல் %1$s",
diff --git a/plugins/CoreHome/lang/tl.json b/plugins/CoreHome/lang/tl.json
index edfa0e610f..9d88540047 100644
--- a/plugins/CoreHome/lang/tl.json
+++ b/plugins/CoreHome/lang/tl.json
@@ -23,7 +23,6 @@
"InjectedHostSuperUserWarning": "Ang Piwik ay maaaring na-configure ng mali (halimbawa, kung inilipat kamakailan ang Piwik sa bagong server o URL). Maaari mong %1$s i-click dito at magdagdag ng %2$s bilang wastong Piwik hostname (kung pinagkakatiwalaan mo ito) %3$s, o %4$s i-click dito at pumunta sa %5$s upang ma-access ang Piwik ng ligtas %6$s.",
"InjectedHostWarningIntro": "Ina-access mo na ngayon Piwik mula sa %1$s, ngunit ang Piwik ay na-configure upang tumakbo sa address na ito: %2$s.",
"JavascriptDisabled": "Dapat mong i-enable ang Javascrip upang iyong magamit ang Piwik sa standard view. <br\/> tila ang JavaScript ay disabled o hindi suportado ng iyong browser. <br\/> Upang magamit ang standard view, paganahin ang JavaScript sa pamamagitan ng pagbabago ng iyong mga pagpipilian sa browser, pagkatapos ay %1$s subukang muli %2$s. <br\/>",
- "MakeADifference": "Gumawa ng isang pagkakaiba: %1$sMagbigay ng donasyon ngayon%2$s upang pondohan ang Piwik 2.0!",
"MakeOneTimeDonation": "Ang widget na ito ay ipinapakita lamang sa mga user na may Super User na access.",
"NoPrivilegesAskPiwikAdmin": "Ikaw ay naka-log-in bilang '%1$s' ngunit mukhang wala kang anumang pahintulot na naka-set sa Piwik. %2$s Tanungin ang iyong Piwik administrator (i-click upang i-email) %3$s upang bigyan ka ng 'view' access sa website.",
"PageOf": "%1$s ng %2$s",
diff --git a/plugins/CoreHome/lang/tr.json b/plugins/CoreHome/lang/tr.json
index 82b6af072d..c25cd34f33 100644
--- a/plugins/CoreHome/lang/tr.json
+++ b/plugins/CoreHome/lang/tr.json
@@ -21,7 +21,6 @@
"InjectedHostEmailBody": "Merhaba, bugün Piwik'e erişmeye çalıştım ve bilinmeyen host uyarısı ile karşılaştım.",
"InjectedHostEmailSubject": "Bilinmeyen bir sunucu Piwik'e erişti: %s",
"InjectedHostWarningIntro": "Şu anda Piwik'e %1$s 'den giriş yapıyorsunuz ama Piwik şu adreste çalışması için ayarlandı: %2$s.",
- "MakeADifference": "Farklılık yarat: Piwik 2.0'ı finanse etmek için şimdi %1$s bağışla %2$s",
"MakeOneTimeDonation": "Onun yerine bir defalık bağış yapın",
"Menu": "Menü",
"PageOf": "%1$s nin %2$s",
diff --git a/plugins/CoreHome/lang/uk.json b/plugins/CoreHome/lang/uk.json
index 54ec682b22..197814814d 100644
--- a/plugins/CoreHome/lang/uk.json
+++ b/plugins/CoreHome/lang/uk.json
@@ -25,7 +25,6 @@
"InjectedHostWarningIntro": "Зараз ви заходите в Piwik на %1$s, але Piwik був налаштований на цю адресу: %2$s.",
"JavascriptDisabled": "JavaScript Вам необхідно включити для коректного стандартного відображення Piwik.<br \/>Якщо Ви читаєте це повідомлення, значить JavaScript заборонений, або не підтримується вашим браузером.<br \/>Для використання стандартного виду, активуйте JavaScript в налаштуваннях вашого браузера, потім %1$sспробуйте оновити сторінку%2$s.<br \/>",
"MainNavigation": "Основна навігація",
- "MakeADifference": "Зробіть свій внесок: %1$sЗробіть внесок зараз%2$s для фінансування Piwik 2.0!",
"MakeOneTimeDonation": "Зробити тільки пожертвування (без передплати).",
"Menu": "Меню",
"NoPrivilegesAskPiwikAdmin": "Ви авторизовані як '%1$s', але, здається, для вас не встановлені права в Piwik. %2$s Попросіть вашого адміністратора (натисніть, щоб написати лист)%3$s надати вам доступ для \"перегляду\" до статистики сайту.",
diff --git a/plugins/CoreHome/lang/vi.json b/plugins/CoreHome/lang/vi.json
index 73056da87b..5bf5a2e9eb 100644
--- a/plugins/CoreHome/lang/vi.json
+++ b/plugins/CoreHome/lang/vi.json
@@ -23,7 +23,6 @@
"InjectedHostSuperUserWarning": "Piwik có thể bị cấu hình sai (ví dụ, Piwik gần đây được dời sang máy chủ khác hoặc URL khác). Bạn có thể %1$snhấn vào đây và thêm %2$s như là tên máy chủ hợp lệ%3$s, hoặc %4$snhấn vào đây để đi đến %5$s để truy cập Piwik một cách an toàn%6$s",
"InjectedHostWarningIntro": "Bây giờ bạn đang truy cập Piwik từ %1$s, nhưng Piwik đã được cấu hình để chạy tại địa chỉ này: %2$s",
"JavascriptDisabled": "JavaScript phải được cho phép trong trường hợp bạn sử dụng Piwik với hiển thị tiêu chuẩn. <br \/>Tuy nhiên, có thể là JavaScript đã bị chặn hoặc trình duyệt của bạn không hỗ trợ.<br \/> Để sử dụng hiển thị tiêu chuẩn, vui lòng bật JavaScript bằng cách thay đổi tùy biến trình duyệt của bạn, sau đó %1$sthử lại%2$s.<br \/>",
- "MakeADifference": "Hãy tạo sự khác biệt: %1$s Đóng góp ngay bây giờ %2$s cho quỹ Piwik 2.0!",
"MakeOneTimeDonation": "Hãy đóng góp",
"NoPrivilegesAskPiwikAdmin": "Bạn được đăng nhập như '%1$s' nhưng dường như bạn không được phép thiết lập trong Piwik. %2$s Yêu cầu quản trị Piwik của bạn (bấm vào để email) %3$s để cung cấp cho bạn 'xem' truy cập đến một website.",
"PageOf": "%1$s của %2$s",
diff --git a/plugins/CoreHome/lang/zh-cn.json b/plugins/CoreHome/lang/zh-cn.json
index b479dcbb37..d38a0e8c5f 100644
--- a/plugins/CoreHome/lang/zh-cn.json
+++ b/plugins/CoreHome/lang/zh-cn.json
@@ -25,7 +25,6 @@
"InjectedHostWarningIntro": "您现在是通过 %1$s 访问 Piwik,但 Piwik 设置的地址是: %2$s.",
"JavascriptDisabled": "使用 Piwik 的标准视图时必须启用 JavaScript。<br \/>然而,看来您的浏览器已停用或不支持 JavaScript。<br \/>若要使用标准视图,请修改您的浏览器选项并启用 JavaScript, 然后%1$s重试一次%2$s。<br \/>",
"MainNavigation": "主导航",
- "MakeADifference": "现在就%1$s捐款%2$s给 Piwik 2.0 !",
"MakeOneTimeDonation": "一次性捐款",
"Menu": "菜单",
"NoPrivilegesAskPiwikAdmin": "您当前登录用户是 '%1$s' 但是没有 Piwik 权限。%2$s 联系 Piwik 管理员 (点击发送邮件)%3$s 获得 '查看' 权限。",
diff --git a/plugins/CoreHome/stylesheets/zen-mode.less b/plugins/CoreHome/stylesheets/zen-mode.less
index d15814952a..e80b9fc12e 100644
--- a/plugins/CoreHome/stylesheets/zen-mode.less
+++ b/plugins/CoreHome/stylesheets/zen-mode.less
@@ -64,7 +64,7 @@
}
.goalEntry {
- border-bottom: 0px;
+ border-bottom: 0;
}
.relatedReferrerReports {
diff --git a/plugins/CoreHome/templates/_singleWidget.twig b/plugins/CoreHome/templates/_singleWidget.twig
new file mode 100644
index 0000000000..9c2cd98bbe
--- /dev/null
+++ b/plugins/CoreHome/templates/_singleWidget.twig
@@ -0,0 +1,3 @@
+<div piwik-content-block content-title="{{ title|translate|e('html_attr') }}">
+ {{ content|raw }}
+</div> \ No newline at end of file
diff --git a/plugins/CorePluginsAdmin/Controller.php b/plugins/CorePluginsAdmin/Controller.php
index fc201f4c2d..f4d08fc12a 100644
--- a/plugins/CorePluginsAdmin/Controller.php
+++ b/plugins/CorePluginsAdmin/Controller.php
@@ -371,6 +371,8 @@ class Controller extends Plugin\ControllerAdmin
public function safemode($lastError = array())
{
+ ob_clean();
+
$this->tryToRepairPiwik();
if (empty($lastError)) {
diff --git a/plugins/CorePluginsAdmin/Widgets/GetNewPlugins.php b/plugins/CorePluginsAdmin/Widgets/GetNewPlugins.php
index e19259c66a..a45b35e0b6 100644
--- a/plugins/CorePluginsAdmin/Widgets/GetNewPlugins.php
+++ b/plugins/CorePluginsAdmin/Widgets/GetNewPlugins.php
@@ -32,7 +32,7 @@ class GetNewPlugins extends Widget
// TODO it actually shows "recently updated plugins currently". Need a new sort filter in the Marketplace
// TODO when decided whether to show new plugins or recently updated plugins add translation key
// we want to show new plugins likely (when changed Marketplace to support actually "newest" plugins)
- $config->setName('Latest Piwik Plugin Updates');
+ $config->setName('Latest Marketplace Updates');
$config->setOrder(19);
}
diff --git a/plugins/CorePluginsAdmin/angularjs/field/field.directive.js b/plugins/CorePluginsAdmin/angularjs/field/field.directive.js
index 8bfd41ebcf..1268fb881f 100644
--- a/plugins/CorePluginsAdmin/angularjs/field/field.directive.js
+++ b/plugins/CorePluginsAdmin/angularjs/field/field.directive.js
@@ -17,6 +17,8 @@
* description=""
* introduction=""
* name=""
+ * placeholder=""
+ * rows="3"
* autocomplete="off"
* disabled="true"
* full-width="true"
@@ -54,7 +56,9 @@
templateFile: '@',
fullWidth: '@',
maxlength: '@',
- required: '@'
+ required: '@',
+ placeholder: '@',
+ rows: '@'
},
template: '<div piwik-form-field="field"></div>',
link: function(scope, elm, attrs, ctrl) {
@@ -114,7 +118,7 @@
}
var i = 0, attribute;
- var attributes = ['disabled', 'autocomplete', 'tabindex', 'autofocus', 'required', 'maxlength'];
+ var attributes = ['disabled', 'autocomplete', 'tabindex', 'autofocus', 'rows', 'required', 'maxlength', 'placeholder'];
for (i; i < attributes.length; i++) {
attribute = attributes[i];
if (!!$scope[attribute]) {
@@ -130,6 +134,14 @@
}
});
+ if ('undefined' !== typeof $scope.placeholder && $scope.placeholder !== null) {
+ $scope.$watch('placeholder', function (val, oldVal) {
+ if (val !== oldVal) {
+ $scope.field.uiControlAttributes.placeholder = val;
+ }
+ });
+ }
+
$scope.$watch('disabled', function (val, oldVal) {
if (val !== oldVal) {
$scope.field.uiControlAttributes.disabled = val;
diff --git a/plugins/CorePluginsAdmin/angularjs/form-field/field-textarea.html b/plugins/CorePluginsAdmin/angularjs/form-field/field-textarea.html
index d6336bb888..a52d05cb72 100644
--- a/plugins/CorePluginsAdmin/angularjs/form-field/field-textarea.html
+++ b/plugins/CorePluginsAdmin/angularjs/form-field/field-textarea.html
@@ -1,6 +1,7 @@
<div>
<textarea name="{{ formField.name }}"
piwik-attributes="{{formField.uiControlAttributes}}"
+ id="{{ formField.name }}"
ng-model="formField.value"
class="materialize-textarea"
></textarea>
diff --git a/plugins/CorePluginsAdmin/lang/ar.json b/plugins/CorePluginsAdmin/lang/ar.json
index 332305ceff..c6b9067f05 100644
--- a/plugins/CorePluginsAdmin/lang/ar.json
+++ b/plugins/CorePluginsAdmin/lang/ar.json
@@ -34,7 +34,6 @@
"PluginUpdateAvailable": "أنت تستخدم الإصدار %1$s %2$sويوجد إصدار جديد متاح",
"PluginWebsite": "الموقع الإلكتروني للإضافة",
"Screenshots": "صور العرض",
- "SortByAlpha": "الفا",
"Status": "الحالة",
"StepUnzippingPlugin": "إستخراج الإضافة",
"StepUnzippingTheme": "إستخراج الثيم",
diff --git a/plugins/CorePluginsAdmin/lang/bg.json b/plugins/CorePluginsAdmin/lang/bg.json
index f3e24c034f..f740354b04 100644
--- a/plugins/CorePluginsAdmin/lang/bg.json
+++ b/plugins/CorePluginsAdmin/lang/bg.json
@@ -21,7 +21,6 @@
"Deactivate": "Деактивирай",
"Developer": "Разработчик",
"DoMoreContactPiwikAdmins": "За да се инсталира нова добавка или нова тема, трябва да се свържете с вашия администратор, който отговаря за Piwik.",
- "EmailToEnquireUpdatedVersion": "Моля, пишете до %1$s и изискайте актуална версия на %2$s.",
"FeaturedPlugin": "Препоръчана добавка",
"GetEarlyAccessForPaidPlugins": "Забележка: всички от наличните добавки са безплатни за използване; в бъдеще ще има платена секция в магазина за приложения (%1$sсвържете се с нас%2$s за предварителен достъп).",
"History": "История",
@@ -61,9 +60,6 @@
"PluginVersionInfo": "%1$s от %2$s",
"PluginWebsite": "Сайт за добавки",
"Screenshots": "Екранни снимки",
- "SortByAlpha": "по азбучен ред",
- "SortByNewest": "най-новите",
- "SortByPopular": "популярно",
"Status": "Състояние",
"StepDownloadingPluginFromMarketplace": "Сваляне на добавка от магазина за приложения",
"StepDownloadingThemeFromMarketplace": "Сваляне на тапет от магазина за приложения",
@@ -78,8 +74,6 @@
"SuccessfullyActicated": "Успешно беше активирано <strong>%s<\/strong>.",
"Support": "Поддръжка",
"TeaserExtendPiwik": "Разширете възможностите на Piwik с добавки и тапети",
- "TeaserExtendPiwikByPlugin": "Разширяване на възможностите на Piwik, чрез нова добавка",
- "TeaserExtendPiwikByTheme": "Насладете се на друг изглед и усещане инсталирайки нов тапет",
"TeaserExtendPiwikByUpload": "Разширяване на възможностите на Piwik, чрез добавяне на zip файл",
"Theme": "Тапет",
"Themes": "Тапети",
diff --git a/plugins/CorePluginsAdmin/lang/cs.json b/plugins/CorePluginsAdmin/lang/cs.json
index 438d601d9e..3cdbeb2baf 100644
--- a/plugins/CorePluginsAdmin/lang/cs.json
+++ b/plugins/CorePluginsAdmin/lang/cs.json
@@ -23,7 +23,6 @@
"Developer": "Vývojář",
"DevelopersLearnHowToDevelopPlugins": "Vývojáři: naučte se, jak rozšířit Piwik vývojem %1$szásuvných modulů nebo témat vzhledu%2$s.",
"DoMoreContactPiwikAdmins": "Pokud chcete nainstalovat nový zásuvný modul nebo šablonu,, kontaktujte vaše administrátory Piwiku.",
- "EmailToEnquireUpdatedVersion": "Napište e-mail %1$s a požádejte o novější verzi %2$s.",
"FeaturedPlugin": "Doporučovaný zásuvný modul",
"ChangeLookByManageThemes": "Vzhled Piwiku můžete změnit %1$sve správě motivů%2$s.",
"GetEarlyAccessForPaidPlugins": "Poznámka: Momentálně jsou všechny zásuvné moduly v obchodě zdarma. V budoucnu máme v plánu povolit placené zásuvné moduly. %1$sKontaktujte nás%2$s pro včasný přístup.",
@@ -35,6 +34,8 @@
"InstallingPlugin": "Instalování %s",
"InstallNewPlugins": "Instalovat nové zásuvné moduly",
"InstallNewThemes": "Instalovat nové šablony",
+ "InstalledPlugins": "Nainstalované zásuvné moduly",
+ "InstalledThemes": "Nainstalovaná témata vzhledu",
"LastCommitTime": "(Poslední změna %s)",
"LastUpdated": "Naposledy aktualizován",
"LicenseHomepage": "Licencovat domovskou stránku",
@@ -51,6 +52,7 @@
"MissingRequirementsPleaseInstallNotice": "Prosím nainstalujte %1$s %2$s, protože je vyžadován %3$s.",
"NewVersion": "nová verze",
"NoPluginsFound": "Žádné zásuvné moduly nenalezeny",
+ "NoPluginSettings": "Žádná nastavení zásuvného modulu, která by bylo možné nastavit",
"NotAllowedToBrowseMarketplacePlugins": "Můžete si projít zásuvné moduly, které rozšiřují možnosti Piwik platformy. Pokud některý z nich potřebujete, kontaktujte administrátora.",
"NotAllowedToBrowseMarketplaceThemes": "Můžete si projít seznam šablon, které mohou být instalovány k přizpůsobení vzhledu Piwik platformy. Pokud nějakou z nich chcete použít, kontaktujte administrátora.",
"NoThemesFound": "Nenalezeny žádné šablony",
@@ -70,9 +72,9 @@
"PluginVersionInfo": "%1$s z %2$s",
"PluginWebsite": "Stránky zásuvného modulu",
"Screenshots": "Snímky obrazovky",
- "SortByAlpha": "alfa",
- "SortByNewest": "nejnovější",
- "SortByPopular": "populární",
+ "SortByAlpha": "Alfa",
+ "SortByNewest": "Nejnovější",
+ "SortByPopular": "Oblíbené",
"Status": "Stav",
"StepDownloadingPluginFromMarketplace": "Stahování zásuvného modulu z obchodu",
"StepDownloadingThemeFromMarketplace": "Stahování šablony z obchodu",
@@ -87,8 +89,8 @@
"SuccessfullyActicated": "Úspěšně jste aktivovali <strong>%s<\/strong>.",
"Support": "Podpora",
"TeaserExtendPiwik": "Rozšiřte Piwik s použitím zásuvných modulů a šablon",
- "TeaserExtendPiwikByPlugin": "Rozšiřte Piwik instalací nového zásuvného modulu",
- "TeaserExtendPiwikByTheme": "Užijte si jiný vzhled po instalaci nové šablony",
+ "TeaserExtendPiwikByPlugin": "Rozšiřte Piwik %1$sinstalací nového zásuvného modulu%2$s.",
+ "TeaserExtendPiwikByTheme": "Užijte si nový vzhled po %1$sinstalaci nového vzhledu%2$s.",
"TeaserExtendPiwikByUpload": "Rozšiřte Piwik nahráním zip souboru",
"InstallingNewPluginViaMarketplaceOrUpload": "Můžete zásuvný modul nainstalovat automaticky z obchodu, %1$snebo ho nahrát%2$s ve formátu .zip.",
"Theme": "Šablona",
@@ -101,6 +103,7 @@
"UploadZipFile": "Nahrát zip soubor",
"Version": "Verze",
"ViewRepositoryChangelog": "Zobrazit změny",
+ "ViewAllMarketplacePlugins": "Zobrazit všechny zásuvné moduly v marketplace zásuvných modulů",
"Websites": "Stránky"
}
} \ No newline at end of file
diff --git a/plugins/CorePluginsAdmin/lang/da.json b/plugins/CorePluginsAdmin/lang/da.json
index 324326c7d7..734ea080aa 100644
--- a/plugins/CorePluginsAdmin/lang/da.json
+++ b/plugins/CorePluginsAdmin/lang/da.json
@@ -23,7 +23,6 @@
"Developer": "Udvikler",
"DevelopersLearnHowToDevelopPlugins": "Udviklere: Lær hvordan du kan udvide og tilpasse Piwik ved at %1$sudvikle udvidelser eller temaer%2$s.",
"DoMoreContactPiwikAdmins": "For at installere en ny programudvidelse eller et nyt tema, kontakt Piwik administratoren.",
- "EmailToEnquireUpdatedVersion": "Send e-mail til %1$s og forespørg om en opdateret version af %2$s.",
"FeaturedPlugin": "Udvalgte programudvidelser",
"ChangeLookByManageThemes": "Skift udseendet på Piwik med %1$sAdministration af temaer%2$s.",
"GetEarlyAccessForPaidPlugins": "Bemærk: alle programudvidelser er tilgængelige gratis på nuværende tidspunkt; i fremtiden vil vi sætte betalte programudvidelser på markedspladsen (%1$skontakt os%2$s for tidlig adgang).",
@@ -70,9 +69,6 @@
"PluginVersionInfo": "%1$s fra %2$s",
"PluginWebsite": "Programudvidelsens hjemmeside",
"Screenshots": "Skærmbilleder",
- "SortByAlpha": "alpha",
- "SortByNewest": "nyeste",
- "SortByPopular": "populær",
"Status": "Status",
"StepDownloadingPluginFromMarketplace": "Henter programudvidelse fra markedspladsen",
"StepDownloadingThemeFromMarketplace": "Henter tema fra markedspladsen",
@@ -87,8 +83,6 @@
"SuccessfullyActicated": "Du har aktiveret <strong>%s<\/strong>.",
"Support": "Support",
"TeaserExtendPiwik": "Udvid Piwik med programudvidelser og temaer",
- "TeaserExtendPiwikByPlugin": "Udvid Piwik ved at installere en ny programudvidelse",
- "TeaserExtendPiwikByTheme": "Ændre udseendet ved at installere et nyt tema",
"TeaserExtendPiwikByUpload": "Udvid Piwik ved at overføre en ZIP-fil",
"InstallingNewPluginViaMarketplaceOrUpload": "De kan automatisk installere udvidelser fra markedspladsen eller %1$soverføre en udvidelse%2$s i .zip format.",
"Theme": "Tema",
diff --git a/plugins/CorePluginsAdmin/lang/de.json b/plugins/CorePluginsAdmin/lang/de.json
index 4597571372..1696d929d7 100644
--- a/plugins/CorePluginsAdmin/lang/de.json
+++ b/plugins/CorePluginsAdmin/lang/de.json
@@ -23,7 +23,6 @@
"Developer": "Entwickler",
"DevelopersLearnHowToDevelopPlugins": "Für Entwickler: Lernen Sie wie Sie Piwik erweitern und personalisieren können, in dem Sie %1$sPlugins oder Themes entwickeln%2$s.",
"DoMoreContactPiwikAdmins": "Um ein neues Plugin oder Theme zu installieren, treten Sie bitte in Kontakt mit Ihren Piwik-Admins.",
- "EmailToEnquireUpdatedVersion": "Bitte schreiben Sie eine E-Mail and %1$s und fragen Sie nach einer aktualisierten Version von %2$s.",
"FeaturedPlugin": "Top-Plugin",
"ChangeLookByManageThemes": "Sie können das Erscheinungsbild von Piwik mit dem Einsatz von %1$sThemes%2$s ändern.",
"GetEarlyAccessForPaidPlugins": "Hinweis: Derzeit sind alle Plugins kostenlos erhältlich; In Zukunft werden wir auch bezahlte Plugins im Marketplace aktivieren (%1$sKontaktieren Sie uns%2$s für vorzeitigen Zugriff).",
@@ -35,6 +34,8 @@
"InstallingPlugin": "Installiere %s",
"InstallNewPlugins": "Neue Plugins installieren",
"InstallNewThemes": "Neue Themes installieren",
+ "InstalledPlugins": "Installierte Plugins",
+ "InstalledThemes": "Installierte Themes",
"LastCommitTime": "(letzter Commit %s)",
"LastUpdated": "Letzte Aktualisierung",
"LicenseHomepage": "Lizenz-Website",
@@ -51,6 +52,7 @@
"MissingRequirementsPleaseInstallNotice": "Bitte installiere %1$s %2$s da es von %3$s benötigt wird.",
"NewVersion": "Neue Version",
"NoPluginsFound": "Keine Plugins gefunden",
+ "NoPluginSettings": "Es gibt keine Einstellungen dieser Erweiterung, die konfiguriert werden können",
"NotAllowedToBrowseMarketplacePlugins": "Sie können die Liste der installierbaren Plugins durchforsten, um sie für Ihre Plattform anzupassen oder zu erweitern. Bitte kontaktieren Sie Ihren Administrator, wenn Sie eines dieser Plugins installiert haben möchten.",
"NotAllowedToBrowseMarketplaceThemes": "Sie können die Liste der installierbaren Themes durchforsten, um das Erscheinungsbild Ihrer Plattform anzupassen. Bitte kontaktieren Sie Ihren Administrator wenn Sie eines dieser Themes installiert haben möchten.",
"NoThemesFound": "Keine Themes gefunden",
@@ -71,8 +73,8 @@
"PluginWebsite": "Website des Plugins",
"Screenshots": "Screenshots",
"SortByAlpha": "Alpha",
- "SortByNewest": "neu",
- "SortByPopular": "beliebt",
+ "SortByNewest": "Neueste",
+ "SortByPopular": "Beliebt",
"Status": "Status",
"StepDownloadingPluginFromMarketplace": "Download des Plugins aus dem Marketplace",
"StepDownloadingThemeFromMarketplace": "Download des Themes aus dem Marketplace",
@@ -87,8 +89,8 @@
"SuccessfullyActicated": "Sie haben <strong>%s<\/strong> erfolgreich aktiviert.",
"Support": "Support",
"TeaserExtendPiwik": "Erweitere Piwik mit Plugins und Themes",
- "TeaserExtendPiwikByPlugin": "Erweitern Sie Piwik durch die Installation von Plugins",
- "TeaserExtendPiwikByTheme": "Wechseln Sie das Erscheinungsbild durch die Installation eines neuen Themes",
+ "TeaserExtendPiwikByPlugin": "Erweitern Sie Piwik durch die %1$sInstallation eines neuen Plugins%2$s.",
+ "TeaserExtendPiwikByTheme": "Wechseln Sie das Erscheinungsbild durch die %1$sInstallation eines neuen Themes%2$s.",
"TeaserExtendPiwikByUpload": "Piwik durch den Upload einer ZIP Datei erweitern",
"InstallingNewPluginViaMarketplaceOrUpload": "Sie können Plugins aus dem Marketplace automatisiert installieren oder ein Plugin im .zip Format %1$shochladen%2$s.",
"Theme": "Theme",
@@ -101,6 +103,7 @@
"UploadZipFile": "Zip-Datei hochladen",
"Version": "Version",
"ViewRepositoryChangelog": "Änderungen ansehen",
+ "ViewAllMarketplacePlugins": "Alle Marketplace Plugins anzeigen",
"Websites": "Websites"
}
} \ No newline at end of file
diff --git a/plugins/CorePluginsAdmin/lang/el.json b/plugins/CorePluginsAdmin/lang/el.json
index 206e78c19d..f2a09685fa 100644
--- a/plugins/CorePluginsAdmin/lang/el.json
+++ b/plugins/CorePluginsAdmin/lang/el.json
@@ -23,7 +23,6 @@
"Developer": "Προγραμματιστής",
"DevelopersLearnHowToDevelopPlugins": "Προγραμματιστές: Μάθετε πώς να επεκτείνετε και να προσαρμόζετε το Piwik %1$sδημιουργώντας πρόσθετα ή θέματα%2$s.",
"DoMoreContactPiwikAdmins": "Για να εγκαταστήσετε ένα νέο πρόσθετο ή θέμα, ελάτε σε επαφή με τους διαχειριστές του Piwik.",
- "EmailToEnquireUpdatedVersion": "Παρακαλούμε στείλτε email στο %1$s και ζητήστε ενημέρωση της έκδοσης για το %2$s.",
"FeaturedPlugin": "Προβαλλόμενο πρόσθετο",
"ChangeLookByManageThemes": "Μπορείτε να αλλάξετε την εμφάνιση του Piwik από τη %1$sΔιαχείριση Θεμάτων%2$s.",
"GetEarlyAccessForPaidPlugins": "Σημείωση: Όλα τα πρόσθετα είναι διαθέσιμα δωρεάν αυτή τη στιγμή. Στο μέλλον θα ενεργοποιήσουμε τα Πρόσθετα επί Πληρωμή στην Αγορά (%1$sεπικοινωνήστε μαζί μας%2$s για νωρίτερη πρόσβαση).",
@@ -35,6 +34,8 @@
"InstallingPlugin": "Γίνεται εγκατάσταση του %s",
"InstallNewPlugins": "Εγκατάσταση νέων πρόσθετων",
"InstallNewThemes": "Εγκατάσταση νέων θεμάτων",
+ "InstalledPlugins": "Εγκατεστημένα Πρόσθετα",
+ "InstalledThemes": "Εγκατεστημένα Θέματα",
"LastCommitTime": "(τελευταία οριστικοποίηση %s)",
"LastUpdated": "Τελευταία Ενημέρωση",
"LicenseHomepage": "Ιστοσελίδα Άδειας",
@@ -51,6 +52,7 @@
"MissingRequirementsPleaseInstallNotice": "Παρακαλούμε εγκαταστήστε τα %1$s %2$s καθώς απαιτούνται από το %3$s.",
"NewVersion": "νέα έκδοση",
"NoPluginsFound": "Δε βρέθηκαν πρόσθετα",
+ "NoPluginSettings": "Δεν υπάρχουν ρυθμίσεις που μπορούν να παραμετροποιηθούν",
"NotAllowedToBrowseMarketplacePlugins": "Μπορείτε να δείτε τη λίστα των πρόσθετων που μπορούν να εγκατασταθούν για να προσαρμόσετε ή να επεκτείνετε την πλατφόρμα του Piwik. Παρακαλούμε επικοινωνήστε με τον διαχειριστή σας αν χρειάζεστε κάποιο από αυτά να εγκατασταθεί.",
"NotAllowedToBrowseMarketplaceThemes": "Μπορείτε να δείτε τη λίστα των θεμάτων που μπορούν να εγκατασταθούν για να προσαρμόσετε την εμφάνιση της πλατφόρμας του Piwik. Παρακαλούμε επικοινωνήστε με τον διαχειριστή σας αν χρειάζεστε κάποιο από αυτά να εγκατασταθεί.",
"NoThemesFound": "Δε βρέθηκαν θέματα",
@@ -70,9 +72,9 @@
"PluginVersionInfo": "%1$s από %2$s",
"PluginWebsite": "Ιστοτόπος πρόσθετου",
"Screenshots": "Παραδείγματα οθονών",
- "SortByAlpha": "άλφα",
- "SortByNewest": "νεότερο",
- "SortByPopular": "δημοφιλές",
+ "SortByAlpha": "Άλφα",
+ "SortByNewest": "Νεότερα",
+ "SortByPopular": "Δημοφιλή",
"Status": "Κατάσταση",
"StepDownloadingPluginFromMarketplace": "Κατέβασμα του πρόσθετου από την Αγορά",
"StepDownloadingThemeFromMarketplace": "Κατέβασμα του θέματος από την Αγορά",
@@ -87,8 +89,8 @@
"SuccessfullyActicated": "Ενεργοποιήσατε με επιτυχία το <strong>%s<\/strong>.",
"Support": "Υποστήριξη",
"TeaserExtendPiwik": "Επέκταση του Piwik με Πρόσθετα και Θέματα",
- "TeaserExtendPiwikByPlugin": "Επεκτείνετε το Piwik εγκαθιστώντας ένα νέο πρόσθετο",
- "TeaserExtendPiwikByTheme": "Απολαύστε μια άλλη όψη & αίσθηση εγκαθιστώντας ένα νέο θέμα",
+ "TeaserExtendPiwikByPlugin": "Επέκταση του Piwik με %1$sεγκατάσταση νέου πρόσθετου%2$s.",
+ "TeaserExtendPiwikByTheme": "Χαρείτε μια άλλη όψη και αίσθηση %1$sεγκαθιστώντας ένα νέο θέμα%2$s.",
"TeaserExtendPiwikByUpload": "Επεκτείνετε το Piwik ανεβάζοντας ένα αρχείο ZIP",
"InstallingNewPluginViaMarketplaceOrUpload": "Μπορείτε να εγκαθιστάτε αυτόματα πρόσθετα από την Αγορά ή %1$sνα ανεβάσετε ένα πρόσθετο%2$s σε μορφή .zip.",
"Theme": "Θεματική παραλλαγή",
@@ -101,6 +103,7 @@
"UploadZipFile": "Ανέβασμα του αρχείου ZIP",
"Version": "Έκδοση",
"ViewRepositoryChangelog": "Εμφάνιση των αλλαγών",
+ "ViewAllMarketplacePlugins": "Εμφάνιση όλων των πρόσθετων στην Αγορά",
"Websites": "Ιστοτόποι"
}
} \ No newline at end of file
diff --git a/plugins/CorePluginsAdmin/lang/en.json b/plugins/CorePluginsAdmin/lang/en.json
index 124b5d7293..0519947747 100644
--- a/plugins/CorePluginsAdmin/lang/en.json
+++ b/plugins/CorePluginsAdmin/lang/en.json
@@ -104,6 +104,7 @@
"Version": "Version",
"ViewRepositoryChangelog": "View the changes",
"ViewAllMarketplacePlugins": "View all Marketplace plugins",
- "Websites": "Websites"
+ "Websites": "Websites",
+ "WeDeactivatedThePluginAsItHasMissingDependencies": "We disabled the plugin %s as it has missing dependencies:"
}
-} \ No newline at end of file
+}
diff --git a/plugins/CorePluginsAdmin/lang/es.json b/plugins/CorePluginsAdmin/lang/es.json
index b4a91d7d0a..43a5db73e2 100644
--- a/plugins/CorePluginsAdmin/lang/es.json
+++ b/plugins/CorePluginsAdmin/lang/es.json
@@ -23,7 +23,6 @@
"Developer": "Desarrollador",
"DevelopersLearnHowToDevelopPlugins": "Desarrolladores: Aprenda como extender y personalizar Piwik %1$sdesarrollando complementos o temas%2$s.",
"DoMoreContactPiwikAdmins": "Para instalar un nuevo complemento o un nuevo tema, póngase en contacto con sus administradores de Piwik.",
- "EmailToEnquireUpdatedVersion": "Por favor envíe un correo electrónico a %1$s para solicitar mayor información sobre una versión actualizada de %2$s.",
"FeaturedPlugin": "Complemento destacado",
"ChangeLookByManageThemes": "Puede cambiar la apariencia de Piwik %1$sgestionando temas%2$s.",
"GetEarlyAccessForPaidPlugins": "Nota: por el momento todos los complementos están disponibles gratuitamente, en el futuro habilitaremos la sección Complementos de Pago en el Mercado (%1$scontáctenos %2$s para tener acceso de un modo temprano).",
@@ -35,6 +34,8 @@
"InstallingPlugin": "Instalando %s",
"InstallNewPlugins": "Instalar nuevos complementos",
"InstallNewThemes": "Instalar nuevos temas",
+ "InstalledPlugins": "Complementos instalados",
+ "InstalledThemes": "Temas instalados",
"LastCommitTime": "(último cambio %s)",
"LastUpdated": "Última actualización",
"LicenseHomepage": "Página de la licencia",
@@ -51,6 +52,7 @@
"MissingRequirementsPleaseInstallNotice": "Por favor instale %1$s %2$s en tanto es requerido por %3$s.",
"NewVersion": "nueva versión",
"NoPluginsFound": "No se encontraron complementos",
+ "NoPluginSettings": "No hay ajustes para este complemento que puedan ser configurados",
"NotAllowedToBrowseMarketplacePlugins": "Puedes navegar la lista de complementos que se pueden instalar para personalizar o extender su plataforma Piwik. Por favor contáctese con el administrador si desea que sea instalado uno de ellos.",
"NotAllowedToBrowseMarketplaceThemes": "Puede navegar la lista de temas que se pueden instalar para personalizar el estilo de su plataforma Piwik. Por favor contáctese con el administrador si desea que sea instalado uno de ellos.",
"NoThemesFound": "No se encontraron temas",
@@ -70,9 +72,9 @@
"PluginVersionInfo": "%1$s de %2$s",
"PluginWebsite": "Sitio de internet del complemento",
"Screenshots": "Capturas de pantalla",
- "SortByAlpha": "alfa",
- "SortByNewest": "más reciente",
- "SortByPopular": "popular",
+ "SortByAlpha": "Alfa",
+ "SortByNewest": "Más reciente",
+ "SortByPopular": "Popular",
"Status": "Estado",
"StepDownloadingPluginFromMarketplace": "Descargando complemento del Mercado",
"StepDownloadingThemeFromMarketplace": "Descargando tema del Mercado",
@@ -87,8 +89,8 @@
"SuccessfullyActicated": "<strong>%s<\/strong> ha sido activado con éxito.",
"Support": "Asistencia",
"TeaserExtendPiwik": "Amplíe Piwik con complementos y temas",
- "TeaserExtendPiwikByPlugin": "Amplíe Piwik instalando un nuevo complemento",
- "TeaserExtendPiwikByTheme": "Disfrute de otra apariencia instalando un nuevo tema",
+ "TeaserExtendPiwikByPlugin": "Amplíe Piwik %1$sinstalando un nuevo complemento%2$s.",
+ "TeaserExtendPiwikByTheme": "Disfrute de otra apariencia y estilo %1$sinstalado un nuevo tema%2$s.",
"TeaserExtendPiwikByUpload": "Amplíe Piwik cargando un archivo ZIP",
"InstallingNewPluginViaMarketplaceOrUpload": "Puede automáticamente instalar complementos desde el Mercado o %1$scargar un complemento%2$s in formato .zip.",
"Theme": "Tema",
@@ -101,6 +103,7 @@
"UploadZipFile": "Carga un archivo ZIP",
"Version": "Versión",
"ViewRepositoryChangelog": "Ver cambios",
+ "ViewAllMarketplacePlugins": "Ver todos los complementos del Marketplace",
"Websites": "Sitios de internet"
}
} \ No newline at end of file
diff --git a/plugins/CorePluginsAdmin/lang/et.json b/plugins/CorePluginsAdmin/lang/et.json
index 24a456f98d..1d324dfac8 100644
--- a/plugins/CorePluginsAdmin/lang/et.json
+++ b/plugins/CorePluginsAdmin/lang/et.json
@@ -43,9 +43,6 @@
"PluginVersionInfo": "%1$s, tuli: %2$s",
"PluginWebsite": "Lisatarkvara veebileht",
"Screenshots": "Ekraanitõmmised",
- "SortByAlpha": "alfa",
- "SortByNewest": "uusimad",
- "SortByPopular": "populaarsed",
"Status": "Olek",
"StepDownloadingPluginFromMarketplace": "Laen marketist lisatarkvara alla",
"StepDownloadingThemeFromMarketplace": "Laen alla kujundust marketist",
@@ -55,7 +52,6 @@
"StepUnzippingTheme": "Pakin kujundust lahti",
"Support": "Tugi",
"TeaserExtendPiwik": "Laienda Piwikut lisatarkvara ja kujunduste abil",
- "TeaserExtendPiwikByPlugin": "Laienda Piwikut paigaldades lisatarkvara",
"Theme": "Kujundus",
"Themes": "Kujundused",
"ThemesManagement": "Halda kujundusi",
diff --git a/plugins/CorePluginsAdmin/lang/fa.json b/plugins/CorePluginsAdmin/lang/fa.json
index d59c73100d..0780821319 100644
--- a/plugins/CorePluginsAdmin/lang/fa.json
+++ b/plugins/CorePluginsAdmin/lang/fa.json
@@ -54,9 +54,6 @@
"PluginVersionInfo": "%1$s از %2$s",
"PluginWebsite": "سایت افزونه",
"Screenshots": "تصاویر",
- "SortByAlpha": "آلفا",
- "SortByNewest": "جدیدترین",
- "SortByPopular": "عمومی",
"Status": "وضعیت",
"StepDownloadingPluginFromMarketplace": "دانلود پلاگین از بازار",
"StepDownloadingThemeFromMarketplace": "دانلود زمینه از بازار",
@@ -71,8 +68,6 @@
"SuccessfullyActicated": "شما با موفقیت <strong>%s<\/strong> را فعال کردید.",
"Support": "پشتیبانی",
"TeaserExtendPiwik": "Piwik را با نصب پلاگین و زمینه های جدید گسترش دهید",
- "TeaserExtendPiwikByPlugin": "Piwik را با نصب پلاگین جدید گسترش دهید",
- "TeaserExtendPiwikByTheme": "با نصب زمینه جدید از چهره و احساس آن لذت ببرید.",
"TeaserExtendPiwikByUpload": "گسترش دهید Piwik را با آپلود کردن فایل زیپ",
"Theme": "حالت نمایش",
"Themes": "حالت های نمایش",
diff --git a/plugins/CorePluginsAdmin/lang/fi.json b/plugins/CorePluginsAdmin/lang/fi.json
index b3dd018dd2..a417938185 100644
--- a/plugins/CorePluginsAdmin/lang/fi.json
+++ b/plugins/CorePluginsAdmin/lang/fi.json
@@ -60,9 +60,6 @@
"PluginVersionInfo": "%1$s %2$s:sta",
"PluginWebsite": "Liitännäissivu",
"Screenshots": "Ruudunkaappaukset",
- "SortByAlpha": "alpha",
- "SortByNewest": "uusin",
- "SortByPopular": "suosittu",
"Status": "Tila",
"StepDownloadingPluginFromMarketplace": "Lataa liitännäinen kauppatorilta",
"StepDownloadingThemeFromMarketplace": "Lataa teema kauppatorilta",
@@ -77,8 +74,6 @@
"SuccessfullyActicated": "<strong>%s<\/strong> on aktivoitu onnistuneesti.",
"Support": "Tuki",
"TeaserExtendPiwik": "Laajenna Piwikiä liitännäisillä ja teemoilla",
- "TeaserExtendPiwikByPlugin": "Laajenna Piwikiä asentamalla uusi liitännäinen",
- "TeaserExtendPiwikByTheme": "Nauti uudesta designista ja tunteesta asentamalla uusi teema",
"TeaserExtendPiwikByUpload": "Laajenna Piwikiä lisäämällä ZIP-tiedosto",
"Theme": "Teema",
"Themes": "Teemat",
diff --git a/plugins/CorePluginsAdmin/lang/fr.json b/plugins/CorePluginsAdmin/lang/fr.json
index 8dbc4ca761..a1f335e364 100644
--- a/plugins/CorePluginsAdmin/lang/fr.json
+++ b/plugins/CorePluginsAdmin/lang/fr.json
@@ -23,7 +23,6 @@
"Developer": "Développeur",
"DevelopersLearnHowToDevelopPlugins": "Développeurs : Apprenez comment vous pouvez étendre et personaliser Piwik en %1$sdévelopant des composants ou themes%2$s.",
"DoMoreContactPiwikAdmins": "Pour installer un nouveau composant additionnel ou thème, veuillez contacter votre administrateur Piwik.",
- "EmailToEnquireUpdatedVersion": "Veuillez envoyer un e-mail à %1$s et renseighner une version mise à jour de %2$s.",
"FeaturedPlugin": "Composant mis en avant",
"ChangeLookByManageThemes": "Vous pouvez changer l'apparence de Piwik en %1$sgérant les thèmes%2$s.",
"GetEarlyAccessForPaidPlugins": "Note : tous les composants sont disponibles gratuitement à présent, dans le futur nous fourniront la possibilité de publier des composants payants sur le Marché (%1$scontactez-nous%2$s pour bénéficier d'un accès en avance)",
@@ -35,6 +34,8 @@
"InstallingPlugin": "Installation de %s",
"InstallNewPlugins": "Installer les nouveaux composants",
"InstallNewThemes": "Installer les nouveaux thèmes",
+ "InstalledPlugins": "Plugins installés",
+ "InstalledThemes": "Thèmes installés",
"LastCommitTime": "(dernier archivage %s)",
"LastUpdated": "A jour",
"LicenseHomepage": "Page de la licence",
@@ -51,6 +52,7 @@
"MissingRequirementsPleaseInstallNotice": "Veuillez installer %1$s %2$s qui est requis par %3$s.",
"NewVersion": "nouvelle version",
"NoPluginsFound": "Aucun composant trouvé",
+ "NoPluginSettings": "Aucun paramètre de plugin ne peut être configuré",
"NotAllowedToBrowseMarketplacePlugins": "Vous pouvez parcourir la liste des composants qui peuvent être installés pour personnaliser ou étendre votre plateforme Piwik. Veuillez contacter votre administrateur si vous avez besoin d'en installer.",
"NotAllowedToBrowseMarketplaceThemes": "Vous pouvez parcourir la liste des thèmes qui peuvent être installés pour personnaliser l'apparence de votre plateforme Piwik. Veuillez contacter votre administrateur pour qu'il les installe pour vous.",
"NoThemesFound": "Aucun thème trouvé",
@@ -70,9 +72,9 @@
"PluginVersionInfo": "%1$s de %2$s",
"PluginWebsite": "Site du composant additionnel",
"Screenshots": "Captures d'écran",
- "SortByAlpha": "alpha",
- "SortByNewest": "plus récent(e)",
- "SortByPopular": "populaire",
+ "SortByAlpha": "Alpha",
+ "SortByNewest": "Plus récent",
+ "SortByPopular": "Populaire",
"Status": "État",
"StepDownloadingPluginFromMarketplace": "Téléchargement d'un composant additionnel depuis le Marché",
"StepDownloadingThemeFromMarketplace": "Téléchargement d'un thème depuis le Marché",
@@ -87,8 +89,8 @@
"SuccessfullyActicated": "Vous avez activé avec succès <strong>%s<\/strong>.",
"Support": "Support",
"TeaserExtendPiwik": "Etendre Piwik avec des composants additionnels et des thèmes",
- "TeaserExtendPiwikByPlugin": "Etendre Piwik en installant un nouveau composant additionnel",
- "TeaserExtendPiwikByTheme": "Profitez d'une nouvelle charte graphique en installant un nouveau thème",
+ "TeaserExtendPiwikByPlugin": "Etendre Piwik en %1$sinstallant un nouveau composant additionnel%2$s.",
+ "TeaserExtendPiwikByTheme": "Profitez d'une nouvelle charte graphique en %1$sinstallant un nouveau thème%2$s.",
"TeaserExtendPiwikByUpload": "Etendre Piwik en téléchargeant un fichier ZIP",
"InstallingNewPluginViaMarketplaceOrUpload": "Vous pouvez installer automatiquement un plugin à partir du Marketplace ou %1$supload a plugin%2$s au format .zip.",
"Theme": "Thème",
@@ -101,6 +103,7 @@
"UploadZipFile": "Télécharger fichier ZIP",
"Version": "Version",
"ViewRepositoryChangelog": "Afficher les changements",
+ "ViewAllMarketplacePlugins": "Voir tous les plugins du marché",
"Websites": "Sites web"
}
} \ No newline at end of file
diff --git a/plugins/CorePluginsAdmin/lang/it.json b/plugins/CorePluginsAdmin/lang/it.json
index 880e44ca4b..e2d21a1438 100644
--- a/plugins/CorePluginsAdmin/lang/it.json
+++ b/plugins/CorePluginsAdmin/lang/it.json
@@ -23,7 +23,6 @@
"Developer": "Sviluppatore",
"DevelopersLearnHowToDevelopPlugins": "Per gli sviluppatori: Imparate come ampliare e personalizzare Piwik %1$ssviluppando plugins e temi%2$s.",
"DoMoreContactPiwikAdmins": "Per installare un nuovo plugin o un nuovo tema, rimani in contatto con il tuo amministratore di Piwik.",
- "EmailToEnquireUpdatedVersion": "Manda un'email a %1$s per informarti su una versione aggiornata di %2$s.",
"FeaturedPlugin": "Plugin rappresentativo",
"ChangeLookByManageThemes": "Puoi cambiare l'aspetto di Piwik tramite %1$sGestione Temi%2$s.",
"GetEarlyAccessForPaidPlugins": "Nota: al momento tutti i plugin sono disponibili gratuitamente; in futuro abiliteremo sul Marketplace la sezione Plugin a Pagamento (%1$scontattaci%2$s per accedere anticipatamente).",
@@ -35,6 +34,8 @@
"InstallingPlugin": "Sto installando %s",
"InstallNewPlugins": "Installa nuovi plugin",
"InstallNewThemes": "Intalla nuovi temi",
+ "InstalledPlugins": "Plugin installati",
+ "InstalledThemes": "Temi installati",
"LastCommitTime": "ultima consegna %s",
"LastUpdated": "Ultimo aggiornamento",
"LicenseHomepage": "Homepage della Licenza",
@@ -51,6 +52,7 @@
"MissingRequirementsPleaseInstallNotice": "Si prega di installare %1$s %2$s come richiesto da %3$s.",
"NewVersion": "nuova versione",
"NoPluginsFound": "Non sono stati trovati plugin",
+ "NoPluginSettings": "Non ci sono plugin da configurare",
"NotAllowedToBrowseMarketplacePlugins": "Puoi esplorare la lista dei plugin che possono essere installati per personalizzare o espandere la tua piattaforma Piwik. Contatta il tuo amministratore se desideri installarne qualcuno.",
"NotAllowedToBrowseMarketplaceThemes": "Puoi esplorare la lista dei temi che possono essere installati per personalizzare l'aspetto della tua piattaforma Piwik. Contatta il tuo amministratore se desideri che ne installi qualcuno.",
"NoThemesFound": "Non sono stati trovati temi",
@@ -70,9 +72,9 @@
"PluginVersionInfo": "%1$s da %2$s",
"PluginWebsite": "Sito Plugin",
"Screenshots": "Screenshots",
- "SortByAlpha": "alfa",
- "SortByNewest": "più recente",
- "SortByPopular": "popolare",
+ "SortByAlpha": "Alfa",
+ "SortByNewest": "Il più recente",
+ "SortByPopular": "Popolare",
"Status": "Stato",
"StepDownloadingPluginFromMarketplace": "Download del plugin dal Marketplace",
"StepDownloadingThemeFromMarketplace": "Download del tema dal Marketplace",
@@ -87,8 +89,8 @@
"SuccessfullyActicated": "Hai attivato con successo <strong>%s<\/strong>.",
"Support": "Supportaci",
"TeaserExtendPiwik": "Amplia Piwik con Plugin e Temi",
- "TeaserExtendPiwikByPlugin": "Amplia Piwik installando un nuovo plugin",
- "TeaserExtendPiwikByTheme": "Goditi un altro look installando un nuovo tema",
+ "TeaserExtendPiwikByPlugin": "Estendi Piwik %1$sinstallando un nuovo plugin%2$s.",
+ "TeaserExtendPiwikByTheme": "Prova un altro aspetto & atmosfera %1$sinstallando un nuovo tema%2$s.",
"TeaserExtendPiwikByUpload": "Estendi Piwik caricando un file ZIP",
"InstallingNewPluginViaMarketplaceOrUpload": "Puoi installare automaticamente dei plugins dal Market o %1$scaricare un plugin%2$s in formato .zip.",
"Theme": "Tema",
@@ -101,6 +103,7 @@
"UploadZipFile": "Caricamento file ZIP",
"Version": "Versione",
"ViewRepositoryChangelog": "Guarda i cambiamenti",
+ "ViewAllMarketplacePlugins": "Scopri tutti i plugin del Marketplace",
"Websites": "Siti web"
}
} \ No newline at end of file
diff --git a/plugins/CorePluginsAdmin/lang/ja.json b/plugins/CorePluginsAdmin/lang/ja.json
index ace3833bf2..ae7be8850a 100644
--- a/plugins/CorePluginsAdmin/lang/ja.json
+++ b/plugins/CorePluginsAdmin/lang/ja.json
@@ -23,7 +23,6 @@
"Developer": "開発者",
"DevelopersLearnHowToDevelopPlugins": "デベロッパー:%1$s テーマやプラグイン %2$s を開発することでPiwikを拡張、カスタマイズする方法を学びます。",
"DoMoreContactPiwikAdmins": "新しいプラグインやテーマをインストールするには、 Piwik の管理者に連絡をしてください",
- "EmailToEnquireUpdatedVersion": "%1$s をメールで送付の上、%2$s の最新バージョンをお問い合わせください。",
"FeaturedPlugin": "注目のプラグイン",
"ChangeLookByManageThemes": "%1$s テーマの管理 %2$sによって Piwik の外観を変更できます。",
"GetEarlyAccessForPaidPlugins": "注 : 現在、全てのプラグインは無料で利用できます。今後マーケットプレイスでは有料プラグインが有効になります。 (有料プラグインについて、誰よりも早く知りたい方は、%1$s こちら %2$s )",
@@ -70,9 +69,6 @@
"PluginVersionInfo": "%2$s からの %1$s",
"PluginWebsite": "プラグインのウェブサイト",
"Screenshots": "スクリーンショット",
- "SortByAlpha": "アルファ",
- "SortByNewest": "最新",
- "SortByPopular": "人気",
"Status": "状態",
"StepDownloadingPluginFromMarketplace": "マーケットプレイスからプラグインをダウンロード",
"StepDownloadingThemeFromMarketplace": "マーケットプレイスからテーマをダウンロード",
@@ -87,8 +83,6 @@
"SuccessfullyActicated": "<strong> %s <\/strong> の有効化に成功しました。",
"Support": "サポート",
"TeaserExtendPiwik": "Piwik のプラグインとテーマを拡張",
- "TeaserExtendPiwikByPlugin": "新しいプラグインをインストールして Piwik を拡張",
- "TeaserExtendPiwikByTheme": "新しいテーマをインストールして別の外観と操作感をお楽しみください",
"TeaserExtendPiwikByUpload": "ZIP ファイルをアップロードして Piwik を拡張",
"InstallingNewPluginViaMarketplaceOrUpload": "自動的にマーケットプレイスからプラグインをインストールまたは.zip形式のプラグイン %1$s を %2$s アップロードすることができます。",
"Theme": "テーマ",
diff --git a/plugins/CorePluginsAdmin/lang/ko.json b/plugins/CorePluginsAdmin/lang/ko.json
index c604615601..8d6171e006 100644
--- a/plugins/CorePluginsAdmin/lang/ko.json
+++ b/plugins/CorePluginsAdmin/lang/ko.json
@@ -40,9 +40,6 @@
"PluginsManagement": "플러그인 관리",
"PluginWebsite": "플러그인 웹사이트",
"Screenshots": "스크린샷",
- "SortByAlpha": "알파버전",
- "SortByNewest": "최신",
- "SortByPopular": "인기순",
"Status": "상태",
"StepDownloadingPluginFromMarketplace": "마켓플레이스에서 플러그인 다운로드 중",
"StepDownloadingThemeFromMarketplace": "마켓플레이스에서 테마 다운로드 중",
diff --git a/plugins/CorePluginsAdmin/lang/nb.json b/plugins/CorePluginsAdmin/lang/nb.json
index 0444d1efa6..f883b88eec 100644
--- a/plugins/CorePluginsAdmin/lang/nb.json
+++ b/plugins/CorePluginsAdmin/lang/nb.json
@@ -23,7 +23,6 @@
"Developer": "Utvikler",
"DevelopersLearnHowToDevelopPlugins": "Utviklere: Lær hvordan du kan utvide og tilpasse Piwik ved %1$så utvikle utvidelser og tema%2$s.",
"DoMoreContactPiwikAdmins": "For å installer en ny utvidelse eller et nytt tema, kontakt administratoren for din Piwik.",
- "EmailToEnquireUpdatedVersion": "Vennligst send e-post til %1$s og si at det finnes en oppdatert versjon av %2$s.",
"FeaturedPlugin": "Fremhevet utvidelse",
"ChangeLookByManageThemes": "Du kan endre utseendet til Piwik ved å %1$sHåndtere temaer%2$s.",
"GetEarlyAccessForPaidPlugins": "Merk. alle utvidelser er nå tilgjengelig gratis; i fremtiden vil vi også tilby utvidelser mot betaling i markedsplassen (%1$skontakt oss%2$s for tidlig tilgang).",
@@ -35,6 +34,8 @@
"InstallingPlugin": "Installerer %s",
"InstallNewPlugins": "Installer nye utvidelser",
"InstallNewThemes": "Installer nye tema",
+ "InstalledPlugins": "Installerte utvidelser",
+ "InstalledThemes": "Installerte temaer",
"LastCommitTime": "(siste bidrag %s)",
"LastUpdated": "Sist oppdatert",
"LicenseHomepage": "Lisensside",
@@ -51,6 +52,7 @@
"MissingRequirementsPleaseInstallNotice": "Vennligst installer %1$s %2$s da dette er påkrevd av %3$s.",
"NewVersion": "ny versjon",
"NoPluginsFound": "Ingen utvidelser funnet",
+ "NoPluginSettings": "Det er ingen utvidelsesinnstillinger som kan konfigureres",
"NotAllowedToBrowseMarketplacePlugins": "Du kan bla i listen over utvidelser som kan installeres for å utvide eller tilpasse din Piwik-plattform. Vennligst kontakt din admin hvis du trenger å installere noen av disse.",
"NotAllowedToBrowseMarketplaceThemes": "Du kan bla i listen over temaer som kan installeres for å tilpasse utseendet til Piwik-plattformen. Vennligst kontakt din admin for å få noen av disse installert.",
"NoThemesFound": "Ingen temaer funnet",
@@ -70,9 +72,9 @@
"PluginVersionInfo": "%1$s fra %2$s",
"PluginWebsite": "Nettsted for utvidelse",
"Screenshots": "Skjermbilder",
- "SortByAlpha": "alpha",
- "SortByNewest": "nyeste",
- "SortByPopular": "populære",
+ "SortByAlpha": "Alpha",
+ "SortByNewest": "Nyeste",
+ "SortByPopular": "Populære",
"Status": "Status",
"StepDownloadingPluginFromMarketplace": "Laster ned utvidelse fra markedsplassen",
"StepDownloadingThemeFromMarketplace": "Laster ned tema fra markedsplassen",
@@ -87,8 +89,8 @@
"SuccessfullyActicated": "Du har aktivert <strong>%s<\/strong>.",
"Support": "Støtte",
"TeaserExtendPiwik": "Utvid Piwik med utvidelser og temaer",
- "TeaserExtendPiwikByPlugin": "Utvid Piwik ved å installere en ny utvidelse",
- "TeaserExtendPiwikByTheme": "Nyt et annet design ved å installere et nytt tema",
+ "TeaserExtendPiwikByPlugin": "Utvid Piwik ved å %1$sinstallere en ny utvidelse%2$s.",
+ "TeaserExtendPiwikByTheme": "Prøv et nytt utseende ved å %1$sinstallere et nytt tema%2$s.",
"TeaserExtendPiwikByUpload": "Utvid Piwik ved å laste opp en ZIP-fil",
"InstallingNewPluginViaMarketplaceOrUpload": "Du kan installere utvidelser fra markedsplassen automatisk eller %1$slaste opp en utvidelse%2$s i .zip-format.",
"Theme": "Tema",
@@ -101,6 +103,7 @@
"UploadZipFile": "Last opp ZIP-fil",
"Version": "Versjon",
"ViewRepositoryChangelog": "Vis endringene",
+ "ViewAllMarketplacePlugins": "Se alle utvidelsene på Markedsplassen",
"Websites": "Nettsteder"
}
} \ No newline at end of file
diff --git a/plugins/CorePluginsAdmin/lang/nl.json b/plugins/CorePluginsAdmin/lang/nl.json
index 11e87f6645..6125114f35 100644
--- a/plugins/CorePluginsAdmin/lang/nl.json
+++ b/plugins/CorePluginsAdmin/lang/nl.json
@@ -23,7 +23,6 @@
"Developer": "Ontwikkelaar",
"DevelopersLearnHowToDevelopPlugins": "Ontwikkelaars: Leer hoe Piwik kan worden uitgebreid en aangepast door het %1$sontwikkelen van plugins en thema's%2$s.",
"DoMoreContactPiwikAdmins": "Neem contact op met je Piwik beheerder om een nieuwe plugin of thema te installeren.",
- "EmailToEnquireUpdatedVersion": "Mail naar %1$s en vraag naar een actuele versie van %2$s.",
"FeaturedPlugin": "Aanbevolen plugin",
"ChangeLookByManageThemes": "Je kan het uitelijk van Piwik wijzigen %1$sThema's%2$s",
"GetEarlyAccessForPaidPlugins": "Opmerking: op het moment zijn alle plugins gratis beschikbaar; in de toekomst activeren we Betaalde Plugins in de Marktplaats (%1$sneem contact op%2$s om eerder toegang te krijgen).",
@@ -70,9 +69,6 @@
"PluginVersionInfo": "%1$s van %2$s",
"PluginWebsite": "Plugin Website",
"Screenshots": "Schermafbeeldingen",
- "SortByAlpha": "alfa",
- "SortByNewest": "nieuwste",
- "SortByPopular": "populair",
"Status": "Status",
"StepDownloadingPluginFromMarketplace": "Plugin van de Marktplaats aan het Downloaden",
"StepDownloadingThemeFromMarketplace": "Thema van de Marktplaats aan het Downloaden",
@@ -87,8 +83,6 @@
"SuccessfullyActicated": "Je hebt succesvol <strong>%s<\/strong> geactiveerd.",
"Support": "Ondersteuning",
"TeaserExtendPiwik": "Breidt Piwik uit met plugins en thema's",
- "TeaserExtendPiwikByPlugin": "Breidt Piwik uit door een nieuwe plugin te installeren",
- "TeaserExtendPiwikByTheme": "Geniet van een andere weergave door het installeren van een nieuw thema.",
"TeaserExtendPiwikByUpload": "Breidt Piwik uit door een ZIP bestand te uploaden",
"InstallingNewPluginViaMarketplaceOrUpload": "Je kunt automatisch plugins installeren van de Martkplaats, of een %1$splugin uploaden%2$s in een .zip bestand.",
"Theme": "Thema",
diff --git a/plugins/CorePluginsAdmin/lang/pl.json b/plugins/CorePluginsAdmin/lang/pl.json
index 510e5bf484..8580c1bea1 100644
--- a/plugins/CorePluginsAdmin/lang/pl.json
+++ b/plugins/CorePluginsAdmin/lang/pl.json
@@ -21,7 +21,6 @@
"Deactivate": "Wyłącz",
"Developer": "Deweloper",
"DoMoreContactPiwikAdmins": "Aby zainstalować nowy plugin lub nową skórę, skontaktuj się z administratorami Piwik'a.",
- "EmailToEnquireUpdatedVersion": "Proszę napiac do %1$s i zapytać o zaktualizowanie wersji %2$s.",
"FeaturedPlugin": "Wyróżniony plugin",
"GetEarlyAccessForPaidPlugins": "Uwaga: wszystkie pluginy są obecnie dostępne za darmo; w przyszłości uruchomimy w Sklepie Płatne Pluginy (%1$sskontaktuj się%2$s dla wczesnego dostępu).",
"History": "Historia",
@@ -61,9 +60,6 @@
"PluginVersionInfo": "%1$s z %2$s",
"PluginWebsite": "Strona WWW",
"Screenshots": "Screenshoty",
- "SortByAlpha": "alfa",
- "SortByNewest": "najnowsze",
- "SortByPopular": "popularne",
"Status": "Status",
"StepDownloadingPluginFromMarketplace": "Pobieranie wtyczki ze Sklepu",
"StepDownloadingThemeFromMarketplace": "Pobieranie szablonu ze Sklepu",
@@ -78,7 +74,6 @@
"SuccessfullyActicated": "Pomyślnie aktywowano <strong>%s<\/strong>.",
"Support": "Wsparcie",
"TeaserExtendPiwik": "Rozszerz Piwik o pluginy i szablony",
- "TeaserExtendPiwikByPlugin": "Rozszerz Piwik poprzez instalację nowych wtyczek",
"TeaserExtendPiwikByUpload": "Rozbuduj Piwik poporzez wgranie plików ZIP",
"Theme": "Szablon",
"Themes": "Szablony",
diff --git a/plugins/CorePluginsAdmin/lang/pt-br.json b/plugins/CorePluginsAdmin/lang/pt-br.json
index 70d48fc1ff..9356a2e109 100644
--- a/plugins/CorePluginsAdmin/lang/pt-br.json
+++ b/plugins/CorePluginsAdmin/lang/pt-br.json
@@ -23,7 +23,6 @@
"Developer": "Desenvolvedor",
"DevelopersLearnHowToDevelopPlugins": "Desenvolvedores: Saibam como estender e personalizar o Piwik %1$sdesenvolvendo plugins ou temas%2$s.",
"DoMoreContactPiwikAdmins": "Para instalar um novo plugin ou um novo tema, por favor, entrar em contato com os administradores do servidor Piwik.",
- "EmailToEnquireUpdatedVersion": "Por favor enviar e-mail %1$s e inquirir uma versão atualizada do %2$s.",
"FeaturedPlugin": "Plugin destaque",
"ChangeLookByManageThemes": "Você pode alterar a aparência do Piwik %1$sGerenciando Temas%2$s.",
"GetEarlyAccessForPaidPlugins": "Nota: atualmente todos os plugins estão disponíveis gratuitamente; no futuro serão permitidos Plugins Pagos no Marketplace (%1$sentre em contato conosco%2$s para acesso antecipado).",
@@ -35,6 +34,8 @@
"InstallingPlugin": "Instalando %s",
"InstallNewPlugins": "Instalar novos plugins",
"InstallNewThemes": "Instalar novos temas",
+ "InstalledPlugins": "Plugins instalados",
+ "InstalledThemes": "Temas instalados",
"LastCommitTime": "(último commit %s)",
"LastUpdated": "Última Atualização",
"LicenseHomepage": "Página de licenciamento",
@@ -70,9 +71,9 @@
"PluginVersionInfo": "%1$s de %2$s",
"PluginWebsite": "Site de Plugin",
"Screenshots": "Screenshots",
- "SortByAlpha": "alfa",
- "SortByNewest": "mais recente",
- "SortByPopular": "popular",
+ "SortByAlpha": "Alfa",
+ "SortByNewest": "Mais recente",
+ "SortByPopular": "Popular",
"Status": "Status",
"StepDownloadingPluginFromMarketplace": "Transferindo plugin do Marketplace",
"StepDownloadingThemeFromMarketplace": "Transferindo tema do Marketplace",
@@ -87,8 +88,6 @@
"SuccessfullyActicated": "Você ativou com sucesso <strong>%s<\/strong>.",
"Support": "Suporte",
"TeaserExtendPiwik": "Estenda Piwik com plugins e temas",
- "TeaserExtendPiwikByPlugin": "Estenda Piwik instalando um novo plugin",
- "TeaserExtendPiwikByTheme": "Aproveite um outro look & feel instalando um novo tema",
"TeaserExtendPiwikByUpload": "Estenda o Piwik carregando um arquivo ZIP",
"InstallingNewPluginViaMarketplaceOrUpload": "Você pode instalar automaticamente plugins do Marketplace ou %1$scarregar um plugin%2$s no formato .zip",
"Theme": "Tema",
@@ -101,6 +100,7 @@
"UploadZipFile": "Carregar arquivo ZIP",
"Version": "Versão",
"ViewRepositoryChangelog": "Ver as mudanças",
+ "ViewAllMarketplacePlugins": "Ver todos os plugins no Marketplace",
"Websites": "Websites"
}
} \ No newline at end of file
diff --git a/plugins/CorePluginsAdmin/lang/pt.json b/plugins/CorePluginsAdmin/lang/pt.json
index c29e017e14..aa0852ffaf 100644
--- a/plugins/CorePluginsAdmin/lang/pt.json
+++ b/plugins/CorePluginsAdmin/lang/pt.json
@@ -22,7 +22,6 @@
"PluginHomepage": "Homepage do Plugin",
"PluginKeywords": "Palavras Chave",
"PluginsManagement": "Gestão de Plugins",
- "SortByPopular": "polular",
"Status": "Estado",
"Support": "Suporte",
"Theme": "Tema",
diff --git a/plugins/CorePluginsAdmin/lang/ro.json b/plugins/CorePluginsAdmin/lang/ro.json
index d9ff7f63d9..1051a2ac07 100644
--- a/plugins/CorePluginsAdmin/lang/ro.json
+++ b/plugins/CorePluginsAdmin/lang/ro.json
@@ -21,7 +21,6 @@
"Deactivate": "Dezactivare",
"Developer": "Dezvoltator",
"DoMoreContactPiwikAdmins": "Pentru a instala un nou plugin sau o tema noua, va rugam luati legatura cu administratorii Dvs. ai Piwik.",
- "EmailToEnquireUpdatedVersion": "Va rugam sa trimiteti email %1$s si intrebati de o versiune mai noua a %2$s.",
"FeaturedPlugin": "Plugin promovat",
"GetEarlyAccessForPaidPlugins": "Nota: toate pluginurile sunt disponibile gratuit in acest moment; pe viitor activa sectiunea Pluginuri cu Plata in Marketplace (%1$scontacteaza-ne%2$s pentru a putea accesa mai devreme).",
"History": "Istoric",
@@ -61,9 +60,6 @@
"PluginVersionInfo": "%1$s de la %2$s",
"PluginWebsite": "Siteul pluginului",
"Screenshots": "Imagini",
- "SortByAlpha": "alpha",
- "SortByNewest": "cele mai noi",
- "SortByPopular": "popular",
"Status": "Stare",
"StepDownloadingPluginFromMarketplace": "Se downloadeaza pluginul din Marketplace",
"StepDownloadingThemeFromMarketplace": "Se downloadeaza tema din Marketplace",
@@ -78,8 +74,6 @@
"SuccessfullyActicated": "Ati activat cu succes <strong>%s<\/strong>.",
"Support": "Asistenta",
"TeaserExtendPiwik": "Extinde Piwik cu Pluginuri si Teme",
- "TeaserExtendPiwikByPlugin": "Extinde Piwik instaland un nou plugin",
- "TeaserExtendPiwikByTheme": "Bucurati-ve de un alt look & feel instaland o tema noua",
"TeaserExtendPiwikByUpload": "Extinde Piwik uploadand un fisier ZIP",
"Theme": "Temă",
"Themes": "Teme",
diff --git a/plugins/CorePluginsAdmin/lang/ru.json b/plugins/CorePluginsAdmin/lang/ru.json
index 405c87ac6f..e1531186b2 100644
--- a/plugins/CorePluginsAdmin/lang/ru.json
+++ b/plugins/CorePluginsAdmin/lang/ru.json
@@ -23,7 +23,6 @@
"Developer": "Разработчик",
"DevelopersLearnHowToDevelopPlugins": "Разработчикам: Изучите, как вы можете расширить и настроить Piwik при помощи плагинов для %1$sразработки или тем%2$s.",
"DoMoreContactPiwikAdmins": "Для установки нового плагина или новой темы, пожалуйста свяжитесь с вашим Piwik-администратором",
- "EmailToEnquireUpdatedVersion": "Пожалуйста, напишите на электронную почту %1$s и запросите обновленную версию %2$s.",
"FeaturedPlugin": "Набирающий популярность плагин",
"ChangeLookByManageThemes": "Вы можете изменить внешний вид Piwik: %1$sВыбор Темы%2$s.",
"GetEarlyAccessForPaidPlugins": "Примечание: в настоящее время все плагины доступны бесплатно, в будущем мы включим платные плагины на Marketplace (%1$sсвяжитесь с нами%2$s для раннего доступа).",
@@ -35,6 +34,8 @@
"InstallingPlugin": "Установка %s",
"InstallNewPlugins": "Установить новые плагины",
"InstallNewThemes": "Установить новые темы",
+ "InstalledPlugins": "Установленные плагины",
+ "InstalledThemes": "Установленные темы",
"LastCommitTime": "(последний коммит %s)",
"LastUpdated": "Последнее обновление",
"LicenseHomepage": "Дом. страница лицензии",
@@ -51,6 +52,7 @@
"MissingRequirementsPleaseInstallNotice": "Пожалуйста, установите %1$s %2$s т. к. оно требуется для %3$s.",
"NewVersion": "новая версия",
"NoPluginsFound": "Плагины не найдены",
+ "NoPluginSettings": "Нет настроек плагинов, которые могут быть сконфигурированы",
"NotAllowedToBrowseMarketplacePlugins": "Можете посмотреть список плагинов, которые могут быть установлены для подстройки или расширения вашей платформы Piwik. Свяжитесь с администратором если вам потребуется установить один из них.",
"NotAllowedToBrowseMarketplaceThemes": "Вы можете посмотреть список тем, которые могут быть установлены для настройки внешнего вида платформы Piwik. Пожалуйста, свяжите с вашим администратором, чтобы установить любой из них.",
"NoThemesFound": "Темы не найдены",
@@ -70,9 +72,9 @@
"PluginVersionInfo": "%1$s – %2$s",
"PluginWebsite": "Сайт плагина",
"Screenshots": "Скриншоты",
- "SortByAlpha": "по названию",
- "SortByNewest": "по новизне",
- "SortByPopular": "по популярности",
+ "SortByAlpha": "Альфа",
+ "SortByNewest": "Новейшие",
+ "SortByPopular": "Популярные",
"Status": "Статус",
"StepDownloadingPluginFromMarketplace": "Скачать плагин из Marketplace",
"StepDownloadingThemeFromMarketplace": "Скачать тему из Marketplace",
@@ -87,8 +89,8 @@
"SuccessfullyActicated": "Вы успешно активировали <strong>%s<\/strong>.",
"Support": "Поддержка",
"TeaserExtendPiwik": "Улучшение Piwik с помощью Плагинов и Тем",
- "TeaserExtendPiwikByPlugin": "Улучшение Piwik установкой нового плагина",
- "TeaserExtendPiwikByTheme": "Насладитесь другим внешним видом установив новую тему",
+ "TeaserExtendPiwikByPlugin": "Расширьте Piwik %1$sустановив новый плагин%2$s.",
+ "TeaserExtendPiwikByTheme": "Насладитесь другим внешним видом %1$sустановив новую тему%2$s.",
"TeaserExtendPiwikByUpload": "Улучшение Piwik закачкой ZIP файла",
"InstallingNewPluginViaMarketplaceOrUpload": "Вы автоматически можете установить плагины из Marketplace или %1$sзагрузить плагин%2$s в формате zip.",
"Theme": "Тема",
@@ -101,6 +103,7 @@
"UploadZipFile": "Закачать ZIP файл",
"Version": "Версия",
"ViewRepositoryChangelog": "Посмотреть изменения",
+ "ViewAllMarketplacePlugins": "Посмотреть все плагины в Marketplace",
"Websites": "Сайты"
}
} \ No newline at end of file
diff --git a/plugins/CorePluginsAdmin/lang/sk.json b/plugins/CorePluginsAdmin/lang/sk.json
index fc6db1f6ca..010db1891d 100644
--- a/plugins/CorePluginsAdmin/lang/sk.json
+++ b/plugins/CorePluginsAdmin/lang/sk.json
@@ -23,7 +23,6 @@
"Developer": "Vývojár",
"DevelopersLearnHowToDevelopPlugins": "Vývojári: Naučiť sa ako rozšíriť a prispôsobiť Piwik %1$s vývojarskými pluginmi alebo %2$s motívmi.",
"DoMoreContactPiwikAdmins": "Pre nainštalovanie nového pluginu alebo motívu sa prosím spojte s Vašími Piwik administrátormi.",
- "EmailToEnquireUpdatedVersion": "Prosím mejlujte %1$s a informujte sa o aktualizovanej verzii %2$s.",
"FeaturedPlugin": "Hlavný plugin",
"ChangeLookByManageThemes": "Výzor Piwiku môžete zmeniť %1$s spravovaním motívov%2$s.",
"GetEarlyAccessForPaidPlugins": "Pozn.: všetky pluginy sú v súčasnosti voľne dostupné; v budúcnosti chceme zaviesť spoplatnené pluginy ktoré sa budú nachádzať na trhu (%1$s kontaktujte nás %2$s pre rýchly prístup).",
@@ -70,9 +69,6 @@
"PluginVersionInfo": "%1$s z %2$s",
"PluginWebsite": "Webstránka pluginu",
"Screenshots": "Screenshoty",
- "SortByAlpha": "alfa",
- "SortByNewest": "najnovší",
- "SortByPopular": "obľúbený",
"Status": "Stav",
"StepDownloadingPluginFromMarketplace": "Sťahovanie pluginu z trhu",
"StepDownloadingThemeFromMarketplace": "Sťahovanie motívu z trhu",
@@ -87,8 +83,6 @@
"SuccessfullyActicated": "Úspešne ste aktivovali <strong>%s<\/strong>.",
"Support": "Podpora",
"TeaserExtendPiwik": "Rozšíriť Piwik s pluginmi a motívmi",
- "TeaserExtendPiwikByPlugin": "Rozšíriť Piwik inštalovaním nového pluginu",
- "TeaserExtendPiwikByTheme": "Vychutnať si iný pohľad & pocit nainštalovaním nového motívu",
"TeaserExtendPiwikByUpload": "Rozšíriť Piwik nahratím ZIP súboru",
"InstallingNewPluginViaMarketplaceOrUpload": "Môžete automaticky nainštalovať plugin z trhu alebo %1$s nahrať plugin%2$s v .zip formáte.",
"Theme": "Motív",
diff --git a/plugins/CorePluginsAdmin/lang/sl.json b/plugins/CorePluginsAdmin/lang/sl.json
index 447314e4d2..9d7889d23a 100644
--- a/plugins/CorePluginsAdmin/lang/sl.json
+++ b/plugins/CorePluginsAdmin/lang/sl.json
@@ -15,6 +15,7 @@
"PluginHomepage": "Spletna stran vtičnika",
"PluginKeywords": "Ključne Besede",
"PluginsManagement": "Urejanje Vtičnikov",
+ "PluginVersionInfo": "%1$s from %2$s",
"Status": "Status",
"Version": "Različica",
"Websites": "Spletne strani"
diff --git a/plugins/CorePluginsAdmin/lang/sq.json b/plugins/CorePluginsAdmin/lang/sq.json
index 4d2f10f0e7..858b5feb6b 100644
--- a/plugins/CorePluginsAdmin/lang/sq.json
+++ b/plugins/CorePluginsAdmin/lang/sq.json
@@ -2,25 +2,108 @@
"CorePluginsAdmin": {
"ActionActivatePlugin": "Aktivizoje shtojcën",
"ActionActivateTheme": "Aktivizojeni temën",
+ "ActionInstall": "Instaloje",
"ActionUninstall": "Çinstalojeni",
"Activate": "Aktivizoje",
"Activated": "E aktivizuar",
- "Active": "Vepruese",
+ "Active": "Aktive",
"Activity": "Veprimtari",
+ "AllowedUploadFormats": "Një shtojcë apo një temë mund ta ngarkoni në formatin .zip përmes kësaj faqeje.",
"AuthorHomepage": "Faqja Hyrëse e Autorit",
"Authors": "Autorë",
+ "BackToExtendPiwik": "Mbrapsht te Marketplace",
+ "BeCarefulUsingPlugins": "Shtojcat që s’janë krijuar nga ekipi Piwik duhet të përdoren me kujdes: nuk i kemi shqyrtuar ne.",
+ "BeCarefulUsingThemes": "Temat që s’janë krijuar nga ekipi Piwik duhet të përdoren me kujdes: nuk i kemi shqyrtuar ne.",
+ "ByXDevelopers": "nga zhvilluesit %s",
+ "CannotInstall": "S’instalohet dot (ndihmë)",
+ "Changelog": "Regjistër ndryshimesh",
+ "ChangeSettingsPossible": "Mund të ndryshoni %1$srregullimet%2$s për këtë shtojcë.",
+ "CorePluginTooltip": "Shtojcat bazë nuk kanë version, ngaqë shpërndahen tok me Piwik-un.",
"Deactivate": "Çaktivizoje",
- "Inactive": "Jovepruese",
- "LicenseHomepage": "Faqja Hyrëse e Lejes",
+ "Developer": "Zhvillues",
+ "DevelopersLearnHowToDevelopPlugins": "Zhvillues: Mësoni se si ta thelloni dhe përshtatni Piwik-un përmes %1$shartimit të shtojcave ose temave%2$s.",
+ "DoMoreContactPiwikAdmins": "Që të instaloni një shtojcë apo temë të re, ju lutemi, lidhuni me përgjegjësit e instalimit tuaj të Piwik-ut.",
+ "FeaturedPlugin": "Shtojcë e zgjedhur",
+ "ChangeLookByManageThemes": "Pamjen e Piwik-ut mund ta ndryshoni që nga %1$sAdministrim Temash%2$s.",
+ "GetEarlyAccessForPaidPlugins": "Shënim: sot për sot, krejt shtojcat ofrohen falas; në të ardhmen, do të aktivizojmë në Marketplace Shtojca Me Pagesë (%1$slidhuni me ne%2$s që të jeni ndër të parët atje).",
+ "History": "Historik",
+ "Inactive": "Joaktive",
+ "InfoPluginUpdateIsRecommended": "Përditësoni shtojcat tuaja tani, që të përfitoni nga përmirësimet më të reja.",
+ "InfoThemeIsUsedByOtherUsersAsWell": "Shënim: %1$s përdoruesit e tjerë të regjistruar në këtë instancë Piwik-u po përdorin gjithashtu temën %2$s.",
+ "InfoThemeUpdateIsRecommended": "Përditësoni temat tuaja që të shijoni versionin më të ri.",
+ "InstallingPlugin": "Po instalohet %s",
+ "InstallNewPlugins": "Instaloni shtojca të reja",
+ "InstallNewThemes": "Instaloni tema të reja",
+ "InstalledPlugins": "Shtojca të instaluara",
+ "InstalledThemes": "Tema të instaluara",
+ "LastCommitTime": "(parashtrimi i fundit %s)",
+ "LastUpdated": "Përditësuar Së Fundi Më",
+ "LicenseHomepage": "Faqja Hyrëse e Licencës",
+ "LikeThisPlugin": "Ju pëlqen kjo shtojcë?",
+ "ConsiderDonating": "Shihni mundësinë e dhurimit",
+ "CommunityContributedPlugin": "Kjo është një shtojcë me kontribut nga bashkësia, që ju jepet falas.",
+ "ConsiderDonatingCreatorOf": "Ju lutemi, shihni mundësinë e dhurimit për krijuesin e %s",
"PluginsExtendPiwik": "Shtojcat zgjerojnë dhe thellojnë funksionet e Piwik-ut.",
"OncePluginIsInstalledYouMayActivateHere": "Pasi një shtojcë të jetë instaluar, mund ta aktivizoni ose çaktivizoni prej këtu.",
+ "Marketplace": "Marketplace",
+ "MarketplaceSellPluginSubject": "Marketplace - Shisni Shtojca",
+ "MenuPlatform": "Platformë",
+ "MissingRequirementsNotice": "Ju lutemi, përditësojeni %1$s %2$s me një version më të ri, është i domosdoshëm %1$s %3$s.",
+ "MissingRequirementsPleaseInstallNotice": "Ju lutemi, instaloni %1$s %2$s pasi është i domosdoshëm për %3$s.",
+ "NewVersion": "version i ri",
+ "NoPluginsFound": "S’u gjetën shtojca",
+ "NoPluginSettings": "S’ka rregullime shtojce që mund të formësohen",
+ "NotAllowedToBrowseMarketplacePlugins": "Mund të shfletoni listën e shtojcave që mund të instalohen për përshtatjen ose zgjerimin e platformës tuaj Piwik. Ju lutemi, lidhuni me përgjegjësin e instalimit tuaj, nëse keni nevojë të instalohet ndonjë prej këtyre.",
+ "NotAllowedToBrowseMarketplaceThemes": "Mund të shfletoni listën e temave që mund të instalohen për përshtatjen e pamjes së platformës tuaj Piwik. Ju lutemi, lidhuni me përgjegjësin e instalimit tuaj, nëse keni nevojë të instalohet ndonjë prej këtyre.",
+ "NoThemesFound": "S’u gjetën tema",
+ "NoZipFileSelected": "Ju lutemi, përzgjidhni një kartelë ZIP.",
+ "NumDownloadsLatestVersion": "Versioni më i ri: %s Shkarkime",
+ "NumUpdatesAvailable": "%s Përditësim(e) gati",
+ "Origin": "Origjina",
+ "OriginCore": "Bazë",
+ "OriginThirdParty": "Prej palësh të treta",
"PluginHomepage": "Faqe Hyrëse e Shtojcës",
- "PluginKeywords": "Fjalëkyça",
+ "PluginKeywords": "Fjalëkyçe",
+ "PluginNotCompatibleWith": "Shtojca %1$s s’është e përputhshme me %2$s.",
+ "PluginNotWorkingAlternative": "Nëse e përdorni këtë shtojcë, ndoshta mund të gjeni një version më të ri te Marketplace-i. Nëse jo, mund të donit ta çinstaloni.",
+ "PluginRequirement": "%1$s lyp %2$s.",
"PluginsManagement": "Administrim Shtojcash",
- "PluginVersionInfo": "%1$s from %2$s",
+ "PluginUpdateAvailable": "Po përdorni versionin %1$s dhe ka gati një version të ri %2$s.",
+ "PluginVersionInfo": "%1$s nga %2$s",
+ "PluginWebsite": "Sajt i Shtojcës",
+ "Screenshots": "Foto ekrani",
+ "SortByAlpha": "Alfa",
+ "SortByNewest": "Më të Rejat",
+ "SortByPopular": "Popullore",
"Status": "Gjendje",
+ "StepDownloadingPluginFromMarketplace": "Po shkarkohet shtojca që nga Marketplace-i",
+ "StepDownloadingThemeFromMarketplace": "Po shkarkohet tema që nga Marketplace-i",
+ "StepPluginSuccessfullyInstalled": "E instaluat me sukses shtojcën %1$s %2$s.",
+ "StepPluginSuccessfullyUpdated": "E përditësuat me sukses shtojcën %1$s %2$s.",
+ "StepReplaceExistingPlugin": "Po zëvendësohet shtojca ekzistuese",
+ "StepReplaceExistingTheme": "Po zëvendësohet tema ekzistuese",
+ "StepThemeSuccessfullyInstalled": "E instaluat me sukses temën %1$s %2$s.",
+ "StepThemeSuccessfullyUpdated": "E përditësuat me sukses temën %1$s %2$s.",
+ "StepUnzippingPlugin": "Po shpaketohet shtojca",
+ "StepUnzippingTheme": "Po shpaketohet tema",
+ "SuccessfullyActicated": "E aktivizuat me sukses <strong>%s<\/strong>.",
"Support": "Asistencë",
+ "TeaserExtendPiwik": "Zgjerojeni Piwik-un me Shtojca dhe Tema",
+ "TeaserExtendPiwikByPlugin": "Zgjerojeni Piwik-un përmes %1$sinstalimit të një shtojce të re%2$s.",
+ "TeaserExtendPiwikByTheme": "Shijoni pamje & ndjesi të reja përmes %1$sinstalimit të një teme të re%2$s.",
+ "TeaserExtendPiwikByUpload": "Zgjerojeni Piwik-un përmes ngarkimit të një kartele ZIP",
+ "InstallingNewPluginViaMarketplaceOrUpload": "Shtojca mund të instaloni vetvetiu që prej Marketplace-it ose %1$sta ngarkoni një shtojcë%2$s në formatin .zip.",
+ "Theme": "Temë",
+ "Themes": "Tema",
+ "ThemesDescription": "Temat mund të ndryshojnë pamjen e ndërfaqes së përdoruesit të Piwik-ut, dhe të sjellin një pamje të re për shijimin e raporteve tuaja analitike.",
+ "ThemesManagement": "Administroni Tema",
+ "UninstallConfirm": "Ju ndan një hap nga çinstalimi i shtojcës %s. Shtojca do të hiqet plotësisht nga platforma juaj dhe ky veprim s’mund të zhbëhet. Jeni i sigurt se doni të bëhet kështu?",
+ "Updated": "U përditësua",
+ "UpdatingPlugin": "Po përditësohet %s",
+ "UploadZipFile": "Ngarkoni kartelë ZIP",
"Version": "Version",
+ "ViewRepositoryChangelog": "Shihni ndryshimet",
+ "ViewAllMarketplacePlugins": "Shihni krejt shtojcat e Marketplace-it",
"Websites": "Sajte"
}
} \ No newline at end of file
diff --git a/plugins/CorePluginsAdmin/lang/sr.json b/plugins/CorePluginsAdmin/lang/sr.json
index a88994f2b8..3783879314 100644
--- a/plugins/CorePluginsAdmin/lang/sr.json
+++ b/plugins/CorePluginsAdmin/lang/sr.json
@@ -23,7 +23,6 @@
"Developer": "Programer",
"DevelopersLearnHowToDevelopPlugins": "Programeri: saznajte kako da proširite i prilagodite Piwik %1$spravljenjem dodataka i tema%2$s.",
"DoMoreContactPiwikAdmins": "Ukoliko želite da instalirate novi dodatak ili temu, kontaktirajte vašeg Piwik administratora.",
- "EmailToEnquireUpdatedVersion": "Molimo vas da pošaljete mejl na %1$s i da zatražite novu verziju %2$s.",
"FeaturedPlugin": "Istaknuti dodatak",
"ChangeLookByManageThemes": "Možete izmeniti izgled Piwik-a %1$supravljanjem temama%2$s.",
"GetEarlyAccessForPaidPlugins": "Svi dodaci su u ovom trenutku dostupni potpuno besplatno; u budućnosti ćemo na Marketu omogućiti i dodatke koji se plaćaju (%1$skontaktirajte na%2$s za rani pristup).",
@@ -35,6 +34,8 @@
"InstallingPlugin": "Instaliranje %s",
"InstallNewPlugins": "Instaliranje novog dodatka",
"InstallNewThemes": "Instaliranje nove teme",
+ "InstalledPlugins": "Instalirani dodaci",
+ "InstalledThemes": "Instalirane teme",
"LastCommitTime": "(poslednja promena %s)",
"LastUpdated": "Poslednje ažuriranje",
"LicenseHomepage": "Podaci o licenci",
@@ -51,6 +52,7 @@
"MissingRequirementsPleaseInstallNotice": "Molimo vas da instalirate %1$s %2$s pošto ga zahteva %3$s.",
"NewVersion": "nova verzija",
"NoPluginsFound": "Nije nađen nijedan dodatak",
+ "NoPluginSettings": "Ne postoje podešavanja ovog dodatka",
"NotAllowedToBrowseMarketplacePlugins": "Možete da pretražujete spisak dodataka koje je moguće instalirati kako biste podesili ili proširili vašu Piwik platformu. Kontaktirajte vašeg administratora ukoliko želite neki od njih da vidite instaliran.",
"NotAllowedToBrowseMarketplaceThemes": "Možete da pretražujete listu tema koje mogu biti instalirane kako biste podesili izgled vaše Piwik platforme. Kontaktirajte vašeg administratora ako želite da neku od njih vidite instaliranu.",
"NoThemesFound": "Nije nađena nijedna tema",
@@ -70,9 +72,9 @@
"PluginVersionInfo": "%1$s sa %2$s",
"PluginWebsite": "Sajt sa dodacima",
"Screenshots": "Snimci ekrana",
- "SortByAlpha": "alfa",
- "SortByNewest": "najnoviji",
- "SortByPopular": "popularnost",
+ "SortByAlpha": "Alfa",
+ "SortByNewest": "Najnoviji",
+ "SortByPopular": "Popularni",
"Status": "Status",
"StepDownloadingPluginFromMarketplace": "Preuzmi dodatak sa Marketa",
"StepDownloadingThemeFromMarketplace": "Preuzmi temu sa Marketa",
@@ -87,8 +89,8 @@
"SuccessfullyActicated": "Uspešno ste aktivirali <strong>%s<\/strong>.",
"Support": "Podrška",
"TeaserExtendPiwik": "Proširite Piwik dodacima i temama",
- "TeaserExtendPiwikByPlugin": "Proširite Piwik instaliranjem novog dodatka",
- "TeaserExtendPiwikByTheme": "Uživajte u novom izgledu instaliranjem nove teme",
+ "TeaserExtendPiwikByPlugin": "Proširite Piwik %1$sinstaliranjem novog dodatka%2$s.",
+ "TeaserExtendPiwikByTheme": "Uživajte u novom izgledu %1$sinstaliranjem nove teme%2$s.",
"TeaserExtendPiwikByUpload": "Proširite Piwik postavljanjem ZIP datoteke",
"InstallingNewPluginViaMarketplaceOrUpload": "Možete automatski instalirati dodatak sa Marketa ili ga možete %1$saploudovati%2$s u ZIP formatu.",
"Theme": "Tema",
@@ -101,6 +103,7 @@
"UploadZipFile": "Postavljanje ZIP datoteke",
"Version": "Verzija",
"ViewRepositoryChangelog": "Prikaži promene",
+ "ViewAllMarketplacePlugins": "Prikaži sve dodatke sa Marketa",
"Websites": "Sajtovi"
}
} \ No newline at end of file
diff --git a/plugins/CorePluginsAdmin/lang/sv.json b/plugins/CorePluginsAdmin/lang/sv.json
index ee558cc58b..e02aa922ee 100644
--- a/plugins/CorePluginsAdmin/lang/sv.json
+++ b/plugins/CorePluginsAdmin/lang/sv.json
@@ -23,7 +23,6 @@
"Developer": "Utvecklare",
"DevelopersLearnHowToDevelopPlugins": "Utvecklare: Lär känna hur du kan bredda eller anpassa Piwik geonom %1$sutveckling av plugin eller teman%2$s",
"DoMoreContactPiwikAdmins": "För att installera ett nytt plugin eller tema, gå till dina Piwik admins.",
- "EmailToEnquireUpdatedVersion": "Skicka ett mejl till %1$s och meddela om en uppdaterad version av %2$s.",
"FeaturedPlugin": "Utvalda plugin",
"ChangeLookByManageThemes": "Du kan ändra utseendet på Piwik genom %1$sHantera teman%2$s.",
"GetEarlyAccessForPaidPlugins": "Observera: Just nu är alla plugin gratis; framöver kommer det finnas Plugin som kostar i butiken. (%1$skontakta oss%2$s för tidig tillgång)",
@@ -70,9 +69,6 @@
"PluginVersionInfo": "%1$s från %2$s",
"PluginWebsite": "Plugin sida",
"Screenshots": "Skärmdumpar",
- "SortByAlpha": "alfa",
- "SortByNewest": "nyaste",
- "SortByPopular": "populär",
"Status": "Status",
"StepDownloadingPluginFromMarketplace": "Ladda ner plugin från Butiken.",
"StepDownloadingThemeFromMarketplace": "Ladda ner tema från Butiken",
@@ -87,8 +83,6 @@
"SuccessfullyActicated": "Du har nu aktiverat <strong>%s<\/strong>.",
"Support": "Support",
"TeaserExtendPiwik": "Få ut mer av Piwik med plugin och teman",
- "TeaserExtendPiwikByPlugin": "Få ut mer av din Piwik genom att installera ett nytt plugin",
- "TeaserExtendPiwikByTheme": "Njut av en annan design och känsla genom att installera ett nytt tema",
"TeaserExtendPiwikByUpload": "Utöka Piwik genom att ladda upp en ZIP fil",
"InstallingNewPluginViaMarketplaceOrUpload": "Du kan automatiskt installera plugin från Butiken eller %1$sladda upp en plugin%2$s i .zip format.",
"Theme": "Tema",
diff --git a/plugins/CorePluginsAdmin/lang/tl.json b/plugins/CorePluginsAdmin/lang/tl.json
index 25f61146f5..f2244988e8 100644
--- a/plugins/CorePluginsAdmin/lang/tl.json
+++ b/plugins/CorePluginsAdmin/lang/tl.json
@@ -21,7 +21,6 @@
"Deactivate": "I-deactivate",
"Developer": "Nagdevelop",
"DoMoreContactPiwikAdmins": "Para ma-install ang bagong plugin o bagong theme, mangyaring makipag ugnayan sa mga admin ng Piwik",
- "EmailToEnquireUpdatedVersion": "Paki-email ang %1$s at magtanong ng bagong na bersyon ng %2$s.",
"FeaturedPlugin": "Feature na plugin",
"GetEarlyAccessForPaidPlugins": "Tandaan: lahat ng mga plugin ay magagamit ng libre sa kasalukuyan; sa hinaharap ay i-eenable namin ang Bayad na Plugin sa Marketplace (%1$s makipag-ugnayan sa amin %2$s para sa maagang pag-access).",
"History": "Kasaysayan",
@@ -61,9 +60,6 @@
"PluginVersionInfo": "%1$s mula %2$s",
"PluginWebsite": "Plugin Website",
"Screenshots": "Screenshots",
- "SortByAlpha": "alpha",
- "SortByNewest": "pinakabago",
- "SortByPopular": "sikat",
"Status": "Status",
"StepDownloadingPluginFromMarketplace": "Dina-download ang plugin mula sa Marketplace",
"StepDownloadingThemeFromMarketplace": "Dina-download ang theme mula sa Marketplace",
@@ -78,8 +74,6 @@
"SuccessfullyActicated": "Matagumpay mong na-activate ang <strong> %s <\/ strong>.",
"Support": "Suporta",
"TeaserExtendPiwik": "Palawakin ang Piwik sa Social na Plugin at Themes",
- "TeaserExtendPiwikByPlugin": "Palawakin ang Piwik sa pamamagitan ng pag-install ng isang bagong plugin",
- "TeaserExtendPiwikByTheme": "Tangkilikin ang isa pang itsura sa pamamagitan ng pag install ng bagong theme",
"TeaserExtendPiwikByUpload": "Palawakin ang Piwik sa pamamagitan ng pag-upload ng ZIP File",
"Theme": "Theme",
"Themes": "Themes",
diff --git a/plugins/CorePluginsAdmin/lang/tr.json b/plugins/CorePluginsAdmin/lang/tr.json
index 228325a807..799838b354 100644
--- a/plugins/CorePluginsAdmin/lang/tr.json
+++ b/plugins/CorePluginsAdmin/lang/tr.json
@@ -46,9 +46,6 @@
"PluginVersionInfo": "%2$s den %1$s e",
"PluginWebsite": "Eklenti Sitesi",
"Screenshots": "Ekran Görüntüleri",
- "SortByAlpha": "alfa",
- "SortByNewest": "en yeni",
- "SortByPopular": "popüler",
"Status": "Durum",
"StepDownloadingPluginFromMarketplace": "Pazaryerinden eklenti indirin",
"StepDownloadingThemeFromMarketplace": "Pazaryerinden tema indirin",
diff --git a/plugins/CorePluginsAdmin/lang/uk.json b/plugins/CorePluginsAdmin/lang/uk.json
index 4ac19ce28c..76aa3b7383 100644
--- a/plugins/CorePluginsAdmin/lang/uk.json
+++ b/plugins/CorePluginsAdmin/lang/uk.json
@@ -23,7 +23,6 @@
"Developer": "Розробник",
"DevelopersLearnHowToDevelopPlugins": "Розробникам: Вивчіть, як ви можете розширити та персоналізувати Piwik за допомогою плагінів для %1$sрозробки або тем%2$s.",
"DoMoreContactPiwikAdmins": "Для встановлення нового плагіну або нової темм, будь ласка зв'яжіться з вашим Piwik-адміністратором",
- "EmailToEnquireUpdatedVersion": "Будь ласка, напишіть на електронну пошту %1$s і запросіть оновлену версію %2$s.",
"FeaturedPlugin": "Плагін що набирає популярність",
"ChangeLookByManageThemes": "Ви можете змінити зовнішній вигляд Piwik: %1$sВибір Теми%2$s.",
"GetEarlyAccessForPaidPlugins": "Примітка: в даний час всі плагіни доступні безкоштовно, в майбутньому ми включимо платні плагіни до Маркету (%1$sЗв'яжіться з нами%2$s для раннього доступу).",
@@ -70,9 +69,6 @@
"PluginVersionInfo": "%1$s – %2$s",
"PluginWebsite": "Сайт плагіну",
"Screenshots": "Скріншоти",
- "SortByAlpha": "за назвою",
- "SortByNewest": "по новизні",
- "SortByPopular": "за популярністю",
"Status": "Статус",
"StepDownloadingPluginFromMarketplace": "Завантажити плагін з Маркету",
"StepDownloadingThemeFromMarketplace": "Завантажити тему з Маркету",
@@ -87,8 +83,6 @@
"SuccessfullyActicated": "Ви успішно активували <strong>%s<\/strong>.",
"Support": "Підтримка",
"TeaserExtendPiwik": "Поліпшення Piwik за допомогою Плагінів і Тим",
- "TeaserExtendPiwikByPlugin": "Поліпшення Piwik установкою нового плагіна",
- "TeaserExtendPiwikByTheme": "Насолоджуйтеся іншим зовнішнім виглядом встановивши нову тему",
"TeaserExtendPiwikByUpload": "Поліпшення Piwik закачуванням ZIP файла",
"InstallingNewPluginViaMarketplaceOrUpload": "Ви автоматично можете встановити плагіни з Маркету або %1$sзавантажити плагін%2$s в форматі zip.",
"Theme": "Тема",
diff --git a/plugins/CorePluginsAdmin/lang/vi.json b/plugins/CorePluginsAdmin/lang/vi.json
index 8d131dd15c..8354dec65c 100644
--- a/plugins/CorePluginsAdmin/lang/vi.json
+++ b/plugins/CorePluginsAdmin/lang/vi.json
@@ -45,8 +45,6 @@
"PluginNotCompatibleWith": "%1$s plugin là không tương thích với %2$s.",
"PluginsManagement": "Quản lý các Plugin.",
"PluginVersionInfo": "%1$s từ %2$s",
- "SortByNewest": "mới nhất",
- "SortByPopular": "thông dụng",
"Status": "Trạng thái",
"StepDownloadingThemeFromMarketplace": "Tải giao diện từ Chợ ứng dụng",
"Support": "Hỗ trợ",
diff --git a/plugins/CorePluginsAdmin/lang/zh-cn.json b/plugins/CorePluginsAdmin/lang/zh-cn.json
index df8b537e4f..e958a5b845 100644
--- a/plugins/CorePluginsAdmin/lang/zh-cn.json
+++ b/plugins/CorePluginsAdmin/lang/zh-cn.json
@@ -23,7 +23,6 @@
"Developer": "程序员",
"DevelopersLearnHowToDevelopPlugins": "开发者:你可以学习如何扩展和定制 Piwik%1$s开发插件或主题%2$s。",
"DoMoreContactPiwikAdmins": "要安装新插件或者一个新的主题,请与您的Piwik管理员联系。",
- "EmailToEnquireUpdatedVersion": "请发邮件%1$s和查询%2$s的更新版本。",
"FeaturedPlugin": "特色插件",
"ChangeLookByManageThemes": "你可以进入%1$s管理主题%2$s来改变Piwik的外观。",
"GetEarlyAccessForPaidPlugins": "注意:目前所有插件都是免费的,但未来我们可能会在市场里开放付费插件。(%1$s联系我们%2$s)",
@@ -70,9 +69,6 @@
"PluginVersionInfo": "%1$s 来自 %2$s",
"PluginWebsite": "插件网站",
"Screenshots": "截屏",
- "SortByAlpha": "alpha",
- "SortByNewest": "最新的",
- "SortByPopular": "最热门",
"Status": "状态",
"StepDownloadingPluginFromMarketplace": "正在从商城下载插件",
"StepDownloadingThemeFromMarketplace": "正在从商城下载布景",
@@ -87,8 +83,6 @@
"SuccessfullyActicated": "您已成功激活<strong>%s<\/strong>。",
"Support": "支持",
"TeaserExtendPiwik": "使用插件主题来扩展Piwik",
- "TeaserExtendPiwikByPlugin": "安装一个新的插件来扩展Piwik。",
- "TeaserExtendPiwikByTheme": "安装一个新的主题来感受一下",
"TeaserExtendPiwikByUpload": "上传一个ZIP文件来扩展Piwik。",
"InstallingNewPluginViaMarketplaceOrUpload": "你可以从市场里自动安装插件,或%1$s上传%2$s一个ZIP格式的插件。",
"Theme": "主题",
diff --git a/plugins/CoreUpdater/SystemSettings.php b/plugins/CoreUpdater/SystemSettings.php
index 4827a74676..256cf65f08 100644
--- a/plugins/CoreUpdater/SystemSettings.php
+++ b/plugins/CoreUpdater/SystemSettings.php
@@ -97,7 +97,7 @@ class SystemSettings extends \Piwik\Settings\Plugin\SystemSettings
private function createSendPluginUpdateEmail()
{
- return $this->makeSetting('enable_plugin_update_communication', false, FieldConfig::TYPE_BOOL, function (FieldConfig $field) {
+ return $this->makeSetting('enable_plugin_update_communication', $default = true, FieldConfig::TYPE_BOOL, function (FieldConfig $field) {
$field->introduction = Piwik::translate('CoreAdminHome_SendPluginUpdateCommunication');
$field->uiControl = FieldConfig::UI_CONTROL_RADIO;
$field->availableValues = array('1' => Piwik::translate('General_Yes'),
diff --git a/plugins/CoreUpdater/lang/cs.json b/plugins/CoreUpdater/lang/cs.json
index 47ed4fff6c..f6b10e04b5 100644
--- a/plugins/CoreUpdater/lang/cs.json
+++ b/plugins/CoreUpdater/lang/cs.json
@@ -1,5 +1,6 @@
{
"CoreUpdater": {
+ "CheckingForPluginUpdates": "Kontrola aktualizací zásuvných modulů",
"ClickHereToViewSqlQueries": "Klikněte zde pro zobrazení SQL dotazů s možností je zkopírovat, které mají být spuštěny",
"CriticalErrorDuringTheUpgradeProcess": "Při aktualizaci nastala kritická chyba:",
"DatabaseUpgradeRequired": "Vyžadováno povýšení databáze",
@@ -14,7 +15,7 @@
"ErrorDIYHelp_4": "abyste dokončili aktualizaci znovu spusťte aktualizaci (přes WWW prohlížeč nebo příkazovou řádku",
"ErrorDIYHelp_5": "nahlašte problém a řešení, aby mohl být Piwik vylepšen",
"ErrorDuringPluginsUpdates": "Chyba při aktualizaci zásuvných modulů:",
- "ExceptionAlreadyLatestVersion": "Váš Piwik %s již je aktualizován",
+ "ExceptionAlreadyLatestVersion": "Piwik %s je již v nejnovější verzi.",
"ExceptionArchiveEmpty": "Archiv je prázdný",
"ExceptionArchiveIncompatible": "Nekompatibilní archiv: %s",
"ExceptionArchiveIncomplete": "Archiv je nekompletní: některé soubory chybí (např.: %s).",
@@ -23,7 +24,7 @@
"HelpMessageIntroductionWhenError": "Níže je hlavní chybová hláška. Pomůže vám zjistit příčinu, ale pokud budete potřebovat další pomoc:",
"HelpMessageIntroductionWhenWarning": "Aktualizace proběhla v pořádku, ale byly zaznamenány problémy. Prosím přečtěte si jejich popis výše. Pro další pomoc:",
"HighTrafficPiwikServerEnableMaintenance": "Pokud provozujete Piwik server s velkým provozem, doporučujeme %1$sna chvíli zakázat sledování návštěvníků a přepnout uživatelské rozhraní do režimu údržby%2$s.",
- "IncompatbilePluginsWillBeDisabledInfo": "Poznámka: Některé zásuvné moduly nejsou kompatibilní s Piwikem %s. Budou zakázány při aktualizaci:",
+ "IncompatbilePluginsWillBeDisabledInfo": "Poznámka: Některé zásuvné moduly nejsou kompatibilní s Piwikem %s. Tyto budou buď automaticky aktualizovány, pokud to bude možné, nebo vypnuty před aktualizací:",
"InstallingTheLatestVersion": "Instaluji poslední verzi",
"LatestBetaRelease": "Poslední beta vydání",
"LatestStableRelease": "Poslední stabilní vydání",
@@ -52,6 +53,7 @@
"UpdateAutomatically": "Aktualizovat automaticky",
"UpdateHasBeenCancelledExplanation": "One Click aktualizace Piwiku byla zrušena. Pokud nemůžete opravit chybu je doporučeno Piwik aktualizovat manuálně. %1$s Prosím zkontrolujte nejdříve %2$sdokumentaci k aktualizaci%3$s!",
"UpdateTitle": "Aktualizovat",
+ "UpdatingPluginXToVersionY": "Aktualizace modulu %1$s na verzi %2$s",
"UpdateSuccessTitle": "Piwik byl úspěšně aktualizován!",
"UpdateErrorTitle": "Chyba aktualizace",
"ThankYouUpdatePiwik": "Děkujeme, že používáte Piwik vždy v nejaktuálnější verzi!",
diff --git a/plugins/CoreUpdater/lang/da.json b/plugins/CoreUpdater/lang/da.json
index 5b3fe4d0db..28e689bcf1 100644
--- a/plugins/CoreUpdater/lang/da.json
+++ b/plugins/CoreUpdater/lang/da.json
@@ -23,7 +23,6 @@
"HelpMessageIntroductionWhenError": "Ovenstående vises fejlmeddelelsen. Den bør hjælpe med at forklare årsagen, men hvis der behøves mere hjælp:",
"HelpMessageIntroductionWhenWarning": "Opdateringen er fuldført, men det var nogle småproblemer under processen. Læs detaljerne ovenfor. For yderligere hjælp:",
"HighTrafficPiwikServerEnableMaintenance": "Hvis du administrerer en Piwik server med høj trafik, anbefaler vi at du %1$s midlertidigt deaktivere sporing af besøgende og sætte Piwik brugergrænseflade i vedligeholdelsestilstand%2$s",
- "IncompatbilePluginsWillBeDisabledInfo": "Bemærk: Nogle udvidelsesmoduler er ikke kompatible med Piwik %s. De vil blive deaktiveret, når du opgraderer:",
"InstallingTheLatestVersion": "Installerer den seneste version",
"LatestBetaRelease": "Den seneste beta release",
"LatestStableRelease": "Den seneste stabile udgave",
diff --git a/plugins/CoreUpdater/lang/de.json b/plugins/CoreUpdater/lang/de.json
index 6a70623792..f3c8cf31ba 100644
--- a/plugins/CoreUpdater/lang/de.json
+++ b/plugins/CoreUpdater/lang/de.json
@@ -1,5 +1,6 @@
{
"CoreUpdater": {
+ "CheckingForPluginUpdates": "Suche nach neuen Plugin-Aktualisierungen.",
"ClickHereToViewSqlQueries": "Klicken Sie hier, um die Liste der auszuführenden SQL-Befehle anzuzeigen und zu kopieren.",
"CriticalErrorDuringTheUpgradeProcess": "Kritischer Fehler während der Aktualisierung:",
"DatabaseUpgradeRequired": "Die Datenbank muss aktualisiert werden",
@@ -23,7 +24,7 @@
"HelpMessageIntroductionWhenError": "Dies ist die Kernfehlermeldung. Sie sollte helfen, die Ursache zu erklären, aber wenn Sie weitere Hilfe benötigen, bitte:",
"HelpMessageIntroductionWhenWarning": "Die Aktualisierung konnte erfolgreich abgeschlossen werden, obwohl es währenddessen zu Problemen kam. Für nähere Details lesen Sie bitte die Beschreibung. Für weitere Hilfe:",
"HighTrafficPiwikServerEnableMaintenance": "Wenn Sie eine Website mit hohem Verkehrsaufkommen verwalten, empfehlen wir, das %1$sBesuchertracking vorübergehend zu deaktivieren und die Benutzeroberfläche in den Wartungsmodus zu versetzen%2$s.",
- "IncompatbilePluginsWillBeDisabledInfo": "Hinweis: Einige Plugins sind nicht kompatibel mit Piwik %s. Diese werden beim Upgrade deaktiviert:",
+ "IncompatbilePluginsWillBeDisabledInfo": "Hinweis: Einige Erweiterungen sind nicht mit Piwik %s kompatibel. Sobald im Marktplatz ein Update verfügbar ist, werden wir sie aktualisieren. Ist aktuell keine Aktualisierung der Erweiterungen möglich, werden sie beim Upgrade deaktiviert.",
"InstallingTheLatestVersion": "Die neueste Version wird installiert",
"LatestBetaRelease": "Das aktuelle beta Release",
"LatestStableRelease": "Das aktuelle stabile Release",
@@ -52,6 +53,7 @@
"UpdateAutomatically": "Aktualisierung automatisch ausführen",
"UpdateHasBeenCancelledExplanation": "Die Piwik Ein-Klick-Aktualisierung wurde abgebrochen. Wenn die oben stehende Fehlermeldung nicht behoben werden kann, sollten Sie Piwik manuell aktualisieren. %1$s Bitte lesen Sie die %2$sDokumentation zur Aktualisierung%3$s, um die Einzelheiten zu erfahren!",
"UpdateTitle": "Aktualisierung",
+ "UpdatingPluginXToVersionY": "Aktualisiere Plugin %1$s auf Version %2$s",
"UpdateSuccessTitle": "Piwik wurde erfolgreich aktualisiert!",
"UpdateErrorTitle": "Aktualisierungsfehler",
"ThankYouUpdatePiwik": "Vielen Dank, dass Sie Piwik nutzen und es aktuell halten!",
diff --git a/plugins/CoreUpdater/lang/el.json b/plugins/CoreUpdater/lang/el.json
index 695a3c5519..d792d653a7 100644
--- a/plugins/CoreUpdater/lang/el.json
+++ b/plugins/CoreUpdater/lang/el.json
@@ -1,5 +1,6 @@
{
"CoreUpdater": {
+ "CheckingForPluginUpdates": "Γίνεται έλεγχος για ενημερώσεις πρόσθετων",
"ClickHereToViewSqlQueries": "Πατήστε εδώ για να δείτε και να αντιγράψετε τη λίστα των ερωτημάτων που θα εκτελεστούν",
"CriticalErrorDuringTheUpgradeProcess": "Κρίσιμο σφάλμα κατά τη διαδικασία αναβάθμισης:",
"DatabaseUpgradeRequired": "Απαιτείται Αναβάθμιση της Βάσης Δεδομένων",
@@ -23,7 +24,7 @@
"HelpMessageIntroductionWhenError": "Το παραπάνω είναι το μήνυμα λάθους του πυρήνα. Λογικά πρέπει να βοηθάει την επεξήγηση της αιτίας, αλλά αν θέλετε περισσότερες πληροφορίες:",
"HelpMessageIntroductionWhenWarning": "Η αναβάθμιση ολοκληρώθηκε με επιτυχία, αλλά υπήρξαν κάποια θέματα κατά τη διάρκεια. Παρακαλώ διαβάστε τις παραπάνω περιγραφές για τις λεπτομέρειες. Για περισσότερη βοήθεια:",
"HighTrafficPiwikServerEnableMaintenance": "Αν διαχειρίζεστε ένα Piwik διακομιστή με υψηλή κίνηση, προτείνουμε να %1$sαπενεργοποιήσετε προσωρινά την παρακολούθηση Επισκέπτη και να βάλετε τη Διεπαφή Χρήστη του Piwik σε κατάσταση συντήρησης%2$s.",
- "IncompatbilePluginsWillBeDisabledInfo": "Σημείωση: ορισμένα πρόσθετα δεν είναι συμβατά με το Piwik %s. Θα απενεργοποιηθούν όταν αναβαθμίσετε:",
+ "IncompatbilePluginsWillBeDisabledInfo": "Σημείωση: ορισμένα πρόσθετα δεν είναι συμβατά με το Piwik %s. Θα ενημερωθούν αν υπάρχει κάποια ενημέρωση στην Αγορά, διαφορετικά θα απενεργοποιηθούν όταν τα ενημερώσετε:",
"InstallingTheLatestVersion": "Εγκατάσταση της τελευταίας έκδοσης",
"LatestBetaRelease": "Τελευταία δοκιμαστική έκδοση",
"LatestStableRelease": "Τελευταία σταθερή έκδοση",
@@ -52,6 +53,7 @@
"UpdateAutomatically": "Αυτόματη ενημέρωση",
"UpdateHasBeenCancelledExplanation": "Η Αναβάθμιση με Ένα Κλικ ακυρώθηκε. Αν δεν μπορείτε να διορθώσετε το παραπάνω σφάλμα, σας προτείνουμε να αναβαθμίσετε το Piwik χειροκίνητα. %1$s Διαβάστε την %2$sΤεκμηρίωση Αναβάθμισης%3$s για να ξεκινήσετε!",
"UpdateTitle": "Ενημέρωση",
+ "UpdatingPluginXToVersionY": "Γίνεται ενημέρωση του πρόσθετου από την έκδοση %1$s στην %2$s",
"UpdateSuccessTitle": "Το Piwik αναβαθμίστηκε επιτυχώς!",
"UpdateErrorTitle": "Σφάλμα ενημέρωσης",
"ThankYouUpdatePiwik": "Ευχαριστούμε που χρησιμοποιείτε το Piwik και το κρατάτε ενημερωμένο!",
diff --git a/plugins/CoreUpdater/lang/es.json b/plugins/CoreUpdater/lang/es.json
index d97e404a48..3b576e7c1b 100644
--- a/plugins/CoreUpdater/lang/es.json
+++ b/plugins/CoreUpdater/lang/es.json
@@ -1,5 +1,6 @@
{
"CoreUpdater": {
+ "CheckingForPluginUpdates": "Verificando nuevas actualizaciones del complemento",
"ClickHereToViewSqlQueries": "Clic aquí para ver y copiar la lista de sentencias SQL que será ejecutada",
"CriticalErrorDuringTheUpgradeProcess": "Error crítico durante el proceso de actualización:",
"DatabaseUpgradeRequired": "La base de datos necesita actualizarse",
@@ -23,7 +24,7 @@
"HelpMessageIntroductionWhenError": "Lo anterior es un mensaje de error principal. Debería ayudarle a explicar la causa, pero si necesita más ayuda, por favor:",
"HelpMessageIntroductionWhenWarning": "Actualización completada con éxito, sin embargo hubo problemas durante el proceso. Por favor, lea las descripciones anteriores para obtener más detalles. Para obtener más ayuda:",
"HighTrafficPiwikServerEnableMaintenance": "Si administra un servidor de Piwik con tráfico elevado, le recomendamos %1$sdesactivar momentáneamente el seguimento de los visitantes y disponer la interfaz de usuario de Piwik en modo mantenimiento%2$s.",
- "IncompatbilePluginsWillBeDisabledInfo": "Nota: algunos complementos no son compatibles con Piwik %s. Serán desactivados cuando actualice:",
+ "IncompatbilePluginsWillBeDisabledInfo": "Nota: algunos complementos no son compatibles con Piwik %s. Los actualizaremos si existe una nueva versiòn en el Marketplace, de lo contrario, lo deshabilitaremos cuando lo actualice:",
"InstallingTheLatestVersion": "Instalando la última versión",
"LatestBetaRelease": "Ultima versión beta estable",
"LatestStableRelease": "Ultima liberación de versión estable",
@@ -52,6 +53,7 @@
"UpdateAutomatically": "Actualización automática",
"UpdateHasBeenCancelledExplanation": "La actualización con Un Clic de Piwik se ha cancelado. Si no puede solucionar el anterior mensaje de error, se recomienda que actualice Piwik manualmente. %1$s ¡Por favor, consulte la %2$sdocumentación de actualización%3$s para empezar!",
"UpdateTitle": "Actualizar",
+ "UpdatingPluginXToVersionY": "Actualizando complemento %1$s a la versiòn %2$s",
"UpdateSuccessTitle": "¡Piwik se ha actualizado correctamente!",
"UpdateErrorTitle": "Error de actualización",
"ThankYouUpdatePiwik": "¡Gracias por utilizar Piwik y mantenerlo actualizado!",
diff --git a/plugins/CoreUpdater/lang/fi.json b/plugins/CoreUpdater/lang/fi.json
index 28915e6f2f..7f9d1d95d6 100644
--- a/plugins/CoreUpdater/lang/fi.json
+++ b/plugins/CoreUpdater/lang/fi.json
@@ -23,7 +23,6 @@
"HelpMessageIntroductionWhenError": "Alla on ytimen virheviesti: Sen pitäisi auttaa virheen etsimisessä, mutta jos tarvitset lisää apua:",
"HelpMessageIntroductionWhenWarning": "Päivitys valmistui onnistuneesti, mutta prosessin aikana tapahtui virheitä. Ole hyvä ja lue alla olevat kuvaukset. Lisää apua:",
"HighTrafficPiwikServerEnableMaintenance": "Jos Piwik-palvelimellasi on suuria määriä liikennettä, suosittelemme %1$spoistamaan käyttäjäseurannan hetkellisesti käytöstä ja laittamaan Piwikin käyttäjäliittymän huoltotilaan%2$s.",
- "IncompatbilePluginsWillBeDisabledInfo": "Huom. Osa lisäosista ei ole yhteensopivia Piwikin kanssa: %s. Nämä poistetaan käytöstä kun päivität:",
"InstallingTheLatestVersion": "Asennetaan uusinta versiota",
"LatestBetaRelease": "Viimeisin beta-julkaisu",
"LatestStableRelease": "Viimeisin vakaa julkaisu",
diff --git a/plugins/CoreUpdater/lang/fr.json b/plugins/CoreUpdater/lang/fr.json
index e988e51340..fb35e896ff 100644
--- a/plugins/CoreUpdater/lang/fr.json
+++ b/plugins/CoreUpdater/lang/fr.json
@@ -1,5 +1,6 @@
{
"CoreUpdater": {
+ "CheckingForPluginUpdates": "Vérification des mises à jour pour les plugins",
"ClickHereToViewSqlQueries": "Cliquez ici pour visualiser la liste des commandes SQL qui vont être exécutées",
"CriticalErrorDuringTheUpgradeProcess": "Erreur critique pendant la mise à jour :",
"DatabaseUpgradeRequired": "Mise à jour de la base de données requise",
@@ -23,7 +24,7 @@
"HelpMessageIntroductionWhenError": "Ci-dessus est le message d'erreur du noyau. Cela devrait expliquer la cause, mais si vous nécessitez davantage d'aide merci de :",
"HelpMessageIntroductionWhenWarning": "La mise à jour a été complétée avec succès. Cependant, des problèmes sont survenus. Lisez la description ci-dessus pour plus de détails. Pour davantage d'aide :",
"HighTrafficPiwikServerEnableMaintenance": "Si vous gérez un serveur Piwik à haut traffic, nous recommandons de %1$sdésactiver momentanément le suivi des visiteurs et de mettre l'interface utilisateur de Piwik en mode de maintenance%2$s.",
- "IncompatbilePluginsWillBeDisabledInfo": "Note : certains plugins ne sont pas compatbles avec Piwik %s. Ils seront désactivés lorsque vous mettrez à jour :",
+ "IncompatbilePluginsWillBeDisabledInfo": "Note : certains composants ne sont pas compatibles avec Piwik %s. Nous allons les mettre à jour si une mise à jour est disponible que le marché, sinon nous allons les désactiver lorsque vous effecturez la mise à jour :",
"InstallingTheLatestVersion": "Installation de la dernière version",
"LatestBetaRelease": "Dernière version beta",
"LatestStableRelease": "Dernière version stable",
@@ -52,6 +53,7 @@
"UpdateAutomatically": "Mettre à jour automatiquement",
"UpdateHasBeenCancelledExplanation": "La mise à jour de Piwik en un clic a été désactivée. Si vous ne pouvez pas corriger la cause du message d'erreur ci-dessous, il est recommandé que vous fassiez manuellement la mise à jour de Piwik. %1$sConsultez la documentation%2$s de la mise à jour%3$s pour commencer!",
"UpdateTitle": "Mise à jour",
+ "UpdatingPluginXToVersionY": "Mise à jour du composant %1$s à la version %2$s",
"UpdateSuccessTitle": "Piwik a été mis à jour avec succès !",
"UpdateErrorTitle": "Erreur de mise à jour",
"ThankYouUpdatePiwik": "Merci d'utiliser Piwik et de le garder à jour !",
diff --git a/plugins/CoreUpdater/lang/it.json b/plugins/CoreUpdater/lang/it.json
index a8b10cc92e..6845d40715 100644
--- a/plugins/CoreUpdater/lang/it.json
+++ b/plugins/CoreUpdater/lang/it.json
@@ -1,5 +1,6 @@
{
"CoreUpdater": {
+ "CheckingForPluginUpdates": "Controllo aggiornamenti plugin",
"ClickHereToViewSqlQueries": "Leggi e copia la lista di query SQL che dovranno essere eseguite",
"CriticalErrorDuringTheUpgradeProcess": "Errore critico durante l'aggiornamento:",
"DatabaseUpgradeRequired": "Aggiornamento del Database richiesto",
@@ -23,7 +24,7 @@
"HelpMessageIntroductionWhenError": "Il messaggio qui sopra ti spiega l'errore verificatosi durante l'aggiornamento. Ti spiega cosa l'ha causato, ma se vuoi ulteriore aiuto:",
"HelpMessageIntroductionWhenWarning": "L'aggiornamento è stato completato con successo, tuttavia si sono verificati dei piccoli problemi. Puoi leggerne qui sopra una breve descrizione. Per maggiori informazioni:",
"HighTrafficPiwikServerEnableMaintenance": "Se gestisci un server di Piwik ad alto traffico, raccomandiamo di %1$sdisabilitare temporaneamente il Tracciamento dei visitatori e di mettere l'Interfaccia Utente di Piwik in modalità manutenzione%2$s.",
- "IncompatbilePluginsWillBeDisabledInfo": "Nota: alcuni plugins non sono compatibili con Piwik %s. Dopo l'aggiornamento verranno disabilitati.",
+ "IncompatbilePluginsWillBeDisabledInfo": "Nota: alcuni plugin non sono compatibili con Piwik %s. Se sarà disponibile un aggiornamento sul Marketplace li aggiorneremo, altrimenti li terremo disabilitati quando aggiornerai:",
"InstallingTheLatestVersion": "Sto installando l'ultima versione",
"LatestBetaRelease": "Ultima release beta",
"LatestStableRelease": "Ultima release stabile",
@@ -52,9 +53,10 @@
"UpdateAutomatically": "Aggiorna automaticamente",
"UpdateHasBeenCancelledExplanation": "Il \"Piwik One Click Update\" è stato annullato. Se non riesci a sistemare il problema che ha causato il messaggio di errore indicato, è consigliabile aggiornare Piwik manualmente. %1$s Controlla la %2$sDocumentazione di aggiornamento%3$s per iniziare!",
"UpdateTitle": "Aggiorna",
+ "UpdatingPluginXToVersionY": "Aggiornamento del plugin %1$s alla versione %2$s",
"UpdateSuccessTitle": "Piwik è stato aggiornato con successo!",
"UpdateErrorTitle": "Errore nell'aggiornamento",
- "ThankYouUpdatePiwik": "Grazie per l'utilizzo di Piwik e per tenerlo aggiornato!",
+ "ThankYouUpdatePiwik": "Grazie per l'utilizzo di Piwik e per averlo aggiornato!",
"PostUpdateMessage": "Piwik sarà sempre gratuito da scaricare e utilizzare, ma necessita del tuo continuo sostegno per crescere e migliorare.",
"PostUpdateSupport": "Se hai bisogno di aiuto per utilizzare Piwik, puoi averlo dai suoi creatori:",
"ProfessionalServices": "Servizi Professionali",
diff --git a/plugins/CoreUpdater/lang/ja.json b/plugins/CoreUpdater/lang/ja.json
index cb276d1566..874f0daedb 100644
--- a/plugins/CoreUpdater/lang/ja.json
+++ b/plugins/CoreUpdater/lang/ja.json
@@ -23,7 +23,6 @@
"HelpMessageIntroductionWhenError": "上記はコアのエラーメッセージです。 原因の説明に役立つはずですが、さらなるヘルプが必要であればこちらをどうぞ:",
"HelpMessageIntroductionWhenWarning": "アップグレードは正常に完了しましたが、処理中に問題がありました。 詳細は上記の説明をお読みください。 さらなるヘルプ:",
"HighTrafficPiwikServerEnableMaintenance": "高トラフィックの Piwik サーバーを管理する場合、 %1$smomentarily disable visitor Tracking and put the Piwik User Interface in maintenance mode%2$s をお勧めします。",
- "IncompatbilePluginsWillBeDisabledInfo": "注 : 一部のプラグインは、Piwik %s に互換性がありません。アップグレード時に、これらのプラグインは無効になります。",
"InstallingTheLatestVersion": "最新バージョンをインストール中",
"LatestBetaRelease": "最新のベータ版 リリース",
"LatestStableRelease": "最新の安定版リリース",
diff --git a/plugins/CoreUpdater/lang/lt.json b/plugins/CoreUpdater/lang/lt.json
index fea60afcad..e113f822e6 100644
--- a/plugins/CoreUpdater/lang/lt.json
+++ b/plugins/CoreUpdater/lang/lt.json
@@ -1,5 +1,6 @@
{
"CoreUpdater": {
+ "CheckingForPluginUpdates": "Tikrinama ar yra naujų atnaujinimų papildiniams",
"ClickHereToViewSqlQueries": "Spauskite čia SQL užklausų, kurias reikia įvykdyti, sąrašui gauti.",
"CriticalErrorDuringTheUpgradeProcess": "Kritinė klaida atnaujinimo metu:",
"DatabaseUpgradeRequired": "Reikalingas duombazės atnaujinimas",
@@ -21,12 +22,12 @@
"HelpMessageContent": "Peržiūrėkite %1$s Piwik DUK, %2$s kur paaiškinamos dažniausiai pasitaikančios naujinimo problemos. %3$s Jūsų sistemos administratorius gali padėti išspręsti daugumą jų, kadangi jos dažniausiai susijusios su serverio arba MySQL nustatymais.",
"HelpMessageIntroductionWhenError": "Aukščiau nurodytas klaidos aprašymas. Jei reikia daugiau pagalbos:",
"HelpMessageIntroductionWhenWarning": "Piwik atnaujinta, tačiau su išlygomis. Prašome perskaityti aukščiau pateikiamą aprašymą. Jei reikia daugiau pagalbos:",
- "IncompatbilePluginsWillBeDisabledInfo": "Pastaba: kai kurie papildiniai yra nesuderinami su Piwik %s. Kai atsinaujinsite, jie bus išjungti:",
"InstallingTheLatestVersion": "Įdiegiama naujausia versija",
"MajorUpdateWarning1": "Tai yra didesnis atnaujinimas! Jis užtruks ilgiau nei įprasta.",
"NoteForLargePiwikInstances": "Svarbi pastaba apie didelius Piwik diegimus",
"NoteItIsExpectedThatQueriesFail": "Pastaba: jei rankiniu būdu įvykdysite šias užklausas, gali būti, jog kai kurios iš jų praneš apie klaidas ir nebus įvykdytos. Paprasčiausias ignoruokite klaidas ir vykdykite sekančias užklausas esančias sąraše.",
"NotificationClickToUpdatePlugins": "Spustelėkite čia, kad atnaujintumėte savo papildinius dabar:",
+ "NotificationClickToUpdateThemes": "Spustelėkite čia, kad atnaujintumėte savo temas dabar:",
"NotificationSubjectAvailablePluginUpdate": "Jūsų Piwik papildiniams yra atnaujinimų",
"PiwikHasBeenSuccessfullyUpgraded": "Piwik sėkmingai atnaujinta!",
"PiwikUpdatedSuccessfully": "Piwik sėkmingai atnaujinta!",
@@ -40,6 +41,7 @@
"UpdateAutomatically": "Naujinti automatiškai",
"UpdateHasBeenCancelledExplanation": "Piwik automatinis atnaujinimas atšauktas. Jei negalite ištaisyti nurodytos klaidos, rekomenduojame atnaujinti Piwik rankiniu būdu. %1$s Peržiūrėkite %2$sNaujinimo dokumentaciją%3$s prieš pradedant!",
"UpdateTitle": "Naujinimas",
+ "UpdatingPluginXToVersionY": "Atnaujinamas papildinys %1$s į versiją %2$s",
"UpdateSuccessTitle": "Piwik sėkmingai atnaujinta!",
"UpdateErrorTitle": "Atnaujinimo klaida",
"UpgradeComplete": "Naujinimas baigtas!",
@@ -50,6 +52,7 @@
"YouCanUpgradeAutomaticallyOrDownloadPackage": "Galite atnaujinti iki %s versijos automatiškai arba atsisiųsti paketą ir atnaujinti Piwik rankiniu būdu:",
"YouCouldManuallyExecuteSqlQueries": "Jei negalite pasinaudoti komandine eilute Piwik atnaujinti ar Piwik tiesiog neatsinaujina (dėl nutrūkusios sesijos, prarasto ryšio su duombaze ar kurios nors kitos priežasties), galite rankiniu būdu įvykdyti SQL užklausas Piwik atnaujinimui.",
"YouMustDownloadPackageOrFixPermissions": "Piwik negali perrašyti Jūsų dabartinio diegimo. Galite arba pataisyti katalogo\/failo teises, arba atsisiųsti paketą ir įdiegti šią versiją %s rankiniu būdu:",
- "YourDatabaseIsOutOfDate": "Norint tęsti, reikia atnaujinti Piwik duombazę"
+ "YourDatabaseIsOutOfDate": "Norint tęsti, reikia atnaujinti Piwik duombazę",
+ "ViewVersionChangelog": "Rodyti šios versijos keitinių žurnalą:"
}
} \ No newline at end of file
diff --git a/plugins/CoreUpdater/lang/nb.json b/plugins/CoreUpdater/lang/nb.json
index 975b2eb501..9dfc88ba1c 100644
--- a/plugins/CoreUpdater/lang/nb.json
+++ b/plugins/CoreUpdater/lang/nb.json
@@ -1,5 +1,6 @@
{
"CoreUpdater": {
+ "CheckingForPluginUpdates": "Ser etter nye oppdateringer for utvidelser",
"ClickHereToViewSqlQueries": "Klikk her for å se og kopiere listen med SQL-spørringer som vil bli utført.",
"CriticalErrorDuringTheUpgradeProcess": "Kritisk feil under oppdateringen:",
"DatabaseUpgradeRequired": "Databaseoppgradering er nødvendig",
@@ -23,7 +24,7 @@
"HelpMessageIntroductionWhenError": "Over vises feilmeldingen. Den bør hjelpe deg med å forklare årsaken, men hvis du trenger mer hjelp, vennligst:",
"HelpMessageIntroductionWhenWarning": "Oppdateringen er fullført, men det var noen småproblemer under prossessen. Les beskrivelsene over for mer informasjon. For videre hjelp:",
"HighTrafficPiwikServerEnableMaintenance": "Hvis du administrerer en Piwik-tjener for et nettsted med høy trafikk, anbefaler vi at du %1$smidlertidig slår av sporing av besøkende og setter Piwik-brukergrensesnittet i vedlikeholdsmodus%2$s.",
- "IncompatbilePluginsWillBeDisabledInfo": "Merk: Noen tillegg er ikke kompatible med Piwik %s. De blir deaktivert når du oppgraderer:",
+ "IncompatbilePluginsWillBeDisabledInfo": "Merk: noen utvidelser er ikke kompatible med Piwik %s. Vi vil oppdatere dem hvis det finnes en oppdatering på Markedsplassen. Ellers vil vi deaktivere dem når du oppgraderer Piwik:",
"InstallingTheLatestVersion": "Installerer siste versjon.",
"LatestBetaRelease": "Siste beta-versjon",
"LatestStableRelease": "Siste stabile versjon",
@@ -52,6 +53,7 @@
"UpdateAutomatically": "Oppdater automatisk",
"UpdateHasBeenCancelledExplanation": "Den automatiske oppdateringen av Piwik har blitt avbrutt. Hvis du ikke kan fikse feilen over, anbefales det at du oppdaterer Piwik manuelt. %1$s Les %2$soppdateringsdokumentasjonen%3$s for å komme i gang!",
"UpdateTitle": "Oppdater",
+ "UpdatingPluginXToVersionY": "Oppdaterer utvidelsen %1$s til versjon %2$s",
"UpdateSuccessTitle": "Piwik ble korrekt oppdatert!",
"UpdateErrorTitle": "Feil ved oppdatering",
"ThankYouUpdatePiwik": "Takk for at du bruker Piwik og holder den oppdatert!",
diff --git a/plugins/CoreUpdater/lang/nl.json b/plugins/CoreUpdater/lang/nl.json
index 331d80c3ea..9ad11f7ae6 100644
--- a/plugins/CoreUpdater/lang/nl.json
+++ b/plugins/CoreUpdater/lang/nl.json
@@ -1,5 +1,6 @@
{
"CoreUpdater": {
+ "CheckingForPluginUpdates": "Controleren voor nieuwe plugin updates",
"ClickHereToViewSqlQueries": "Klik hier voor een lijst van de SQL query's die zullen worden uitgevoerd.",
"CriticalErrorDuringTheUpgradeProcess": "Kritieke fout tijdens upgrade:",
"DatabaseUpgradeRequired": "Database upgrade vereist",
@@ -23,8 +24,13 @@
"HelpMessageIntroductionWhenError": "Hierboven staat de foutmelding. Hierin zou de oorzaak naar voren moeten komen, mocht u desondanks nog vragen hebben:",
"HelpMessageIntroductionWhenWarning": "De upgrade is voltooid, maar met fouten tijdens het proces. Lees de omschrijvingen hierboven voor meer informatie. Voor verdere hulp:",
"HighTrafficPiwikServerEnableMaintenance": "Als je een Piwik server met veel verkeer beheert, raden we je aan om %1$smetingen tijdelijk uit te schakelen en de Piwik omgeving in onderhouds modus te zetten%2$s",
- "IncompatbilePluginsWillBeDisabledInfo": "Let op: sommige plugins zijn niet compitable met Piwik %s. Deze worden uitgeschakeld bij een upgrade.",
+ "IncompatbilePluginsWillBeDisabledInfo": "Notitie: somige plugins zijn nog niet beschikbaar voor Piwik %s. We zullen deze updaten wanneer een update beschikbaar is in de Marketplace, anders zullen we de plugin uitschakelen wanneer een upgrade van Piwik wordt uitgevoerd.",
"InstallingTheLatestVersion": "Bezig om de laatste versie te installeren",
+ "LatestBetaRelease": "Laatste beta release",
+ "LatestStableRelease": "Laatste stabiele release",
+ "Latest2XStableRelease": "Laatste stabiele 2.X versie",
+ "Latest2XBetaRelease": "Laatste beta 2.X versie",
+ "LtsSupportVersion": "Lange Termijn Support versie",
"MajorUpdateWarning1": "Dit is een ingrijpende update! Het zal langer dan normaal duren.",
"MajorUpdateWarning2": "Het volgende advies vooral voor grote installaties bedoelt.",
"NoteForLargePiwikInstances": "Belangrijke mededeling voor grote Piwik installaties",
@@ -47,11 +53,13 @@
"UpdateAutomatically": "Update automatisch.",
"UpdateHasBeenCancelledExplanation": "Piwik één klik update is geannuleerd. Als u de bovenstaande foutmelding niet kan oplossen, raden we u aan Piwik handmatig te updaten. %1$s Lees de %2$s Update documentatie %3$s om te beginnen.",
"UpdateTitle": "Piwik › Update",
+ "UpdatingPluginXToVersionY": "Updating plugin %1$s naar versie %2$s",
"UpdateSuccessTitle": "Piwik upgrade was succesvol!",
"UpdateErrorTitle": "Update fout",
"ThankYouUpdatePiwik": "Dank voor het gebruiken van Piwik en het up-to-date houden!",
"PostUpdateMessage": "Piwik zal altijd gratis te downloaden zijn, maar het heeft je voortdurende support nodig om te groeien en beter te worden.",
"PostUpdateSupport": "Als je hulp nodig hebt, kun je support krijgen bij de makers:",
+ "ProfessionalServices": "Professionele Hulp",
"CloudHosting": "Cloud hosting",
"Updating": "Bijwerken",
"UpdateUsingHttpsFailed": "Het downloaden van de laatste Piwik versie over een beveiligde HTTPS verbinding was niet succesvol, door de volgende fout:",
diff --git a/plugins/CoreUpdater/lang/pl.json b/plugins/CoreUpdater/lang/pl.json
index 27de847fe6..c1feb1ebc8 100644
--- a/plugins/CoreUpdater/lang/pl.json
+++ b/plugins/CoreUpdater/lang/pl.json
@@ -23,7 +23,6 @@
"HelpMessageIntroductionWhenError": "Powyżej znajduje się główny komunikat o błędzie. To powinno pomóc ustalić przyczynę problemu, ale jeżeli problem wymaga dodatkowej pomocy:",
"HelpMessageIntroductionWhenWarning": "Aktualizacja zakończona sukcesem, jednakże nie obyło się bez problemów podczas tego procesu. Proszę zaposnać się z powyższym opisem by poznać szczegóły. Więcej pomocy możesz uzyskać:",
"HighTrafficPiwikServerEnableMaintenance": "Jeśli zarządzasz serwerem Piwik o dużym ruchu, zalecamy %1$stymczasowo wyłączyć śledzenie odwiedzających i przełączyć Interfejs Użytkownika Piwik w tryb konserwacji%2$s",
- "IncompatbilePluginsWillBeDisabledInfo": "Uwaga: niektóre wtyczki nie są zgodne z Piwik %s. Będą wyłączone podczas aktualizacji:",
"InstallingTheLatestVersion": "Instalowanie najnowszej wersji",
"MajorUpdateWarning1": "To jest znacząca aktualizacja i potrwa dłużej niż zwykle.",
"MajorUpdateWarning2": "Poniższe porady są szczególnie ważne dla dużych instalacji.",
diff --git a/plugins/CoreUpdater/lang/pt-br.json b/plugins/CoreUpdater/lang/pt-br.json
index c9741637c6..5bfdfbe27b 100644
--- a/plugins/CoreUpdater/lang/pt-br.json
+++ b/plugins/CoreUpdater/lang/pt-br.json
@@ -1,5 +1,6 @@
{
"CoreUpdater": {
+ "CheckingForPluginUpdates": "Verificando atualizações do novo plugin",
"ClickHereToViewSqlQueries": "Clique aqui para ver e copiar a lista de consultas - queries SQL que serão executadas",
"CriticalErrorDuringTheUpgradeProcess": "Erro crítico durante o processo de atualização:",
"DatabaseUpgradeRequired": "Atualização do banco de dados requerida",
@@ -23,7 +24,6 @@
"HelpMessageIntroductionWhenError": "Acima está a mensagem de erro principal. Ela deve ajudar a explicar a causa, mas se você precisar de mais ajuda por favor:",
"HelpMessageIntroductionWhenWarning": "A atualização se completou com sucesso, contudo houve alguns problemas durante o processo. Por favor leia a descrição acima para os detalhes. Para mais ajuda:",
"HighTrafficPiwikServerEnableMaintenance": "Se você gerencia um servidor Piwik com alto tráfego, recomendamos %1$sdesativar momentaneamente o Rastreamento de visitantes e colocar a interface de usuário do servidor Piwik no modo de manutenção%2$s.",
- "IncompatbilePluginsWillBeDisabledInfo": "Nota: alguns plugins não são compatíveis com Piwik %s. Eles serão desativados quando você atualizar:",
"InstallingTheLatestVersion": "Instalando a versão mais recente",
"LatestBetaRelease": "Último lançamento beta",
"LatestStableRelease": "Último lançamento estável",
@@ -57,6 +57,7 @@
"ThankYouUpdatePiwik": "Obrigado por usar o Piwik e mantê-lo atualizado!",
"PostUpdateMessage": "Piwik será sempre gratuito para baixar e usar, mas ele precisa de seu apoio para continuar a crescer e melhorar.",
"PostUpdateSupport": "Se você precisar de ajuda para usar Piwik, você pode obter o apoio de seus criadores:",
+ "ProfessionalServices": "Serviços Profissionais",
"CloudHosting": "Nuvem de hospedagem",
"Updating": "Atualizando",
"UpdateUsingHttpsFailed": "Fazendo o download da versão mais recente do Piwik sobre conexão segura HTTPS não teve sucesso, devido ao seguinte erro:",
diff --git a/plugins/CoreUpdater/lang/ro.json b/plugins/CoreUpdater/lang/ro.json
index 06297f05b4..c5daf4fa68 100644
--- a/plugins/CoreUpdater/lang/ro.json
+++ b/plugins/CoreUpdater/lang/ro.json
@@ -23,7 +23,6 @@
"HelpMessageIntroductionWhenError": "Eroare de core . Consulta documentatia de ajutor:",
"HelpMessageIntroductionWhenWarning": "Actualizarea s-a efectuat cu succes, oricum mai sunt cateva lucruri ce sunt necesare pentru a finaliza procesul . Citeste descrierea pentru detalii. Pentru ajutor:",
"HighTrafficPiwikServerEnableMaintenance": "Daca administrezi un server Piwik cu trafic mare, noi recomandam ca %1$spentru moment sa dezactivezi Contorizarea vizitatorilor si sa pui Interfata de Utilizare Piwik in modul de mentenanta%2$s.",
- "IncompatbilePluginsWillBeDisabledInfo": "Observatie: anumite pluginuri nu sunt compatibile cu Piwik %s. Acestea vor fi deactivate cand veti face upgrade:",
"InstallingTheLatestVersion": "Se instalează ultima versiune",
"MajorUpdateWarning1": "Este o actualizare majoră! Va dura mai mult decât de obicei.",
"MajorUpdateWarning2": "Următorul sfat este îndeosebi important pentru instalaţii mari.",
diff --git a/plugins/CoreUpdater/lang/ru.json b/plugins/CoreUpdater/lang/ru.json
index 4b63c6e4a3..bfdaa22bcb 100644
--- a/plugins/CoreUpdater/lang/ru.json
+++ b/plugins/CoreUpdater/lang/ru.json
@@ -1,5 +1,6 @@
{
"CoreUpdater": {
+ "CheckingForPluginUpdates": "Проверка обновлений плагинов",
"ClickHereToViewSqlQueries": "Нажмите здесь чтобы просмотреть и скопировать список SQL запросов, который необходимо выполнить",
"CriticalErrorDuringTheUpgradeProcess": "Критическая ошибка во время обновления:",
"DatabaseUpgradeRequired": "Требуется обновление базы данных",
@@ -23,7 +24,7 @@
"HelpMessageIntroductionWhenError": "Выше подается код ошибки ядра системы. Он поможет Вам объяснить причину ошибки, но если же Вам необходима дополнительная помощь, пожалуйста:",
"HelpMessageIntroductionWhenWarning": "Обновление завершено успешно, однако в процессе возникло несколько предупреждений. Пожалуйста, прочтите примечания ниже. Для дополнительной помощи:",
"HighTrafficPiwikServerEnableMaintenance": "Если вы управляете сервером Piwik с большим объемом трафика, мы рекомендуем %1$sна мгновение выключить Отслеживание посетителей и переключить Пользовательский интерфейс Piwik в режим%2$s поддержки.",
- "IncompatbilePluginsWillBeDisabledInfo": "Примечание: некоторые плагины не совместимы с Piwik %s. Они будут отключены при обновлении:",
+ "IncompatbilePluginsWillBeDisabledInfo": "Примечание: некоторые плагины не совместимы с Piwik %s. Если они есть на Marketplace — они обновятся, в противном случае они будут отключены при обновлении:",
"InstallingTheLatestVersion": "Установка последней версии",
"LatestBetaRelease": "Последний тестовый выпуск",
"LatestStableRelease": "Последний стабильный выпуск",
@@ -52,11 +53,13 @@
"UpdateAutomatically": "Обновить автоматически",
"UpdateHasBeenCancelledExplanation": "Piwik One Click Update отменен. Если Вы не можете исправить вышеописанные ошибки, рекомендуется обновить Piwik вручную. %1$s Пожалуйста, проверьте %2$sдокументацию обновления%3$s для того, чтобы начать!",
"UpdateTitle": "Обновить",
+ "UpdatingPluginXToVersionY": "Обновление плагина %1$s до версии %2$s",
"UpdateSuccessTitle": "Piwik успешно обновлен!",
"UpdateErrorTitle": "Ошибка при обновлении",
"ThankYouUpdatePiwik": "Спасибо за то, что пользуетесь Piwik и обновляете его!",
"PostUpdateMessage": "Piwik всегда будет свободным для скачивания и использования, но ему нужна постоянная поддержка чтобы расти и улучшаться.",
"PostUpdateSupport": "Если вам нужна помощь в использовании Piwik, то вы сможете получить поддержку от его создателей:",
+ "ProfessionalServices": "Профессиональные услуги",
"CloudHosting": "Облачный хостинг",
"Updating": "Обновление",
"UpdateUsingHttpsFailed": "Не удалось скачать последнюю версию Piwik по безопасному HTTPS, возникла следующая ошибка:",
diff --git a/plugins/CoreUpdater/lang/sk.json b/plugins/CoreUpdater/lang/sk.json
index c9ea15ceac..55bfb4de1d 100644
--- a/plugins/CoreUpdater/lang/sk.json
+++ b/plugins/CoreUpdater/lang/sk.json
@@ -23,7 +23,6 @@
"HelpMessageIntroductionWhenError": "Vyššie je uvedená hlavná chybová správa, ktorá by mala vysvetliť problém. Ak potrebujete ďalšiu pomoc, tak prosím:",
"HelpMessageIntroductionWhenWarning": "Aktualizácia je úspešne ukončená, vyskytli sa však problémy. Prečítajte si nasledovné detaily. Ďalšiu pomoc nájdete na:",
"HighTrafficPiwikServerEnableMaintenance": "Ak natrafíte na zahltený Piwik server, odporúčame %1$s dočasne vypnúť sledovanie návštevníkov a prepnúť Piwik-užívateľské rozhranie do módu údržby %2$s.",
- "IncompatbilePluginsWillBeDisabledInfo": "Pozn.: niektoré pluginy nie sú kompatibilné s Piwik %s. Budú vypnuté ak aktualizujete:",
"InstallingTheLatestVersion": "Inštalácia poslednej verzie",
"LatestBetaRelease": "Posledná beta verzia",
"LatestStableRelease": "Posledná stabilné vydanie",
diff --git a/plugins/CoreUpdater/lang/sq.json b/plugins/CoreUpdater/lang/sq.json
index 4704abcab7..354cf15726 100644
--- a/plugins/CoreUpdater/lang/sq.json
+++ b/plugins/CoreUpdater/lang/sq.json
@@ -1,12 +1,13 @@
{
"CoreUpdater": {
- "ClickHereToViewSqlQueries": "Klikoni këtu që të shihni dhe të kopjoni listën e kërkesave SQL që ka për t’u ekzekutuar",
+ "CheckingForPluginUpdates": "Po kontrollohet për përditësime të reja shtojce",
+ "ClickHereToViewSqlQueries": "Klikoni këtu që të shihni dhe të kopjoni listën e kërkesave SQL që do të kryhen",
"CriticalErrorDuringTheUpgradeProcess": "Gabim Kritik gjatë procesit të përditësimit:",
"DatabaseUpgradeRequired": "Lypset Përmirësim i Bazës së të Dhënave",
"DisablingIncompatiblePlugins": "Po çaktivizohen shtojca të papërputhshme: %s",
"DownloadingUpdateFromX": "Po shkarkohet përditësimi prej %s",
"DownloadX": "Shkarko %s",
- "EmptyDatabaseError": "Baza e të dhënave %s është bosh. Kartelën tuaj të formësimit të Piwik-ut duhet ta përpunoni ose ta hiqni.",
+ "EmptyDatabaseError": "Baza e të dhënave %s është e zbrazët. Kartelën tuaj të formësimit të Piwik-ut duhet ta përpunoni ose ta hiqni.",
"ErrorDIYHelp": "Nëse jeni përdorues i përparuar dhe hasni një gabim në përditësimin e bazës së të dhënave:",
"ErrorDIYHelp_1": "identifikoni dhe ndreqni burimin e problemit (p.sh., memory_limit ose max_execution_time)",
"ErrorDIYHelp_2": "plotësoni kërkesat e mbetura te përditësimi që dështoi",
@@ -14,16 +15,16 @@
"ErrorDIYHelp_4": "rixhironi përditësuesin (nga shfletuesi ose rreshti i urdhrave) për të vazhduar me përditësimet e mbetura",
"ErrorDIYHelp_5": "njoftoni për problemin (dhe zgjidhjen), që kështu Piwik-u të mund të përmirësohet",
"ErrorDuringPluginsUpdates": "Gabim gjatë përditësimit të shtojcave:",
- "ExceptionAlreadyLatestVersion": "Versioni juaj %s i Piwik-ut është i fundit.",
- "ExceptionArchiveEmpty": "Arkivë bosh.",
+ "ExceptionAlreadyLatestVersion": "Versioni juaj %s i Piwik-ut është më i riu.",
+ "ExceptionArchiveEmpty": "Arkivë e zbrazët.",
"ExceptionArchiveIncompatible": "Arkivë e papërputhshme: %s",
- "ExceptionArchiveIncomplete": "Arkiva nuk është e plotë: mungojnë disa kartela (p.sh. %s).",
+ "ExceptionArchiveIncomplete": "Arkivi nuk është e plotë: mungojnë disa kartela (p.sh. %s).",
"FeedbackRequest": "Mos ngurroni të ndani me Ekipin e Piwik-ut idetë dhë sugjerimet tuaja, këtu:",
"HelpMessageContent": "Hidhini një sy %1$s Piwik FAQ %2$s që shpjegojnë gabimet më të rëndomta gjatë përditësimesh. %3$s Pyesni përgjegjësin e sistemit tuaj - ai mund të jetë në gjendje të t’ju ndihmojë për gabimin, i cili ka shumë të ngjarë të ketë lidhje me rregullimet e shërbyesit tuaj ose ato të MySQL-së.",
- "HelpMessageIntroductionWhenError": "Sa më sipër, është thelbi i mesazhit të gabimit. Do të ndihmonte të shpjegohej shkaku, por nëse keni nevojë për ndihmë të mëtejshme, ju lutem:",
- "HelpMessageIntroductionWhenWarning": "Përditësimi u plotësua me sukses, sidoqoftë pati ca kleçka gjatë procesit. Ju lutem, lexoni përshkrimet më sipër për hollësi. Për më tepër ndihmë:",
- "HighTrafficPiwikServerEnableMaintenance": "Nëse administroni një shërbyes Piwik me trafik të madh, këshillojmë ta %1$sçaktivizoni përkohësisht Gjurmimin e vizitorëve dhe ta kaloni Ndërfaqen e Përdoruesit të Piwik-ut nën mënyrën mirëmbajtje%2$s.",
- "IncompatbilePluginsWillBeDisabledInfo": "Shënim: disa shtojca s’janë të përputhshme me Piwik %s. Ato do të çaktivizohen, kur ta përditësoni:",
+ "HelpMessageIntroductionWhenError": "Sa më sipër, është thelbi i mesazhit të gabimit. Do të ndihmonte të shpjegohej shkaku, por nëse keni nevojë për ndihmë të mëtejshme, ju lutemi:",
+ "HelpMessageIntroductionWhenWarning": "Përditësimi u plotësua me sukses, sidoqoftë pati ca kleçka gjatë procesit. Ju lutemi, lexoni përshkrimet më sipër për hollësi. Për më tepër ndihmë:",
+ "HighTrafficPiwikServerEnableMaintenance": "Nëse administroni një shërbyes Piwik me trafik të madh, këshillojmë ta %1$sçaktivizoni përkohësisht Ndjekjen e vizitorëve dhe ta kaloni Ndërfaqen e Përdoruesit të Piwik-ut nën mënyrën mirëmbajtje%2$s.",
+ "IncompatbilePluginsWillBeDisabledInfo": "Shënim: disa shtojca janë të papërputhshme me Piwik %s. Do t’i përditësojmë, nëse ka një përditësim të gatshëm te Marketplace, përndryshe do t’i çaktivizojmë kur të bëni një përmirësim:",
"InstallingTheLatestVersion": "Po instalohet versioni më i fundit",
"LatestBetaRelease": "Hedhja beta më e re në qarkullim",
"LatestStableRelease": "Hedhja e qëndrueshme më e re në qarkullim",
@@ -33,7 +34,7 @@
"MajorUpdateWarning1": "Ky është një përditësim i rëndësishëm! Do të hajë më tepër kohë se zakonisht.",
"MajorUpdateWarning2": "Këshilla vijuese është veçanërisht e rëndësishme për instalime të mëdha.",
"NoteForLargePiwikInstances": "Shënime të rëndësishme për instalime Piwik me shumë ngarkesë",
- "NoteItIsExpectedThatQueriesFail": "Shënim: nëse këto kërkesa i ekzekutoni dorazi, pritet që ndonjëra, ose disa, prej tyre edhe të dështojë. Në një rast të tillë, thjesht shpërfillini gabimet, dhe vazhdoni me pasueset në listë.",
+ "NoteItIsExpectedThatQueriesFail": "Shënim: nëse këto kërkesa i ekzekutoni dorazi, pritet që ndonjëra, ose disa prej tyre, edhe të dështojë. Në një rast të tillë, thjesht shpërfillini gabimet, dhe vazhdoni me pasueset në listë.",
"NotificationClickToUpdatePlugins": "Klikoni këtu që të përditësoni shtojcat tuaja tani:",
"NotificationClickToUpdateThemes": "Klikoni këtu që të përditësoni temat tuaja tani:",
"NotificationSubjectAvailableCoreUpdate": "Është gati Piwik %s i ri",
@@ -42,21 +43,23 @@
"PiwikUpdatedSuccessfully": "Piwik-u u përditësua me sukses!",
"PiwikWillBeUpgradedFromVersionXToVersionY": "Baza e të dhënave për Piwik-un do të përmirësohet prej versionit %1$s te versioni i ri %2$s.",
"ReadyToGo": "Gati për t’ia filluar?",
- "TheFollowingPluginsWillBeUpgradedX": "Shtojcat vijuese do të përditësohen: %s.",
- "TheFollowingDimensionsWillBeUpgradedX": "Përmasat vijuese do të përditësohen: %s.",
+ "TheFollowingPluginsWillBeUpgradedX": "Do të përditësohen shtojcat vijuese: %s.",
+ "TheFollowingDimensionsWillBeUpgradedX": "Do të përditësohen përmasat vijuese: %s.",
"ThereIsNewPluginVersionAvailableForUpdate": "Disa nga shtojcat që keni, janë përditësuar te Marketplace:",
"ThereIsNewVersionAvailableForUpdate": "Mund të kihet një version i ri, i përmirësuar, i Piwik-ut",
"TheUpgradeProcessMayFailExecuteCommand": "Nëse keni një bazë të dhënash Piwik të madhe, përditësimet mund të zgjasin shumë në shfletues. Në të tilla raste, mund t’i bëni përditësimet që nga rresht urdhrash: %s",
"TheUpgradeProcessMayTakeAWhilePleaseBePatient": "Procesi i përditësimit të bazës së të dhënave mund të zgjasë ca, ndaj bëni durim.",
"UnpackingTheUpdate": "Po shpaketohet përditësimi",
"UpdateAutomatically": "Përmirësoje Vetvetiu",
- "UpdateHasBeenCancelledExplanation": "Përditësimi Piwik Me Një Klik u anulua. Nëse s’ndreqni dot gabimin me mesazhin e mësipërm, këshillohet ta përditësoni Piwik-un dorazi. %1$s Ju lutem, shihni %2$sdokumentimin e Përditësimeve%3$s për t’ia filluar!",
- "UpdateTitle": "Piwik › Përditësim",
+ "UpdateHasBeenCancelledExplanation": "Përditësimi Piwik Me Një Klik u anulua. Nëse s’ndreqni dot gabimin me mesazhin e mësipërm, këshillohet ta përditësoni Piwik-un dorazi. %1$s Ju lutemi, shihni %2$sdokumentimin e Përditësimeve%3$s për t’ia filluar!",
+ "UpdateTitle": "Përditësim",
+ "UpdatingPluginXToVersionY": "Po përditësohet shtojca %1$s me versionin %2$s",
"UpdateSuccessTitle": "Piwik-u u përmirësua me sukses!",
"UpdateErrorTitle": "Gabim në përditësim",
"ThankYouUpdatePiwik": "Faleminderit për përdorimin dhe mbajtjen e Piwik-ut të përditësuar!",
"PostUpdateMessage": "Shkarkimi dhe përdorimi i Piwik-ut do të jenë gjithnjë të lirë, por i duhet përkrahja juaj e vazhdueshme për t’u rritur dhe përmirësuar.",
"PostUpdateSupport": "Nëse ju duhet ndihmë mbi përdorimin e Piwik-ut, mund të merrni asistencë nga krijuesit e tij:",
+ "ProfessionalServices": "Shërbime Profesionale",
"CloudHosting": "Strehim në re",
"Updating": "Përditësim",
"UpdateUsingHttpsFailed": "Shkarkimi i versionit më të ri të Piwik-ut përmes një lidhje të sigurt HTTPS nuk pati sukses, për shkak të gabimit vijues:",
@@ -71,7 +74,7 @@
"WeAutomaticallyDeactivatedTheFollowingPlugins": "Çaktivizuam automatikisht shtojcat vijuese: %s",
"YouCanUpgradeAutomaticallyOrDownloadPackage": "Mund ta përmirësoni automatikisht me versionin %s, ose të shkarkoni paketën dhe ta instaloni atë dorazi:",
"YouCouldManuallyExecuteSqlQueries": "Nëse nuk jeni në gjendje të xhironi përditësuesin nga rresht urdhrash dhe Piwik-u nuk arrin të përmirësohet (për shkak mbarimi kohe për bazën e të dhënave, mbarimi kohe për shfletuesin, ose çfarëdo çështje tjetër), mundeni të ekzekutoni kërkesa SQL dorazi që të përditësoni Piwik-un.",
- "YouMustDownloadPackageOrFixPermissions": "Piwik-u është i pazoti të mbishkruajë instalimin tuaj të tanishëm. Mundeni ose të ndreqni lejet mbi drejtorira\/kartela, ose të shkarkoni paketën dhe instaloni versionin %s dorazi:",
+ "YouMustDownloadPackageOrFixPermissions": "Piwik-u s’është në gjendje të mbishkruajë instalimin tuaj të tanishëm. Mundeni ose të ndreqni lejet mbi drejtorira\/kartela, ose të shkarkoni paketën dhe instaloni versionin %s dorazi:",
"YourDatabaseIsOutOfDate": "Baza juaj e të dhënave për Piwik-un është e vjetruar, dhe duhet përmirësuar përpara se të mund të vazhdoni.",
"ViewVersionChangelog": "Shihni regjistër ndryshimesh për këtë version:"
}
diff --git a/plugins/CoreUpdater/lang/sr.json b/plugins/CoreUpdater/lang/sr.json
index c199b6c3fb..311f67f807 100644
--- a/plugins/CoreUpdater/lang/sr.json
+++ b/plugins/CoreUpdater/lang/sr.json
@@ -1,5 +1,6 @@
{
"CoreUpdater": {
+ "CheckingForPluginUpdates": "Proveravam da li ima novih verzija dodataka",
"ClickHereToViewSqlQueries": "Kliknite ovde kako biste videli i iskopirali SQL upite koje je potrebno izvršiti",
"CriticalErrorDuringTheUpgradeProcess": "Kritične greške nastale tokom procesa nadogradnje:",
"DatabaseUpgradeRequired": "Potrebna je nadogradnja baze",
@@ -23,8 +24,13 @@
"HelpMessageIntroductionWhenError": "Ovo gore je sama srž poruke o grešci. Ona bi trebalo da objasni uzrok a u slučaju da vam je potrebna dalja pomoć:",
"HelpMessageIntroductionWhenWarning": "Proces nadogradnje je uspešno okončan, međutim, imamo i spornih momenata nastalih tokom procesa. Molimo vas da pročitate njihove opise zarad detalja. U slučaju da vam je potrebna dalja pomoć:",
"HighTrafficPiwikServerEnableMaintenance": "Ukoliko koristite Piwik na serveru sa velikim saobraćajem, preporučujemo da %1$sodmah isključite praćenje posetilaca i prebacite Piwik interfejs u mod održavanja%2$s.",
- "IncompatbilePluginsWillBeDisabledInfo": "Neko dodaci nisu kompatibilni sa Piwik %s. Oni će biti deaktivirani nakon nadogradnje:",
+ "IncompatbilePluginsWillBeDisabledInfo": "Neko dodaci nisu kompatibilni sa Piwik %s. Nadogradićemo ih ako postoji novija verzija na Marketu, u protivnom će biti deaktivirani nakon nadogradnje Piwik-a:",
"InstallingTheLatestVersion": "Instaliranje poslednje verzije",
+ "LatestBetaRelease": "Poslednja beta verzija",
+ "LatestStableRelease": "Poslednja stabilna verzija",
+ "Latest2XStableRelease": "Poslednja stabilna 2.X verzija",
+ "Latest2XBetaRelease": "Poslednja beta 2.X verzija",
+ "LtsSupportVersion": "Verzija sa dugoročnom podrškom (LTS)",
"MajorUpdateWarning1": "Ovo je bitna nadogradnja! Trajaće duže nego inače.",
"MajorUpdateWarning2": "Sledeći predlog je naročito važan kod dugih instalacija.",
"NoteForLargePiwikInstances": "Važna napomena za velike Piwik instalacije",
@@ -47,11 +53,13 @@
"UpdateAutomatically": "Automatska nadogradnja",
"UpdateHasBeenCancelledExplanation": "Automatska nadogradnja Piwik-a je prekinuta. Ako ne možete popraviti grešku iznad, preporučljivo je da ručno izvršite nadogradnju. %1$s Molimo Vas da proverite %2$sdokumentaciju za nadogradnju%3$s!",
"UpdateTitle": "Nadogradnja",
+ "UpdatingPluginXToVersionY": "Nadogradnja dodatka %1$s na verziju %2$s",
"UpdateSuccessTitle": "Piwik je uspešno nadograđen!",
"UpdateErrorTitle": "Greška prilikom ažuriranja",
"ThankYouUpdatePiwik": "Hvala vam što koristite Piwik i što ga držite uvek ažurnim!",
"PostUpdateMessage": "Piwik će uvek biti besplatan za preuzimanje i korišćenje ali on zahteva vašu neprestanu podršku kako bi rastao i razvijao se.",
"PostUpdateSupport": "Ukoliko vam je potrebna pomoć oko korišćenja Piwik-a, možete je dobiti od njegovih tvoraca:",
+ "ProfessionalServices": "Profesionalne usluge",
"CloudHosting": "Hosting u oblacima",
"Updating": "Ažuriranje",
"UpdateUsingHttpsFailed": "Preuzimanje poslednje verzije Piwik-a preko HTTPS-a nije uspelo zbog sledeće greške:",
diff --git a/plugins/CoreUpdater/lang/sv.json b/plugins/CoreUpdater/lang/sv.json
index d752241e64..a7835c8def 100644
--- a/plugins/CoreUpdater/lang/sv.json
+++ b/plugins/CoreUpdater/lang/sv.json
@@ -23,7 +23,6 @@
"HelpMessageIntroductionWhenError": "Ovanstående är huvudsakliga felmeddelandet. Det bör bidra till att förklara orsaken, men om du behöver mer hjälp vänligen:",
"HelpMessageIntroductionWhenWarning": "Uppdateringen slutfördes framgångsrikt, men det fanns dock problem under processen. Vänligen läs ovanstående beskrivningar för detaljer. För ytterligare hjälp:",
"HighTrafficPiwikServerEnableMaintenance": "Om du hanterar en Piwik server med mycket trafik rekommenderar vi att du tillfälligt %1$sinaktiverar spårning av besökare och sätter Piwik's användargränssnitt i underhållsläge%2$s.",
- "IncompatbilePluginsWillBeDisabledInfo": "Obs: vissa tillägg är inte kompatibla med Piwik %s. De kommer att inaktiveras när du uppgraderar:",
"InstallingTheLatestVersion": "Installerar den senaste versionen",
"LatestBetaRelease": "Senaste betaversion",
"LatestStableRelease": "Senaste stabila versionen",
diff --git a/plugins/CoreUpdater/lang/tl.json b/plugins/CoreUpdater/lang/tl.json
index 3ce76138d7..9695087c1a 100644
--- a/plugins/CoreUpdater/lang/tl.json
+++ b/plugins/CoreUpdater/lang/tl.json
@@ -23,7 +23,6 @@
"HelpMessageIntroductionWhenError": "Sa itaas ay ang core error message. Ito ay tumutulong upang ipaliwanag ang mga dahilan ng error ngunit kung kailangan mo ng karagdagang tulong mangyaring:",
"HelpMessageIntroductionWhenWarning": "Kumplete na ang pag-uupdate gayunpaman meron mga issues habang ito ay sinasagawa. Mangyaring basahin ang mga nasataas para sa mga detalye. Para sa mga karagdatang tulong:",
"HighTrafficPiwikServerEnableMaintenance": "Kung ikaw ay may pinamamahalaang Piwik server na may mataas na traffic aming nirerekomenda na %1$s panandaliang alisin ang visitor Tracking at ilagay ang Piwik User Interface sa maintenance mode %2$s.",
- "IncompatbilePluginsWillBeDisabledInfo": "Tandaan: ang ilang mga plugin ay hindi tugma sa Piwik %s. Ang mga ito ay hindi pinagana kapag nag-upgrade ka:",
"InstallingTheLatestVersion": "Ini-install ang pinakabagong bersyon",
"MajorUpdateWarning1": "Ito ay isang mahalagang update! Ito ay mas matagal kaysa sa karaniwan.",
"MajorUpdateWarning2": "Ang mga sumusunod na payo ay mahalaga para sa mga malalaking pag-install.",
diff --git a/plugins/CoreUpdater/lang/uk.json b/plugins/CoreUpdater/lang/uk.json
index e0b1b50c05..d8233db0d7 100644
--- a/plugins/CoreUpdater/lang/uk.json
+++ b/plugins/CoreUpdater/lang/uk.json
@@ -23,7 +23,6 @@
"HelpMessageIntroductionWhenError": "Вище знаходиться повідомлення про помилку рівня ядра. Це повинно допомогти у виявлення причини, але якщо потрібна подальша допомога, будьласка:",
"HelpMessageIntroductionWhenWarning": "Поновлення завершено успішно, однак були інциденти протягом проходження процесу. Будь-ласка прочитайте опис щоб дізнатися деталі. Для подальшої допомоги:",
"HighTrafficPiwikServerEnableMaintenance": "Якщо ви керуєте сервером Piwik з великим обсягом трафіку, ми рекомендуємо %1$sна мить вимкнути Відстеження відвідувачів і перемкнути Інтерфейс Piwik в режим%2$s підтримки.",
- "IncompatbilePluginsWillBeDisabledInfo": "Примітка: деякі плагіни не сумісні з Piwik %s. Вони будуть відключені при оновленні:",
"InstallingTheLatestVersion": "Встановлення останньої версії",
"LatestBetaRelease": "Останній тестовий випуск",
"LatestStableRelease": "Останній стабільний випуск",
diff --git a/plugins/CoreUpdater/lang/zh-cn.json b/plugins/CoreUpdater/lang/zh-cn.json
index 01f231928c..33c5247662 100644
--- a/plugins/CoreUpdater/lang/zh-cn.json
+++ b/plugins/CoreUpdater/lang/zh-cn.json
@@ -23,7 +23,6 @@
"HelpMessageIntroductionWhenError": "以上是核心的错误讯息。它应有助于解释原因,但如果您需要进一步的说明,请:",
"HelpMessageIntroductionWhenWarning": "此次升级成功完成,但在过程中有发生一些问题,请仔细阅读上面的详细说明。如需更进一步的说明:",
"HighTrafficPiwikServerEnableMaintenance": "如果你管理一个高流量的Piwik服务器,我们建议您 %1$s暂时禁止访问者跟踪,并设置Piwik用户界面为维护模式%2$s。",
- "IncompatbilePluginsWillBeDisabledInfo": "注意:有些插件不兼容Piwik%s。如果您升级,他们将被关闭:",
"InstallingTheLatestVersion": "正在安装最新版本",
"LatestBetaRelease": "最新测试版",
"LatestStableRelease": "最新的稳定版本",
diff --git a/plugins/CoreUpdater/lang/zh-tw.json b/plugins/CoreUpdater/lang/zh-tw.json
index e866d7f3ff..2df3b47752 100644
--- a/plugins/CoreUpdater/lang/zh-tw.json
+++ b/plugins/CoreUpdater/lang/zh-tw.json
@@ -23,7 +23,6 @@
"HelpMessageIntroductionWhenError": "以上是核心錯誤訊息。它應該有助於解釋原因,但如果你需要進一步的說明請至:",
"HelpMessageIntroductionWhenWarning": "此次更新成功完成,但在過程中有發生一些問題。請閱讀以上說明的詳細內容。如需更進一步的說明:",
"HighTrafficPiwikServerEnableMaintenance": "如果你管理一個高流量的Piwik伺服器,我們建議%1$s暫時禁用訪客追踪功能,並把Piwik用戶界面設定為維運模式%2$s。",
- "IncompatbilePluginsWillBeDisabledInfo": "注意:有些插件並不兼容在Piwik %s,它們將會當你升級後被禁用。",
"InstallingTheLatestVersion": "正在安裝最新版本中",
"MajorUpdateWarning1": "這是一個重大更新!這將需要比平常更長的時間。",
"MajorUpdateWarning2": "下面的建議針對大量安裝時尤其重要。",
diff --git a/plugins/CoreVisualizations/Visualizations/HtmlTable/AllColumns.php b/plugins/CoreVisualizations/Visualizations/HtmlTable/AllColumns.php
index ef6ad37ea8..536477abb3 100644
--- a/plugins/CoreVisualizations/Visualizations/HtmlTable/AllColumns.php
+++ b/plugins/CoreVisualizations/Visualizations/HtmlTable/AllColumns.php
@@ -26,7 +26,6 @@ class AllColumns extends HtmlTable
public function beforeRender()
{
$this->config->show_extra_columns = true;
- $this->config->show_exclude_low_population = true;
parent::beforeRender();
}
diff --git a/plugins/CoreVisualizations/Visualizations/Sparklines.php b/plugins/CoreVisualizations/Visualizations/Sparklines.php
index 0407259221..8ee6f60401 100644
--- a/plugins/CoreVisualizations/Visualizations/Sparklines.php
+++ b/plugins/CoreVisualizations/Visualizations/Sparklines.php
@@ -59,10 +59,17 @@ class Sparklines extends ViewDataTable
$columnsList = array();
if ($this->config->hasSparklineMetrics()) {
foreach ($this->config->getSparklineMetrics() as $cols) {
- $columnsList = array_merge($cols['columns'], $columnsList);
+ $columns = $cols['columns'];
+ if (!is_array($columns)) {
+ $columns = array($columns);
+ }
+
+ $columnsList = array_merge($columns, $columnsList);
}
}
+ $view->allMetricsDocumentation = Metrics::getDefaultMetricsDocumentation();
+
$this->requestConfig->request_parameters_to_modify['columns'] = $columnsList;
$this->requestConfig->request_parameters_to_modify['format_metrics'] = '1';
diff --git a/plugins/CoreVisualizations/Visualizations/Sparklines/Config.php b/plugins/CoreVisualizations/Visualizations/Sparklines/Config.php
index 70100f6896..a4dae712db 100644
--- a/plugins/CoreVisualizations/Visualizations/Sparklines/Config.php
+++ b/plugins/CoreVisualizations/Visualizations/Sparklines/Config.php
@@ -204,9 +204,22 @@ class Config extends \Piwik\ViewDataTable\Config
$description = array($description);
}
+ if (!empty($requestParamsForSparkline['columns'])
+ && is_array($requestParamsForSparkline['columns'])
+ && count($requestParamsForSparkline['columns']) === count($values)) {
+ $columns = array_values($requestParamsForSparkline['columns']);
+ } elseif (!empty($requestParamsForSparkline['columns'])
+ && is_string($requestParamsForSparkline['columns'])
+ && count($values) === 1) {
+ $columns = array($requestParamsForSparkline['columns']);
+ } else{
+ $columns = array();
+ }
+
if (count($values) === count($description)) {
foreach ($values as $index => $value) {
$metrics[] = array(
+ 'column' => isset($columns[$index]) ? $columns[$index] : '',
'value' => $value,
'description' => $description[$index]
);
diff --git a/plugins/CoreVisualizations/templates/_dataTableViz_sparklines.twig b/plugins/CoreVisualizations/templates/_dataTableViz_sparklines.twig
index cf4c655fce..b0e29cc26a 100644
--- a/plugins/CoreVisualizations/templates/_dataTableViz_sparklines.twig
+++ b/plugins/CoreVisualizations/templates/_dataTableViz_sparklines.twig
@@ -13,7 +13,7 @@
{% for key, sparkline in sparklines %}
{% if key is even %}
- {{ macros.singleSparkline(sparkline) }}
+ {{ macros.singleSparkline(sparkline, allMetricsDocumentation) }}
{% endif %}
{% endfor %}
@@ -25,7 +25,7 @@
{% for key, sparkline in sparklines %}
{% if key is odd %}
- {{ macros.singleSparkline(sparkline) }}
+ {{ macros.singleSparkline(sparkline, allMetricsDocumentation) }}
{% endif %}
{% endfor %}
diff --git a/plugins/CoreVisualizations/templates/macros.twig b/plugins/CoreVisualizations/templates/macros.twig
index ffd1885be1..43d8c2158e 100644
--- a/plugins/CoreVisualizations/templates/macros.twig
+++ b/plugins/CoreVisualizations/templates/macros.twig
@@ -1,12 +1,14 @@
-{% macro singleSparkline(sparkline) %}
+{% macro singleSparkline(sparkline, allMetricsDocumentation) %}
<div class="sparkline">
{% if sparkline.url %}{{ sparkline(sparkline.url)|raw }}{% endif %}
{% for metric in sparkline.metrics %}
+ <span {% if allMetricsDocumentation[metric.column] is defined and allMetricsDocumentation[metric.column] %}title="{{ allMetricsDocumentation[metric.column] }}"{% endif %}>
{% if '%s' in metric.description -%}
{{ metric.description|translate("<strong>"~metric.value~"</strong>")|raw }}
{%- else %}
<strong>{{ metric.value }}</strong> {{ metric.description }}
{%- endif %}{% if not loop.last %}, {% endif %}
+ </span>
{% endfor %}
{% if sparkline.evolution is defined %}
diff --git a/plugins/CoreVisualizations/tests/Integration/SparklinesConfigTest.php b/plugins/CoreVisualizations/tests/Integration/SparklinesConfigTest.php
index 45f4876ea4..49a116b5cc 100644
--- a/plugins/CoreVisualizations/tests/Integration/SparklinesConfigTest.php
+++ b/plugins/CoreVisualizations/tests/Integration/SparklinesConfigTest.php
@@ -54,7 +54,7 @@ class SparklinesConfigTest extends IntegrationTestCase
$expectedSparkline = array(
'url' => '?period=day&date=2012-03-06,2012-04-04&idSite=1&module=CoreHome&action=renderMe&viewDataTable=sparkline',
'metrics' => array (
- array ('value' => 10, 'description' => 'Visits'),
+ array ('column' => '', 'value' => 10, 'description' => 'Visits'),
),
'order' => 999
);
@@ -62,6 +62,18 @@ class SparklinesConfigTest extends IntegrationTestCase
$this->assertSame(array($expectedSparkline), $this->config->getSortedSparklines());
}
+ public function test_addSparkline_shouldAddAMinimalSparklineWithOneValueAndUseDefaultOrderWithColumn()
+ {
+ $params = $this->sparklineParams();
+ $params['columns'] = 'nb_visits';
+ $this->config->addSparkline($params, $value = 10, $description = 'Visits');
+
+ $expectedSparkline = array('column' => 'nb_visits', 'value' => 10, 'description' => 'Visits');
+
+ $sparklines = $this->config->getSortedSparklines();
+ $this->assertSame(array($expectedSparkline), $sparklines[0]['metrics']);
+ }
+
public function test_addSparkline_shouldAddSparklineWithMultipleValues()
{
$this->config->addSparkline($this->sparklineParams(), $values = array(10, 20), $description = array('Visits', 'Actions'));
@@ -69,11 +81,27 @@ class SparklinesConfigTest extends IntegrationTestCase
$sparklines = $this->config->getSortedSparklines();
$this->assertSame(array (
- array ('value' => 10, 'description' => 'Visits'),
- array ('value' => 20, 'description' => 'Actions'),
+ array ('column' => '', 'value' => 10, 'description' => 'Visits'),
+ array ('column' => '', 'value' => 20, 'description' => 'Actions'),
), $sparklines[0]['metrics']);
}
+ public function test_addSparkline_shouldAddSparklinesMultipleValuesWithColumns()
+ {
+ $params = $this->sparklineParams();
+ $params['columns'] = array('nb_visits', 'nb_actions');
+
+ $this->config->addSparkline($params, $values = array(10, 20), $description = array('Visits', 'Actions'));
+
+ $expectedSparkline = array(
+ array ('column' => 'nb_visits', 'value' => 10, 'description' => 'Visits'),
+ array ('column' => 'nb_actions', 'value' => 20, 'description' => 'Actions')
+ );
+
+ $sparklines = $this->config->getSortedSparklines();
+ $this->assertSame($expectedSparkline, $sparklines[0]['metrics']);
+ }
+
/**
* @expectedException \Exception
* @expectedExceptionMessage Values: 10, 20, 30 Descriptions: Visits, Actions
diff --git a/plugins/CustomPiwikJs/TrackerUpdater.php b/plugins/CustomPiwikJs/TrackerUpdater.php
index 6370287882..d90d8c166d 100644
--- a/plugins/CustomPiwikJs/TrackerUpdater.php
+++ b/plugins/CustomPiwikJs/TrackerUpdater.php
@@ -62,16 +62,28 @@ class TrackerUpdater
$this->toFile->checkWritable();
}
+ public function getCurrentTrackerFileContent()
+ {
+ return $this->toFile->getContent();
+ }
+
+ public function getUpdatedTrackerFileContent()
+ {
+ $trackingCode = new PiwikJsManipulator($this->fromFile->getContent(), $this->trackerFiles);
+ $newContent = $trackingCode->manipulateContent();
+
+ return $newContent;
+ }
+
public function update()
{
if (!$this->toFile->hasWriteAccess() || !$this->fromFile->hasReadAccess()) {
return;
}
- $trackingCode = new PiwikJsManipulator($this->fromFile->getContent(), $this->trackerFiles);
- $newContent = $trackingCode->manipulateContent();
+ $newContent = $this->getUpdatedTrackerFileContent();
- if ($newContent !== $this->toFile->getContent()) {
+ if ($newContent !== $this->getCurrentTrackerFileContent()) {
$this->toFile->save($newContent);
}
}
diff --git a/plugins/CustomPiwikJs/lang/de.json b/plugins/CustomPiwikJs/lang/de.json
index 7aa50965a5..dc2914dbc4 100644
--- a/plugins/CustomPiwikJs/lang/de.json
+++ b/plugins/CustomPiwikJs/lang/de.json
@@ -1,5 +1,7 @@
{
"CustomPiwikJs": {
- "DiagnosticPiwikJsWritable": "Schreibbarer JavaScript-Tracker (\"\/piwik.js\")"
+ "DiagnosticPiwikJsWritable": "Schreibbarer JavaScript-Tracker (\"\/piwik.js\")",
+ "DiagnosticPiwikJsNotWritable": "Die Piwik-JavaScript-Tracker-Datei \"\/piwik.js\" ist nicht beschreibbar, das bedeutet, dass andere Plugins können den JavaScript-Tracker nicht benutzen. In Zukunft werden sogar einige Kernfunktionen nicht wie erwartet funktionieren.",
+ "DiagnosticPiwikJsMakeWritable": "Wir empfehlen, Piwik.js beschreibbar zu machen, indem Sie folgenden Befehl ausführen: %s"
}
} \ No newline at end of file
diff --git a/plugins/CustomPiwikJs/lang/it.json b/plugins/CustomPiwikJs/lang/it.json
new file mode 100644
index 0000000000..8bb062534d
--- /dev/null
+++ b/plugins/CustomPiwikJs/lang/it.json
@@ -0,0 +1,7 @@
+{
+ "CustomPiwikJs": {
+ "DiagnosticPiwikJsWritable": "Tracker JavaScript Scrivibile (\"\/piwik.js\")",
+ "DiagnosticPiwikJsNotWritable": "Il file traclker Piwik JavaScript non è scrivibile. Ciò significa che altri plugin non possono espandere il tracker JavaScript. In futuro persino alcune funzioni di base potrebbero non funzionare come ci si aspetta.",
+ "DiagnosticPiwikJsMakeWritable": "Ci raccomandiamo di rendere scrivibile Piwik.js con l'esecuzione di questo comando: %s"
+ }
+} \ No newline at end of file
diff --git a/plugins/CustomPiwikJs/lang/nb.json b/plugins/CustomPiwikJs/lang/nb.json
index e568140ece..1dd0b8ac71 100644
--- a/plugins/CustomPiwikJs/lang/nb.json
+++ b/plugins/CustomPiwikJs/lang/nb.json
@@ -1,7 +1,7 @@
{
"CustomPiwikJs": {
- "DiagnosticPiwikJsWritable": "Skrivbar JavaScript Sporer (\"\/piwik.js\")",
- "DiagnosticPiwikJsNotWritable": "Piwik JavaScript Sporer filen \"\/piwik.js\" er ikke skrivbar som betyr andre plugins kan ikke forlenge Javascript Sporer. I fremtiden enda noen sentrale funksjoner kanskje ikke fungerer som forventet.",
- "DiagnosticPiwikJsMakeWritable": "Vi anbefaler å Piwik.js skrivbar ved å kjøre denne kommandoen: %s"
+ "DiagnosticPiwikJsWritable": "Skrivbar JavaScript-tracker (\"\/piwik.js\")",
+ "DiagnosticPiwikJsNotWritable": "Piwik JavaScript-trackerfilen «\/piwik.js» er ikke skrivbar, som betyr at andre utvidelser ikke kan utvide Javascript-trackeren. I fremtiden kan det tenkes at noe kjernefunksjonalitet heller ikke fungerer som forventet.",
+ "DiagnosticPiwikJsMakeWritable": "Vi anbefaler å gjøre Piwik.js skrivbar ved å kjøre denne kommandoen: %s"
}
} \ No newline at end of file
diff --git a/plugins/CustomPiwikJs/lang/ru.json b/plugins/CustomPiwikJs/lang/ru.json
new file mode 100644
index 0000000000..a0cf2b1c7b
--- /dev/null
+++ b/plugins/CustomPiwikJs/lang/ru.json
@@ -0,0 +1,7 @@
+{
+ "CustomPiwikJs": {
+ "DiagnosticPiwikJsWritable": "Записываемый JavaScript-трекер (\"\/piwik.js\")",
+ "DiagnosticPiwikJsNotWritable": "Файл Piwik-а JavaScript-трекер \"\/piwik.js\" не доступен для записи, поэтому другие плагины не могут расширить трекер JavaScript. В будущем даже некоторые основные функции смогут не работать, как предполагалось.",
+ "DiagnosticPiwikJsMakeWritable": "Мы рекомендуем разрешить доступ на запись к файлу Piwik.js, выполнив эту команду: %s"
+ }
+} \ No newline at end of file
diff --git a/plugins/CustomPiwikJs/lang/sq.json b/plugins/CustomPiwikJs/lang/sq.json
new file mode 100644
index 0000000000..018fd9dd7a
--- /dev/null
+++ b/plugins/CustomPiwikJs/lang/sq.json
@@ -0,0 +1,7 @@
+{
+ "CustomPiwikJs": {
+ "DiagnosticPiwikJsWritable": "Ndjekës JavaScript i Shkrueshëm (\"\/piwik.js\")",
+ "DiagnosticPiwikJsNotWritable": "Kartela e ndjekësit JavaScript të Piwik-ut, \"\/piwik.js\" s’është e shkrueshme, çka do të thotë se shtojcat e tjera s’mund ta zgjerojnë ndjekësin JavaScript. Në të ardhmen mund të mos punojnë siç pritet madje edhe disa veçori bazë.",
+ "DiagnosticPiwikJsMakeWritable": "Këshillojmë bërjen e Piwik.js të shkrueshme, duke xhiruar urdhrin: %s"
+ }
+} \ No newline at end of file
diff --git a/plugins/CustomPiwikJs/lang/sr.json b/plugins/CustomPiwikJs/lang/sr.json
new file mode 100644
index 0000000000..f4e68204c4
--- /dev/null
+++ b/plugins/CustomPiwikJs/lang/sr.json
@@ -0,0 +1,7 @@
+{
+ "CustomPiwikJs": {
+ "DiagnosticPiwikJsWritable": "JavaScript treker u koji je moguće pisati (\"\/piwik.js\")",
+ "DiagnosticPiwikJsNotWritable": "U Piwik JavaScript treker datoteku \"\/piwik.js\" nije moguće pisati što znači da ostali dodaci ne mogu da prošire JavaScript treker. U budućnosti možda čak ni neke bazične funkcije neće raditi kako se očekuje.",
+ "DiagnosticPiwikJsMakeWritable": "Predlažemo da omogućite pisanje u piwik.js sledećom komandom: %s"
+ }
+} \ No newline at end of file
diff --git a/plugins/CustomPiwikJs/lang/tr.json b/plugins/CustomPiwikJs/lang/tr.json
new file mode 100644
index 0000000000..0f24431c6b
--- /dev/null
+++ b/plugins/CustomPiwikJs/lang/tr.json
@@ -0,0 +1,7 @@
+{
+ "CustomPiwikJs": {
+ "DiagnosticPiwikJsWritable": "Yazılabilir JavaScript İzleyici (\"\/piwik.js\")",
+ "DiagnosticPiwikJsNotWritable": "\"\/piwik.js\" Piwik JavaScript izleyici dosyası yazılabilir olmadığından diğer uygulama ekleri JavaScript izleyiciyi kullanamaz. İleride bazı temel özellikler de beklendiği gibi çalışmayabilir.",
+ "DiagnosticPiwikJsMakeWritable": "Piwik.js dosyasını şu komutu kullanarak yazılabilir yapmanız önerilir: %s"
+ }
+} \ No newline at end of file
diff --git a/plugins/CustomPiwikJs/tests/Integration/TrackerUpdaterTest.php b/plugins/CustomPiwikJs/tests/Integration/TrackerUpdaterTest.php
index 58650adf7e..ef90785a5f 100644
--- a/plugins/CustomPiwikJs/tests/Integration/TrackerUpdaterTest.php
+++ b/plugins/CustomPiwikJs/tests/Integration/TrackerUpdaterTest.php
@@ -74,6 +74,58 @@ class TrackerUpdaterTest extends IntegrationTestCase
$updater->checkWillSucceed();
}
+ public function test_getCurrentTrackerFileContent()
+ {
+ $targetFile = $this->dir . 'testpiwik.js';
+
+ $updater = $this->makeUpdater(null, $targetFile);
+ $content = $updater->getCurrentTrackerFileContent();
+
+ $this->assertSame(file_get_contents($targetFile), $content);
+ }
+
+ public function test_getUpdatedTrackerFileContent_returnsGeneratedPiwikJsWithMergedTrackerFiles_WhenTheyExist()
+ {
+ $source = $this->dir . 'testpiwik.js';
+ $target = $this->dir . 'MyTestTarget.js';
+
+ $updater = $this->makeUpdater($source, $target);
+ $updater->setTrackerFiles(new PluginTrackerFilesMock(array(
+ $this->dir . 'tracker.js', $this->dir . 'tracker.min.js'
+ )));
+ $content = $updater->getUpdatedTrackerFileContent();
+
+ $this->assertSame('/** MyHeader*/
+var PiwikJs = "mytest";
+
+/*!!! pluginTrackerHook */
+
+/* GENERATED: tracker.min.js */
+
+/* END GENERATED: tracker.min.js */
+
+
+/* GENERATED: tracker.js */
+
+/* END GENERATED: tracker.js */
+
+
+var myArray = [];
+', $content);
+ }
+
+ public function test_getUpdatedTrackerFileContent_returnsSourceFile_IfNoTrackerFilesFound()
+ {
+ $source = $this->dir . 'testpiwik.js';
+ $target = $this->dir . 'MyTestTarget.js';
+
+ $updater = $this->makeUpdater($source, $target);
+ $updater->setTrackerFiles(new PluginTrackerFilesMock(array()));
+ $content = $updater->getUpdatedTrackerFileContent();
+
+ $this->assertSame(file_get_contents($source), $content);
+ }
+
public function test_update_shouldNotThrowAnError_IfTargetFileIsNotWritable()
{
$updater = $this->makeUpdater(null, $this->dir . 'MyNotExisIngFilessss.js');
diff --git a/plugins/CustomVariables/lang/ko.json b/plugins/CustomVariables/lang/ko.json
index d0fb3c829c..372dcb2f30 100644
--- a/plugins/CustomVariables/lang/ko.json
+++ b/plugins/CustomVariables/lang/ko.json
@@ -5,6 +5,7 @@
"CustomVariables": "맞춤 변수",
"CustomVariablesReportDocumentation": "이 보고서는 맞춤 변수에 대한 정보를 포함합니다. 변수 이름을 클릭하여 값의 분포를 확인할 수 있습니다. %1$s 맞춤 변수에 대한 자세한 내용은 %2$spiwik.org의 맞춤 변수 설명서%3$s를 참조하세요.",
"ScopePage": "페이지 범위",
- "ScopeVisit": "방문 범위"
+ "ScopeVisit": "방문 범위",
+ "ToCreateCustomVarExecute": "새로운 맞춤 변수 슬랏을 만들기 위해서는 Piwik 설치 시 아래 명령을 따르세요:"
}
} \ No newline at end of file
diff --git a/plugins/CustomVariables/lang/nb.json b/plugins/CustomVariables/lang/nb.json
index 3ba6325f36..c87f4e9052 100644
--- a/plugins/CustomVariables/lang/nb.json
+++ b/plugins/CustomVariables/lang/nb.json
@@ -1,6 +1,24 @@
{
"CustomVariables": {
+ "ColumnCustomVariableName": "Navn på egendefinert variabel",
+ "ColumnCustomVariableValue": "Verdi på egendefinert variabel",
"CustomVariables": "Egendefinerte variabler",
- "Unused": "Ubrukt"
+ "CustomVariablesReportDocumentation": "Denne rapporten inneholder informasjon om dine egendefinerte variabler. Klikk på et variabelnavn for å se fordelingen av verdier. %1$sFor mer informasjon om egendefinerte variabler, les %2$sdokumentasjonen om egendefinerte variabler på piwik.org%3$s",
+ "PluginDescription": "Egendefinerte variabler er (navn- og verdi-)par som du kan tilordne ved å bruke Javascript-API for besøkere eller deres handlinger. Piwik vil da rapportere hvor mange besøk, sider, konverteringer som skjer for hver av disse variablene og deres verdier. Se de detaljerte egendefinerte variablene for alle brukere og handlinger i besøksloggen.<br \/>Krever at du bruker <a href=\"http:\/\/piwik.org\/docs\/ecommerce-analytics\/\">Ecommerce Analytics<\/a>!",
+ "ScopePage": "gjelder side",
+ "ScopeVisit": "gjelder besøk",
+ "ManageDescription": "Dette sammendraget viser alle mulige egendefinerte variabler og deres bruk for nettstedet «%s». Navnene i hver «luke» er sortert etter hvor ofte de blir brukt.",
+ "ScopeX": "Gjelder %s",
+ "Index": "Indeks",
+ "Usages": "Bruk",
+ "Unused": "Ubrukt",
+ "CreateNewSlot": "Øk antallet tilgjengelige egendefinerte variabler",
+ "UsageDetails": "%1$s besøk og %2$s handlinger siden dette nettstedet ble laget.",
+ "CreatingCustomVariableTakesTime": "Å lage en ny luke for en egendefinert variabel kan ta lang tid avhengig av størrelsen på databasen din. Derfor er det kun mulig å gjøre dette via en kommando som må kjøres fra kommandolinjen.",
+ "CurrentAvailableCustomVariables": "Nå kan du bruke opp til %s egendefinerte variabler per nettsted.",
+ "ToCreateCustomVarExecute": "For å lage en ny luke for en egendefinert variabel, skriv inn følgende kommando i din Piwik-installasjon:",
+ "SlotsReportIsGeneratedOverTime": "Data for denne rapporten vil bli synlige over tid. Det kan ta en dag eller to før du kan se data, og noen uker før rapportene er helt nøyaktige.",
+ "MetricsAreOnlyAvailableForVisitScope": "Merk: %1$s-måltall er kun tilgjengelige for egendefinerte variabler som gjelder %2$s.",
+ "MetricsNotAvailableForPageScope": "For egendefinerte variabler som gjelder %1$s, er kolonneverdien for disse måltallene %2$s"
}
} \ No newline at end of file
diff --git a/plugins/CustomVariables/lang/sq.json b/plugins/CustomVariables/lang/sq.json
index ba2540b520..08dd7adb55 100644
--- a/plugins/CustomVariables/lang/sq.json
+++ b/plugins/CustomVariables/lang/sq.json
@@ -1,13 +1,24 @@
{
"CustomVariables": {
- "ColumnCustomVariableName": "Emër Ndryshoreje të Personalizueshme",
- "ColumnCustomVariableValue": "Vlerë Ndryshoreje të Personalizueshme",
- "CustomVariables": "Ndryshore të Personalizueshme",
- "CustomVariablesReportDocumentation": "Ky raport përmban të dhëna rreth Ndryshoreve tuaja të Personalizuara. Klikoni mbi një emër ndryshoreje që të shihni shpërndarjen e vlerave. %1$s Për më tepër të dhëna rreth Ndryshoresh të Personalizuara në përgjithësi, lexoni %2$sdokumentimin e Ndryshoreve të Personalizuara te piwik.org%3$s",
- "PluginDescription": "Ndryshoret e Personalizueshme janë çifte (emër, vlerë) që mund t’ua vini në përshoqërim vizitorëve tuaj apo çfarëdo veprimi prej tyre, duke përdorur API-n për Javascript-in. Piwik-u mandej do të raportojë sa vizita, faqe, shndërrime ka për secilin prej këtyre emrave dhe vlerave të personalizuara. Ndryshoret e Personalizueshme në hollësi për çdo përdorues dhe veprim i gjeni te Regjistri i Vizitorëve.<br \/>E domosdoshme për përdorim të veçorisë <a href=\"http:\/\/piwik.org\/docs\/ecommerce-analytics\/\">Analiza E-tregti<\/a>!",
+ "ColumnCustomVariableName": "Emër Ndryshoreje Vetjake",
+ "ColumnCustomVariableValue": "Vlerë Ndryshoreje Vetjake",
+ "CustomVariables": "Ndryshore Vetjake",
+ "CustomVariablesReportDocumentation": "Ky raport përmban të dhëna rreth Ndryshoreve tuaja Vetjake. Klikoni mbi një emër ndryshoreje që të shihni shpërndarjen e vlerave. %1$s Për më tepër të dhëna rreth Ndryshoresh Vetjake në përgjithësi, lexoni %2$sdokumentimin e Ndryshoreve Vetjake te piwik.org%3$s",
+ "PluginDescription": "Ndryshoret e Vetjake janë çifte (emër, vlerë) që mund t’ua vini në përshoqërim vizitorëve tuaj apo çfarëdo veprimi prej tyre, duke përdorur API-n për Javascript-in. Piwik-u mandej do të raportojë sa vizita, faqe, shndërrime ka për secilin prej këtyre emrave dhe vlerave vetjake. Ndryshoret Vetjake në hollësi për çdo përdorues dhe veprim i gjeni te Regjistri i Vizitorëve.<br \/>E domosdoshme për përdorim të veçorisë <a href=\"http:\/\/piwik.org\/docs\/ecommerce-analytics\/\">Analiza E-tregti<\/a>!",
"ScopePage": "faqe me qëllim",
"ScopeVisit": "vizitë me qëllim",
+ "ManageDescription": "Kjo përmbledhje tregon krejt vendet e ndryshoreve vetjake dhe përdorimin e tyre për sajtin '%s'. Emrat brenda secilit vend renditen sipas shpeshtisë së përdorimit të tyre gjithsej.",
+ "ScopeX": "Fusha %s",
"Index": "Tregues",
- "Usages": "Përdorime"
+ "Usages": "Përdorime",
+ "Unused": "I papërdorur",
+ "CreateNewSlot": "Rrite numrin e vendeve të mundshme të Ndryshoreve Vetjake",
+ "UsageDetails": "%1$s vizita dhe %2$s veprime që nga krijimi i sajtit.",
+ "CreatingCustomVariableTakesTime": "Krijimi i një vendi të ri ndryshoreje vetjake mund të dojë një kohë të gjatë, në varësi të madhësisë së bazës suaj të të dhënave. Ndaj kjo është e mundur të bëhet vetëm përmes një urdhri që lypset të xhirohet te rreshti i urdhrave.",
+ "CurrentAvailableCustomVariables": "Hëpërhë mund të përdorni deri në %s Ndryshore Vetjake për sajt.",
+ "ToCreateCustomVarExecute": "Për krijimin e një vendi të ri ndryshoreje vetjake përmbushni urdhrin vijues brenda instalimit tuaj të Piwik-ut:",
+ "SlotsReportIsGeneratedOverTime": "Të dhënat për këtë raport do të mblidhen me kalimin e kohës. Mund të duhen një a dy ditë që të shihni çfarëdo të dhënash dhe ca javë përpara se raporti të jetë plotësisht i saktë.",
+ "MetricsAreOnlyAvailableForVisitScope": "Shënim: Vlerat %1$s janë të passhme vetëm për Ndryshore Vetjake të fushës %2$s.",
+ "MetricsNotAvailableForPageScope": "Për Ndryshore Vetjake të fushës %1$s, vlera e shtyllës për këto të dhëna është %2$s"
}
} \ No newline at end of file
diff --git a/plugins/CustomVariables/lang/sr.json b/plugins/CustomVariables/lang/sr.json
index 37ba3f7eb0..e21799c20f 100644
--- a/plugins/CustomVariables/lang/sr.json
+++ b/plugins/CustomVariables/lang/sr.json
@@ -6,6 +6,19 @@
"CustomVariablesReportDocumentation": "Ovaj izveštaj sadrži informacije o dodatnim parametrima. Kliknite na ime parametra kako biste videli distribuciju vrednosti. %1$s Za više informacija o dodatnim parametrima pogledajte %2$sCustom Variables na piwik.org%3$s",
"PluginDescription": "Dodatni parametri su uređeni parovi (naziv, vrednost) koje možete pomoću JavaScript API-ja da dodelite posetiocima ili bilo kojoj njihovoj akciji. Piwik će onda beležiti koliko ima poseta, stranica i konverzija za svaki od tih parova. Detalje možete videti u logu posetilaca. <br \/>Neophodno za <a href=\"http:\/\/piwik.org\/docs\/ecommerce-analytics\/\">E-commerce analitike<\/a>!",
"ScopePage": "oblast strana",
- "ScopeVisit": "oblast poseta"
+ "ScopeVisit": "oblast poseta",
+ "ManageDescription": "Ovaj pregled prikazuje sve dodatne parametre i njihovu upotrebu za sajt '%s'. Nazivi su poređani po tome koliko često je koja upotrebljena.",
+ "ScopeX": "Oblast %s",
+ "Index": "Indeks",
+ "Usages": "Upotrebe",
+ "Unused": "Neiskorišćeno",
+ "CreateNewSlot": "Povećajte broj raspoloživih dodatnih parametara.",
+ "UsageDetails": "%1$s poseta i %2$sakcija od kreiranja ovog sajta.",
+ "CreatingCustomVariableTakesTime": "Kreiranje novog dodatnog parametra može da uzme dosta vremena u zavisnosti od veličine vaše baze. Zbog toga je to moguće uraditi samo iz komandne linije.",
+ "CurrentAvailableCustomVariables": "Trenutno možete da koristite do %s dodatnih parametara po sajtu.",
+ "ToCreateCustomVarExecute": "Da biste kreirali nov korisnički parametar, izvršite sledeću komandu:",
+ "SlotsReportIsGeneratedOverTime": "Podaci za ovaj izveštaj će biti pripremani tokom vremena. Može proći dan ili dva pre nego što budete videli bilo kakve podatke i nekoliko nedelja pre nego što izveštaj bude bio potpuno precizan.",
+ "MetricsAreOnlyAvailableForVisitScope": "Pažnja: samo %1$s metrika je na raspolaganju za dodatne parametre u opsegu %2$s.",
+ "MetricsNotAvailableForPageScope": "Za dodatne parametre iz oblasti %1$s, vrednost kolone za te metrike je %2$s."
}
} \ No newline at end of file
diff --git a/plugins/CustomVariables/lang/tr.json b/plugins/CustomVariables/lang/tr.json
index f5a64187f0..f850f4144a 100644
--- a/plugins/CustomVariables/lang/tr.json
+++ b/plugins/CustomVariables/lang/tr.json
@@ -1,7 +1,7 @@
{
"CustomVariables": {
- "ColumnCustomVariableName": "Özel Değişken adı",
- "ColumnCustomVariableValue": "Özel Değişken değeri",
+ "ColumnCustomVariableName": "Özel Değişken Adı",
+ "ColumnCustomVariableValue": "Özel Değişken Değeri",
"CustomVariables": "Özel Değişkenler",
"ScopePage": "ilgili sayfa",
"ScopeVisit": "ilgili ziyaret"
diff --git a/plugins/DBStats/lang/sq.json b/plugins/DBStats/lang/sq.json
index 0e338133c6..86c85360e5 100644
--- a/plugins/DBStats/lang/sq.json
+++ b/plugins/DBStats/lang/sq.json
@@ -6,9 +6,9 @@
"EstimatedSize": "Madhësi e vlerësuar",
"IndexSize": "Madhësi treguesi",
"LearnMore": "Për të mësuar më tepër rreth se si i përpunon të dhënat Piwik-u dhe se si ta bëni Piwik-un të punojë mirë me sajte me trafik mesatar ose të madh, kontrolloni dokumentimin %s.",
- "MainDescription": "Piwik-u po i depoziton krejt të dhënat tuaja për analizë web te baza e të dhënave MySQL. Tani për tani, tabelat e Piwik-ut po përdorin %s.",
- "MetricDataByYear": "Tabela Matjesh Sipas Vitesh",
- "MetricTables": "Tabela Matjesh",
+ "MainDescription": "Piwik-u po i depoziton krejt të dhënat tuaja për analiza web te baza e të dhënave MySQL. Tani për tani, tabelat e Piwik-ut po përdorin %s.",
+ "MetricDataByYear": "Tabela Vlerash Sipas Vitesh",
+ "MetricTables": "Tabela Vlerash",
"OtherTables": "Tabela të Tjera",
"PluginDescription": "Furnizon raporte të hollësishëm përdorimi baze të dhënash MySQL. Gjendet nën Diagnostikimet, për Superpërdoruesit.",
"ReportDataByYear": "Tabela Raportesh Sipas Vitit",
@@ -16,6 +16,6 @@
"RowCount": "Numërim rreshtash",
"Table": "Tabelë",
"TotalSize": "Madhësi gjithsej",
- "TrackerTables": "Tabela Gjurmuesi"
+ "TrackerTables": "Tabela Ndjekësi"
}
} \ No newline at end of file
diff --git a/plugins/Dashboard/javascripts/widgetMenu.js b/plugins/Dashboard/javascripts/widgetMenu.js
index d3d96569eb..55eef4ab09 100644
--- a/plugins/Dashboard/javascripts/widgetMenu.js
+++ b/plugins/Dashboard/javascripts/widgetMenu.js
@@ -83,6 +83,12 @@ widgetsHelper.getAvailableWidgets = function (callback) {
}
}
);
+ ajaxRequest.setErrorCallback(function (deferred, status) {
+ if (status == 'abort' || !deferred || deferred.status < 400 || deferred.status >= 600) {
+ return;
+ }
+ $('#loadingError').show();
+ });
ajaxRequest.send(true);
}
diff --git a/plugins/Dashboard/lang/sq.json b/plugins/Dashboard/lang/sq.json
index 0b9a887d1f..ba115c0890 100644
--- a/plugins/Dashboard/lang/sq.json
+++ b/plugins/Dashboard/lang/sq.json
@@ -11,7 +11,7 @@
"DashboardName": "Emër pulti:",
"DashboardOf": "Pulti i %s",
"DefaultDashboard": "Pulti parazgjedhje - Përdorim i parazgjedhjeve për përzgjedhje widget-sh dhe skema shtyllash",
- "DeleteWidgetConfirm": "Jeni i sigurt se doni të fshihet ky \"widget\" prej pulti?",
+ "DeleteWidgetConfirm": "Jeni i sigurt se doni të fshihet ky \"widget\" prej pultit?",
"EmptyDashboard": "Pult i zbrazët - Zgjidhni widget-et tuaj të parapëlqyer",
"LoadingWidget": "Widget-i po ngarkohet, ju lutemi, pritni...",
"ManageDashboard": "Administroni pultin",
@@ -31,7 +31,7 @@
"SetAsDefaultWidgetsConfirm": "Jeni i sigurt se doni të caktohet përzgjedhja e tanishme e widget-eve dhe e skemës për shtyllat si gjedhja parazgjedhje e pultit?",
"SetAsDefaultWidgetsConfirmHelp": "Kjo përzgjedhje widget-sh dhe shtyllash për pultin do të përdoret kur cilido përdorues krijon një pult të ri, ose kur përdoret veçoria \"%s\".",
"TopLinkTooltip": "Shihni raporte Analizash Web për %s.",
- "WidgetNotFound": "Nuk u gjet \"widget\"",
+ "WidgetNotFound": "S’u gjet widget-i",
"WidgetPreview": "Paraparje widget-i"
}
} \ No newline at end of file
diff --git a/plugins/Dashboard/lang/sr.json b/plugins/Dashboard/lang/sr.json
index 4a80362d1a..9f7ec7e454 100644
--- a/plugins/Dashboard/lang/sr.json
+++ b/plugins/Dashboard/lang/sr.json
@@ -21,6 +21,7 @@
"PluginDescription": "Vaša konzola za veb analitiku. Prilagodite je svojim potrebama dodavanjem novih vidžeta, prevlačenjem istih i menjanjem rasporeda. Svaki korisnik može da upravlja svojom konzolom.",
"RemoveDashboard": "Ukloni konzolu",
"RemoveDashboardConfirm": "Da li ste sigurni da želite da uklonite konzolu \"%s\"?",
+ "RemoveDefaultDashboardNotPossible": "Ne možete ukloniti podrazumevanu konzolu",
"RenameDashboard": "Promena naziva",
"ResetDashboard": "Resetuj konzolu",
"ResetDashboardConfirm": "Da li ste sigurni da želite da resetujete konzolu na podrazumevane vidžete?",
diff --git a/plugins/DevicePlugins/lang/ko.json b/plugins/DevicePlugins/lang/ko.json
index 84dfe3cec5..25df8e2c01 100644
--- a/plugins/DevicePlugins/lang/ko.json
+++ b/plugins/DevicePlugins/lang/ko.json
@@ -1,5 +1,7 @@
{
"DevicePlugins": {
+ "PluginDescription": "방문자의 브라우저가 지원하는 플러그인들 리스트 보고서",
+ "PluginDetectionDoesNotWorkInIE": "참고: Internet Explorer 11 이전 버전에서는 플러그인 검색이 작동하지 않습니다. 이 보고서는 IE 브라우저가 아닌것과 새로운 버전의 IE에 기반합니다.",
"WidgetPlugins": "플러그인 목록",
"WidgetPluginsDocumentation": "방문자가 사용하는 브라우저의 플러그인에 대한 보고서입니다. 컨텐츠에 대한 최적의 표시 방법을 선택하는 데 중요한 정보입니다."
}
diff --git a/plugins/DevicePlugins/lang/sr.json b/plugins/DevicePlugins/lang/sr.json
index bcb3803323..484a7056fd 100644
--- a/plugins/DevicePlugins/lang/sr.json
+++ b/plugins/DevicePlugins/lang/sr.json
@@ -3,6 +3,7 @@
"BrowserWithNoPluginsEnabled": "%1$s sa isključenim dodacima",
"BrowserWithPluginsEnabled": "%1$s sa uključenim dodacima %2$s",
"PluginDescription": "Prikazuje spisak dodataka koji su podržani u brauzerima posetilaca.",
+ "PluginDetectionDoesNotWorkInIE": "Pažnja: detekcija dodataka ne radi za Internet Eksplorer pre verzije 11. Ovaj izveštaj se odnosi samo na brauzere koji nisu Internet Ekslorer i na nove verzije dotičnog",
"WidgetPlugins": "Lista dodataka",
"WidgetPluginsDocumentation": "Ovaj izveštaj prikazuje koje dodatke za brauzere vaši posetioci imaju uključene. Ova informacija može biti od značaja prilikom odabira pravog načina prikaza sadržaja na vašem sajtu."
}
diff --git a/plugins/DevicesDetection/lang/sq.json b/plugins/DevicesDetection/lang/sq.json
index df2cd7d373..a4caf551c1 100644
--- a/plugins/DevicesDetection/lang/sq.json
+++ b/plugins/DevicesDetection/lang/sq.json
@@ -1,18 +1,44 @@
{
"DevicesDetection": {
- "BrowserEngine": "Shfletues",
+ "BrowserEngine": "Motor shfletuesi",
"BrowserEngineDocumentation": "Ky grafik tregon shfletuesit e vizitorëve tuaj, grupuar sipas familjesh shfletuesish. %s Informacioni më i rëndësishëm për programuesit web është lloji i mekanizmit vizatues që përdor shfletuesi. Etiketat përmbajnë emrat e mekanizmave, pasuar në kllapa nga shfletuesit më të zakonshëm që përdorin secilin prej tyre.",
+ "BrowserEngines": "Motorë shfletuesi",
"BrowserFamily": "Familje shfletuesi",
- "Browsers": "Shfletuesa",
+ "Browsers": "Shfletues",
"BrowserVersion": "Version shfletuesi",
"BrowserVersions": "Versione shfletuesi",
"Camera": "Kamerë",
+ "CarBrowser": "Shfletues automjetesh",
"Software": "Software",
"ColumnBrowser": "Shfletues",
"ColumnOperatingSystem": "Sistem operativ",
+ "ColumnOperatingSystemVersion": "Version sistemi operativ",
+ "Console": "Konsolë",
+ "dataTableLabelBrands": "Markë",
+ "dataTableLabelModels": "Model",
+ "dataTableLabelSystemVersion": "Version Sistemi Operativ",
"dataTableLabelTypes": "Lloj",
+ "Device": "Pajisje",
+ "DeviceBrand": "Markë pajisjeje",
+ "DeviceDetection": "Zbulim pajisjeje",
+ "DeviceModel": "Model pajisjeje",
+ "DevicesDetection": "Pajisje Vizitorësh",
+ "DeviceType": "Lloj pajisjeje",
+ "FeaturePhone": "Telefon",
+ "OperatingSystemFamilies": "Familje Sistemesh Operativë",
+ "OperatingSystemFamily": "Familje Sistemi Operativ",
"OperatingSystems": "Sisteme operativë",
- "WidgetBrowsers": "Shfletuesa vizitorësh",
+ "OperatingSystemVersions": "Versione Sistemesh Operativë",
+ "PluginDescription": "Furnizon të dhëna të zgjeruara rreth pajisje përdoruesish, të tilla si Marka (prodhuesi), Modeli (version pajisjeje), lloj pajisjeje (tv, konsola, telefon të mençur, desktop, etj) dhe të tjera.",
+ "SmartDisplay": "Ekran i mençur",
+ "Smartphone": "Telefon i mençur",
+ "PortableMediaPlayer": "Lojtës media portativ",
+ "Devices": "Pajisje",
+ "Tablet": "Tablet",
+ "Phablet": "Fablet",
+ "TV": "Tv",
+ "UserAgent": "Agjent përdoruesi",
+ "WidgetBrowsers": "Shfletues Vizitori",
"WidgetBrowsersDocumentation": "Ky raport përmban të dhëna rreth llojeve të shfletuesit që përdornin vizitorët tuaj. Secili version i një shfletuesi tregohet veçmas."
}
} \ No newline at end of file
diff --git a/plugins/DevicesDetection/lang/tr.json b/plugins/DevicesDetection/lang/tr.json
index 0e9e8a6f55..a0940b66d4 100644
--- a/plugins/DevicesDetection/lang/tr.json
+++ b/plugins/DevicesDetection/lang/tr.json
@@ -1,6 +1,7 @@
{
"DevicesDetection": {
"BrowserEngine": "Tarayıcı motoru",
+ "BrowserEngineDocumentation": "Bu rapor ziyaretçilerin web tarayıcılarının tarayıcı motorlarına göre dağılımını görüntüler. %s Web tasarımcıları için en önemli bilgi ziyaretçilerin kullandığı görüntüleme motorudur. Etiketlerde motorların adı ve yanında köşeli parantez içinde bu motoru en çok kullanan tarayıcı görüntülenir.",
"BrowserEngines": "Tarayıcı motorları",
"BrowserFamily": "Tarayıcı ailesi",
"Browsers": "Tarayıcılar",
@@ -27,15 +28,15 @@
"OperatingSystemFamilies": "İşletim Sistemi aileleri",
"OperatingSystemFamily": "İşletim Sistemi Ailesi",
"OperatingSystems": "İşletim sistemleri",
- "OperatingSystemVersions": "İşletim Sistemi versiyonları",
+ "OperatingSystemVersions": "İşletim Sistemi Sürümleri",
"PluginDescription": "Marka (Üretici), Model (cihaz versiyonu) , cihaz tipi (tv, konsol, akıllı telefon, masaüstü gibi) özellikleri içeren kulanıcı cihazları ile ilgili ek bilgi sunar.",
- "SmartDisplay": "Akıllı görüntüleme",
+ "SmartDisplay": "Akıllı Görüntüleyici",
"Smartphone": "Akıllı Telefon",
- "PortableMediaPlayer": "Taşınabilir medya oynatıcısı",
- "Devices": "Cihazlar",
+ "PortableMediaPlayer": "Taşınabilir Ortam Oynatıcısı",
+ "Devices": "Aygıtlar",
"Tablet": "Tablet",
- "Phablet": "Tablet",
- "TV": "Tv",
+ "Phablet": "Phablet",
+ "TV": "TV",
"UserAgent": "User-Agent",
"WidgetBrowsers": "Ziyaretçi tarayıcılari",
"WidgetBrowsersDocumentation": "Bu rapor ziyaretçilerinizin ne tür tarayıcılar kullandığı bilgisini içerir. Her tarayıcı versiyonu ayrı olarak listelenmiştir."
diff --git a/plugins/Diagnostics/Diagnostic/FileIntegrityCheck.php b/plugins/Diagnostics/Diagnostic/FileIntegrityCheck.php
index 454237418d..7393877175 100644
--- a/plugins/Diagnostics/Diagnostic/FileIntegrityCheck.php
+++ b/plugins/Diagnostics/Diagnostic/FileIntegrityCheck.php
@@ -7,6 +7,7 @@
*/
namespace Piwik\Plugins\Diagnostics\Diagnostic;
+use Piwik\Development;
use Piwik\Filechecks;
use Piwik\Translation\Translator;
@@ -29,6 +30,10 @@ class FileIntegrityCheck implements Diagnostic
{
$label = $this->translator->translate('Installation_SystemCheckFileIntegrity');
+ if(Development::isEnabled()) {
+ return array(DiagnosticResult::singleResult($label, DiagnosticResult::STATUS_OK));
+ }
+
$messages = Filechecks::getFileIntegrityInformation();
$ok = array_shift($messages);
diff --git a/plugins/Diagnostics/lang/sq.json b/plugins/Diagnostics/lang/sq.json
index 1e0cf25ff0..26a12f8cc4 100644
--- a/plugins/Diagnostics/lang/sq.json
+++ b/plugins/Diagnostics/lang/sq.json
@@ -1,6 +1,8 @@
{
"Diagnostics": {
"ConfigFileTitle": "Kartelë formësimesh",
+ "ConfigFileIntroduction": "Këtu mund të shihni formësimin e Piwik-ut. Nëse Piwik-un e xhironi në një mjedis me ngarkesë të balancuar, faqja mund të jetë ndryshe, varet se nga cili shërbyes ngarkohet faqja. Rreshtat me një ngjyrë tjetër për sfondin përfaqësojnë vlera formësimi që janë dhënë si shembull te kartela %1$s.",
+ "HideUnchanged": "Nëse dëshironi të shihni vetëm vlerat e ndryshuara, mund të %1$sfshihni krejt vlerat e pandryshuara%2$s.",
"Sections": "Ndarje"
}
} \ No newline at end of file
diff --git a/plugins/Diagnostics/lang/sr.json b/plugins/Diagnostics/lang/sr.json
new file mode 100644
index 0000000000..7c936b1ab0
--- /dev/null
+++ b/plugins/Diagnostics/lang/sr.json
@@ -0,0 +1,8 @@
+{
+ "Diagnostics": {
+ "ConfigFileTitle": "Datoteka sa podešavanjima",
+ "ConfigFileIntroduction": "Ovde možete da vidite Piwik podešavanja. Ukoliko vaš Piwik radi u okruženju sa balansiranjem opterećenja, stranica možda izgčeda drugačije u zavisnosti sa kog servera je učitana. Redovi sa drugačijom bojom pozadine sadrže vrednosti koje su izmenjene u odnosu na primer iz fajla %1$s.",
+ "HideUnchanged": "Ukoliko želite da vidite samo izmenjene vrednosti, možete da %1$ssakrijete neizmenjene vrednosti%2$s.",
+ "Sections": "Sekcije"
+ }
+} \ No newline at end of file
diff --git a/plugins/Diagnostics/lang/tr.json b/plugins/Diagnostics/lang/tr.json
new file mode 100644
index 0000000000..4a2aec5eff
--- /dev/null
+++ b/plugins/Diagnostics/lang/tr.json
@@ -0,0 +1,8 @@
+{
+ "Diagnostics": {
+ "ConfigFileTitle": "Ayar Dosyası",
+ "ConfigFileIntroduction": "Piwik ayarları bu bölümde görülebilir. Piwik yazılımını yük dengeleme yapılan bir ortamda kullanıyorsanız sayfadaki bilgiler yüklendiği sunucuya göre değişiklik gösterebilir. %1$s dosyasındaki örnek dosyada belirtilen değerlere göre değiştirilmiş olan satırlar farklı art alan renginde görüntülenir.",
+ "HideUnchanged": "Yalnız değiştirilmiş değerlerin görüntülenmesi için %1$sdeğiştirilmemiş tüm değerleri gizleyin%2$s.",
+ "Sections": "Bölümler"
+ }
+} \ No newline at end of file
diff --git a/plugins/Ecommerce/lang/ru.json b/plugins/Ecommerce/lang/ru.json
index 98a46f81fa..8fed6f2c57 100644
--- a/plugins/Ecommerce/lang/ru.json
+++ b/plugins/Ecommerce/lang/ru.json
@@ -1,6 +1,8 @@
{
"Ecommerce": {
"PluginDescription": "Ecommerce позволяет вам отслеживать, когда пользователи добавляют продукты в корзины, и когда они преобразовываются в распродажу ecommerce. Также отслеживайте просмотр продуктов и категорий продуктов, и оставленные корзины.",
- "Sales": "Продажи"
+ "Sales": "Продажи",
+ "SalesBy": "Продаж по %s",
+ "SalesAdjective": "Продаж %s"
}
} \ No newline at end of file
diff --git a/plugins/Ecommerce/lang/sq.json b/plugins/Ecommerce/lang/sq.json
index 0b7be266d9..b50ca93ba4 100644
--- a/plugins/Ecommerce/lang/sq.json
+++ b/plugins/Ecommerce/lang/sq.json
@@ -1,6 +1,6 @@
{
"Ecommerce": {
- "PluginDescription": "Etregtia ju lejon të ndiqni se kur përdoruesit shtojnë produkte në shporta, dhe kur ato shndërrohen në shitje etregtie. Ajo ndjek gjithashtu parje produktesh dhe kategorish produktesh dhe shporta të braktisura.",
+ "PluginDescription": "E-tregtia ju lejon të ndiqni se kur përdoruesit shtojnë produkte në shporta, dhe kur ato shndërrohen në shitje e-tregtie. Ajo ndjek gjithashtu parje produktesh dhe kategorish produktesh apo shporta të braktisura.",
"Sales": "Shitje",
"SalesBy": "Shitje nga %s",
"SalesAdjective": "Shitje %s"
diff --git a/plugins/Events/Archiver.php b/plugins/Events/Archiver.php
index c928ec318e..76e4c3e677 100644
--- a/plugins/Events/Archiver.php
+++ b/plugins/Events/Archiver.php
@@ -98,7 +98,10 @@ class Archiver extends \Piwik\Plugin\Archiver
public function aggregateMultipleReports()
{
$dataTableToSum = $this->getRecordNames();
- $columnsAggregationOperation = null;
+ $columnsAggregationOperation = array(
+ Metrics::INDEX_EVENT_MIN_EVENT_VALUE => 'min',
+ Metrics::INDEX_EVENT_MAX_EVENT_VALUE => 'max',
+ );
$this->getProcessor()->aggregateDataTableRecords(
$dataTableToSum,
diff --git a/plugins/Events/lang/sq.json b/plugins/Events/lang/sq.json
index e97f2cb97d..d306dd1b5f 100644
--- a/plugins/Events/lang/sq.json
+++ b/plugins/Events/lang/sq.json
@@ -1,11 +1,32 @@
{
"Events": {
- "Event": "Veprimtari",
- "EventCategories": "Kategori Veprimtarish",
- "EventCategory": "Kategori Veprimtarish",
- "EventName": "Emër Veprimtarie",
- "EventNames": "Emra Veprimtarish",
- "Events": "Veprimtari",
- "EventsWithValue": "Veprimtari me një vlerë"
+ "PluginDescription": "Ndiqni Akte dhe merrni raporte mbi veprimtarinë e vizitorëve tuaj.",
+ "AvgEventValue": "Vlera mesatare e Akteve është: %s",
+ "AvgValue": "Vlerë mesatare",
+ "AvgValueDocumentation": "Mesatarja e krejt vlerave për këtë akt",
+ "Event": "Akt",
+ "EventAction": "Veprim Akti",
+ "EventActions": "Veprime Akti",
+ "EventCategories": "Kategori Aktesh",
+ "EventCategory": "Kategori Akti",
+ "EventName": "Emër Akti",
+ "EventNames": "Emra Aktesh",
+ "Events": "Akte",
+ "EventsWithValue": "Akte me një vlerë",
+ "EventsWithValueDocumentation": "Numër aktesh për të cilat është caktuar një vlerë Akti",
+ "EventValue": "Vlerë Akti",
+ "EventValueTooltip": "Vlera Tërësore e Aktit është shuma e %1$s vlerave të akteve %2$s mes minimumit prej %3$s dhe maksimumit prej %4$s.",
+ "MaxValue": "Vlerë maksimum",
+ "MaxValueDocumentation": "Vlera maksimum për këtë akt",
+ "MinValue": "Vlera minimum",
+ "MinValueDocumentation": "Vlera minimum për këtë akt",
+ "SecondaryDimension": "Përmasa dytësore është %s.",
+ "SwitchToSecondaryDimension": "Kalo te %s",
+ "TopEvents": "Aktet Kryesuese",
+ "TotalEvents": "Akte gjithsej",
+ "TotalEventsDocumentation": "Numri gjithsej i akteve",
+ "TotalValue": "Vlerë gjithsej",
+ "TotalValueDocumentation": "Shuma e vlerave të akteve",
+ "ViewEvents": "Shihni Akte"
}
} \ No newline at end of file
diff --git a/plugins/Feedback/lang/cs.json b/plugins/Feedback/lang/cs.json
index 415390b5a0..a0031b3a11 100644
--- a/plugins/Feedback/lang/cs.json
+++ b/plugins/Feedback/lang/cs.json
@@ -9,7 +9,7 @@
"PrivacyClaim": "Piwik respektuje vaše %1$ssoukromí%2$s a dává vám plnou kontrolu nad vašimi daty.",
"RateFeatureLeaveMessageDislike": "Je nám líto, že se vám to nelíbí. Řekněte nám, jak se můžeme zlepšit.",
"RateFeatureLeaveMessageLike": "Jsme rádi, že se vám to líbí. Řekněte nám, co se vám líbí nejvíc, nebo jestli máte nějaký návrh na novou funkci.",
- "RateFeatureSendFeedbackInformation": "Piwik platforma nám (týmu Piwiku) pošle zprávu s vaší e-mailovou adresou, abychom vás v případě otázek mohli kontaktovat.",
+ "RateFeatureSendFeedbackInformation": "Piwik nám (týmu Piwiku) pošle zprávu (s vaší emailovou adresou), abychom vás v případě otázek mohli kontaktovat.",
"RateFeatureThankYouTitle": "Děkujeme za ohodnocení %s.",
"RateFeatureTitle": "Líbí se vám vlastnost %s? Ohodnoťte ji a zanechte komentář",
"SendFeedback": "Odeslat odezvu",
@@ -23,7 +23,7 @@
"ProfessionalServicesOfferIntro": "Ze kterých služeb můžete profitovat?",
"ProfessionalServicesReviewPiwikSetup": "Kontrola vaší instalace Piwiku",
"ProfessionalServicesOptimizationMaintenance": "Služby optimalizace a údržby Piwiku",
- "ProfessionalServicesPhoneEmailSupport": "Telefonická a e-mailová podpora",
+ "ProfessionalServicesPhoneEmailSupport": "Telefonická a emailová podpora",
"ProfessionalServicesTraining": "Školení uživatelů, techniků a vývoářů",
"ProfessionalServicesPremiumFeatures": "Prémiové funkce",
"ProfessionalServicesCustomDevelopment": "Vývojářské služby na míru",
diff --git a/plugins/Feedback/lang/nb.json b/plugins/Feedback/lang/nb.json
index 0b0a28fc40..ff89e44d03 100644
--- a/plugins/Feedback/lang/nb.json
+++ b/plugins/Feedback/lang/nb.json
@@ -9,9 +9,9 @@
"SendFeedback": "Send tilbakemelding",
"ThankYou": "Takk for at du hjelper oss å lage Piwik bedre!",
"TopLinkTooltip": "Fortell oss hva du synes eller be om profesjonell støtte.",
- "CommunityHelp": "Samfunns Hjelpere",
+ "CommunityHelp": "Hjelp fra Piwik-samfunnet",
"ProfessionalHelp": "Profesjonell hjelp",
- "ProfessionalServicesPhoneEmailSupport": "Telefon og e-post-støtte",
+ "ProfessionalServicesPhoneEmailSupport": "Telefon- og e-poststøtte",
"ProfessionalServicesPremiumFeatures": "Premium-funksjoner",
"ContactUs": "Kontakt oss"
}
diff --git a/plugins/Feedback/lang/sq.json b/plugins/Feedback/lang/sq.json
index bac0ae015e..4dadf4c7cc 100644
--- a/plugins/Feedback/lang/sq.json
+++ b/plugins/Feedback/lang/sq.json
@@ -4,8 +4,8 @@
"HowToCreateTicket": "Ju lutemi, lexoni rekomandimet se si të shkruhet si duhet një %1$snjoftim të metash%2$s apo %3$skërkesë për veçori%4$s. Mandej regjistrohuni ose bëni hyrjen te %5$sndjekësi ynë i çështjeve%6$s dhe krijoni një %7$sçështje të re%8$s.",
"IWantTo": "Dua të:",
"LearnWaysToParticipate": "Njihuni me krejt mënyrat përmes të cilave mund të %1$s merrni pjesë%2$s",
- "ManuallySendEmailTo": "Ju lutem, dërgojeni mesazhin tuaj dorazi te",
- "PluginDescription": "Dërgojani Përshtypjet tuaja Ekipit të Piwik-ut. Ndani me taidetë dhe sugjerimet tuaja për ta bërë Piwik-un platformën më të mirë në botë për analiza!",
+ "ManuallySendEmailTo": "Ju lutemi, dërgojeni mesazhin tuaj dorazi te",
+ "PluginDescription": "Dërgojani Përshtypjet tuaja Ekipit të Piwik-ut. Ndani me ta idetë dhe sugjerimet tuaja për ta bërë Piwik-un platformën më të mirë në botë për analiza!",
"PrivacyClaim": "Piwik-u respekton %1$sprivatësinë%2$s tuaj dhe ju jep kontroll të plotë mbi të dhënat tuaja.",
"RateFeatureLeaveMessageDislike": "Na vjen keq që dëgjojmë se s’ju pëlqen! Ju lutemi, na thoni se si mund ta përmirësojmë.",
"RateFeatureLeaveMessageLike": "Gëzohemi që ju pëlqen! Ju lutemi, na thoni se çfarë ju pëlqeu më shumë ose nëse keni ndonjë kërkesë për veçori të re.",
@@ -16,9 +16,18 @@
"ThankYou": "Faleminderit që na ndihmoni ta bëjmë më të mirë Piwik-un!",
"TopLinkTooltip": "Na thoni se ç’mendim keni, ose kërkoni Asistencë Profesionale.",
"ViewAnswersToFAQ": "Shihni përgjigjet te %1$sPyetje të Bëra Shpesh%2$s",
- "ViewUserGuides": "Mësoni përmes %1$sudhërëfyesit tonë për përdoruesit%2$s se si ta formësoni Piwik-un dhe si të analizoni me efektshmëri të dhënat tuaja",
+ "ViewUserGuides": "Mësoni përmes %1$sudhërrëfyesit tonë për përdoruesit%2$s se si ta formësoni Piwik-un dhe si të analizoni me efektshmëri të dhënat tuaja",
"CommunityHelp": "Ndihmë nga Bashkësia",
"ProfessionalHelp": "Ndihmë Profesionale",
+ "ProfessionalServicesIntro": "Rrjeti ynë mbarëbotëror i konsulentëve profesionalë për Piwik ofron asistencë për klientë që kanë të instaluar Piwik-un në infrastrukturën e tyre.",
+ "ProfessionalServicesOfferIntro": "Prej cilave shërbime mund të përfitoni?",
+ "ProfessionalServicesReviewPiwikSetup": "Një përmbledhje e rregullimit të Piwik-ut tuaj",
+ "ProfessionalServicesOptimizationMaintenance": "Shërbime optimizimi & mirëmbajtjeje të Piwik-ut",
+ "ProfessionalServicesPhoneEmailSupport": "Asistencë me Telefon dhe Email",
+ "ProfessionalServicesTraining": "Trajnim Përdoruesish, Teknik, dhe Zhvilluesish",
+ "ProfessionalServicesPremiumFeatures": "Veçori me pagesë",
+ "ProfessionalServicesCustomDevelopment": "Shërbime Zhvillimi Përshtatjesh",
+ "ProfessionalServicesAnalystConsulting": "Shërbime konsulence analisti",
"ContactUs": "Lidhuni me ne",
"VisitTheForums": "Vizitoni %1$s Forumet%2$s dhe merrni ndihmë prej bashkësisë së përdoruesve të Piwik-ut"
}
diff --git a/plugins/Feedback/lang/sr.json b/plugins/Feedback/lang/sr.json
index 95c6c01682..0df1951ad1 100644
--- a/plugins/Feedback/lang/sr.json
+++ b/plugins/Feedback/lang/sr.json
@@ -19,6 +19,16 @@
"ViewUserGuides": "Naučite kako da podesite Piwik i kako da efikasno analizirate vaše podatke prateći %1$skorisničko uputstvo%2$s",
"CommunityHelp": "Pomoć zajednice",
"ProfessionalHelp": "Profesionalna pomoć",
- "ContactUs": "Kontaktirajte nas"
+ "ProfessionalServicesIntro": "Svetska mreža profesionalnih konsultanata za podršku klijentima koji hostuju Piwik na sopstvenim platformama.",
+ "ProfessionalServicesOfferIntro": "Od kojih usluga možete imati koristi?",
+ "ProfessionalServicesReviewPiwikSetup": "Provera vaše Piwik instalacije",
+ "ProfessionalServicesOptimizationMaintenance": "Usluge optimizacije i održavanja Piwik-a",
+ "ProfessionalServicesPhoneEmailSupport": "Telefonska i podrška putem mejla",
+ "ProfessionalServicesTraining": "Korisnički, tehnički i razvojni trening",
+ "ProfessionalServicesPremiumFeatures": "Premium sadržaji",
+ "ProfessionalServicesCustomDevelopment": "Razvoj usluga po vašoj želji",
+ "ProfessionalServicesAnalystConsulting": "Usluge analitičkog konsaltinga",
+ "ContactUs": "Kontaktirajte nas",
+ "VisitTheForums": "Posetite %1$s Forum%2$s kako biste dobili pomoć zajednice Piwik korisnika"
}
} \ No newline at end of file
diff --git a/plugins/Goals/Goals.php b/plugins/Goals/Goals.php
index 0ea6543ccf..0700d8aa75 100644
--- a/plugins/Goals/Goals.php
+++ b/plugins/Goals/Goals.php
@@ -272,6 +272,5 @@ class Goals extends \Piwik\Plugin
$translationKeys[] = 'Goals_DeleteGoalConfirm';
$translationKeys[] = 'Goals_Ecommerce';
$translationKeys[] = 'Goals_Optional';
- $translationKeys[] = 'Goals_ChooseGoal';
}
}
diff --git a/plugins/Goals/Updates/3.0.0-b1.php b/plugins/Goals/Updates/3.0.0-b1.php
index db28c5a45c..923c2acb7a 100644
--- a/plugins/Goals/Updates/3.0.0-b1.php
+++ b/plugins/Goals/Updates/3.0.0-b1.php
@@ -12,21 +12,38 @@ namespace Piwik\Plugins\Goals;
use Piwik\Common;
use Piwik\Updater;
use Piwik\Updates;
+use Piwik\Updater\Migration\Factory as MigrationFactory;
class Updates_3_0_0_b1 extends Updates
{
- public function getMigrationQueries(Updater $updater)
+ /**
+ * @var MigrationFactory
+ */
+ private $migration;
+
+ public function __construct(MigrationFactory $factory)
+ {
+ $this->migration = $factory;
+ }
+
+ /**
+ * Here you can define one or multiple SQL statements that should be executed during the update.
+ * @return Updater\Migration[]
+ */
+ public function getMigrations(Updater $updater)
{
- $updateSql = array(
- 'ALTER TABLE `' . Common::prefixTable('goal')
- . '` ADD COLUMN `description` VARCHAR(255) NOT NULL DEFAULT \'\' AFTER `name`;' => array(1060)
+ return array(
+ $this->migration->db->addColumn('goal', 'description', 'VARCHAR(255) NOT NULL DEFAULT \'\'', 'name'),
);
- return $updateSql;
}
+ /**
+ * Here you can define any action that should be performed during the update. For instance executing SQL statements,
+ * renaming config entries, updating files, etc.
+ */
public function doUpdate(Updater $updater)
{
- $updater->executeMigrationQueries(__FILE__, $this->getMigrationQueries($updater));
+ $updater->executeMigrations(__FILE__, $this->getMigrations($updater));
}
}
diff --git a/plugins/Goals/angularjs/manage-goals/manage-goals.controller.js b/plugins/Goals/angularjs/manage-goals/manage-goals.controller.js
index f7c26cea4a..3f0c4bfa8a 100644
--- a/plugins/Goals/angularjs/manage-goals/manage-goals.controller.js
+++ b/plugins/Goals/angularjs/manage-goals/manage-goals.controller.js
@@ -141,7 +141,7 @@
this.createGoal = function () {
this.showAddEditForm();
- initGoalForm('Goals.addGoal', _pk_translate('Goals_AddGoal'), '', 'url', '', 'contains', /*caseSensitive = */false, /*allowMultiple = */'0', '0');
+ initGoalForm('Goals.addGoal', _pk_translate('Goals_AddGoal'), '', '', 'url', '', 'contains', /*caseSensitive = */false, /*allowMultiple = */'0', '0');
scrollToTop();
}
diff --git a/plugins/Goals/lang/ar.json b/plugins/Goals/lang/ar.json
index 0f1394d2ec..331bfd8ece 100644
--- a/plugins/Goals/lang/ar.json
+++ b/plugins/Goals/lang/ar.json
@@ -39,8 +39,6 @@
"MatchesExpression": "يطابق التعبير %s",
"NewVisitorsConversionRateIs": "معدل التحويل للزيارات الجديدة هو %s",
"Optional": "(اختياري)",
- "OverallConversionRate": "%s إجمالي معدل التحويل (الزيارات التي حققت هدفاً)",
- "OverallRevenue": "%s ربح إجمالي",
"PageTitle": "عنوان الصفحة",
"Pattern": "النمط",
"ReturningVisitorsConversionRateIs": "معدل التحويل للزيارات المتكررة هو %s",
@@ -50,7 +48,6 @@
"VisitPageTitle": "يزور صفحة بعنوان معين",
"VisitUrl": "زيارة رابط معين (صفحة أو مجموعة من الصفحات)",
"WhenVisitors": "عندما يقوم الزوار",
- "WhereThe": "حيث يكون",
- "WhereVisitedPageManuallyCallsJavascriptTrackerLearnMore": "حيث تكون الصفحة تحتوي على استدعاء لجافاسكريبت piwikTracker.trackGoal() (%1$sتعرف على المزيد%2$s)"
+ "WhereThe": "حيث يكون"
}
} \ No newline at end of file
diff --git a/plugins/Goals/lang/be.json b/plugins/Goals/lang/be.json
index 4374b6ebf6..8624f6efd2 100644
--- a/plugins/Goals/lang/be.json
+++ b/plugins/Goals/lang/be.json
@@ -62,8 +62,6 @@
"MatchesExpression": "супадае з выразам %s",
"NewVisitorsConversionRateIs": "Канверсія новых наведвальнікаў - %s",
"Optional": "(неабавязкова)",
- "OverallConversionRate": "%s агульны ўзровень канверсіі (наведванні з завершанай мэтай)",
- "OverallRevenue": "%s агульны прыбытак",
"PageTitle": "Назва старонкі",
"Pattern": "Шаблон",
"ProductCategory": "Катэгорыя прадукта",
@@ -79,7 +77,6 @@
"VisitUrl": "Наведайце URL-адрас (старонкі, або групу старонак)",
"WhenVisitors": "калі наведвальнікі",
"WhereThe": "дзе",
- "WhereVisitedPageManuallyCallsJavascriptTrackerLearnMore": "дзе старонка павінна змяшчаць выклік JavaScript piwikTracker.trackGoal() метада (%1$sдаведацца больш%2$s)",
"YouCanEnableEcommerceReports": "Вы можаце ўключыць %1$s для гэтага вэб-сайта ў %2$s старонкі."
}
} \ No newline at end of file
diff --git a/plugins/Goals/lang/bg.json b/plugins/Goals/lang/bg.json
index 8729dc5666..7c1ce63e5c 100644
--- a/plugins/Goals/lang/bg.json
+++ b/plugins/Goals/lang/bg.json
@@ -65,8 +65,6 @@
"MatchesExpression": "съответства на изразените %s",
"NewVisitorsConversionRateIs": "Стойност на конверсията от новите посетители е %s",
"Optional": "(по избор)",
- "OverallConversionRate": "%s цялостно обменния курс (посещения със завършена цел)",
- "OverallRevenue": "%s общи приходи",
"PageTitle": "Заглавие на страница",
"Pattern": "Модел",
"ProductCategory": "Категория на продукт",
@@ -83,7 +81,6 @@
"VisitUrl": "посетят определен URL (страница или група от страници)",
"WhenVisitors": "когато посетителите",
"WhereThe": "където",
- "WhereVisitedPageManuallyCallsJavascriptTrackerLearnMore": "когато посетена страница съдържа призив към JavaScript piwikTracker.trackGoal() метод (%1$sнаучете повече%2$s)",
"YouCanEnableEcommerceReports": "Можете да включите %1$s за този уебсайт в %2$s страницата."
}
} \ No newline at end of file
diff --git a/plugins/Goals/lang/ca.json b/plugins/Goals/lang/ca.json
index f081f721ea..ded1c0f6e6 100644
--- a/plugins/Goals/lang/ca.json
+++ b/plugins/Goals/lang/ca.json
@@ -65,8 +65,6 @@
"MatchesExpression": "compleix l'expresió %s",
"NewVisitorsConversionRateIs": "El rati de conversió dels nous visitants es %s",
"Optional": "(opcional)",
- "OverallConversionRate": "%s rati de conversió global (visitants amb un objectiu complert)",
- "OverallRevenue": "%s ingresssos globals",
"PageTitle": "Títol de la pàgina",
"Pattern": "Patró",
"ProductCategory": "Categoria de Producte",
@@ -83,7 +81,6 @@
"VisitUrl": "Visitar una URL donada (pàgina o grup de pàgines)",
"WhenVisitors": "quan el visitant",
"WhereThe": "quan el",
- "WhereVisitedPageManuallyCallsJavascriptTrackerLearnMore": "quan la pagina visitada conté una crida al mètode piwikTracker.trackGoal() de la API de Javascript (%1$s saber més %2$s)",
"YouCanEnableEcommerceReports": "Podeu activar el %1$s per aquest lloc web a la pàgina %2$s."
}
} \ No newline at end of file
diff --git a/plugins/Goals/lang/cs.json b/plugins/Goals/lang/cs.json
index 467dd8f4ef..026a7394fd 100644
--- a/plugins/Goals/lang/cs.json
+++ b/plugins/Goals/lang/cs.json
@@ -14,6 +14,7 @@
"CategoryTextGeneral_Visitors": "Umístění uživatele",
"CategoryTextReferrers_Referrers": "Referrery",
"CategoryTextVisitsSummary_VisitsSummary": "Uživatelský atribut",
+ "CategoryTextDevicesDetection_DevicesDetection": "Zařízení",
"CategoryTextGeneral_Visit": "Zapojení",
"ChooseGoal": "Vyberte cíl",
"ClickOutlink": "Kliknou na odkaz na externí web",
@@ -23,7 +24,7 @@
"ColumnAverageQuantityDocumentation": "Průměrný počet tohoto %s prodaný v elektronických objednávkách.",
"ColumnConversionRateDocumentation": "Procento návštěv, které vyvolaly cíl %s.",
"ColumnConversionRateProductDocumentation": "Konverzní poměr %s je počet objednávek obsahujících tento produkt děleno celkovým počtem návštěv stránky produktu.",
- "ColumnConversions": "Přechody",
+ "ColumnConversions": "Převody",
"ColumnConversionsDocumentation": "Počet konverzí pro %s.",
"ColumnOrdersDocumentation": "Počet elektronických objednávek, které aspoň jednou obsahovaly %s.",
"ColumnPurchasedProductsDocumentation": "Počet zakoupených produktů je součet množství produktů ze všech elektronických objednávek.",
@@ -36,6 +37,7 @@
"ConversionByTypeReportDocumentation": "Toto hlášení poskytuje podrobné informace o výkonu cíle (konverze, konverzní poměr, celkový příjem za návštěvu) pro každou z kategorií zobrazených v levém panelu. %1$s Klikněte na jednu z kategorií pro zobrazení hlášení. %2$s Pro více informací si přečtěte %3$sdokumentaci sledování cílů%4$s",
"ConversionRate": "%s frekvence konverzí",
"Conversions": "%s konverzí",
+ "ConversionsDescription": "Konverze",
"ConversionsOverview": "Přehled konverzí",
"ConversionsOverviewBy": "Přehled konverzí podle typu návštěvy",
"DaysToConv": "Dnů do konverze",
@@ -70,7 +72,6 @@
"IsExactly": "je přesně %s",
"LearnMoreAboutGoalTrackingDocumentation": "Více o sledování cílů se dozvíte v %1$suživatelské dokumentaci%2$s.",
"LeftInCart": "%s Zbylo v košíku",
- "ManageGoalsOrCreateANewGoal": "%1$sSpravovat cíle%2$s nebo ho vytvořte.",
"Manually": "ručně",
"ManuallyTriggeredUsingJavascriptFunction": "Cíl je ručně zaznamenáván pomocí JavaScriptového API trackGoal()",
"MatchesExpression": "odpovídá %s",
@@ -80,8 +81,8 @@
"NoConversionsNoReportsMessage": "Reporty nejsou zobrazeny, protože nejsou dostupná převodní data pro vybrané cíle a období.",
"NeedAccess": "Pouze administrátor nebo uživatel s právy super-uživatele může spravovat cíle pro daný web.",
"Optional": "(volitelné)",
- "OverallConversionRate": "%s celková frekvence konverzí (návštěv se splněným cílem)",
- "OverallRevenue": "%s celkový příjem",
+ "OverallConversionRate": "Celkový počet konverzí (návštěvy se splněným cílem)",
+ "OverallRevenue": "celkový příjem",
"PageTitle": "Titulek stránky",
"Pattern": "Vzor",
"PluginDescription": "Vytvořte cíle a sledujte detailní hlášení o jejich konverzích: vývoj v čase, příjem za návštěvu, konverze prro referrer, pro klíčové slovo a více.",
@@ -102,7 +103,7 @@
"VisitUrl": "Navštíví zadanou URL (stránku nebo skupiny stránek)",
"WhenVisitors": "pokud návštěvníci",
"WhereThe": "když",
- "WhereVisitedPageManuallyCallsJavascriptTrackerLearnMore": "kde navštívená stránka obsahuhe volání metody JavaScriptu 'trackGoal' (%1$svíce%2$s)",
+ "WhereVisitedPageManuallyCallsJavascriptTrackerLearnMore": "Navštívená stránka musí obsahovat volání metody JavaScriptu 'trackGoal' (%1$svíce informací%2$s)",
"YouCanEnableEcommerceReports": "Pro tyto stránky můžete povolit %1$s na stránce %2$s."
}
} \ No newline at end of file
diff --git a/plugins/Goals/lang/da.json b/plugins/Goals/lang/da.json
index f5dde7af7b..6bfc103887 100644
--- a/plugins/Goals/lang/da.json
+++ b/plugins/Goals/lang/da.json
@@ -14,6 +14,7 @@
"CategoryTextGeneral_Visitors": "Bruger lokation",
"CategoryTextReferrers_Referrers": "Henvisninger",
"CategoryTextVisitsSummary_VisitsSummary": "Bruger attribute",
+ "CategoryTextDevicesDetection_DevicesDetection": "Enheder",
"CategoryTextGeneral_Visit": "engagement",
"ChooseGoal": "Vælg mål",
"ClickOutlink": "Klik på et link til en ekstern hjemmeside",
@@ -36,6 +37,7 @@
"ConversionByTypeReportDocumentation": "Rapporten indeholder detaljerede oplysninger om mål ydeevne (konverteringer, omregningskurser og indtægt pr. besøg) for hver af kategorierne tilgængelig i panelet til venstre. %1$s Klik på en af kategorierne for at få vist rapporten. %2$s For mere information læs %3$sSporing af mål dokumentation på piwik.org%4$s",
"ConversionRate": "%s konverteringsrate",
"Conversions": "%s konverteringer",
+ "ConversionsDescription": "konverteringer",
"ConversionsOverview": "Konverteringsoversigt",
"ConversionsOverviewBy": "Konverteringsoversigt efter besøgstype",
"DaysToConv": "Dage til konvertering",
@@ -70,7 +72,6 @@
"IsExactly": "er nøjagtig %s",
"LearnMoreAboutGoalTrackingDocumentation": "Lær mere om %1$s sporingsmål i Piwik%2$s i brugerdokumentationen.",
"LeftInCart": "%s tilbage i kurven",
- "ManageGoalsOrCreateANewGoal": "%1$sAdministrer mål%2$s eller opret et nyt mål nu!",
"Manually": "manuelt",
"ManuallyTriggeredUsingJavascriptFunction": "Målet udløses manuelt ved hjælp af JavaScript API trackGoal ()",
"MatchesExpression": "matcher udtrykket %s",
@@ -80,8 +81,8 @@
"NoConversionsNoReportsMessage": "Rapporter bliver ikke vist fordi der ikke er nogen salgsdata for det valgte mål og periode.",
"NeedAccess": "Kun en administrator eller en bruger med Super User adgang kan behandle mål for et givet website.",
"Optional": "(valgfri)",
- "OverallConversionRate": "%s samlet konverteringsrate (besøg med et færdigt mål)",
- "OverallRevenue": "%s samlede indtægter",
+ "OverallConversionRate": "samlet konverteringsrate (besøg med et færdigt mål)",
+ "OverallRevenue": "samlede indtægter",
"PageTitle": "sidetitel",
"Pattern": "Mønster",
"PluginDescription": "Opret mål og se detaljerede rapporter om målkonverteringer: udvikling over tid, indtjening pr. besøg, konverteringer pr. henviser, pr. søgeord og meget mere.",
@@ -102,7 +103,7 @@
"VisitUrl": "Besøger en bestemt hjemmeside (side eller en gruppe af sider)",
"WhenVisitors": "når de besøgende",
"WhereThe": "Hvor",
- "WhereVisitedPageManuallyCallsJavascriptTrackerLearnMore": "hvor den besøgte side indeholder et kald til JavaScriptet piwikTracker.trackGoal () metode (%1$s lær mere%2$s)",
+ "WhereVisitedPageManuallyCallsJavascriptTrackerLearnMore": "Den besøgte side skal indeholde et kald til JavaScript 'trackGoal' metode (%1$slær mere%2$s)",
"YouCanEnableEcommerceReports": "Du kan aktivere %1$s for hjemmesiden på %2$s siden."
}
} \ No newline at end of file
diff --git a/plugins/Goals/lang/de.json b/plugins/Goals/lang/de.json
index 4335674c45..c1896c1f90 100644
--- a/plugins/Goals/lang/de.json
+++ b/plugins/Goals/lang/de.json
@@ -14,8 +14,8 @@
"CategoryTextGeneral_Visitors": "Benutzerstandort",
"CategoryTextReferrers_Referrers": "Verweise",
"CategoryTextVisitsSummary_VisitsSummary": "Benutzereigenschaft",
+ "CategoryTextDevicesDetection_DevicesDetection": "Geräte",
"CategoryTextGeneral_Visit": "Engagement",
- "ChooseGoal": "Ziel wählen",
"ClickOutlink": "auf einen Link zu einer externen Website geklickt wird",
"SendEvent": "Ein Ereignis auslösen",
"ColumnAverageOrderRevenueDocumentation": "Der durchschnittliche Bestellwert ist der Gesamtumsatz aller Bestellungen geteilt durch die Anzahl der Bestellungen",
@@ -36,6 +36,7 @@
"ConversionByTypeReportDocumentation": "In diesem Bericht finden Sie detaillierte Informationen über die Performance Ihrer Ziele für jede der Kategorien in der linken Leiste. %1$s Klicken Sie auf eine der Kategorien, um den entsprechenden Bericht anzuzeigen. %2$s Weitere Informationen finden Sie in der %3$sZiel-Dokumentation auf piwik.org%4$s",
"ConversionRate": "%s Konversionsrate",
"Conversions": "%s Konversionen",
+ "ConversionsDescription": "Konversionen",
"ConversionsOverview": "Konversions-Überblick",
"ConversionsOverviewBy": "Überblick über Konversionen nach Besuchstyp",
"DaysToConv": "Tage bis zur Konversion",
@@ -70,7 +71,6 @@
"IsExactly": "ist genau %s",
"LearnMoreAboutGoalTrackingDocumentation": "Mehr zum Thema %1$s Erfassen von Zielen in Piwik%2$s erfahren Sie in der Dokumentation.",
"LeftInCart": "%s im Warenkorb gelassen",
- "ManageGoalsOrCreateANewGoal": "%1$sZiele verwalten%2$s oder ein neues Ziel erstellen!",
"Manually": "manuell",
"ManuallyTriggeredUsingJavascriptFunction": "Ziel wird manuell über die trackGoal() Funktion der Javascript-API auf erfüllt gesetzt",
"MatchesExpression": "entspricht dem Ausdruck %s",
@@ -80,8 +80,8 @@
"NoConversionsNoReportsMessage": "Es werden keine Berichte angezeigt, da keine Konversionen für das gewählte Ziel und den Zeitraum existieren.",
"NeedAccess": "Nur ein (Haupt-)Administrator kann Ziele für eine gegebene Website verwalten.",
"Optional": "(optional)",
- "OverallConversionRate": "%s Gesamtkonversionsrate (Besuche mit einem erreichten Ziel)",
- "OverallRevenue": "%s Gesamtumsatz",
+ "OverallConversionRate": "Gesamtkonversionsrate (Besuche, bei denen ein Ziel erreicht wurde)",
+ "OverallRevenue": "Gesamtumsatz",
"PageTitle": "Seitentitel",
"Pattern": "Muster",
"PluginDescription": "Erstellen Sie Ziele und sehen Sie detaililerte Berichte über Ihre Zielkonversionen: Entwicklung über einen bestimmten Zeitraum, Umsatz pro Besuch, Konversionen pro Verweis, pro Suchbegriff, und mehr.",
@@ -102,7 +102,7 @@
"VisitUrl": "Die angegebene URL (Seite oder Gruppe von Seiten) wird besucht",
"WhenVisitors": "wenn vom Besucher",
"WhereThe": "bei denen die",
- "WhereVisitedPageManuallyCallsJavascriptTrackerLearnMore": "wenn die besuchte Seite einen Aufruf der Javascript-Methode 'trackGoal' enthält (%1$sweitere Informationen%2$s)",
+ "WhereVisitedPageManuallyCallsJavascriptTrackerLearnMore": "Die besuchte Seite muss einen Aufruf der JavaScript-Methode \"trackGoal\" enthalten (%1$serfahren Sie mehr%2$s)",
"YouCanEnableEcommerceReports": "Sie können %1$s für diese Website auf der Seite %2$s aktivieren."
}
} \ No newline at end of file
diff --git a/plugins/Goals/lang/el.json b/plugins/Goals/lang/el.json
index c57bb5aaa2..85ab9eb14d 100644
--- a/plugins/Goals/lang/el.json
+++ b/plugins/Goals/lang/el.json
@@ -14,6 +14,7 @@
"CategoryTextGeneral_Visitors": "Τοποθεσία χρήστη",
"CategoryTextReferrers_Referrers": "Αναφορείς",
"CategoryTextVisitsSummary_VisitsSummary": "Χαρακτηριστικό χρήστη",
+ "CategoryTextDevicesDetection_DevicesDetection": "Συσκευές",
"CategoryTextGeneral_Visit": "δέσμευση",
"ChooseGoal": "Επιλέξτε Στόχο",
"ClickOutlink": "Το πάτημα Συνδέσμου προς εξωτερική ιστοσελίδα",
@@ -36,6 +37,7 @@
"ConversionByTypeReportDocumentation": "Η αναφορά αυτή παρέχει λεπτομερή πληροφορία σχετικά με την απόδοση των στόχων (μετατροπές, ρυθμοί μετατροπών και κέρδος ανά επίσκεψη) για καθεμία από τις διαθέσιμες κατηγορίες στον αριστερό πίνακα. %1$s Κάντε κλικ σε μία από τις κατηγορίες για να δείτε την αναφορά. %2$s Για περισσότερες πληροφορίες, δείτε την %3$sτεκμηρίωση Μετατροπής Στόχων%4$s",
"ConversionRate": "%s βαθμός μετατροπής",
"Conversions": "%s μετατροπές",
+ "ConversionsDescription": "μετατροπές",
"ConversionsOverview": "Επισκόπηση μετατροπών",
"ConversionsOverviewBy": "Επισκόπηση μετατροπών ανά τμήμα",
"DaysToConv": "Ημέρες για Μετατροπή",
@@ -70,7 +72,6 @@
"IsExactly": "είναι ακριβώς %s",
"LearnMoreAboutGoalTrackingDocumentation": "Δείτε περισσότερα για την %1$sΠαρακολούθηση των Στόχων στο Piwik%2$s στην τεκμηρίωση για το χρήστη.",
"LeftInCart": "%s απομένουν στο καλάθι",
- "ManageGoalsOrCreateANewGoal": "%1$sΔιαχειριστείτε τους Στόχους%2$s ή δημιουργήστε ένα νέο τώρα!",
"Manually": "χειροκίνητα",
"ManuallyTriggeredUsingJavascriptFunction": "Ο Στόχος ενεργοποιείτε χειροκίνητα με χρήση του Javascript API trackGoal()",
"MatchesExpression": "ταιριάζει στην έκφραση %s",
@@ -80,8 +81,8 @@
"NoConversionsNoReportsMessage": "Οι αναφορές δεν εμφανίζεται επειδή δεν υπάρχουν δεδομένα για μετατροπή για τον επιλεγμένο στόχο και περίοδο.",
"NeedAccess": "Μόνος ένας διαχειριστής ή χρήστης με δικαίωμα Υπερ Χρήστη μπορεί να διαχειριστεί τους Στόχους για ένα συγκεκριμένο ιστοτόπο.",
"Optional": "(προαιρετικό)",
- "OverallConversionRate": "%s καθολικός βαθμός προσόδου (επισκέψεις με έναν πλήρη στόχο)",
- "OverallRevenue": "%s καθολική πρόσοδος",
+ "OverallConversionRate": "συνολικός ρυθμός μετατροπής (επισκέψεις με πετυχημένο στόχο)",
+ "OverallRevenue": "συνολικό κέρδος",
"PageTitle": "Τίτλος Σελίδας",
"Pattern": "Υπόδειγμα",
"PluginDescription": "Δημιουργήστε Στόχους και δείτε λεπτομερείς αναφορές σχετικά με τις μετατροπές Στόχων: εξέλιξη με το χρόνο, μετατροπές ανά αναφορέα, ανά λέξη κλειδί και άλλα πολλά.",
@@ -102,7 +103,7 @@
"VisitUrl": "Επίσκεψη σε μια δοθείσα διεύθυνση URL (σελίδα ή ομάδα σελίδων)",
"WhenVisitors": "όταν οι επισκέψεις αφορούν",
"WhereThe": "όπου το",
- "WhereVisitedPageManuallyCallsJavascriptTrackerLearnMore": "όπου η σελίδα που έχει επισκεφθεί από κάποιο χρήστη περιέχει μια κλήση για την μέθοδο 'trackGoal' της JavaScript (%1$sδιαβάστε περισσότερα%2$s)",
+ "WhereVisitedPageManuallyCallsJavascriptTrackerLearnMore": "Η σελίδα για την οποία υπήρξε επίσκεψη πρέπει να περιέχει μια κλήση στη μέθοδο 'trackGoal' της JavaScript (%1$sδείτε περισσότερα%2$s)",
"YouCanEnableEcommerceReports": "Μπορείτε να ενεργοποιήσετε το %1$s για αυτό τον ιστοτόπο στη σελίδα %2$s."
}
} \ No newline at end of file
diff --git a/plugins/Goals/lang/en.json b/plugins/Goals/lang/en.json
index 4c886392b2..d78a22a276 100644
--- a/plugins/Goals/lang/en.json
+++ b/plugins/Goals/lang/en.json
@@ -16,7 +16,6 @@
"CategoryTextVisitsSummary_VisitsSummary": "User attribute",
"CategoryTextDevicesDetection_DevicesDetection": "Devices",
"CategoryTextGeneral_Visit": "engagement",
- "ChooseGoal": "Choose Goal",
"ClickOutlink": "Click on a Link to an external website",
"SendEvent": "Send an event",
"ColumnAverageOrderRevenueDocumentation": "Average Order Value (AOV) is the total revenue from all Ecommerce Orders divided by the number of orders.",
diff --git a/plugins/Goals/lang/es.json b/plugins/Goals/lang/es.json
index be3da50bb9..b89f5d8f90 100644
--- a/plugins/Goals/lang/es.json
+++ b/plugins/Goals/lang/es.json
@@ -14,6 +14,7 @@
"CategoryTextGeneral_Visitors": "Ubicación del usuario",
"CategoryTextReferrers_Referrers": "Referencias",
"CategoryTextVisitsSummary_VisitsSummary": "Atributo del usuario",
+ "CategoryTextDevicesDetection_DevicesDetection": "Dispositivos",
"CategoryTextGeneral_Visit": "compromiso",
"ChooseGoal": "Elegir objetivo",
"ClickOutlink": "Clic en un enlace a un sitio de internet externo",
@@ -36,6 +37,7 @@
"ConversionByTypeReportDocumentation": "Este reporte proporciona información detallada sobre el rendimiento del objetivo (conversiones, ratio de conversión y ingresos por visita) para cada de las categorías disponibles en el panel de la izquierda. %1$s Por favor, haga clic en una de las categorías para ver el informe. %2$s Para más información, lea la %3$sdocumentación sobre Seguimiento de Objetivos en piwik.org%4$s",
"ConversionRate": "%s tasa de conversión",
"Conversions": "%s conversiones",
+ "ConversionsDescription": "conversiones",
"ConversionsOverview": "Vista general de conversiones",
"ConversionsOverviewBy": "Visión general de las conversiones por tipo de visita",
"DaysToConv": "Días hasta la conversión",
@@ -70,7 +72,6 @@
"IsExactly": "es exactamente %s",
"LearnMoreAboutGoalTrackingDocumentation": "Aprender más acerca de %1$sRastrear metas en Piwik%2$s en la documentación de usuario.",
"LeftInCart": "%s dejado en el carrito",
- "ManageGoalsOrCreateANewGoal": "%1$sAdministrar metas%2$s o crear un nuevo objetivo ahora!",
"Manually": "manualmente",
"ManuallyTriggeredUsingJavascriptFunction": "Los objetivos son manualmente activados usando la API Javascript trackGoal()",
"MatchesExpression": "coincide con la expresión %s",
@@ -80,8 +81,8 @@
"NoConversionsNoReportsMessage": "Los informes no se muestran porque no hay datos de conversión para el objetivo y período seleccionado.",
"NeedAccess": "Solo un Administrador o un usuario con permisos de Super Usuario puede gestionar Objetivos para un determinado sitio web.",
"Optional": "(opcional)",
- "OverallConversionRate": "%s tasa global de la conversión (visitas con un objetivo completado)",
- "OverallRevenue": "%s ingresos totales",
+ "OverallConversionRate": "tasa de conversión global (visitas con un objetivo cumplido)",
+ "OverallRevenue": "ingresos totales",
"PageTitle": "Título de la página",
"Pattern": "Patrón",
"PluginDescription": "Crear metas y vea informes detallados acerca de conversión de metas: evolución sobre el tiempo, ingreso por visita, conversiones por menciones, por palabra clave y más.",
@@ -102,7 +103,7 @@
"VisitUrl": "Visita a una URL dada (página o grupo de páginas)",
"WhenVisitors": "cuando los visitantes",
"WhereThe": "donde el",
- "WhereVisitedPageManuallyCallsJavascriptTrackerLearnMore": "donde las paginas visitadas contienen una llamada al método JavaScript 'trackGoal' (%1$ssaber mas%2$s)",
+ "WhereVisitedPageManuallyCallsJavascriptTrackerLearnMore": "La página visitada necesita contener una solicitud vía el 'trackGoal' de Javascript (%1$ssaber más%2$s)",
"YouCanEnableEcommerceReports": "Puede habilitar %1$s para este sitio de internet en la página %2$s."
}
} \ No newline at end of file
diff --git a/plugins/Goals/lang/et.json b/plugins/Goals/lang/et.json
index ce5bb66789..b24eff554c 100644
--- a/plugins/Goals/lang/et.json
+++ b/plugins/Goals/lang/et.json
@@ -44,8 +44,6 @@
"Manually": "manuaalselt",
"MatchesExpression": "vastab reeglile %s",
"Optional": "(valikuline)",
- "OverallConversionRate": "%s üldine tulu tekitamise määr (täidetud eesmärgiga külastused)",
- "OverallRevenue": "%s üldine tulu",
"PageTitle": "Lehe pealkiri",
"Pattern": "Muster",
"ProductCategory": "Toote kategooria",
diff --git a/plugins/Goals/lang/fa.json b/plugins/Goals/lang/fa.json
index 8366f700df..046e3e28f6 100644
--- a/plugins/Goals/lang/fa.json
+++ b/plugins/Goals/lang/fa.json
@@ -57,8 +57,6 @@
"MatchesExpression": "با عبارت %s تطابق دارد",
"NewVisitorsConversionRateIs": "نرخ تبدیلات بازدیدکنندگان جدید %s است",
"Optional": "(اختیاری)",
- "OverallConversionRate": "%s نرخ تبدیل کلی (بازدید به هدف رسیده)",
- "OverallRevenue": "تمام درآمد %s",
"PageTitle": "عنوان صفحه",
"Pattern": "الگو",
"ProductCategory": "دسته محصول",
diff --git a/plugins/Goals/lang/fi.json b/plugins/Goals/lang/fi.json
index 09d853141f..c112451090 100644
--- a/plugins/Goals/lang/fi.json
+++ b/plugins/Goals/lang/fi.json
@@ -68,8 +68,6 @@
"NewGoalIntro": "Konversion seuranta on yksi tehokkaimmista tavoista mitata ja kehittää yrityksesi päämääriä.",
"NewVisitorsConversionRateIs": "Uusien kävijöiden siirtymäaste on %s",
"Optional": "(vapaavalintainen)",
- "OverallConversionRate": "%s yleinen siirtymisaste (käynti jossa täytetään tavoite)",
- "OverallRevenue": "%s yleistuotto",
"PageTitle": "Sivun otsikko",
"Pattern": "Malli",
"ProductCategory": "Tuotteen kategoria",
@@ -86,7 +84,6 @@
"VisitUrl": "Vierailee annetussa osoitteessa (sivu tai ryhmä sivuja)",
"WhenVisitors": "kun kävijöitä",
"WhereThe": "jossa",
- "WhereVisitedPageManuallyCallsJavascriptTrackerLearnMore": "jossa sivu sisältää JavaScript-kutsun metodille 'trackGoal' (%1$slue lisää%2$s)",
"YouCanEnableEcommerceReports": "Voit ottaa käyttöön %1$s tälle sivustolle sivulla %2$s."
}
} \ No newline at end of file
diff --git a/plugins/Goals/lang/fr.json b/plugins/Goals/lang/fr.json
index 32ae0f8271..e1bc0145bc 100644
--- a/plugins/Goals/lang/fr.json
+++ b/plugins/Goals/lang/fr.json
@@ -14,6 +14,7 @@
"CategoryTextGeneral_Visitors": "Emplacement de l'utilisateur",
"CategoryTextReferrers_Referrers": "Référents",
"CategoryTextVisitsSummary_VisitsSummary": "Attribut de l'utilisateur",
+ "CategoryTextDevicesDetection_DevicesDetection": "Périphériques",
"CategoryTextGeneral_Visit": "engagement",
"ChooseGoal": "Choisir un objectif",
"ClickOutlink": "Cliquent sur un lien vers un site externe",
@@ -36,6 +37,7 @@
"ConversionByTypeReportDocumentation": "Ce rapport apporte des informations détaillés les à propos de la performance de l'objectif (conversions, taux de conversion et recettes par visite) pour chacune des catégories disponibles sur le panneau de gauche. %1$s Veuillez cliquer sur une des catégories pour afficher le rapport. %2$s Pour plus d'informations sur les objectifs, lisez la %3$s documentation sur le suivi des objectifs sur Piwik.org%4$s",
"ConversionRate": "%s taux de conversion",
"Conversions": "%s conversions",
+ "ConversionsDescription": "conversions",
"ConversionsOverview": "Vue globale des conversions",
"ConversionsOverviewBy": "Vue d'ensemble des conversions par type de visite",
"DaysToConv": "Jours par conversion",
@@ -70,7 +72,6 @@
"IsExactly": "est exactement %s",
"LearnMoreAboutGoalTrackingDocumentation": "Apprenez en plus sur %1$s le Suivi des Objectifs dans Piwik%2$s dans la documentation utilisateur.",
"LeftInCart": "%s laissé(s) dans le panier",
- "ManageGoalsOrCreateANewGoal": "%1$sGérer les objectifs%2$s ou créer un nouvel objectif maintenant!",
"Manually": "manuellement",
"ManuallyTriggeredUsingJavascriptFunction": "Les objectifs sont déclenchés manuellement en utilisant l'API Javascript trackGoal()",
"MatchesExpression": "correspond à l'expression %s",
@@ -80,8 +81,8 @@
"NoConversionsNoReportsMessage": "Aucun rapport n'est affiché car il n'y a pas de données de conversion pour l'objectif et la période sélectionnée.",
"NeedAccess": "Uniquement un administrateur ou un utilisateur avec le rôle super utilisateur peut gérer les objectifs pour un site web.",
"Optional": "(optionnel)",
- "OverallConversionRate": "%s taux de conversion global (visites avec un objectif rempli)",
- "OverallRevenue": "%s revenu global",
+ "OverallConversionRate": "taux de conversion global (visites avec un objectif rempli)",
+ "OverallRevenue": "revenu global",
"PageTitle": "Titre de la page",
"Pattern": "Modèle",
"PluginDescription": "Créez des Objectifs et obtenez des rapports détaillés à propos de leur conversion : évolution au cours du temps, revenus par visite, conversion par référant, par mot clef et plus.",
@@ -102,7 +103,7 @@
"VisitUrl": "Visitent une URL donnée (page ou groupe de pages)",
"WhenVisitors": "quand les visiteurs",
"WhereThe": "où le",
- "WhereVisitedPageManuallyCallsJavascriptTrackerLearnMore": "où la page visitée contient un appel à la méthode JavaScript 'trackGoal' (%1$sapprenez-en plus%2$s)",
+ "WhereVisitedPageManuallyCallsJavascriptTrackerLearnMore": "La page visité doit contenir un appel à la méthode JavaScript 'trackGoal' (%1$sapprenez-en plus%2$s)",
"YouCanEnableEcommerceReports": "Vous pouvez activer %1$s pour ce site web sur la page %2$s."
}
} \ No newline at end of file
diff --git a/plugins/Goals/lang/hi.json b/plugins/Goals/lang/hi.json
index f2b3f4362d..c096b8d6b8 100644
--- a/plugins/Goals/lang/hi.json
+++ b/plugins/Goals/lang/hi.json
@@ -72,8 +72,6 @@
"NewGoalIntro": "लक्ष्य रूपांतरण ट्रैकिंग अपने व्यापार के लक्ष्यों को मापने के लिए और बेहतर बनाने के लिए सबसे कारगर तरीकों में से एक है.",
"NewVisitorsConversionRateIs": "नई आगंतुक रूपांतरण दर %s है",
"Optional": "(वैकल्पिक)",
- "OverallConversionRate": "%s कुल रूपांतरण दर (एक पूरा लक्ष्य के साथ दौरा)",
- "OverallRevenue": "%s कुल राजस्व",
"PageTitle": "पृष्ठ शीर्षक",
"Pattern": "प्रतिमान",
"ProductCategory": "उत्पाद श्रेणी",
@@ -93,7 +91,6 @@
"VisitUrl": "किसी दिए गए यूआरएल (पृष्ठों के पृष्ठ या समूह) पर जाएँ",
"WhenVisitors": "जब आगंतुकों",
"WhereThe": "जहां",
- "WhereVisitedPageManuallyCallsJavascriptTrackerLearnMore": "दौरा पेज जावास्क्रिप्ट 'trackGoal' के लिए एक कॉल शामिल है जहां विधि (%1$s अधिक जानें%2$s)",
"YouCanEnableEcommerceReports": "आपको %1$s पेज में इस वेबसाइट को सक्षम %2$s कर सकते हैं."
}
} \ No newline at end of file
diff --git a/plugins/Goals/lang/hu.json b/plugins/Goals/lang/hu.json
index 7b6805d51d..bca978fdf9 100644
--- a/plugins/Goals/lang/hu.json
+++ b/plugins/Goals/lang/hu.json
@@ -33,8 +33,6 @@
"MatchesExpression": "egyezik ezzel a kifejezéssel: %s",
"NewVisitorsConversionRateIs": "Új látogatók konverziós aránya %s",
"Optional": "(opcionális)",
- "OverallConversionRate": "%s az összesített konverziós arány (látogatások, melyek során teljesült a cél)",
- "OverallRevenue": "%s összesített bevétel",
"Pattern": "Egyezési minta",
"ReturningVisitorsConversionRateIs": "A visszatérő látogatók konverziós aránya %s",
"UpdateGoal": "Cél frissítése",
@@ -42,7 +40,6 @@
"ViewAndEditGoals": "Célok megtekintése és szerkesztése",
"VisitUrl": "meglátogatnak egy adott URL-t (mely egy weblapot vagy weblapok csoportját jelenti)",
"WhenVisitors": "bekövetkezik, ha a látogatók",
- "WhereThe": "ahol a (z)",
- "WhereVisitedPageManuallyCallsJavascriptTrackerLearnMore": "ahol a meglátogatott oldal tartalmaz egy JavaScript hívást a 'trackGoal' funkció aktiválására (%1$stovábbi információ%2$s)"
+ "WhereThe": "ahol a (z)"
}
} \ No newline at end of file
diff --git a/plugins/Goals/lang/id.json b/plugins/Goals/lang/id.json
index 24d4fef44c..b9c1346b08 100644
--- a/plugins/Goals/lang/id.json
+++ b/plugins/Goals/lang/id.json
@@ -66,8 +66,6 @@
"NewGoalIntro": "Pelacakan Konversi Tujuan merupakan salah satu cara efisien untuk mengukur dan memperbaiki tujuan usaha Anda.",
"NewVisitorsConversionRateIs": "Tingkat pengunjung baru adalah %s",
"Optional": "(pilihan)",
- "OverallConversionRate": "%s keseluruhan tingkat konversi (kunjungan dengan tujuan lengkap)",
- "OverallRevenue": "%s pendapatan keseluruhan",
"PageTitle": "Judul Halaman",
"Pattern": "Pola",
"ProductCategory": "Kategori Produk",
@@ -84,7 +82,6 @@
"VisitUrl": "Kunjungi URL yang diberikan (halaman atau kelompok halaman)",
"WhenVisitors": "ketika pengunjung",
"WhereThe": "di mana",
- "WhereVisitedPageManuallyCallsJavascriptTrackerLearnMore": "di mana halaman yang dikunjungi mengandung panggilan ke metode JavaScript 'trackGoal' (%1$spelajari selengkapnya%2$s)",
"YouCanEnableEcommerceReports": "Anda dapat mengaktifkan %1$s untuk situs ini dalam halaman %2$s."
}
} \ No newline at end of file
diff --git a/plugins/Goals/lang/is.json b/plugins/Goals/lang/is.json
index e14b3828fc..b88486b3b4 100644
--- a/plugins/Goals/lang/is.json
+++ b/plugins/Goals/lang/is.json
@@ -25,8 +25,6 @@
"ManuallyTriggeredUsingJavascriptFunction": "Markmið er kveikt handvirkt með því að nota JavaScript API trackGoal()",
"MatchesExpression": "upfyllir skilyrðið %s",
"Optional": "(valkvætt)",
- "OverallConversionRate": "%s heildar umbreytingatíðni (heimsóknir sem hafa náð markmiði)",
- "OverallRevenue": "%s heildarhagnaður",
"Pattern": "Mynstur",
"UpdateGoal": "Uppfæra Markmið",
"URL": "URL",
diff --git a/plugins/Goals/lang/it.json b/plugins/Goals/lang/it.json
index 8f9c136be6..def1f9ea93 100644
--- a/plugins/Goals/lang/it.json
+++ b/plugins/Goals/lang/it.json
@@ -14,6 +14,7 @@
"CategoryTextGeneral_Visitors": "Località utente",
"CategoryTextReferrers_Referrers": "Referenti",
"CategoryTextVisitsSummary_VisitsSummary": "Attributo utente",
+ "CategoryTextDevicesDetection_DevicesDetection": "Dispositivi",
"CategoryTextGeneral_Visit": "impegno",
"ChooseGoal": "Scegli Goal",
"ClickOutlink": "Click su un Link a un sito esterno",
@@ -36,6 +37,7 @@
"ConversionByTypeReportDocumentation": "Questo report fornisce informazioni dettagliate sull'andamento degli obiettivi (conversioni, tassi di conversione ed entrate per visita), per ciascuna delle categorie disponibili nel pannello di sinistra. %1$s Si prega di cliccare su una delle categorie per visualizzare il report. %2$s Per ulteriori informazioni, leggere la %3$sDocumentazione sul Tracking dei Goal%4$s",
"ConversionRate": "%s rapporto di conversione",
"Conversions": "%s conversioni",
+ "ConversionsDescription": "conversioni",
"ConversionsOverview": "Panoramica Conversioni",
"ConversionsOverviewBy": "Panoramica conversioni per tipo di visita",
"DaysToConv": "Giorni alla Conversione",
@@ -70,7 +72,6 @@
"IsExactly": "è esattamente %s",
"LearnMoreAboutGoalTrackingDocumentation": "Impara di più sul %1$sTracciamento dei Goal in Piwik%2$s nella documentazione per l'utente.",
"LeftInCart": "%s lasciato nel carrello",
- "ManageGoalsOrCreateANewGoal": "%1$sAmministra i Goal%2$s o creane ora uno nuovo!",
"Manually": "manualmente",
"ManuallyTriggeredUsingJavascriptFunction": "Il Goal si attiva manualmente usando l'API Javascript trackGoal()",
"MatchesExpression": "soddisfa l'espressione %s",
@@ -80,8 +81,8 @@
"NoConversionsNoReportsMessage": "I report non vengono visualizzati perché non ci sono dati di conversione per il goal e il periodo selezionati.",
"NeedAccess": "Solo un Amministratore o un utente con privilegi di Super User può gestire gli Obiettivi di un dato sito.",
"Optional": "(opzionale)",
- "OverallConversionRate": "%s rapporto di conversione complessivo (visite con un obiettivo completato)",
- "OverallRevenue": "%s ricavo complessivo",
+ "OverallConversionRate": "rapporto complessivo conversioni (visite con un obiettivo raggiunto)",
+ "OverallRevenue": "ricavo complessivo",
"PageTitle": "Titolo pagina",
"Pattern": "Pattern",
"PluginDescription": "Crea dei Goal e vedi i report dettagliati sulle tue conversioni dei goal: evoluzione nel tempo, guadagno per visita, conversioni per referrer, per keyword, e altro ancora.",
@@ -102,7 +103,7 @@
"VisitUrl": "Visitano uno specifico URL (pagina o gruppo di pagine)",
"WhenVisitors": "quando i visitatori",
"WhereThe": "dove le",
- "WhereVisitedPageManuallyCallsJavascriptTrackerLearnMore": "dove la pagina visitata contiene una chiamata al metodo JavaScript 'trackGoal' (%1$smaggiori dettagli%2$s)",
+ "WhereVisitedPageManuallyCallsJavascriptTrackerLearnMore": "La pagina visitata deve contenere una chiamata al metodo JavaScript 'trackGoal' (%1$sleggi di più%2$s)",
"YouCanEnableEcommerceReports": "Puoi abilitare %1$s per questo sito nella pagina %2$s."
}
} \ No newline at end of file
diff --git a/plugins/Goals/lang/ja.json b/plugins/Goals/lang/ja.json
index 798ff53050..4da8548247 100644
--- a/plugins/Goals/lang/ja.json
+++ b/plugins/Goals/lang/ja.json
@@ -70,7 +70,6 @@
"IsExactly": "%s と完全に一致する",
"LearnMoreAboutGoalTrackingDocumentation": "Piwik の目標のトラッキングについての詳細は、%1$s ユーザーマニュアル %2$sを参照してください。",
"LeftInCart": "カートに残された %s",
- "ManageGoalsOrCreateANewGoal": "%1$s 目標管理 %2$s や新たな目標を今すぐ作成!",
"Manually": "手動",
"ManuallyTriggeredUsingJavascriptFunction": "JavaScript API の trackGoal() を使用した手動トリガー",
"MatchesExpression": "正規表現 %s に一致する",
@@ -79,8 +78,6 @@
"NoGoalsNeedAccess": "管理者またはスーパー ユーザーのアクセス権を持つユーザーだけが、ウェブサイトの目標を管理できます。ウェブサイトの目標を設定する場合は Piwik の管理者に依頼してください。<br> 目標を追跡することは、ウェブサイトの理解に役立ち、パフォーマンスを最大限に高めるための素晴らしい方法です!",
"NeedAccess": "管理者またはスーパー ユーザーのアクセス権を持つユーザーだけが、ウェブサイトの目標を管理できます。",
"Optional": "(オプション)",
- "OverallConversionRate": "%s 総コンバージョン率(目標達成ビジット)",
- "OverallRevenue": "%s 総収益",
"PageTitle": "ページタイトル",
"Pattern": "パターン",
"PluginDescription": "目標を作成し、目標のコンバージョンに関する詳細なレポートを参照してください : 時間がたつにつれての推移、1訪問あたりの収入、1キーワードあたり、リファラーあたりのコンバージョン、およびその他。",
@@ -101,7 +98,6 @@
"VisitUrl": "特定の URL を訪問(ページまたはページグループ)",
"WhenVisitors": "ビジター",
"WhereThe": "対象:",
- "WhereVisitedPageManuallyCallsJavascriptTrackerLearnMore": "訪問したページに JavaScript の 'trackGoal' メソッドのコールが含まれるところ(%1$s詳細%2$s)",
"YouCanEnableEcommerceReports": "%1$s ページでこのウェブサイトに%2$s を有効にできます。"
}
} \ No newline at end of file
diff --git a/plugins/Goals/lang/ka.json b/plugins/Goals/lang/ka.json
index e7d6f0e4c9..e586ae9c47 100644
--- a/plugins/Goals/lang/ka.json
+++ b/plugins/Goals/lang/ka.json
@@ -33,8 +33,6 @@
"MatchesExpression": "ემთხვევა გამონათქვამს %s",
"NewVisitorsConversionRateIs": "ახალი ვიზიტორების კინვერციის მაჩვენებელი არის %s",
"Optional": "(ოფციონალური)",
- "OverallConversionRate": "%s საერთო კონვერსიის მაჩვენებელი (ვიზიტები შესრულებული მიზნებით)",
- "OverallRevenue": "%s საერთო შემოსავალი",
"Pattern": "ნიმუში",
"ReturningVisitorsConversionRateIs": "დაბრუნებული ვიზიტორების კონვერსიის მაჩვენებელი არის %s",
"UpdateGoal": "მიზნის რედაქტირება",
@@ -42,7 +40,6 @@
"ViewAndEditGoals": "მიზნების დათვალიერება და რედაქტირება",
"VisitUrl": "ეწვევა მოცემულ URL–ს (გვერდი ან გვერდების ჯგუფი)",
"WhenVisitors": "როდესაც ვიზიტორი",
- "WhereThe": "სადაც",
- "WhereVisitedPageManuallyCallsJavascriptTrackerLearnMore": "როდესაც მონახულებული გვედი შეიცავს JavaScript 'trackGoal' მეთოდის (%1$sდამატებითი ინფორმაცია%2$s) გამოძახებას"
+ "WhereThe": "სადაც"
}
} \ No newline at end of file
diff --git a/plugins/Goals/lang/ko.json b/plugins/Goals/lang/ko.json
index a4e356a5bf..b4bfa79114 100644
--- a/plugins/Goals/lang/ko.json
+++ b/plugins/Goals/lang/ko.json
@@ -70,7 +70,6 @@
"IsExactly": "%s와 일치",
"LearnMoreAboutGoalTrackingDocumentation": "사용자 문서 내 %1$sPiwik 목표 추적%2$s 문서를 통해서 좀 더 알 수 있습니다.",
"LeftInCart": "카트에 남겨진 %s",
- "ManageGoalsOrCreateANewGoal": "%1$s목표 관리%2$s 혹은 새로운 목표를 만드세요!",
"Manually": "수동으로",
"ManuallyTriggeredUsingJavascriptFunction": "JavaScript API의 trackGoal()을 사용하여 수동 트리거",
"MatchesExpression": "정규식 %s에 일치",
@@ -79,8 +78,6 @@
"NoGoalsNeedAccess": "주어진 웹사이트는 오직 관리자나 슈퍼 유저 권한을 가진 사용자만이 목표를 관리할 수 있습니다. Piwik의 관리자에게 당신의 웹사이트 목표 설정을 요청하세요. <br>목표 추적은 웹사이트 성능을 이해하고 향상시키는데 큰 도움이 됩니다.",
"NeedAccess": "주어진 웹사이트는 오직 관리자나 슈퍼 유저 권한을 가진 사용자만이 목표를 관리할 수 있습니다.",
"Optional": "(선택항목)",
- "OverallConversionRate": "%s 총 전환율 (목표 달성 방문)",
- "OverallRevenue": "%s 총 수익",
"PageTitle": "페이지 제목",
"Pattern": "패턴",
"PluginDescription": "목표를 만들고 목표 전환들 - 시간에 따른 변화, 방문 당 수익, 리퍼러와 키워드 당 전환들 - 에 대한 상세 보고서 보기",
@@ -101,7 +98,6 @@
"VisitUrl": "특정 URL 방문 (페이지 또는 페이지 그룹)",
"WhenVisitors": "방문 시기",
"WhereThe": "방문 대상",
- "WhereVisitedPageManuallyCallsJavascriptTrackerLearnMore": "방문한 페이지 JavaScript의 'trackGoal' 메서드 호출이 포함된 곳 (%1$s자세히%2$s)",
"YouCanEnableEcommerceReports": "%1$s 페이지에서 이 웹사이트에 %2$s를 사용할 수 있습니다."
}
} \ No newline at end of file
diff --git a/plugins/Goals/lang/lt.json b/plugins/Goals/lang/lt.json
index c32adb2a5b..9801ee917e 100644
--- a/plugins/Goals/lang/lt.json
+++ b/plugins/Goals/lang/lt.json
@@ -32,8 +32,6 @@
"MatchesExpression": "atitinka išraišką %s",
"NewVisitorsConversionRateIs": "Naujų lankytojų konversijos koeficientas yra %s",
"Optional": "(papildoma)",
- "OverallConversionRate": "%s bendras konversijos koeficientas (apsilankymai su uždavinio užbaigimu)",
- "OverallRevenue": "%s bendros pajamos",
"Pattern": "Derinys",
"ReturningVisitorsConversionRateIs": "Sugrįžtančių lankytojų konversijos koeficientas yra %s",
"UpdateGoal": "Atnaujinti uždavinį",
diff --git a/plugins/Goals/lang/nb.json b/plugins/Goals/lang/nb.json
index 62627850be..31d852d8b8 100644
--- a/plugins/Goals/lang/nb.json
+++ b/plugins/Goals/lang/nb.json
@@ -11,10 +11,25 @@
"BestReferrers": "Dine best konverterende nettstedshenvisere er:",
"CaseSensitive": "Skiller mellom store og små bokstaver",
"CancelAndReturnToGoals": "Avbryt og %1$sreturner til listen over mål%2$s",
+ "CategoryTextGeneral_Visitors": "Besøkers lokasjon",
"CategoryTextReferrers_Referrers": "Henvisere",
+ "CategoryTextVisitsSummary_VisitsSummary": "Brukerattributt",
+ "CategoryTextDevicesDetection_DevicesDetection": "Enheter",
+ "CategoryTextGeneral_Visit": "engasjement",
"ChooseGoal": "Velg mål",
+ "ClickOutlink": "Klikk på en lenke til et eksternt nettsted",
+ "SendEvent": "Send en hendelse",
+ "ColumnAverageOrderRevenueDocumentation": "Gjennomsnittlig bestillingsverdi (AOV) er den totale omsetningen fra alle Ecommerce-bestillinger delt på antallet bestillinger.",
+ "ColumnAveragePriceDocumentation": "Gjennomsnittlig omsetning for denne %s.",
+ "ColumnAverageQuantityDocumentation": "Gjennomsnittlig volum for denne %s solgt i Ecommerce-bestillinger.",
+ "ColumnConversionRateDocumentation": "Andelen besøk som utløste målet %s.",
+ "ColumnConversionRateProductDocumentation": "Konverteringsraten for %s er antallet bestillinger som inneholder dette produktet delt på antallet besøk på produktsiden.",
"ColumnConversions": "Konvertering",
"ColumnConversionsDocumentation": "Antall konverteringer for %s.",
+ "ColumnOrdersDocumentation": "Antallet Ecommerce-bestillinger som inneholder denne %s minst én gang.",
+ "ColumnPurchasedProductsDocumentation": "Antallet kjøpte produkter er summen av produktvolumene som er solgt alle Ecommerce-bestillinger.",
+ "ColumnQuantityDocumentation": "Mengden er det totale antallet produkter som er solgt for hver %s.",
+ "ColumnRevenueDocumentation": "De totale inntektene som er generert av %s.",
"Contains": "inneholder %s",
"ConversionRate": "%s konverteringsrate",
"Conversions": "%s konverteringer",
diff --git a/plugins/Goals/lang/nl.json b/plugins/Goals/lang/nl.json
index 36b11c96f9..cb20fa7f4e 100644
--- a/plugins/Goals/lang/nl.json
+++ b/plugins/Goals/lang/nl.json
@@ -70,7 +70,6 @@
"IsExactly": "is exact %s",
"LearnMoreAboutGoalTrackingDocumentation": "Leer meer over het %1$s bijhouden van Doelen in Piwik%2$s in de gebruikers documentatie.",
"LeftInCart": "%s achtergelaten in winkelwagen",
- "ManageGoalsOrCreateANewGoal": "%1$sBeheer Doelen%2$s of maak nu een nieuw Doel!",
"Manually": "handmatig",
"ManuallyTriggeredUsingJavascriptFunction": "Doelstelling is handmatig geactiveerd door de Javascript API trackGoal()",
"MatchesExpression": "Voldoet aan de expressie %s",
@@ -80,8 +79,6 @@
"NoConversionsNoReportsMessage": "Rapporten worden niet getoond omdat er geen conversie gegevens zijn voor het geselecteerde doel en periode.",
"NeedAccess": "Alleen een Beheerder of een gebruiker met Super User rechten kan Doelen beheren voor een bepaalde website.",
"Optional": "(optioneel)",
- "OverallConversionRate": "%s Het algehele conversiepercentageDe algehele totaal inkomsten rate (bezoeken met een voltooide doelstelling)",
- "OverallRevenue": "%s totale inkomsten",
"PageTitle": "Paginatitel",
"Pattern": "Patroon",
"PluginDescription": "Maak Doelen aan en zie gedetaileerde rapporten over behaalde doelen: evoluties over tijd, inkomsten per bezoek, omzet per referrer, per sleutelwoord, en meer.",
@@ -102,7 +99,6 @@
"VisitUrl": "Bezoek een gegeven url (pagina of groep pagina's)",
"WhenVisitors": "wanneer bezoekers",
"WhereThe": "waar de",
- "WhereVisitedPageManuallyCallsJavascriptTrackerLearnMore": "Wanneer een bezochte pagina een oproep bevat naar de javascript piwikTracker.trackGoal() methode (%1$smeer info%2$s)",
"YouCanEnableEcommerceReports": "U kunt de functie %1$s inschakelen voor deze website in de pagina %2$s."
}
} \ No newline at end of file
diff --git a/plugins/Goals/lang/pl.json b/plugins/Goals/lang/pl.json
index 68c8b04cbf..369720adc2 100644
--- a/plugins/Goals/lang/pl.json
+++ b/plugins/Goals/lang/pl.json
@@ -54,8 +54,6 @@
"MatchesExpression": "odpowiada wyrażeniu %s",
"NewVisitorsConversionRateIs": "Współczynnik przejść dla nowych odwiedzających to %s",
"Optional": "(opcjonalnie)",
- "OverallConversionRate": "%s ogólny współczynnik zmian (wizyty z osiągniętym pełnym trafieniem)",
- "OverallRevenue": "%s ogólnych przychodów",
"PageTitle": "tytuł strony",
"Pattern": "Wzorzec",
"ProductCategory": "Kategoria produktu",
@@ -69,7 +67,6 @@
"VisitPageTitle": "odwiedź dany tytuł strony",
"VisitUrl": "odwiedź dany adres URL (stronę lub grupę stron)",
"WhenVisitors": "przez odwiedzającego",
- "WhereThe": "gdzie",
- "WhereVisitedPageManuallyCallsJavascriptTrackerLearnMore": "gdzie odwiedzona strona zawiera wywołania do metody JavaScript 'trackGoal' (%1$szobacz więcej%2$s)"
+ "WhereThe": "gdzie"
}
} \ No newline at end of file
diff --git a/plugins/Goals/lang/pt-br.json b/plugins/Goals/lang/pt-br.json
index 8155ea125f..5a3125584f 100644
--- a/plugins/Goals/lang/pt-br.json
+++ b/plugins/Goals/lang/pt-br.json
@@ -14,6 +14,7 @@
"CategoryTextGeneral_Visitors": "Localização do usuário",
"CategoryTextReferrers_Referrers": "Referenciadores",
"CategoryTextVisitsSummary_VisitsSummary": "Característica do usuário",
+ "CategoryTextDevicesDetection_DevicesDetection": "Dispositivos",
"CategoryTextGeneral_Visit": "envolvimento",
"ChooseGoal": "Escolha Objetivo",
"ClickOutlink": "Clique num link para um website externo",
@@ -36,6 +37,7 @@
"ConversionByTypeReportDocumentation": "Esse relatório fornece informações detalhadas sobre o desempenho objetivo (conversões, taxas de conversão e receita por visita) para cada uma das categorias disponíveis no painel esquerdo. %1$s Por favor, clique em uma das categorias para ver o relatório. %2$s para mais informações, leia a documentação %3$sTracking Metas em piwik.org%4$s",
"ConversionRate": "%s taxa de conversão",
"Conversions": "%s conversões",
+ "ConversionsDescription": "conversões",
"ConversionsOverview": "Visão geral de conversões",
"ConversionsOverviewBy": "Visão geral de conversões por tipo de visita",
"DaysToConv": "Dias para Conversão",
@@ -70,7 +72,6 @@
"IsExactly": "é exatamente %s",
"LearnMoreAboutGoalTrackingDocumentation": "Aprenda mais sobre Rastreamento de Metas %1$s em Piwik%2$s na documentação do usuário.",
"LeftInCart": "%s carrinhos abandonados",
- "ManageGoalsOrCreateANewGoal": "%1$sGerencie Metas%2$s ou crie uma nova Meta agora!",
"Manually": "manualmente",
"ManuallyTriggeredUsingJavascriptFunction": "A meta é manualmente triggered usando a API do Javascript trackGoal()",
"MatchesExpression": "corresponde com a expressão %s",
@@ -80,8 +81,6 @@
"NoConversionsNoReportsMessage": "Os relatórios não são exibidos porque não há dados de conversão para a meta e o período selecionados.",
"NeedAccess": "Apenas um Administrador ou um usuário com acesso Super Usuário pode gerenciar Metas para um determinado website.",
"Optional": "(opcional)",
- "OverallConversionRate": "%s taxa total de conversão(visitas com uma meta completa)",
- "OverallRevenue": "%s lucro total",
"PageTitle": "Título da página",
"Pattern": "modelo",
"PluginDescription": "Crie Metas e veja relatórios detalhados sobre suas conversões de meta: evolução ao longo do tempo, receita por visita, conversões por referenciador, por palavra-chave e muito mais.",
@@ -102,7 +101,6 @@
"VisitUrl": "Visitar a URL dada(página ou grupo de páginas)",
"WhenVisitors": "quando visitantes",
"WhereThe": "onde o(a)",
- "WhereVisitedPageManuallyCallsJavascriptTrackerLearnMore": "onde a página visitada contem um chamado para o JavaScript 'trackGoal' metodo (%1$slearn more%2$s)",
"YouCanEnableEcommerceReports": "Você pode habilitar %1$s para este site na página %2$s."
}
} \ No newline at end of file
diff --git a/plugins/Goals/lang/pt.json b/plugins/Goals/lang/pt.json
index 4246f9bc6d..e723e5308e 100644
--- a/plugins/Goals/lang/pt.json
+++ b/plugins/Goals/lang/pt.json
@@ -65,8 +65,6 @@
"MatchesExpression": "corresponde à expressão %s",
"NewVisitorsConversionRateIs": "Taxa de conversão para novos visitantes é %s",
"Optional": "(opcional)",
- "OverallConversionRate": "%s taxa de conversão geral (visitas com um objectivo completo)",
- "OverallRevenue": "%s rendimento geral",
"PageTitle": "Título da Página",
"Pattern": "Padrão",
"ProductCategory": "Categorias de Produtos",
@@ -83,7 +81,6 @@
"VisitUrl": "Visitar um dado endereço (página ou grupo de páginas)",
"WhenVisitors": "quando visitantes",
"WhereThe": "onde o",
- "WhereVisitedPageManuallyCallsJavascriptTrackerLearnMore": "onde a página visitada contém uma chamada ao método JavaScript 'trackGoal' (%1$saprenda mais%2$s)",
"YouCanEnableEcommerceReports": "Você pode ativar %1$s para este site na página %2$s."
}
} \ No newline at end of file
diff --git a/plugins/Goals/lang/ro.json b/plugins/Goals/lang/ro.json
index ed66db5624..618fb7d5d4 100644
--- a/plugins/Goals/lang/ro.json
+++ b/plugins/Goals/lang/ro.json
@@ -66,8 +66,6 @@
"NewGoalIntro": "Urmărirebiectiv conversie este una dintre cele mai eficiente modalități de a măsura și îmbunătăți obiectivele de afaceri.",
"NewVisitorsConversionRateIs": "Rata de conversie pentru vizitatorii noi este %s",
"Optional": "(opţional)",
- "OverallConversionRate": "%s Rata de conversie globală (vizite cu un gol)",
- "OverallRevenue": "%s venit global",
"PageTitle": "Titlul paginii",
"Pattern": "Model",
"ProductCategory": "Categorie de produse",
@@ -84,7 +82,6 @@
"VisitUrl": "Viziteaza un URL dat (o pagina sau un grup de pagini)",
"WhenVisitors": "când vizitatorii",
"WhereThe": "unde",
- "WhereVisitedPageManuallyCallsJavascriptTrackerLearnMore": "acolo unde pagina vizitată conține un call către metoda JavaScript 'trackGoal' (%1$svezi mai multe%2$s)",
"YouCanEnableEcommerceReports": "Poţi activa %1$s pentru acest site pe pagina %2$s."
}
} \ No newline at end of file
diff --git a/plugins/Goals/lang/ru.json b/plugins/Goals/lang/ru.json
index 7a3575049a..a0d224db4d 100644
--- a/plugins/Goals/lang/ru.json
+++ b/plugins/Goals/lang/ru.json
@@ -70,7 +70,6 @@
"IsExactly": "точно %s",
"LearnMoreAboutGoalTrackingDocumentation": "Узнать больше об %1$sотслеживании целей в Piwik%2$s в руководстве пользователя.",
"LeftInCart": "%s брошено в корзине",
- "ManageGoalsOrCreateANewGoal": "%1$sУправляйте целями%2$s или создайте новую прямо сейчас!",
"Manually": "ручная настройка",
"ManuallyTriggeredUsingJavascriptFunction": "Цель вручную стала условной через Javascript API trackGoal()",
"MatchesExpression": "совпадает с выражением %s",
@@ -80,8 +79,6 @@
"NoConversionsNoReportsMessage": "Отчеты не показаны, потому что данные преобразования для выбранных цели и периода отсутсвуют.",
"NeedAccess": "Только Администратор или пользователь с доступом Суперпользователя может управлять целями для данного вебсайта.",
"Optional": "(необязательно)",
- "OverallConversionRate": "%s общий коэффициент конверсий (переходы с выполненной целью)",
- "OverallRevenue": "%s общая прибыль",
"PageTitle": "Заголовок страницы",
"Pattern": "Шаблон",
"PluginDescription": "Создайте Цели и смотрите детальные отчёты о целевых конверсиях: изменение по времени, доход от визита, конверсии со ссылки, с ключевого слова и др.",
@@ -102,7 +99,6 @@
"VisitUrl": "Посещают данный URL (страницу или группу страниц)",
"WhenVisitors": "посетители",
"WhereThe": "где",
- "WhereVisitedPageManuallyCallsJavascriptTrackerLearnMore": "где цель засчитывается с помощью установки вызова метода JavaScript 'trackGoal' (%1$sузнать больше%2$s)",
"YouCanEnableEcommerceReports": "Вы можете активировать %1$s для этого сайта на странице %2$s."
}
} \ No newline at end of file
diff --git a/plugins/Goals/lang/sk.json b/plugins/Goals/lang/sk.json
index 1d811b8b81..6d7c3600f9 100644
--- a/plugins/Goals/lang/sk.json
+++ b/plugins/Goals/lang/sk.json
@@ -35,8 +35,6 @@
"ManuallyTriggeredUsingJavascriptFunction": "Cieľom je ručne spúšťa pomocou JavaScript API trackGoal()",
"NewVisitorsConversionRateIs": "Noví návštevníci miera konverzie %s",
"Optional": "(nepovinné)",
- "OverallConversionRate": "%s celková miera konverzie (návštevy s cieľom dokončenia)",
- "OverallRevenue": "%s celkové príjmy",
"PageTitle": "Titulok stránky",
"Pattern": "Vzor",
"ProductCategory": "Kategória produktu",
diff --git a/plugins/Goals/lang/sq.json b/plugins/Goals/lang/sq.json
index ed466ce0de..c2e872a6ef 100644
--- a/plugins/Goals/lang/sq.json
+++ b/plugins/Goals/lang/sq.json
@@ -8,20 +8,21 @@
"AllowMultipleConversionsPerVisit": "Lejo shndërrime shumëfishe për vizitë",
"BestCountries": "Vendet me shndërrime më të mira për ju janë:",
"BestKeywords": "Fjalëkyçet kryesues për shndërrimet tuaja janë:",
- "BestReferrers": "Referuesit më të mirë të shndërrimeve nga sajte për ju janë:",
+ "BestReferrers": "Sjellësit më të mirë të shndërrimeve nga sajte për ju janë:",
"CaseSensitive": "Përputhje për siç është shkruajtur",
"CancelAndReturnToGoals": "Anulojeni dhe %1$skthehuni te lista e objektivave%2$s",
"CategoryTextGeneral_Visitors": "Vend përdoruesi",
- "CategoryTextReferrers_Referrers": "Referues",
+ "CategoryTextReferrers_Referrers": "Sjellës",
"CategoryTextVisitsSummary_VisitsSummary": "Atribut përdoruesi",
+ "CategoryTextDevicesDetection_DevicesDetection": "Pajisje",
"CategoryTextGeneral_Visit": "angazhim",
"ChooseGoal": "Zgjidhni Objektiv",
"ClickOutlink": "Klikon mbi një Lidhje për te një sajt i jashtëm",
- "SendEvent": "Dërgoni një veprimtari",
+ "SendEvent": "Dërgoni një akt",
"ColumnAverageOrderRevenueDocumentation": "Vlera Mesatare për Porosi (VMP) është shifra e marrë nga pjesëtimi i të ardhurave gjithsej nga krejt Porositë E-tregti me numrin e porosive.",
"ColumnAveragePriceDocumentation": "Të ardhurat mesatare për këtë %s.",
"ColumnAverageQuantityDocumentation": "Sasia mesatare e këtij %s shitur nga porosi E-tregtie.",
- "ColumnConversionRateDocumentation": "Përqindja e vizitave që shkaktuan veprimtari në objektivin %s.",
+ "ColumnConversionRateDocumentation": "Përqindja e vizitave që shkaktuan veprimtari për objektivin %s.",
"ColumnConversionRateProductDocumentation": "Koeficienti i shndërrimit %s është numri i porosive që përmbajnë këtë produkt pjesëtuar me numrin e vizitave bërë te faqja e produktit.",
"ColumnConversions": "Shndërrime",
"ColumnConversionsDocumentation": "Numër shndërrimesh për %s.",
@@ -31,11 +32,12 @@
"ColumnRevenueDocumentation": "Të ardhura gjithsej fituar nga %s.",
"ColumnRevenuePerVisitDocumentation": "Të ardhura gjithsej të rrjedhura nga %s pjesëtuar me numrin e vizitave.",
"ColumnVisits": "Numër vizitash gjithsej, pavarësisht nëse u shkaktua a jo veprimtari te një objektiv.",
- "ColumnVisitsProductDocumentation": "Numri i vizitave te faqja Produkt\/Kategori. Kjo përdoret gjithashtu për të përpunuar koeficientin %s e shndërrimeve. Kjo llogaritje gjendet te raporti nëse ndjekja e parjeve E-tregti është rregulluar te faqet Produkt\/Kategori.",
+ "ColumnVisitsProductDocumentation": "Numri i vizitave te faqja Produkt\/Kategori. Kjo përdoret gjithashtu për të përpunuar koeficientin %s e shndërrimeve. Kjo vlerë gjendet te raporti, nëse ndjekja e parjeve E-tregti është rregulluar te faqet Produkt\/Kategori.",
"Contains": "përmban %s",
"ConversionByTypeReportDocumentation": "Ky raport ofron të dhëna të hollësishme rreth funksionimit të objektivave (shndërrime, koeficient shndërrimesh dhe të ardhura për vizitë) për secilën prej kategorive të mundshme te paneli majtas. %1$s Ju lutemi, klikoni mbi një nga këto kategori që të shihni raportin. %2$s Për më tepër të dhëna, lexoni %3$sdokumentimin për Ndjekje Objektivash te piwik.org%4$s",
"ConversionRate": "Koeficient shndërrimi %s",
"Conversions": "Shndërrime %s",
+ "ConversionsDescription": "shndërrime",
"ConversionsOverview": "Përmbledhje Shndërrimesh",
"ConversionsOverviewBy": "Përmbledhje shndërrimesh sipas llojit të vizitave",
"DaysToConv": "Ditë për Shndërrim",
@@ -56,7 +58,7 @@
"ExternalWebsiteUrl": "URL sajti të jashtëm",
"Filename": "emër kartele",
"GoalConversion": "Shndërrim objektivi",
- "GoalConversions": "Shndërrime objektivi",
+ "GoalConversions": "Shndërrime objektivash",
"GoalConversionsBy": "Shndërrime objektivash %s sipas llojit të vizitave",
"GoalIsTriggered": "Objektivi vihet në punë",
"GoalIsTriggeredWhen": "Objektivi vihet në punë kur",
@@ -68,29 +70,28 @@
"GoalX": "Objektiv %s",
"HelpOneConversionPerVisit": "Nëse një faqe që përputhet me këtë Objektiv rifreskohet ose shihet më shumë se një herë gjatë një Vizite, Objektivi do të ndiqet vetëm herën e parë që faqja u ngarkua gjatë kësaj vizite.",
"IsExactly": "është saktësisht %s",
- "LearnMoreAboutGoalTrackingDocumentation": "Mësoni më tepër mbi %1$s Gjurmimin e Objektivave në Piwik%2$s, te dokumentimi i përdoruesit.",
+ "LearnMoreAboutGoalTrackingDocumentation": "Mësoni më tepër mbi %1$sNdjekjen e Objektivave në Piwik%2$s, te dokumentimi i përdoruesit.",
"LeftInCart": "%s ende në shportë",
- "ManageGoalsOrCreateANewGoal": "%1$sAdministroni Objektiva%2$s ose krijoni tani një Objektiv të ri!",
"Manually": "dorazi",
"ManuallyTriggeredUsingJavascriptFunction": "Objektivi vihet në punë dorazi duke përdorur JavaScript API trackGoal()",
"MatchesExpression": "përputhet me shprehjen %s",
- "NewGoalIntro": "Gjurmimi i Shndërrimeve të Objektivave është një rrugët më të efektshme për të matu dhe përmirësuar objektivat e biznesit tuaj.",
+ "NewGoalIntro": "Ndjekja e Shndërrimeve të Objektivave është një rrugët më të efektshme për të matur dhe përmirësuar objektivat e biznesit tuaj.",
"NewVisitorsConversionRateIs": "Koeficienti i shndërrimit për vizitorë të rinj është %s",
- "NoGoalsNeedAccess": "Objektivat për një sajt të dhënë mund t’i administrojë vetëm Përgjegjësi ose një përdorues me leje Superpërdoruesi. Ju lutemi, kërkojini përgjegjësit të Piwik-ut tuaj të caktojë një Objektiv për sajtin tuaj. <br>Gjurmimi i Objektivave është një rrugë e fuqishme për të ndihmuar të kuptohet dhe maksimizohet suksesshmëria e sajtit tuaj!",
+ "NoGoalsNeedAccess": "Objektivat për një sajt të dhënë mund t’i administrojë vetëm Përgjegjësi ose një përdorues me leje Superpërdoruesi. Ju lutemi, kërkojini përgjegjësit të Piwik-ut tuaj të caktojë një Objektiv për sajtin tuaj. <br>Ndjekja e Objektivave është një rrugë e fuqishme për të ndihmuar të kuptohet si ecën dhe maksimizohet funksionimi i sajtit tuaj!",
"NoConversionsNoReportsMessage": "Raportet nuk shfaqen, ngaqë nuk ka të dhëna shndërrimesh për objektivin dhe periudhën e zgjedhur.",
"NeedAccess": "Objektivat për një sajt të dhënë mund t’i administrojë vetëm Përgjegjësi ose një përdorues me leje Superpërdoruesi.",
"Optional": "(opsionale)",
- "OverallConversionRate": "Koeficient shndërrimesh %s gjithsej (vizita me objektiv të plotësuar)",
- "OverallRevenue": "E ardhur %s e përgjithshme",
+ "OverallConversionRate": "mesatare gjithsej shndërrimesh (vizita me objektiv të plotësuar)",
+ "OverallRevenue": "të ardhura gjithsej",
"PageTitle": "Titull Faqeje",
"Pattern": "Mostër",
- "PluginDescription": "Krijoni Objektiva dhe shihni raporte të hollësishëm mbi shndërrime të objektivave tuaj: evolucioni përgjatë kohës, të ardhura për vizitë, shndërrime sipas referuesish, fjalëkyçesh, etj.",
+ "PluginDescription": "Krijoni Objektiva dhe shihni raporte të hollësishëm mbi shndërrime të objektivave tuaj: evolucioni përgjatë kohës, të ardhura për vizitë, shndërrime sipas sjellësish, fjalëkyçesh, etj.",
"ProductCategory": "Kategori Produkti",
"ProductName": "Emër Produkti",
"Products": "Produkte",
"ProductSKU": "SKU Produkti",
"ReturningVisitorsConversionRateIs": "Koeficienti i shndërrimit për vizitorë të rikthyer është %s",
- "SingleGoalOverviewDocumentation": "Kjo është një përmbledhje e shndërrimeve për një objektiv të vetëm. %s Vijat e grafikut nën të mund të zgjerohen duke klikuar mbi to.",
+ "SingleGoalOverviewDocumentation": "Kjo është një përmbledhje e shndërrimeve për një objektiv të vetëm. %s Grafikët vijëzorë nën të mund të zgjerohen duke klikuar mbi to.",
"ThereIsNoGoalToManage": "Për sajtin %s s’ka objektiva për administrim",
"UpdateGoal": "Përditësoni Objektiv",
"URL": "URL",
@@ -102,7 +103,7 @@
"VisitUrl": "Vizitoni një URL të dhënë (faqe ose grup faqesh)",
"WhenVisitors": "kur vizitorët",
"WhereThe": "kur",
- "WhereVisitedPageManuallyCallsJavascriptTrackerLearnMore": "kur faqja e vizituar përmban një thirrje të metodës JavaScript piwikTracker.trackGoal() (%1$smësoni më tepër%2$s)",
+ "WhereVisitedPageManuallyCallsJavascriptTrackerLearnMore": "Faqja e vizituar lypset të përmbajë një thirrje të metodës JavaScript 'trackGoal' (%1$smësoni më tepër%2$s)",
"YouCanEnableEcommerceReports": "Për këtë sajt mund të aktivizoni %1$s te faqja %2$s."
}
} \ No newline at end of file
diff --git a/plugins/Goals/lang/sr.json b/plugins/Goals/lang/sr.json
index b65739d596..77a55e7def 100644
--- a/plugins/Goals/lang/sr.json
+++ b/plugins/Goals/lang/sr.json
@@ -14,8 +14,8 @@
"CategoryTextGeneral_Visitors": "Lokacije posetilaca",
"CategoryTextReferrers_Referrers": "Reference",
"CategoryTextVisitsSummary_VisitsSummary": "Atributi korisnika",
+ "CategoryTextDevicesDetection_DevicesDetection": "Uređaji",
"CategoryTextGeneral_Visit": "zainteresovanost",
- "ChooseGoal": "Izaberi cilj",
"ClickOutlink": "Klik na link ka eksternom sajtu",
"SendEvent": "Pošalji događaj",
"ColumnAverageOrderRevenueDocumentation": "Prosečna vrednost porudžbine (PVP) je ukupan prihod od svih elektronskih porudžbina podeljen sa brojem porudžbina.",
@@ -36,6 +36,7 @@
"ConversionByTypeReportDocumentation": "Ovaj izveštaj prikazuje detaljne informacije o ciljevima (stepene ispunjenja i prihod po poseti) za svaku od kategorija koja je izabrana s leve strane. %1$s Kliknite na neku od kategorija kako biste videli izveštaj. %2$s Za više informacija pročitajte %3$sTracking Goals na piwik.org%4$s",
"ConversionRate": "%s stepen ispunjenja",
"Conversions": "%s ispunjenja",
+ "ConversionsDescription": "konverzije",
"ConversionsOverview": "Prikaz ispunjenja ciljeva",
"ConversionsOverviewBy": "Pregled ispunjenja ciljeva po tipu posete",
"DaysToConv": "Dana do ispunjenja",
@@ -70,17 +71,17 @@
"IsExactly": "je tačno %s",
"LearnMoreAboutGoalTrackingDocumentation": "Naučite više o %1$s Praćenju ciljeva u Piwik-u%2$s u korisničkoj dokumentaciji.",
"LeftInCart": "%s ostalo u korpi",
- "ManageGoalsOrCreateANewGoal": "%1$sUpravljajte ciljevima%2$s ili kreirajte novi cilj",
"Manually": "ručno",
"ManuallyTriggeredUsingJavascriptFunction": "Cilj je ručno dostignut pomoću JavaScript API trackGoal()",
"MatchesExpression": "je u skladu sa izrazom %s",
"NewGoalIntro": "Praćenje ispunjenja ciljeva je jedan od najefikasnijih načina za merenje i unapređenje vaših poslovnih ciljeva.",
"NewVisitorsConversionRateIs": "Stepen ispunjenja od strane novih posetilaca je %s",
"NoGoalsNeedAccess": "Samo administrator ili superkorisnik može definisati ciljeve za dati sajt. Molimo vas da zatražite od vašeg Piwik administratora da postavi ciljeve za vaš sajt.<br>Praćenje ciljeva je odličan način za razumevanje i maksimiziranje rada vašeg sajta!",
+ "NoConversionsNoReportsMessage": "Izveštaj nije prikazan zato što ne postoje podaci o konverzijama za dati cilj ili period.",
"NeedAccess": "Samo administrator ili superkorisnik može da upravlja ciljevima za dati sajt.",
"Optional": "(opciono)",
- "OverallConversionRate": "%s ukupan stepen ispunjenja (posete sa ispunjenim ciljem)",
- "OverallRevenue": "%s ukupna zarada",
+ "OverallConversionRate": "ukupan stepen konverzije (posete sa ispunjenim ciljem)",
+ "OverallRevenue": "ukupan prihod",
"PageTitle": "Naslov stranice",
"Pattern": "Obrazac",
"PluginDescription": "Kreirajte ciljeve i pogledajte detaljne izveštaje o njihovom ispunjenju: razvoj kroz vreme, zarada po poseti, konverzije po referenci, ključnoj reči i još mnogo toga.",
@@ -101,7 +102,7 @@
"VisitUrl": "Poseti datu adresu (stranicu ili grupu stranica)",
"WhenVisitors": "kad posetioci",
"WhereThe": "gde",
- "WhereVisitedPageManuallyCallsJavascriptTrackerLearnMore": "gde posećena stranica sadrži poziv Java Script 'trackGoal' metod (%1$ssaznajte više%2$s)",
+ "WhereVisitedPageManuallyCallsJavascriptTrackerLearnMore": "Posećena stranica treba da sadrži poziv JavaScript 'trackGoal' metode (%1$ssaznajte više%2$s)",
"YouCanEnableEcommerceReports": "Za ovaj sajt možete omogućiti %1$s na stranici %2$s."
}
} \ No newline at end of file
diff --git a/plugins/Goals/lang/sv.json b/plugins/Goals/lang/sv.json
index 4bc94929f0..2ff331c67e 100644
--- a/plugins/Goals/lang/sv.json
+++ b/plugins/Goals/lang/sv.json
@@ -70,7 +70,6 @@
"IsExactly": "är exakt %s",
"LearnMoreAboutGoalTrackingDocumentation": "Lär dig mer om %1$s att mäta mål i Piwik%2$s i dokumentationen.",
"LeftInCart": "%s kvar i varukorgen",
- "ManageGoalsOrCreateANewGoal": "%1$sHantera mål%2$s eller skapa ett nytt mål nu.",
"Manually": "manuellt",
"ManuallyTriggeredUsingJavascriptFunction": "Målet utlöses manuellt genom att använda JavaScript API trackGoal()",
"MatchesExpression": "matchar uttrycket %s",
@@ -80,8 +79,6 @@
"NoConversionsNoReportsMessage": "Rapporterna visas inte eftersom det inte finns någon konverteringsdata för det valda målet och perioden.",
"NeedAccess": "Bara en administratör eller användare med Superbehörighet kan hantera mål för angiven hemsida.",
"Optional": "(frivilligt)",
- "OverallConversionRate": "%s total omvandlingsgrad (besök med ett uppnått mål)",
- "OverallRevenue": "%s totala intäkter",
"PageTitle": "Sidtitel",
"Pattern": "mönster",
"PluginDescription": "Skapa mål och se detaljerade rapporter för målkonverteringar: utveckling över tid, intäkt per besök, konverteringar per hänvisningskälla, nyckelord med mera.",
@@ -102,7 +99,6 @@
"VisitUrl": "besöker en definerad URL (sida eller grupp av sidor)",
"WhenVisitors": "när besökarna",
"WhereThe": "där",
- "WhereVisitedPageManuallyCallsJavascriptTrackerLearnMore": "där den besökta sidan innehåller ett anrop till JavaScript 'trackGoal'-metoden (%1$slär dig mer%2$s)",
"YouCanEnableEcommerceReports": "Du kan aktivera %1$s för denna webbplats på sidan %2$s."
}
} \ No newline at end of file
diff --git a/plugins/Goals/lang/th.json b/plugins/Goals/lang/th.json
index 69a05b9aec..74efe2e775 100644
--- a/plugins/Goals/lang/th.json
+++ b/plugins/Goals/lang/th.json
@@ -38,8 +38,6 @@
"MatchesExpression": "ตรงกับนิพจน์ที่ %s",
"NewVisitorsConversionRateIs": "อัตราเปลี่ยนแปลงผู้เข้าชมใหม่คือ %s",
"Optional": "(ตัวเลือก)",
- "OverallConversionRate": "%s โดยรวมการแปลงอัตรา (เข้าชมกับเป้าหมายเสร็จสมบูรณ์)",
- "OverallRevenue": "%s โดยรวมรายได้",
"PageTitle": "ชื่อหน้าเว็บ",
"Pattern": "แบบแผน",
"ProductCategory": "หมวดหมู่สินค้า",
@@ -52,7 +50,6 @@
"ViewAndEditGoals": "ดูและแก้ไขเป้าหมาย",
"VisitUrl": "การเข้าชมได้รับ URL (หน้าหรือกลุ่มของหน้า)",
"WhenVisitors": "เมื่อผู้เข้าชม",
- "WhereThe": "ที่ซึ่ง",
- "WhereVisitedPageManuallyCallsJavascriptTrackerLearnMore": "ในหน้าเว็บเพจเมื่อเข้าชมแล้ว จะประกอบไปด้วยวิธีการเรียก JavaScript 'trackGoal' และวิธี (%1$s เรียนรู้เพิ่มเติม %2$s)"
+ "WhereThe": "ที่ซึ่ง"
}
} \ No newline at end of file
diff --git a/plugins/Goals/lang/tr.json b/plugins/Goals/lang/tr.json
index 7be99ef69a..9d4a29bc78 100644
--- a/plugins/Goals/lang/tr.json
+++ b/plugins/Goals/lang/tr.json
@@ -11,6 +11,7 @@
"BestReferrers": "En iyi dönüşüm yapan web sayfaları yönlendiricileri:",
"CaseSensitive": "Büyük-küçük harf duyarlı eşleşme",
"CancelAndReturnToGoals": "Vazgeç ve %1$shedefler listesine geri dön%2$s",
+ "CategoryTextDevicesDetection_DevicesDetection": "Aygıtlar",
"ChooseGoal": "Hedef Seç",
"ClickOutlink": "Harici bir web sayfasına olan Bağlantıya tıklayın",
"SendEvent": "Etkinlik gönder",
diff --git a/plugins/Goals/lang/uk.json b/plugins/Goals/lang/uk.json
index ff668a5102..21f866b7f1 100644
--- a/plugins/Goals/lang/uk.json
+++ b/plugins/Goals/lang/uk.json
@@ -70,7 +70,6 @@
"IsExactly": "точно %s",
"LearnMoreAboutGoalTrackingDocumentation": "Дізнатися більше про %1$sвідстеження цілей в Piwik%2$s в інструкції користувача.",
"LeftInCart": "%s залишено в кошику",
- "ManageGoalsOrCreateANewGoal": "%1$sУправляйте цілями%2$s або створіть нову прямо зараз!",
"Manually": "ручне налаштування",
"ManuallyTriggeredUsingJavascriptFunction": "Ціль вручну стала умовною через Javascript API trackGoal()",
"MatchesExpression": "збігається з виразом %s",
@@ -80,8 +79,6 @@
"NoConversionsNoReportsMessage": "Звіти не показані, тому що дані перетворення для обраних цілей і періоду відсутні.",
"NeedAccess": "Тільки Адміністратор або користувач з доступом Суперкористувача може управляти цілями для даного сайту.",
"Optional": "(необов'язково)",
- "OverallConversionRate": "%s загальний коефіцієнт конверсій (переходи з виконаної цілі)",
- "OverallRevenue": "%s загальний прибуток",
"PageTitle": "Заголовок сторінки",
"Pattern": "Шаблон",
"PluginDescription": "Створіть Цілі і дивіться детальні звіти про цільові конверсії: зміна за часом, дохід від візиту, конверсії з посилання, з ключового слова та ін.",
@@ -102,7 +99,6 @@
"VisitUrl": "Відвідують даний URL (сторінку або групу сторінок)",
"WhenVisitors": "відвідувачі",
"WhereThe": "де",
- "WhereVisitedPageManuallyCallsJavascriptTrackerLearnMore": "де ціль зараховується за допомогою установки виклику методу JavaScript 'trackGoal' (%1$sдізнатися більше%2$s)",
"YouCanEnableEcommerceReports": "Ви можете активувати %1$s для цього сайту на сторінці %2$s."
}
} \ No newline at end of file
diff --git a/plugins/Goals/lang/vi.json b/plugins/Goals/lang/vi.json
index 6643c1a225..5e87840951 100644
--- a/plugins/Goals/lang/vi.json
+++ b/plugins/Goals/lang/vi.json
@@ -66,8 +66,6 @@
"NewGoalIntro": "Theo dõi chuyển đổi mục tiêu là một trong những cách hiệu quả nhất để đo lường và cải thiện các mục tiêu kinh doanh của bạn.",
"NewVisitorsConversionRateIs": "Tỷ lệ chuyển đổi các khách truy cập mới là %s",
"Optional": "(tùy chọn)",
- "OverallConversionRate": "Tỷ lệ chuyển đổi tổng thể %s (truy cập với mục tiêu hoàn thành)",
- "OverallRevenue": "Doanh thu tổng thể %s",
"PageTitle": "Tiêu đề trang",
"Pattern": "Mẫu",
"ProductCategory": "Danh mục sản phẩm",
@@ -84,7 +82,6 @@
"VisitUrl": "Truy cập vào một URL đã cho (trang hoặc một nhóm trang)",
"WhenVisitors": "Khi các khách truy cập",
"WhereThe": "Ở đâu",
- "WhereVisitedPageManuallyCallsJavascriptTrackerLearnMore": "Khi một trang đã truy cập gọi đến phương pháp JavaScript 'trackGoal' (%1$s tìm hiểu thêm %2$s)",
"YouCanEnableEcommerceReports": "Bạn có thể kích hoạt %1$s cho website này trong trang %2$s."
}
} \ No newline at end of file
diff --git a/plugins/Goals/lang/zh-cn.json b/plugins/Goals/lang/zh-cn.json
index 96f93dfefa..109dfe0c1e 100644
--- a/plugins/Goals/lang/zh-cn.json
+++ b/plugins/Goals/lang/zh-cn.json
@@ -62,15 +62,12 @@
"HelpOneConversionPerVisit": "如果一次访问中,匹配目标的页面被刷新或多次查看,只有第一次访问页面的目标会被统计。",
"IsExactly": "正好是 %s",
"LeftInCart": "%s(购物车内产品)",
- "ManageGoalsOrCreateANewGoal": "%1$s管理目标%2$s 或马上新建一个目标!",
"Manually": "手动触发",
"ManuallyTriggeredUsingJavascriptFunction": "手动触发的目标是使用 JavaScript API trackGoal()",
"MatchesExpression": "匹配表达式 %s",
"NewGoalIntro": "目标转化跟踪是最有效的检验和提高商业目标的方法之一。",
"NewVisitorsConversionRateIs": "新访客转化率为 %s",
"Optional": "(选项)",
- "OverallConversionRate": "%s 总转化率(访问一个完整的目标)",
- "OverallRevenue": "%s 总收益",
"PageTitle": "页面标题",
"Pattern": "模式",
"ProductCategory": "产品类别",
@@ -88,7 +85,6 @@
"VisitUrl": "访问特定网址(页面或页面组)",
"WhenVisitors": "当访客",
"WhereThe": "设置",
- "WhereVisitedPageManuallyCallsJavascriptTrackerLearnMore": "在被访问的页面包含一个 JavaScript piwikTracker.trackGoal() 方法(%1$s了解更多%2$s)",
"YouCanEnableEcommerceReports": "您可以为网站开启%1$s在%2$s页面。"
}
} \ No newline at end of file
diff --git a/plugins/Goals/lang/zh-tw.json b/plugins/Goals/lang/zh-tw.json
index 9c636893fc..5f96103dfb 100644
--- a/plugins/Goals/lang/zh-tw.json
+++ b/plugins/Goals/lang/zh-tw.json
@@ -32,8 +32,6 @@
"MatchesExpression": "表達式符合 %s",
"NewVisitorsConversionRateIs": "新訪客轉換率為 %s",
"Optional": "(選用)",
- "OverallConversionRate": "%s 總轉換率(訪問一個完整的目標)",
- "OverallRevenue": "%s 總收益",
"Pattern": "模式",
"ReturningVisitorsConversionRateIs": "回訪訪客轉換率為 %s",
"UpdateGoal": "更新目標",
@@ -41,7 +39,6 @@
"ViewAndEditGoals": "檢視和編輯目標",
"VisitUrl": "訪問特定網址(頁面或頁面群組)",
"WhenVisitors": "當訪客",
- "WhereThe": "位於",
- "WhereVisitedPageManuallyCallsJavascriptTrackerLearnMore": "在被訪問的頁面包含一個 JavaScript piwikTracker.trackGoal() 方法(%1$s知道更多%2$s)"
+ "WhereThe": "位於"
}
} \ No newline at end of file
diff --git a/plugins/Insights/lang/sq.json b/plugins/Insights/lang/sq.json
index bc6a485e1a..565ca6bfc1 100644
--- a/plugins/Insights/lang/sq.json
+++ b/plugins/Insights/lang/sq.json
@@ -1,13 +1,35 @@
{
"Insights": {
+ "PluginDescription": "Furnizon Prirje të trafikut tuaj. Prirjet mund të kihen në formë widget-esh pulti, si edhe në formën e një ikone të re në raporte që t’ju lejojë të shihni tendencat më të rëndësishme në të dhënat tuaja.",
"ControlComparedToDescription": "Rritja e krahasuar me",
+ "ControlFilterByDescription": "Shfaqi krejt, vetëm protagonistët, vetëm të rinjtë ose vetëm të zhdukurit",
+ "DatePeriodCombinationNotSupported": "S’është e mundur të prodhohen prirje për këtë ndërthurje date dhe periudhe.",
"DayComparedToPreviousDay": "dita e mëparshme",
"DayComparedToPreviousWeek": "e njëjta ditë javën e kaluar",
"DayComparedToPreviousYear": "e njëjta ditë vitin e kaluar",
- "IgnoredChanges": "Janë shpërfillur ndryshimet që u takojnë më pak se %s vizitave.",
+ "Filter": "Filtrojini",
+ "FilterIncreaserAndDecreaser": "Shtues & pakësues",
+ "FilterOnlyDecreaser": "Vetëm pakësues",
+ "FilterOnlyDisappeared": "Vetëm të zhdukur",
+ "FilterOnlyIncreaser": "Vetëm shtues",
+ "FilterOnlyMovers": "Vetëm protagonistë",
+ "FilterOnlyNew": "Vetëm të rinjtë",
+ "IgnoredChanges": "U shpërfillën ndryshimet që u takojnë më pak se %s vizitave.",
"MonthComparedToPreviousMonth": "muaji i mëparshëm",
"MonthComparedToPreviousYear": "i njëjti muaj vitin e shkuar",
+ "MoversAndShakersWidgetTitle": "Protagonistë",
+ "NoResultMatchesCriteria": "S’ka rresht me përputhje për kriterin",
+ "OverviewWidgetTitle": "Përmbledhje Prirjesh",
+ "TitleConsideredInsightsChanges": "Rreshtat u shtuan ose pakësuan me të paktën %1$s vizita (%2$s%% nga %3$s vizita gjithsej).",
+ "TitleConsideredInsightsGrowth": "Rreshtat vijues kanë një rritje prej të paktën %1$s%% krahasuar me %2$s.",
+ "TitleConsideredMoversAndShakersChanges": "Të konsideruar protagonistë vetëm nëse u rritën me më tepër se %1$s%% vizita ose u tkurrën me më pak se %2$s%% vizita, zëra të rinj vetëm nëse u shtuan me më shumë se %3$s%% vizita (%4$s), dhe rreshta të zhdukur, nëse u tkurrën në më pak se %5$s%% vizita (%6$s).",
+ "TitleConsideredMoversAndShakersGrowth": "%1$s ndryshoi nga %2$s në %3$s krahasuar me %4$s. Bazuar në këtë, pritet një ecuri %5$s%% për çdo rresht.",
+ "TitleRowChangeDetails": "'%1$s' ndryshoi nga %2$s (%3$s) to %4$s (%5$s) %6$s.",
+ "TitleRowDisappearedDetails": "'%1$s' u pakësua me %2$s dhe u zhduk në %3$s krahasuar me %4$s.",
+ "TitleRowMoverAndShaker": "Ky rresht ka një ndikim më të madh se sa mesatarja.",
+ "TitleRowNewDetails": "'%1$s' u rrit me %2$s dhe është i ri krahasuar me %3$s.",
"WeekComparedToPreviousWeek": "java e mëparshme",
+ "WidgetCategory": "Prirje",
"YearComparedToPreviousYear": "viti i mëparshëm"
}
} \ No newline at end of file
diff --git a/plugins/Installation/lang/ar.json b/plugins/Installation/lang/ar.json
index b62e05e02d..917def9e7d 100644
--- a/plugins/Installation/lang/ar.json
+++ b/plugins/Installation/lang/ar.json
@@ -36,11 +36,17 @@
"NfsFilesystemWarning": "الخادم لديك يستخدم نظام ملفات NFS .",
"NfsFilesystemWarningSuffixAdmin": "هذا يعني أن Piwik سيكون بطيئاً جداً عند استخدام جلسات قائمة على الملفات.",
"NfsFilesystemWarningSuffixInstall": "استخدام الجلسات القائمة على الملفات في بيئة NFS شيئ بطيئ جداً ، ولهذا سيستخدم Piwik جلسات قواعد البيانات. قد تحتاج زيادة العدد الأقصى لاتصالات المستفيدين بخادم قاعدة البيانات إذا كان لديك العديد من مستخدمي لوحات المعلومات المتزامنين.",
+ "NoConfigFileFound": "لم يتم العثور على ملف ضبط Piwik ، إنك تحاول الوصول إلى صفحة Piwik .",
+ "YouMayInstallPiwikNow": "تستطيع %1$sتثبيت Piwik الآن%2$s",
+ "IfPiwikInstalledBeforeTablesCanBeKept": "هل ثبتَّ Piwik من قبل ولديك بعض الجداول في قاعدة البيانات ؟ لا تقلق يمكنك استخدام الجداول نفسها الآن والاحتفاظ ببياناتك الموجودة!",
"Optional": "اختياري",
"Password": "كلمة المرور",
"PasswordDoNotMatch": "كلمة المرور غير متطابقة",
"PasswordRepeat": "كلمة المرور(كرّرها)",
"PercentDone": "تم تنفيذ %s %%",
+ "ProfessionalServicesAdTitle": "تحليلات وخدمات متقدمة",
+ "ProfessionalServicesfessionalServicesAdText": "بإمكان شبكة خبراءنا مساعدة منظمتك في إطلاق القدرات الهائلة لتحليلات Piwik",
+ "ProfessionalServicesfessionalDiscoverHow": "تعلّم عن %1$sمنتجات وخدمات إضافية%2$s لـ Piwik وعن كيفية زيادة التحويلات والإيراد لديك.",
"PleaseFixTheFollowingErrors": "الرجاء إصلاح الأخطاء التالية",
"DefaultSettings": "إعدادات Piwik الافتراضية",
"DefaultSettingsHelp": "يأتي Piwik بإعدادات افتراضية. يمكنك تخصيصها الآن أو فعل ذلك لاحقاً في شاشة الإدارة.",
@@ -48,6 +54,7 @@
"RestartWebServer": "أعد تشغيل خادم الويب لديك بعد القيام بهذا التغيير.",
"ReusingTables": "إعادة استخدام الجداول",
"PiwikOrgNewsletter": "أرسل لي بريداً بآخر تحديثات مجتمع Piwik",
+ "ProfessionalServicesNewsletter": "أرسل لي معلومات عن %1$sخدمات ومنتجات احترافية%2$s خاصة بـ Piwik",
"SeeBelowForMoreInfo": "أنظر أدناه لمزيد من المعلومات.",
"SetupWebsite": "إعداد موقع ويب",
"SetupWebsiteError": "حدث خطأ ما أثناء إضافة الموقع",
@@ -84,6 +91,8 @@
"SystemCheckMbstringHelp": "إضافة mbstring مطلوبة للتعامل مع المحارف عديدة البايتات في واجهة المستخدم و استجابات واجهة API. فضلاً تأكد أيضاً من أن mbstring.func_overload مضبوط على \"0\" في php.ini.",
"SystemCheckMemoryLimit": "حد الذاكرة",
"SystemCheckMemoryLimitHelp": "في المواقع ذات الزيارات الكبيرة، فإن عملية الأرشفة تتطلب ذاكرة أعلى مما هو مسموح به حالياً. إذا تطلب الأمر، قم بتغيير memory_limit في ملف php.ini الخاص بك.",
+ "SystemCheckNoErrorsOrWarnings": "لا توجد أي أخطاء أو تحذيرات",
+ "SystemCheckViewFullSystemCheck": "عرض التقرير الكامل لفحص النظام",
"SystemCheckOpenURL": "Open URL",
"SystemCheckOpenURLHelp": "الاشتراك في النشرة الدورية، إعلامات التحديثات والتحديث السريع يتطلب إضافة 'cURL' وتفعيل 'allow_url_fopen=On' أو 'fsockopen()'.",
"SystemCheckOtherExtensions": "إضافات أخرى",
diff --git a/plugins/Installation/lang/cs.json b/plugins/Installation/lang/cs.json
index ba78860a1b..48170a6584 100644
--- a/plugins/Installation/lang/cs.json
+++ b/plugins/Installation/lang/cs.json
@@ -1,7 +1,7 @@
{
"Installation": {
"CollaborativeProject": "Piwik je společný projekt tvořený s láskou lidmi z celého světa.",
- "ConfigurationHelp": "Váš konfigurační soubor Piwiku je špatně nastavený. Můžete buď odstranit soubor config\/config.ini a znovu začít instalaci, nebo opravit nastavení databáze.",
+ "ConfigurationHelp": "Konfigurační soubor Piwiku se zdá být špatně nastavený. Můžete buď odstranit soubor config\/config.ini a začít instalaci znovu, nebo opravit nastavení databáze.",
"ConfirmDeleteExistingTables": "Jste si jistí, že chcete vymazat tabulky: %s z vaší databáze? UPOZORNĚNÍ: DATA Z TĚCHTO TABULEK NEPŮJDOU OBNOVIT!",
"Congratulations": "Gratulujeme",
"CongratulationsHelp": "<p>Gratulujeme! Vaše instalace Piwiku je kompletní.<\/p><p>Ujistěte se, že máte JavaScriptový kód vložen do svých stránek a čekejte na první návštěvníky!<\/p>",
@@ -31,7 +31,7 @@
"JSTracking_Intro": "Pokud chcete Piwikem sledovat provoz na vašem webu, musíte zajistit, že do každé stránky bude přidán extra kód.",
"LargePiwikInstances": "Nápověda pro velké instalace Piwiku",
"Legend": "Legenda",
- "LoadDataInfileRecommended": "Pokud váš Piwik server zaznamenává provoz na stránkách s vysokým provozem t. j. 100000 stránek za měsíc, doporučujeme se pokusit o řešení tohoto problému.",
+ "LoadDataInfileRecommended": "Pokud Piwik server zaznamenává provoz na stránkách s vysokým vytížením (např. 100000 přístupů za měsíc), doporučujeme se pokusit o řešení tohoto problému.",
"LoadDataInfileUnavailableHelp": "Použití %1$s velmi zrychlí archivační proces Piwiku. Pro zpřístupnění zkuste aktualizovat PHP a Mysql a ujistěte se, že má databázový uživatel privilegium %2$s.",
"NfsFilesystemWarning": "Váš server používá souborový systém NFS.",
"NfsFilesystemWarningSuffixAdmin": "To znamená, že Piwik bude při použití sessions založených na souborech velmi pomalý.",
@@ -51,9 +51,9 @@
"DefaultSettings": "Výchozí nastavení Piwiku",
"DefaultSettingsHelp": "Piwik má výchozí nastavení. Můžete je změnit teď, nebo později z administračního rozhraní.",
"Requirements": "Požadavky Piwiku",
- "RestartWebServer": "Po uložení změn restartujte Vás web server.",
+ "RestartWebServer": "Po uložení změn restartujte webový server.",
"ReusingTables": "Použití existujících tabulek",
- "PiwikOrgNewsletter": "odesílat e-maily s důležitými událostmi v komunitě Piwiku",
+ "PiwikOrgNewsletter": "odesílat emaily s důležitými událostmi v komunitě Piwiku",
"ProfessionalServicesNewsletter": "pošlete mi informace o %1$sProfesionálních službách a produktech%2$s pro Piwik",
"SeeBelowForMoreInfo": "Pro více informací se podívejte níže.",
"SetupWebsite": "Nastavit Web",
@@ -91,6 +91,8 @@
"SystemCheckMbstringHelp": "Rozšíření mbstring je nutné ke zpracování vícebajtových znaků v uživatelském rozhraní a odpovědích API. Také zajistěte, aby byla v souboru php.ini hodnota mbstring.func_overload nastavena na 0.",
"SystemCheckMemoryLimit": "Limit paměti",
"SystemCheckMemoryLimitHelp": "Na webech s vysokým provozem, může archivace vyžadovat více paměti něž je nyní povoleno.<br \/>Pokud je potřeba, podívejte se na direktivu memory_limit ve vašem souboru php.ini.",
+ "SystemCheckNoErrorsOrWarnings": "Nejsou zde žádné chyby nebo varování",
+ "SystemCheckViewFullSystemCheck": "Zobrazit úplné hlášení kontroly systému",
"SystemCheckOpenURL": "Otevřít URL",
"SystemCheckOpenURLHelp": "Předplatné novinek, informace o aktualizaci a aktualizace jedním kliknutím vyžadují rozšíření \"curl\", allow_url_fopen=On, nebo povolené fsockopen().",
"SystemCheckOtherExtensions": "Ostatní rozšíření",
diff --git a/plugins/Installation/lang/de.json b/plugins/Installation/lang/de.json
index 301aeec2a4..56a7b2a8a9 100644
--- a/plugins/Installation/lang/de.json
+++ b/plugins/Installation/lang/de.json
@@ -61,7 +61,7 @@
"SetupWebSiteName": "Name der Website",
"SetupWebsiteSetupSuccess": "Website %s erfolgreich angelegt!",
"SetupWebSiteURL": "URL der Website",
- "SiteSetup": "Konfigurieren Sie Ihre erste Website, welche über Piwik getrackt und analyisert werden soll:",
+ "SiteSetup": "Konfigurieren Sie Ihre erste Website, welche über Piwik getrackt und analysiert werden soll:",
"SiteSetupFootnote": "Hinweis: Sie können weitere Websites hinzuzufügen sobald die Installation von Piwik abgeschlossen wurde!",
"SuperUser": "Hauptadministrator",
"SuperUserLogin": "Hauptadministrator Login",
@@ -91,6 +91,8 @@
"SystemCheckMbstringHelp": "Die mbstring-Erweiterung wird benötigt, um multibyte-Zeichen in der Benutzeroberfläche und in den API-Antworten zu verarbeiten. Bitte überprüfen Sie ebenfalls, ob mbstring.func_overload in der php.ini auf \"0\" gesetzt ist.",
"SystemCheckMemoryLimit": "Speicherlimit",
"SystemCheckMemoryLimitHelp": "Auf einer stark frequentierten Website könnte es passieren, dass die Archivierung mehr Speicher erfordert als erlaubt. Falls erforderlich, ändern Sie den memory_limit Wert in ihrer php.ini Datei.",
+ "SystemCheckNoErrorsOrWarnings": "Keine Fehler oder Warnungen",
+ "SystemCheckViewFullSystemCheck": "Sehen Sie sich den vollständigen Systemprüfbericht an",
"SystemCheckOpenURL": "Öffnen einer URL",
"SystemCheckOpenURLHelp": "Eintragen in den Newsletter, Aktualisierungshinweise und Ein-Klick-Aktualisierungen erfordern die \"curl\" Erweiterung, allow_url_fopen=On und fsockopen() aktiviert.",
"SystemCheckOtherExtensions": "Andere Erweiterungen",
diff --git a/plugins/Installation/lang/el.json b/plugins/Installation/lang/el.json
index 95aa300268..ddc14ca4ff 100644
--- a/plugins/Installation/lang/el.json
+++ b/plugins/Installation/lang/el.json
@@ -91,6 +91,8 @@
"SystemCheckMbstringHelp": "Απαιτείται η επέκταση mbstring για το χειρισμό χαρακτήρων πολλαπλών bytes στη διεπαφή Χρήστη και στις αποκρίσεις API. Επίσης, ελέγξτε ότι η τιμή mbstring.func_overload έχει οριστεί στο \"0\" στο php.ini.",
"SystemCheckMemoryLimit": "Όριο μνήμης",
"SystemCheckMemoryLimitHelp": "Σε μια ιστοσελίδα υψηλής επισκεψιμότητας, η διαδικασία αρχειοθέτησης ίσως απαιτεί περισσότερη μνήμη από την επιτρεπόμενη.<br \/>Δείτε την οδηγία memory_limit στο αρχείο php.ini αν είναι απαραίτητο.",
+ "SystemCheckNoErrorsOrWarnings": "Δεν υπάρχουν σφάλματα ή προειδοποιήσεις",
+ "SystemCheckViewFullSystemCheck": "Εμφάνιση της πλήρης αναφοράς ελέγχου συστήματος",
"SystemCheckOpenURL": "Άνοιγμα URL",
"SystemCheckOpenURLHelp": "Εγγραφές Newsletter, ειδοποιήσεις ενημερώσεων και οι ενημερώσεις ενός κλικ απαιτούν την επέκταση «curl», ενεργοποιήστε το allow_url_fopen=On ή το fsockopen().",
"SystemCheckOtherExtensions": "Άλλες επεκτάσεις",
diff --git a/plugins/Installation/lang/es.json b/plugins/Installation/lang/es.json
index 997665001c..a7e989ed9d 100644
--- a/plugins/Installation/lang/es.json
+++ b/plugins/Installation/lang/es.json
@@ -91,6 +91,8 @@
"SystemCheckMbstringHelp": "Se requiere la extensión mbstring para manejar caracteres multibyte en el interfaz del usuario y también las respuestas de la API. Por favor controle que mbstring.func_overload sea establecido en \"0\" en php.ini.",
"SystemCheckMemoryLimit": "Límite de memoria",
"SystemCheckMemoryLimitHelp": "En un sitio de internet de alto tráfico, el proceso de archivo puede requerir más memoria de la que se permite actualmente. Véase la Directiva memory_limit en su archivo php.ini si es necesario.",
+ "SystemCheckNoErrorsOrWarnings": "No hay errores ni advertencias",
+ "SystemCheckViewFullSystemCheck": "Vea el informe total de verificación del sistema",
"SystemCheckOpenURL": "Abrir URL",
"SystemCheckOpenURLHelp": "Suscripciones a boletines, notificaciones de actualización y actualizaciones con un clic necesitan la extensión \"curl\", allow_url_fopen=On, o fsockopen() habilitado.",
"SystemCheckOtherExtensions": "Otras extensiones",
diff --git a/plugins/Installation/lang/fr.json b/plugins/Installation/lang/fr.json
index b58ea72ba5..061b843ed6 100644
--- a/plugins/Installation/lang/fr.json
+++ b/plugins/Installation/lang/fr.json
@@ -91,6 +91,8 @@
"SystemCheckMbstringHelp": "L'extension msstring est requise pour gérer les caractères sur plusieurs octets dans l'interface utilisateur et dans les réponses de l'API. Veuillez aussi vérifier que mbstring.func_overload est définit à \"0\" dans php.ini.",
"SystemCheckMemoryLimit": "Limite mémoire",
"SystemCheckMemoryLimitHelp": "Sur un site à trafic important, le processus d'archivage peut prendre plus de mémoire que la limite actuelle autorisée.<br \/>Référez-vous à la configuration memory_limit de votre php.ini si nécessaire.",
+ "SystemCheckNoErrorsOrWarnings": "Il n'y a aucune erreur ou avertissement",
+ "SystemCheckViewFullSystemCheck": "Afficher le rapport complet du système",
"SystemCheckOpenURL": "Ouvrez l'URL",
"SystemCheckOpenURLHelp": "Abonnements à la newsletter, notifications des mises à jour, et mise à jour en un clic requièrent l'extension curl, allow_url_fopen=On, ou fsockopen() activé.",
"SystemCheckOtherExtensions": "Autres extensions",
diff --git a/plugins/Installation/lang/it.json b/plugins/Installation/lang/it.json
index 6bed04458a..d3ff5ac9c9 100644
--- a/plugins/Installation/lang/it.json
+++ b/plugins/Installation/lang/it.json
@@ -90,6 +90,8 @@
"SystemCheckMbstringHelp": "È richiesta l'estensione mbstring per trattare caratteri multibyte nell'interfaccia utente e nelle risposte API. Controlla anche che mbstring.func_overload sia impostata a 0 nel php.ini.",
"SystemCheckMemoryLimit": "Memoria massima",
"SystemCheckMemoryLimitHelp": "Su un sito web con grande traffico, il processo di archiviazione potrebbe richiedere più memoria di quella attualmente consentita.<br \/>Cambia la direttiva memory_limmit nel tuo file php.ini se necessario.",
+ "SystemCheckNoErrorsOrWarnings": "Non ci sono errori o avvisi",
+ "SystemCheckViewFullSystemCheck": "Guarda il report completo di controllo del sistema",
"SystemCheckOpenURL": "Apri URL",
"SystemCheckOpenURLHelp": "L'iscrizione alla newsletter, le notifiche degli aggiornamenti e 'one-click updates' (aggiornamenti con un solo click) richiedono che siano abilitati l'estensione 'curl', allow_url_fopen=On o fsockopen().",
"SystemCheckOtherExtensions": "Altre estensioni",
diff --git a/plugins/Installation/lang/ko.json b/plugins/Installation/lang/ko.json
index 67a9c2bdcd..b478a02ad1 100644
--- a/plugins/Installation/lang/ko.json
+++ b/plugins/Installation/lang/ko.json
@@ -36,11 +36,17 @@
"NfsFilesystemWarning": "서버에서 NFS 파일시스템을 사용하고 있습니다.",
"NfsFilesystemWarningSuffixAdmin": "파일 기반 세션을 사용하는 경우 Piwik이 매우 느려짐을 의미합니다.",
"NfsFilesystemWarningSuffixInstall": "NFS의 파일 기반 세션을 사용하면 매우 느립니다, 그래서 Piwik 데이터베이스 세션을 사용합니다. 대시보드 사용자가 많은 경우는, 데이터베이스 서버에 클라이언트 연결의 최대 수를 증가해야 할지도 모릅니다.",
+ "NoConfigFileFound": "Piwik 페이지에 접근을 시도하지만, Piwik 설정 파일을 찾을 수 없습니다.",
+ "YouMayInstallPiwikNow": "당신은 아마 %1$sPiwik 지금 설치%2$s중입니다.",
+ "IfPiwikInstalledBeforeTablesCanBeKept": "Piwik 설치 전에 당신의 데이터베이스에 테이블이 있어도 걱정마세요. 같은 테이블을 재사용하여 기존 데이터를 보존할 수 있습니다!",
"Optional": "옵션",
"Password": "비밀번호",
"PasswordDoNotMatch": "비밀번호가 맞지 않습니다",
"PasswordRepeat": "비밀번호 (반복 입력)",
"PercentDone": "%s %% 완료",
+ "ProfessionalServicesAdTitle": "고급 분석 및 서비스",
+ "ProfessionalServicesfessionalServicesAdText": "우리의 전문가 네트워크가 당신의 조직이 Piwik 분석의 모든 기능을 사용하는 것을 도와드릴 수 있습니다.",
+ "ProfessionalServicesfessionalDiscoverHow": "Piwik의 %1$s추가 상품 및 서비스%2$s에 대해서 알아보시고, 당신의 수익을 증가시키세요.",
"PleaseFixTheFollowingErrors": "다음 오류를 수정하세요",
"DefaultSettings": "기본 Piwik 설정",
"DefaultSettingsHelp": "Piwik 기본 설정에 따릅니다. 이를 지금 혹은 후에 관리자 화면에서 변경할 수 있습니다.",
@@ -48,6 +54,7 @@
"RestartWebServer": "변경한 후 웹서버를 다시 시작하세요.",
"ReusingTables": "테이블",
"PiwikOrgNewsletter": "주요 Piwik 커뮤니티의 업데이트 이메일 구독",
+ "ProfessionalServicesNewsletter": "Piwik를 위해 %1$s전문가 서비스 및 상품%2$s 정보를 보내주세요.",
"SeeBelowForMoreInfo": "자세한 내용은 아래를 참조하세요.",
"SetupWebsite": "웹사이트 설정",
"SetupWebsiteError": "웹사이트 추가중에 에러가 있었습니다",
@@ -84,6 +91,8 @@
"SystemCheckMbstringHelp": "mbstring 확장은 사용자 인터페이스와 API 응답 내 멀티바이트 문자열을 다루는데 필요합니다. 또한, php.ini 내 mbstring.func_overload이 0으로 되어 있는지 확인하세요.",
"SystemCheckMemoryLimit": "메모리 제한",
"SystemCheckMemoryLimitHelp": "높은 트래픽의 웹사이트에서는 압축 진행중에 현재 허용된 것보다 더 높은 메모리를 필요로 할 수 있습니다. 만약 필요하다면 php.ini 파일에서 memory_limit을 변경하세요.",
+ "SystemCheckNoErrorsOrWarnings": "에러나 경고가 없습니다.",
+ "SystemCheckViewFullSystemCheck": "전체 시스템 확인 보고서 보기",
"SystemCheckOpenURL": "URL 열기",
"SystemCheckOpenURLHelp": "뉴스 레터 구독, 업데이트 알림, 원 클릭 업데이트는 \"curl\"확장, allow_url_fopen = On 또는 fsockopen()이 유효해야합니다.",
"SystemCheckOtherExtensions": "기타 확장",
diff --git a/plugins/Installation/lang/nb.json b/plugins/Installation/lang/nb.json
index c14b6c2cb5..12bcce3ba2 100644
--- a/plugins/Installation/lang/nb.json
+++ b/plugins/Installation/lang/nb.json
@@ -91,6 +91,8 @@
"SystemCheckMbstringHelp": "mbstring-utvidelsen kreves for å håndtere multibyte-tegn i brukergrensesnittet og API-svar. Sjekk også at mbstring.func_overload er satt til «0» i php.ini.",
"SystemCheckMemoryLimit": "Minnegrense",
"SystemCheckMemoryLimitHelp": "På et høyt trafikkert nettsted, kan arkiveringsprossessen kreve mer minne enn det som nå er tillatt.<br \/>Se på memory_limit i din php.ini fil hvis nødvendig.",
+ "SystemCheckNoErrorsOrWarnings": "Det er ingen feil eller advarsler",
+ "SystemCheckViewFullSystemCheck": "Se hele systemrapporten",
"SystemCheckOpenURL": "Åpne URL",
"SystemCheckOpenURLHelp": "Nyhetsbrev abonnement, oppdatering påminninger og en-klikk-oppdatering krever Curl-utvidelsen, \"allow_url_fopen=On\" eller at fsockopen() er aktivert.",
"SystemCheckOtherExtensions": "Andre utvidelser",
diff --git a/plugins/Installation/lang/pt-br.json b/plugins/Installation/lang/pt-br.json
index 8366493711..f1a476e5ac 100644
--- a/plugins/Installation/lang/pt-br.json
+++ b/plugins/Installation/lang/pt-br.json
@@ -44,6 +44,7 @@
"PasswordDoNotMatch": "senha não confere",
"PasswordRepeat": "Senha (repetir)",
"PercentDone": "%s %% Completo",
+ "ProfessionalServicesAdTitle": "Análises e Serviços Avançados",
"PleaseFixTheFollowingErrors": "Por favor, corrija os seguintes erros",
"DefaultSettings": "Configurações Piwik padrão",
"DefaultSettingsHelp": "Piwik vem com configurações padrão. Você pode personalizá-las agora ou posteriormente no painel de administração.",
diff --git a/plugins/Installation/lang/ru.json b/plugins/Installation/lang/ru.json
index 63018cf656..1fefc27866 100644
--- a/plugins/Installation/lang/ru.json
+++ b/plugins/Installation/lang/ru.json
@@ -36,11 +36,16 @@
"NfsFilesystemWarning": "Ваш сервер использует NFS.",
"NfsFilesystemWarningSuffixAdmin": "Имеется ввиду, что Piwik будет очень медленным при использовании сессий на основе файлов.",
"NfsFilesystemWarningSuffixInstall": "Использование сессий на основе файлов по протоколу NFS чрезвычайно медленно, поэтому Piwik будет использовать сессии на основе базы данных. Если у вас может быть одновременно множество пользователей на панели управления, вам, возможно, потребуется увеличить максимальное число клиентских подключений к серверу базы данных.",
+ "NoConfigFileFound": "Файл конфигурации Piwik не найден, а вы пытаетесь получить доступ к странице Piwik.",
+ "YouMayInstallPiwikNow": "Вы можете %1$sустановить Piwik%2$s прямо сейчас",
+ "IfPiwikInstalledBeforeTablesCanBeKept": "Если вы устанавливали Piwik раньше и у вас уже есть таблицы в вашей БД, не волнуйтесь, вы можете их использовать и оставить существующие данные!",
"Optional": "Необязательно",
"Password": "Пароль",
"PasswordDoNotMatch": "Пароль не совпадает",
"PasswordRepeat": "Пароль (еще раз)",
"PercentDone": "%s %% Завершено",
+ "ProfessionalServicesAdTitle": "Продвинутая аналитика и сервисы",
+ "ProfessionalServicesfessionalServicesAdText": "Наши эксперты могут помочь вашей организации показать всю мощь аналитики Piwik.",
"PleaseFixTheFollowingErrors": "Пожалуйста, исправьте следующие ошибки",
"DefaultSettings": "Настройки Piwik по умолчанию",
"DefaultSettingsHelp": "Piwik поставляется с настройками по умолчанию. Вы можете настроить их сейчас или сделать это позже в настройках администратора.",
@@ -84,6 +89,8 @@
"SystemCheckMbstringHelp": "Расширение mbstring необходимо для работы с мультибайтовыми символами в интерфейсе пользователя и ответах API. Также убедитесь что mbstring.func_overload равно \"0\" в php.ini.",
"SystemCheckMemoryLimit": "Ограничение памяти",
"SystemCheckMemoryLimitHelp": "На высоконагруженном сайте, процесс архивации может занять больше памяти, чем разрешено в данный момент. Если необходимо, измените директиву memory_limit в вашем php.ini файле.",
+ "SystemCheckNoErrorsOrWarnings": "Нет никаких ошибок или предупреждений",
+ "SystemCheckViewFullSystemCheck": "Просмотр отчёта о полной проверке системы",
"SystemCheckOpenURL": "Открыть URL",
"SystemCheckOpenURLHelp": "Подписки на новостные ленты, сообщения о обновлениях, и One Click Update требует наличия включенного модуля \"curl\", измените директиву php.ini allow_url_fopen=On, или вызовите fsockopen().",
"SystemCheckOtherExtensions": "Другие модули",
diff --git a/plugins/Installation/lang/sq.json b/plugins/Installation/lang/sq.json
index 0cc67566bd..8a6eaae077 100644
--- a/plugins/Installation/lang/sq.json
+++ b/plugins/Installation/lang/sq.json
@@ -1,6 +1,6 @@
{
"Installation": {
- "CollaborativeProject": "Piwik-u është një projekt në bashkëpunim, i ngritur me dashuri nga njerëz anembanë botës.",
+ "CollaborativeProject": "Piwik-u është një projekt në bashkëpunim, i ndërtuar me dashuri nga njerëz anembanë botës.",
"ConfigurationHelp": "Kartela juaj për formësimin e Piwik-ut duket se është e keqformësuar. Ose mund të hiqni config\/config.ini.php dhe rinisni instalimin, ose ndreqni rregullimet për lidhjen me bazën e të dhënave.",
"ConfirmDeleteExistingTables": "Jeni i sigurt se doni të fshihen tabelat: %s prej bazës së të dhënave? KUJDES: NUK DO TË MUND TË RIKTHENI TË DHËNAT PREJ KËTYRE TABELAVE!",
"Congratulations": "Urime",
@@ -10,11 +10,11 @@
"DatabaseErrorConnect": "Gabim gjatë provës për t’u lidhur me shërbyesin e bazës së të dhënave",
"DatabaseServerVersion": "Version shërbyesi baze të dhënash",
"DatabaseSetup": "Rregullimi i Bazës së të Dhënave",
- "DatabaseSetupAdapter": "përshtatës",
- "DatabaseSetupDatabaseName": "emër baze të dhënash",
+ "DatabaseSetupAdapter": "Përshtatës",
+ "DatabaseSetupDatabaseName": "Emër Baze të Dhënash",
"DatabaseSetupLogin": "hyrje",
- "DatabaseSetupServer": "Shërbyes i bazës së të dhënave",
- "DatabaseSetupTablePrefix": "parashtesë tabele",
+ "DatabaseSetupServer": "Shërbyes Baze të Dhënash",
+ "DatabaseSetupTablePrefix": "Parashtesë Tabele",
"Email": "Email",
"Extension": "zgjerim",
"Filesystem": "Sistem kartelash",
@@ -27,27 +27,35 @@
"InsufficientPrivilegesMain": "Ose Baza e të Dhënave s’ekziston, (dhe s’krijohet dot), ose Përdoruesi i caktuar ka privilegje të pamjaftueshme. Përdoruesi i bazës së të dhënave duhet të ketë privilegjet vijuese: %s",
"InvalidStateError": "Gabim: Piwik-u është i instaluar tashmë. %1$s Rikthehuni %2$s te Piwik-u%3$s.",
"JsTagArchivingHelp1": "Për sajte me trafik mesatar ose të madh ka disa optimizime që duhen bërë për ta ndihmuar Piiwik-un të xhirojë më shpejt (të tillë si %1$srregullimi i vetëarkivimit%2$s).",
- "JSTracking_EndNote": "Shënim: pas procesit të instalimit, te ndarja %1$sKod Gjurmimi%2$s e përgjegjësit mund të prodhoni kod vetjak gjurmimi.",
+ "JSTracking_EndNote": "Shënim: pas procesit të instalimit, te ndarja %1$sKod Ndjekjeje%2$s e përgjegjësit mund të prodhoni kod vetjak ndjekjesh.",
"JSTracking_Intro": "Që të ndiqni trafikun tuaj web me Piwik-un, duhet të siguroni shtimin e ca kodi shtesë te secila faqe web e juaja.",
"LargePiwikInstances": "Ndihmë për raste Piwik-u me ngarkesë",
"Legend": "Legjendë",
"LoadDataInfileRecommended": "Nëse shërbyesi juaj Piwik ndjek sajte me trafik të madh (p.sh. > 100,000 faqe në muaj), këshillojmë të përpiqeni ta ndreqni këtë problem.",
"LoadDataInfileUnavailableHelp": "Përdorimi i %1$s do ta përshpejtojë mjaft procesin e arkivimit në Piwik. Që Piwik-u të mund ta përdorë, provoni të përditësoni software-in tuaj PHP & MySQL dhe sigurohuni që përdoruesi i bazës tuaj të të dhënave ka privilegje %2$s.",
- "NfsFilesystemWarning": "Shërbyesi juaj përdor një sistemt NFS kartelash",
+ "NfsFilesystemWarning": "Shërbyesi juaj përdor një sistem NFS kartelash.",
"NfsFilesystemWarningSuffixAdmin": "Kjo do të thotë që Piwik-u do të jetë tejet i ngadaltë kur të përdorë sesione të bazuar në kartela.",
"NfsFilesystemWarningSuffixInstall": "Përdorimi për NFS-në i sesioneve të bazuar në kartela është tejet i ngadaltë, ndaj Piwik-u do të përdorë sesione të bazuar në baza të dhënash. Nëse keni shumë përdorues të njëkohshëm të pultit, mund të keni nevojë të rritni numrin maksimum të lidhjeve nga klientët te shërbyesi i bazës së të dhënave.",
+ "NoConfigFileFound": "S’u gjet dot kartela e formësimit të Piwik-ut dhe po përpiqeni të hyni në një faqe Piwik.",
+ "YouMayInstallPiwikNow": "Tani %1$smund të instaloni Piwik-un%2$s",
+ "IfPiwikInstalledBeforeTablesCanBeKept": "Nëse e keni instaluar herë tjetër Piwik-un dhe keni disa tabela në BD-në tuaj, mos u shqetësoni, mund të ripërdorni të njëjtat tabela dhe të ruani të dhënat ekzistuese!",
"Optional": "Opsionale",
"Password": "Fjalëkalim",
"PasswordDoNotMatch": "fjalëkalimet nuk përputhen",
"PasswordRepeat": "Fjalëkalim (rijepeni)",
"PercentDone": "Plotësuar %s %%",
- "PleaseFixTheFollowingErrors": "Ju lutem, ndreqni gabimet vijuese",
+ "ProfessionalServicesAdTitle": "Statistika & Shërbime të Përparuara",
+ "ProfessionalServicesfessionalServicesAdText": "Rrjeti ynë i ekspertëve mund ta ndihmojë organizmin tuaj të çlirojë fuqinë e plotë të analizave Piwik.",
+ "ProfessionalServicesfessionalDiscoverHow": "Mësoni mbi %1$sproduktet dhe shërbimet shtesë%2$s për Piwik dhe se si të shtoni shndërrimet dhe të ardhurat tuaja.",
+ "PleaseFixTheFollowingErrors": "Ju lutemi, ndreqni gabimet vijuese",
"DefaultSettings": "Rregullimet parazgjedhje për Piwik-un",
"DefaultSettingsHelp": "Piwik-u instalohet me rregullime parazgjedhje. Ato mund t’i përshtatni tani ose këtë ta bëni më vonë që nga skena e përgjegjësit.",
"Requirements": "Të domosdoshme për Piwik-un",
"RestartWebServer": "Pas kryerjes së këtij ndryshimi, rinisni shërbyesin tuaj.",
- "PiwikOrgNewsletter": "më njoftoni me email rreth përditësimesh të rëndësishme të Piwik-ut nga bashkësia",
- "SeeBelowForMoreInfo": "Për më tepër informacion shihni më poshtë",
+ "ReusingTables": "Ripërdorim Tabelash",
+ "PiwikOrgNewsletter": "njoftomëni me email rreth përditësimesh të rëndësishme të Piwik-ut nga bashkësia",
+ "ProfessionalServicesNewsletter": "dërgomëni të dhëna mbi %1$sshërbime dhe produkte Profesionale%2$s për Piwik",
+ "SeeBelowForMoreInfo": "Për më tepër informacion, shihni më poshtë.",
"SetupWebsite": "Rregulloni një Sajt",
"SetupWebsiteError": "Pati një gabim gjatë shtimit të një sajti",
"SetupWebSiteName": "Emër sajti",
@@ -55,10 +63,10 @@
"SetupWebSiteURL": "URL sajti",
"SiteSetup": "Ju lutemi, caktoni sajtin e parë që dëshironi të ndiqet dhe analizohet me Piwik:",
"SiteSetupFootnote": "Shënim: pasi të përfundojë instalimi i Piwik-ut, do të jeni në gjendje të shtoni më tepër Sajte për ndjekje!",
- "SuperUser": "Super Përdorues",
+ "SuperUser": "Superpërdorues",
"SuperUserLogin": "Hyrje si superpërdorues",
"SuperUserSetupError": "Pati një gabim gjatë shtimit të Superpërdoruesit",
- "SuperUserSetupSuccess": "Super Përdoruesi u krijua me sukses!",
+ "SuperUserSetupSuccess": "Superpërdoruesi u krijua me sukses!",
"SystemCheck": "Kontroll sistemi",
"SystemCheckAutoUpdateHelp": "Shënim: përditësimi me Një Klikim i Piwik-ut lyp leje për shkrim te dosja Piwik dhe lënda e saj.",
"SystemCheckCreateFunctionHelp": "Piwik-u përdor funksione anonime për \"callbacks\".",
@@ -68,11 +76,11 @@
"SystemCheckError": "Ndodhi një gabim - duhet të ndreqet përpara se të ecni më tej",
"SystemCheckEvalHelp": "E domosdoshme për HTML QuickForm dhe sistemin Smarty të gjedheve.",
"SystemCheckExtensions": "Të tjera zgjerime të domosdoshme",
- "SystemCheckFileIntegrity": "Pacënueshmëri kartele",
+ "SystemCheckFileIntegrity": "Pacenueshmëri kartele",
"SystemCheckFunctions": "Funksione të domosdoshëm",
"SystemCheckFunctionHelp": "Lypset ta aktivizoni këtë funksion të brendshëm.",
"SystemCheckGDFreeType": "GD > 2.x + Freetype (grafikë)",
- "SystemCheckGDHelp": "\"Sparklines\" (grafikë të veckël) nuk do të funksionojnë.",
+ "SystemCheckGDHelp": "Grafikët vijëzorë (grafikë të veckël) nuk do të funksionojnë.",
"SystemCheckGlobHelp": "Ky funksion i trupëzuar është i çaktivizuar te streha juaj. Piwik-u do të përpiqet ta emulojë këtë funksion por mund të hasë kufizime të mëtejshme sigurie. Kjo mund të ketë ndikim te funksionimi.",
"SystemCheckGzcompressHelp": "Lypset të aktivizoni zgjerimin zlib dhe funksionin gzcompress.",
"SystemCheckGzuncompressHelp": "Lypset të aktivizoni zgjerimin zlib dhe funksionin gzuncompress.",
@@ -83,34 +91,37 @@
"SystemCheckMbstringHelp": "Zgjerimi mbstring lypset për trajtimin e shenjave shumëbajtshe te ndërfaqja e përdoruesit dhe përgjigjet API. Shihni gjithashtu që mbstring.func_overload te php.ini i është dhënë vlera \"0\".",
"SystemCheckMemoryLimit": "Kufi kujtese",
"SystemCheckMemoryLimitHelp": "Në një sajt me shumë trafik, procesi i arkivimit mund të dojë më tepër kujtesë se sa i është dhënë tani. Në u dashtë, ndryshojeni parametrin memory_limit te kartela juaj php.ini.",
+ "SystemCheckNoErrorsOrWarnings": "S’ka gabime apo sinjalizime",
+ "SystemCheckViewFullSystemCheck": "Shihni raportin e plotë të kontrollit të sistemit",
"SystemCheckOpenURL": "Hap URL",
"SystemCheckOpenURLHelp": "Pajtimet në buletine, njoftime përditësimesh, dhe përditësimet me një klikim e duan zgjerimin \"curl\", allow_url_fopen=On, ose fsockopen() të aktivizuar.",
"SystemCheckOtherExtensions": "Zgjerime të tjera",
"SystemCheckOtherFunctions": "Funksione të tjerë",
"SystemCheckPageSpeedDisabled": "PageSpeed e çaktivizuar",
"SystemCheckPageSpeedWarn": "Këshillojmë çaktivizimin e modulit PageSpeed Module te shërbyesi juaj web %s: Është raportuar se PageSpeed shkakton një numër problemesh me Piwik-un.",
- "SystemCheckPackHelp": "Që të gjurmohen vizitorët me Piwik-un, funksioni pack() është i domosdoshëm.",
- "SystemCheckParseIniFileHelp": "Ky funksion i trupëzuar është i çaktivizuar te streha juaj. Piwik-u do të përpiqet ta emulojë këtë funksion por mund të hasë kufizime të mëtejshme sigurie. Edhe punimi i gjurmuesit do të preket nga kjo.",
+ "SystemCheckPackHelp": "Që të ndiqen vizitorët me Piwik-un, funksioni pack() është i domosdoshëm.",
+ "SystemCheckParseIniFileHelp": "Ky funksion i trupëzuar është i çaktivizuar te streha juaj. Piwik-u do të përpiqet ta emulojë këtë funksion por mund të hasë kufizime të mëtejshme sigurie. Nga kjo do të preket edhe punimi i ndjekësit.",
"SystemCheckPdoAndMysqliHelp": "Në një shërbyes Linux mund ta përpiloni php-në me mundësitë vijuese: %1$s te php.ini juaj, shtoni rreshtat vijues: %2$s",
"SystemCheckPhp": "Version PHP-je",
"SystemCheckPhpPdoAndMysqli": "Më tepër të dhëna te: %1$sPHP PDO%2$s dhe %3$sMYSQLI%4$s.",
"SystemCheckSplHelp": "Lypset të formësoni dhe krijoni PHP-në me Librarinë Standarde PHP të aktivizuar (si parazgjedhje).",
"SystemCheckSettings": "Formësim PHP-je i domosdoshëm (php.ini)",
- "SystemCheckSummaryNoProblems": "Urraaaaa! S’ka probleme me rregullimin tuaj të Piwik-ut. Rrihini shpatullat vetes.",
+ "SystemCheckSummaryNoProblems": "Urraaa! S’ka probleme me rregullimin tuaj të Piwik-ut. Rrihini shpatullat vetes.",
"SystemCheckSummaryThereWereErrors": "Ah! Piwik-u ka zbuluar disa %1$sçështje kritike%2$s me rregullimin tuaj për të. %3$sKëto çështje duhen ndrequr menjëherë.%4$s",
"SystemCheckSummaryThereWereWarnings": "Ka disa probleme me sistemin tuaj. Piwik-u do të funksionojë, por mund të hasni ca probleme të vockla.",
"SystemCheckTimeLimitHelp": "Në sajt me shumë trafik, përmbushja e procesit të arkivimit mund të dojë më tepër kohë se sa i është dhënë tani. Në u dashtë, ndryshojeni parametrin max_execution_time te kartela juaj php.ini.",
- "SystemCheckTracker": "Gjendje gjurmuesi",
+ "SystemCheckTracker": "Gjendje ndjekësi",
"SystemCheckTrackerHelp": "Kërkesa GET te piwik.php dështoi. Provoni ta kaloni këtë URL si një të lejuar nga Mirëfilltësimi HTTP dhe çaktivizoni mod_security (mund t’ju duhet t’i kërkoni ndihmë strehuesit tuaj web).Për më tepër të dhëna mbi gabimin, shihni kartelën e regjistrimit të gabimeve të shërbyesit tuaj web.",
"SystemCheckWarnDomHelp": "Do të duhej të aktivizonit zgjerimin \"dom\" (p.sh., instaloni paketën \"php-dom\" dhe\/ose \"php-xml\").",
"SystemCheckWarning": "Piwik-u do të punojë normalisht por mund t’i mungojnë disa veçori",
"SystemCheckWarnJsonHelp": "Do të duhej të aktivizonit zgjerimin \"json\" (p.sh., instaloni paketën \"php-json\") për punim më të mirë.",
"SystemCheckWarnLibXmlHelp": "Do të duhej të aktivizonit zgjerimin \"libxml\" (p.sh., paketën \"install the php-libxml\" ) meqë është e domosdoshme nga zgjerime të tjera bazë të PHP-së.",
"SystemCheckWarnSimpleXMLHelp": "Do të duhej të aktivizonit zgjerimin \"SimpleXML\" (p.sh., instaloni paketën \"php-simplexml\" dhe\/ose \"php-xml\").",
- "SystemCheckWinPdoAndMysqliHelp": "Në një shërbyes Windows mund të shtoni rreshtat vijues te php.ini juaj: %s",
+ "SystemCheckWinPdoAndMysqliHelp": "Në një shërbyes Windows, mund të shtoni rreshtat vijues te php.ini juaj: %s",
"SystemCheckWriteDirs": "Drejtori me hyrje për shkrim",
"SystemCheckWriteDirsHelp": "Për ndreqjen e këtij gabimi në sistemin tuaj Linux, provoni të shtypni urdhrin(at) vijues",
"SystemCheckZlibHelp": "Lypset të formësoni dhe rikrijoni PHP-në me mbulim të zlib-it të aktivizuar, --with-zlib.",
+ "SystemCheckCronArchiveProcess": "Cron Arkivi",
"SystemCheckCronArchiveProcessCLI": "Administrim procesesh përmes CLI-së",
"SystemCheckPhpSetting": "Që të parandaloni disa probleme kritike, duhet të rregulloni sa vijon te kartela juaj php.ini: %s",
"SystemCheckUpdateHttps": "Përditësoje përmes HTTPS-je",
@@ -118,7 +129,7 @@
"NotSupported": "e pambuluar",
"Tables": "Krijim Tabelash",
"TablesCreatedSuccess": "Tabelat u krijuan me sukses!",
- "TablesDelete": "Fshiji tabelat e pikasura",
+ "TablesDelete": "Fshiji tabelat e zbuluara",
"TablesDeletedSuccess": "Tabelat ekzistuese të Piwik-ut u fshinë me sukses",
"TablesFound": "Te baza e të dhënave u gjetën tabelat vijuese",
"TablesReuse": "Ripërdor tabelat ekzistuese",
@@ -128,7 +139,7 @@
"Timezone": "Zonë kohore e sajtit",
"WeHopeYouWillEnjoyPiwik": "Shpresojmë t’ju shijojë Piwik-i po aq sa na shijon neve krijimi i tij.",
"Welcome": "Mirë se vini!",
- "WelcomeHelp": "<p>Piwik-u është një program analize web, me burim të hapët, që e bën të lehtë të kihen të dhëna që dëshironi rreth vizitorëve tuaj.<\/p><p>Ky proces është ndarë në %s hapa të kollajtë dhe do të zgjasë rreth 5 minuta.<\/p>",
+ "WelcomeHelp": "<p>Piwik-u është një program analizash web, me burim të hapët, që e bën të lehtë të kihen të dhëna që dëshironi rreth vizitorëve tuaj.<\/p><p>Ky proces është ndarë në %s hapa të kollajtë dhe do të zgjasë rreth 5 minuta.<\/p>",
"WelcomeToCommunity": "Mirë se vini te bashkësia Piwik!",
"CannotConnectToDb": "S’lidhet dot me bazën e të dhënave",
"CannotConnectToDbResolvingExplanation": "Ky mund të jetë problem i përkohshëm, provoni %1$stë rifreskoni faqen%2$s. Nëse problemi vazhdon, ju lutemi lidhuni me përgjegjësin e Piwik-ut tuaj."
diff --git a/plugins/Installation/lang/sr.json b/plugins/Installation/lang/sr.json
index 1468c49a30..9c649e0e6b 100644
--- a/plugins/Installation/lang/sr.json
+++ b/plugins/Installation/lang/sr.json
@@ -36,11 +36,17 @@
"NfsFilesystemWarning": "Vaš server koristi NFS sistem datoteka.",
"NfsFilesystemWarningSuffixAdmin": "To znači da će Piwik biti jako spor ako koristite sesije bazirane na datotekama.",
"NfsFilesystemWarningSuffixInstall": "Korišćene sesija na bazi datoteka na NFS sistemu je jako sporo tako da će piwik koristiti sesije u bazi podataka. Ako imate puno istovremenih korisnika Konzole, možda ćete morati da povećate maksimalan broj klijentskih konekcija ka serveru sa bazom.",
+ "NoConfigFileFound": "Datoteka sa Piwik podešavanjima nije nađena dok vi pokušavate da pristupite Piwik stranici.",
+ "YouMayInstallPiwikNow": "Sada možete da %1$sinstalirate Piwik%2$s",
+ "IfPiwikInstalledBeforeTablesCanBeKept": "Ukoliko ste već ranije instalirali Piwik i imate neke tabele u bazi podataka, bez brige: možete nastaviti da ih koristite i zadržite postojeće podatke!",
"Optional": "Opciono",
"Password": "Lozinka",
"PasswordDoNotMatch": "lozinke se ne podudaraju",
"PasswordRepeat": "Lozinka (ponovo)",
"PercentDone": "%s %% Završeno",
+ "ProfessionalServicesAdTitle": "Napredne analitike i usluge",
+ "ProfessionalServicesfessionalServicesAdText": "Naša mreža eksperata može da pomogne vašoj organizaciji da otključa punu snagu Piwik analitika.",
+ "ProfessionalServicesfessionalDiscoverHow": "Pogledajte %1$sdodatne Piwik proizvode i usluge%2$s i kako da povećate vaše konverzije i prihode.",
"PleaseFixTheFollowingErrors": "Molimo vas da ispravite sledeće greške",
"DefaultSettings": "Podrazumevana Piwik podešavanja",
"DefaultSettingsHelp": "Piwik dolazi sa podrazumevanim podešavanjima. Možete ih sada izmeniti ili kasnije preko administratorskog panela.",
@@ -48,6 +54,7 @@
"RestartWebServer": "Nakon ovih izmena restartujte vaš web server",
"ReusingTables": "Ponovna upotreba tabela",
"PiwikOrgNewsletter": "pošalji mi mejl kada dođe do značajne Piwik izmene",
+ "ProfessionalServicesNewsletter": "pošalji mi informacije o %1$sprofesionalnim uslugama i proizvodima%2$s za Piwik",
"SeeBelowForMoreInfo": "Pogledajte ispod za više informacija.",
"SetupWebsite": "Podešavanje sajta",
"SetupWebsiteError": "Došlo je do greške prilikom dodavanja sajta",
@@ -84,6 +91,8 @@
"SystemCheckMbstringHelp": "mbstring proširenje je neophodno kako bi se upravljalo višebajtnim karakterima u interfejsu i API odgovorima. Takođe proverite da je mbstring.func_overload postavljen na \"0\" u datoteci php.ini.",
"SystemCheckMemoryLimit": "Memorijsko ograničenje",
"SystemCheckMemoryLimitHelp": "Na sajtovima sa visokim saobraćajem proces arhiviranja podataka može zahtevati više memorije nego što je to trenutno dozvoljeno.<br \/>Promenite vrednost parametra memory_limit u php.ini datoteci ukoliko je to neophodno.",
+ "SystemCheckNoErrorsOrWarnings": "Nema grešaka i upozorenja",
+ "SystemCheckViewFullSystemCheck": "Prikaži pun izveštaj o sistemu",
"SystemCheckOpenURL": "Otvori adresu",
"SystemCheckOpenURLHelp": "Pretplate na listu slanja, obaveštenja o nadogradnjama i nadogradnja na jedan klik zahtevaju \"curl\" proširenje kao i da je omogućeno allow_url_fopen=On ili fsockopen()",
"SystemCheckOtherExtensions": "Ostala proširenja",
diff --git a/plugins/Installation/lang/tr.json b/plugins/Installation/lang/tr.json
index 83ff4a0dd5..53d328fa29 100644
--- a/plugins/Installation/lang/tr.json
+++ b/plugins/Installation/lang/tr.json
@@ -1,22 +1,26 @@
{
"Installation": {
- "ConfigurationHelp": "Piwik konfigürasyon dosyası yanlış yapılandırılmış. config\/config.ini.php dosyasını silin ve kuruluma devam edin, yada veritabanı bağlantınızı doğru yapın.",
- "ConfirmDeleteExistingTables": "%s veritabanından tabloları silmek istediğinizden emin misiniz? UYARI: TABLODAN VERILER YENIDEN ALINAMAZ!",
+ "CollaborativeProject": "Piwik tüm dünyadan katılımcıların sevgisiyle oluşturduğu bir topluluk projesidir.",
+ "ConfigurationHelp": "Piwik yapılandırma dosyası hatalı ayarlanmış gibi görünüyor. config\/config.ini.php dosyasını silerek yüklemeye devam edebilir ya da veritabanı bağlantı ayarlarınızı düzeltebilirsiniz.",
+ "ConfirmDeleteExistingTables": "Veritabanından %s tablolarını silmek istediğinize emin misiniz? UYARI: SİLİNDİKTEN SONRA BU TABLOLARDAKİ VERİLER GERİ ALINAMAZ!",
"Congratulations": "Tebrikler",
- "CongratulationsHelp": "<p>Tebrikler! Piwik Başarıyla kuruldu.<\/p><p>JavaScript kodunu sayfalarınıza yerleştirdiğinizden emin olun ve ilk ziyaretçilerinizi beklemeye başlayın!<\/p>",
+ "CongratulationsHelp": "<p>Tebrikler! Piwik kurulumu tamamlandı.<\/p><p>JavaScript kodunu sayfalarınıza yerleştirdiğinizden emin olun ve ilk ziyaretçilerinizi beklemeye başlayın!<\/p>",
+ "DatabaseAbilities": "Veritabanı yetenekleri",
"DatabaseCreation": "Veritabanı oluşturma",
- "DatabaseErrorConnect": "Veritabanına bağlanırken hata oluştu",
- "DatabaseServerVersion": "Veritabanı sunucu versiyonu",
- "DatabaseSetup": "Veritabanı Yüklemesi",
- "DatabaseSetupDatabaseName": "Veritabanı adı",
- "DatabaseSetupLogin": "Giriş",
+ "DatabaseErrorConnect": "Veritabanına bağlanılırken bir sorun çıktı",
+ "DatabaseServerVersion": "Veritabanı sunucusu sürümü",
+ "DatabaseSetup": "Veritabanı Kurulumu",
+ "DatabaseSetupAdapter": "Bağdaştırıcı",
+ "DatabaseSetupDatabaseName": "Veritabanı Adı",
+ "DatabaseSetupLogin": "Oturum Açın",
"DatabaseSetupServer": "Veritabanı Sunucusu",
- "DatabaseSetupTablePrefix": "Tablo öneki",
+ "DatabaseSetupTablePrefix": "Tablo Ön Eki",
"Email": "E-posta",
"Extension": "eklenti",
- "Filesystem": "Dosya sistemi",
- "GoBackAndDefinePrefix": "Geri dönün ve Piwik Tabloları için tablo ön eki tanımlayınız.",
- "HappyAnalysing": "Mutlu Analizler!",
+ "Filesystem": "Dosya Sistemi",
+ "GetInvolved": "Gördükleriniz hoşunuza gittiyse %1$skatkıda bulunabilirsiniz%2$s.",
+ "GoBackAndDefinePrefix": "Geri dönerek Piwik Tabloları için bir tablo ön eki belirtin",
+ "HappyAnalysing": "Mutlu incelemeler!",
"Installation": "Yükleme",
"InstallationStatus": "Yükleme durumu",
"InvalidStateError": "Hata: Piwik zaten kurulmuş. %1$s Geri dön %2$s Piwik%3$s.",
diff --git a/plugins/LanguagesManager/Commands/CreatePull.php b/plugins/LanguagesManager/Commands/CreatePull.php
index fca1fc76aa..0af07259ff 100644
--- a/plugins/LanguagesManager/Commands/CreatePull.php
+++ b/plugins/LanguagesManager/Commands/CreatePull.php
@@ -19,7 +19,7 @@ use Symfony\Component\Console\Output\OutputInterface;
*/
class CreatePull extends TranslationBase
{
- const GIT_BASE_BRANCH = '2.x-dev';
+ const GIT_BASE_BRANCH = '3.x-dev';
protected function configure()
{
@@ -187,7 +187,7 @@ class CreatePull extends TranslationBase
while (true) {
- $username = $dialog->ask($output, 'Please provide your github username (to create a pull request using Github API): ');
+ $username = $dialog->ask($output, 'Please provide your GitHub username (to create a pull request using GitHub API): ');
$returnCode = shell_exec('curl \
-X POST \
diff --git a/plugins/LanguagesManager/Test/Integration/LanguagesManagerTest.php b/plugins/LanguagesManager/Test/Integration/LanguagesManagerTest.php
index 0017cb3729..0ff66919ce 100755
--- a/plugins/LanguagesManager/Test/Integration/LanguagesManagerTest.php
+++ b/plugins/LanguagesManager/Test/Integration/LanguagesManagerTest.php
@@ -96,6 +96,13 @@ class LanguagesManagerTest extends \PHPUnit_Framework_TestCase
if ($translationWriter->wasFiltered()) {
+ if (!$translationWriter->hasTranslations()) {
+ $this->markTestSkipped('Translation file errors detected in ' . $language . "...\n"
+ . "File would be empty after filtering. You may remove it manually to fix this test.\n"
+ );
+ return;
+ }
+
$translationWriter->saveTemporary();
$this->markTestSkipped(implode("\n", $translationWriter->getFilterMessages()) . "\n"
. 'Translation file errors detected in ' . $language . "...\n"
diff --git a/plugins/LanguagesManager/lang/ko.json b/plugins/LanguagesManager/lang/ko.json
index f5485e3a35..835f2b2636 100644
--- a/plugins/LanguagesManager/lang/ko.json
+++ b/plugins/LanguagesManager/lang/ko.json
@@ -1,5 +1,6 @@
{
"LanguagesManager": {
- "AboutPiwikTranslations": "Piwik 번역에 대해"
+ "AboutPiwikTranslations": "Piwik 번역에 대해",
+ "TranslationSearch": "번역본 검색"
}
} \ No newline at end of file
diff --git a/plugins/Live/lang/es.json b/plugins/Live/lang/es.json
index 495242ead6..4bf0314e4d 100644
--- a/plugins/Live/lang/es.json
+++ b/plugins/Live/lang/es.json
@@ -1,5 +1,6 @@
{
"Live": {
+ "AbandonedCartSummary": "%1$s carritos abandonadoss%2$s y %3$s artículos abandonados%4$s por un total de %5$s%6$s.",
"AveragePageGenerationTime": "Cada página tomó en promedio %1$s para cargar este visitante.",
"CalculatedOverNPageViews": "Calculado usando las últimas %1$s páginas vistas de este visitante.",
"ClickToViewMoreAboutVisit": "Clic para ver más información acerca de esta visita.",
diff --git a/plugins/Live/lang/nb.json b/plugins/Live/lang/nb.json
index 5ac8a3275c..cb6f32881f 100644
--- a/plugins/Live/lang/nb.json
+++ b/plugins/Live/lang/nb.json
@@ -23,7 +23,7 @@
"VisitorProfile": "Besøksprofil",
"VisitorsInRealTime": "Besøkende i sanntid",
"VisitsFrom": "%1$s%2$s besøk%3$s fra",
- "VisitSummaryWithActionDetails": "Brukte totalt %1$s%2$s på nettsiden%3$s og utførte %4$s handlinger%5$s (%6$s) over %7$s besøk%8$s.",
+ "VisitSummaryWithActionDetails": "Brukte totalt %1$s%2$s på nettstedet%3$s, og utførte %4$s handlinger%5$s (%6$s) i løpet av %7$s besøk%8$s.",
"OnClickPause": "%s er startet. Klikk for å sette på pause.",
"OnClickStart": "%s er stoppet. Klikk for å starte."
}
diff --git a/plugins/Live/lang/sq.json b/plugins/Live/lang/sq.json
index 52b75c2ebd..be79abf477 100644
--- a/plugins/Live/lang/sq.json
+++ b/plugins/Live/lang/sq.json
@@ -1,6 +1,11 @@
{
"Live": {
+ "AbandonedCartSummary": "%1$s shporta të braktisura%2$s dhe %3$s artikuj të braktisur%4$s me vlerë gjithsej %5$s%6$s.",
+ "AveragePageGenerationTime": "Për këtë vizitor, çdo faqeje iu desh mesatarisht %1$s të ngarkohej.",
+ "CalculatedOverNPageViews": "E llogaritur duke përdorur %1$s parjet e fundit të faqeve nga ky vizitor.",
"ClickToViewMoreAboutVisit": "Klikoni që të shihni më tepër të dhëna rreth kësaj vizite",
+ "ConvertedNGoals": "U shndërruan %s Objektiva",
+ "EcommerceSummaryConversions": "%1$s porosi%2$s për një tërësi prej %3$s%4$s, %5$s artikuj%6$s të blerë.",
"FirstVisit": "Vizita e parë",
"GoalType": "Lloj",
"HideMap": "fshihe hartën",
@@ -9,11 +14,34 @@
"LastMinutes": "%s minutat e fundit",
"LastVisit": "Vizita e fundit",
"LinkVisitorLog": "Shihni regjistër të hollësishëm të përdoruesit",
- "PageRefreshed": "Sa herë rresht është parë \/ rifreskuar kjo faqew.",
- "Referrer_URL": "URL Referuesi",
+ "LoadMoreVisits": "Ngarko më tepër vizita",
+ "MorePagesNotDisplayed": "faqe të tjera nga ky vizitor nuk janë shfaqur",
+ "NbVisitor": "1 vizitor",
+ "NbVisitors": "%s vizitorë",
+ "NextVisitor": "Vizitori pasues",
+ "NoMoreVisits": "S’ka më vizita për këtë vizitor.",
+ "PageRefreshed": "Sa herë rresht është parë \/ rifreskuar kjo faqe.",
+ "PluginDescription": "Furnizon Regjistër Vizitorësh live dhe ju lejon të shihni vizitorët drejtpërsëdrejti, te widget-i real-time i pultit . Shtojca ju lejon gjithashtu të shihni profil Vizitori për cilindo përdorues.",
+ "PreviousVisitor": "Vizitori i mëparshëm",
+ "RealTimeVisitorCount": "Numërim Vizitorësh i Atypëratyshëm",
+ "Referrer_URL": "URL Sjellësi",
+ "ShowMap": "shfaq hartën",
+ "SimpleRealTimeWidget_Message": "%1$s dhe %2$s në %3$s e fundit",
+ "ViewVisitorProfile": "Shini profilin e vizitorit",
+ "VisitedPages": "Faqe të vizituara",
"VisitorLog": "Regjistër Vizitori",
- "VisitorLogDocumentation": "Kjo tabelë tregon vizitat e fundit brenda intervalit kohor të përzgjedhur. Se kur u bë vizita e fundit nga një vizitor mund ta shihni duke kaluar kursorin përsipër datës së një vizite. %1$s Nëse intervali kohor e përfshin ditën e sotme, mund t’i shihni vizitorët aty për aty! %2$s Të dhënat e shfaqura këtu janë përherë më të rejat, pavarësisht nëse e përdorni a jo dhe se sa shpesh funksionin cron për arkivim.",
+ "VisitorLogDocumentation": "Kjo tabelë tregon vizitat e fundit brenda intervalit kohor të përzgjedhur. Se kur u bë vizita e fundit nga një vizitor, mund ta shihni duke kaluar kursorin përsipër datës së një vizite. %1$s Nëse intervali kohor e përfshin ditën e sotme, mund t’i shihni vizitorët aty për aty! %2$s Të dhënat e shfaqura këtu janë përherë më të rejat, pavarësisht nëse e përdorni apo jo, dhe se sa shpesh, funksionin cron për arkivim.",
+ "VisitorProfile": "Profil vizitori",
"VisitorsInRealTime": "Vizitorë në Kohë Reale",
- "VisitorsLastVisit": "Vizita e fundit e këtij vizitori ndodhi %s ditë më parë."
+ "VisitorsLastVisit": "Vizita e fundit e këtij vizitori ndodhi %s ditë më parë.",
+ "VisitsFrom": "%1$s%2$s vizita%3$s nga",
+ "VisitSummary": "Shpenzoi gjithsej %1$s%2$s në sajtin%3$s, dhe pa %4$s faqe%5$s gjatë %6$s vizitash%7$s.",
+ "VisitSummaryWithActionDetails": "Shpenzoi gjithsej %1$s%2$s në sajtin%3$s, dhe kreu %4$s veprime%5$s (%6$s) gjatë %7$s vizitash%8$s.",
+ "RowActionTooltipDefault": "Shfaq Regjistër Vizitorësh të segmentuar nga ky rresht",
+ "RowActionTooltipWithDimension": "Shfaq Regjistër Vizitorësh të segmentuar nga ky\/kjo %s",
+ "RowActionTooltipTitle": "Hap Regjistër të segmentuar Vizitorësh",
+ "SegmentedVisitorLogTitle": "Regjistër Vizitorësh që shfaq vizita ku %1$s është \"%2$s\"",
+ "OnClickPause": "%s është nisur. Klikoni që të ndalet.",
+ "OnClickStart": "%s është ndalur. Klikoni që të niset."
}
} \ No newline at end of file
diff --git a/plugins/Live/lang/sr.json b/plugins/Live/lang/sr.json
index d84b91cfa1..3c34885612 100644
--- a/plugins/Live/lang/sr.json
+++ b/plugins/Live/lang/sr.json
@@ -1,9 +1,11 @@
{
"Live": {
+ "AbandonedCartSummary": "%1$s napuštenih koripi%2$s i %3$s napuštenih artikala%4$s ukupne vrednosti %5$s%6$s.",
"AveragePageGenerationTime": "Ovom korisniku je za svaku stranicu u proseku potrebno %1$s kako bi se učitala.",
"CalculatedOverNPageViews": "Izračunato na osnovu poslednjih %1$s prikaza stranica ovog korisnika",
"ClickToViewMoreAboutVisit": "Kliknite kako biste videli više informacija o ovoj poseti.",
"ConvertedNGoals": "Ispunjeno ciljeva: %s",
+ "EcommerceSummaryConversions": "%1$s narudžbina%2$s od ukupno %3$s%4$s, naručeno %5$s artikala%6$s.",
"FirstVisit": "Prva poseta",
"GoalType": "Tip",
"HideMap": "sakrij mapu",
@@ -33,6 +35,8 @@
"VisitorsInRealTime": "Posetioci u realnom vremenu",
"VisitorsLastVisit": "Poslednja poseta je bila pre %s dana.",
"VisitsFrom": "%1$s%2$s poseta%3$s sa",
+ "VisitSummary": "Utrošeno ukupno %1$s%2$s na sajtu%3$s, prikazano %4$s stranica%5$s u %6$s poseta%7$s.",
+ "VisitSummaryWithActionDetails": "Utrošeno ukupno %1$s%2$s na sajtu%3$s, izvršeno %4$s akcija%5$s (%6$s) u %7$s poseta%8$s.",
"RowActionTooltipDefault": "Prikaži zapis poseta podeljen ovim redom",
"RowActionTooltipWithDimension": "Prikaži zapis poseta podeljen %s",
"RowActionTooltipTitle": "Otvori podeljeni zapis psoeta",
diff --git a/plugins/Login/Controller.php b/plugins/Login/Controller.php
index 707f9a2c9f..01c115333f 100644
--- a/plugins/Login/Controller.php
+++ b/plugins/Login/Controller.php
@@ -361,6 +361,8 @@ class Controller extends \Piwik\Plugin\Controller
*/
public function logout()
{
+ Piwik::postEvent('Login.logout', array(Piwik::getCurrentUserLogin()));
+
self::clearSession();
$logoutUrl = @Config::getInstance()->General['login_logout_url'];
diff --git a/plugins/Login/SessionInitializer.php b/plugins/Login/SessionInitializer.php
index 72013d2b8c..2caca89aff 100644
--- a/plugins/Login/SessionInitializer.php
+++ b/plugins/Login/SessionInitializer.php
@@ -114,6 +114,9 @@ class SessionInitializer
$authResult = $this->doAuthenticateSession($auth);
if (!$authResult->wasAuthenticationSuccessful()) {
+
+ Piwik::postEvent('Login.authenticate.failed', array($auth->getLogin()));
+
$this->processFailedSession($rememberMe);
} else {
$this->processSuccessfulSession($authResult, $rememberMe);
@@ -131,6 +134,13 @@ class SessionInitializer
*/
protected function doAuthenticateSession(AuthInterface $auth)
{
+ Piwik::postEvent(
+ 'Login.authenticate',
+ array(
+ $auth->getLogin(),
+ )
+ );
+
return $auth->authenticate();
}
diff --git a/plugins/Login/lang/bg.json b/plugins/Login/lang/bg.json
index 4044f52a62..24526fb06c 100644
--- a/plugins/Login/lang/bg.json
+++ b/plugins/Login/lang/bg.json
@@ -14,7 +14,6 @@
"PasswordChanged": "Вашата парола е сменена.",
"PasswordRepeat": "Парола (повторно)",
"PasswordsDoNotMatch": "Паролите не съвпадат.",
- "RememberMe": "Запомни ме",
- "ResetPasswordInstructions": "Въведете нова парола за акаунта си."
+ "RememberMe": "Запомни ме"
}
} \ No newline at end of file
diff --git a/plugins/Login/lang/ca.json b/plugins/Login/lang/ca.json
index 8d87727ebc..18177f3865 100644
--- a/plugins/Login/lang/ca.json
+++ b/plugins/Login/lang/ca.json
@@ -15,7 +15,6 @@
"PasswordChanged": "S'ha canviat la vostra contrasenya",
"PasswordRepeat": "Contrasenya (torneu-la a escriure)",
"PasswordsDoNotMatch": "Les contrasenyes no coincideixen",
- "RememberMe": "Recorda'm",
- "ResetPasswordInstructions": "Introduiu una nova contrasenya pel vostre compte."
+ "RememberMe": "Recorda'm"
}
} \ No newline at end of file
diff --git a/plugins/Login/lang/cs.json b/plugins/Login/lang/cs.json
index 39c4b874b0..8b15e1955e 100644
--- a/plugins/Login/lang/cs.json
+++ b/plugins/Login/lang/cs.json
@@ -1,24 +1,26 @@
{
"Login": {
- "ConfirmationLinkSent": "Do vaší schránky byl odeslán potvrzovací e-mail. Pro potvrzení požadavku na změnu hesla navštivte odkaz uvedený v e-mailu.",
- "ContactAdmin": "Možná příčina: Váš hosting zakázal funkci mail().. <br \/>Prosím kontaktujte svého administrátora Piwiku.",
+ "ConfirmationLinkSent": "Do schránky vám byl odeslán potvrzovací email. Pro potvrzení požadavku na změnu hesla navštivte odkaz uvedený v emailu.",
+ "ContactAdmin": "Možná příčina: Váš hosting zakázal funkci mail(). <br \/>Kontaktujte prosím svého administrátora Piwiku.",
"ExceptionInvalidSuperUserAccessAuthenticationMethod": "Uživatel se super-uživatelským přístupem nemůže být ověřen mechanismem %s.",
"ExceptionPasswordMD5HashExpected": "Parametr hesla je očekáván jako MD5 hash hesla",
"InvalidNonceOrHeadersOrReferrer": "Zabezpečení formuláře selhalo. Prosím obnovte formulář a zkontrolujte, že máte povolené cookies. Pokud používáte proxy server, %1$smusíte nakonfigurovat Piwik aby přijímal proxy hlavičku%2$s, která přeposílá hlavičku hosta. Zkontrolujte také, že je správně posílána hlavička referrer.",
"InvalidNonceSSLMisconfigured": "Můžete také %1$s přinutit Piwik používat zabezpečené připojení%2$s: ve svém konfiguračním souboru %3$s nastavte %4$s pod sekci %5$s",
"InvalidOrExpiredToken": "Klíč je neplatný, nebo vypršel",
- "InvalidUsernameEmail": "Neplatné uživatelské jméno a\/nebo e-mailová adresa",
+ "InvalidUsernameEmail": "Neplatné uživatelské jméno a\/nebo emailová adresa",
"LogIn": "Přihlásit",
- "LoginOrEmail": "Uživatelské jméno nebo E-mail",
+ "LoginOrEmail": "Uživatelské jméno nebo email",
"LoginPasswordNotCorrect": "Chybná kombinace uživatelského jména a hesla.",
"LostYourPassword": "Zapomněli jste vaše heslo?",
+ "ChangeYourPassword": "Změnit své heslo",
"MailPasswordChangeBody": "Ahoj %1$s,\n\nz %2$s byl přijat požadavek na reset hesla. Abyste se mohli přihlásit s novými přihlašovacími údaji, navštivte následující odkaz:\n\n%3$s\n\nUpozornění: Změna hesla rovněž změní váš token_auth. Váš nový token_auth naleznete na stránce s vaším nastavením\n\nPokud používáte váš token_auth v externích aplikacích nebo pro archivaci, nezapomeňte h změnit, jinak API požadavky selžou\n\nPoznámka: tento odkaz vyprší za 24 hodin.\n\nA děkujeme, že používáte Piwik!",
"MailTopicPasswordChange": "Potvrďte změnu hesla",
+ "NewPassword": "Nové heslo",
+ "NewPasswordRepeat": "Nové heslo (opakovat)",
"PasswordChanged": "Vaše heslo bylo změněno.",
"PasswordRepeat": "Heslo (pro kontrolu)",
"PasswordsDoNotMatch": "Hesla si neodpovídají",
"PluginDescription": "Poskytuje autentizaci jménem a heslem a funkcionalitu obnovy hesla. Metodu přihlašování můžete změnit pomocí zásuvného modulu přihlašování, kterým je například LoginLdap dostupný z obchodu.",
- "RememberMe": "Zapamatovat si",
- "ResetPasswordInstructions": "Zadejte nové heslo k Vašemu účtu."
+ "RememberMe": "Zapamatovat si"
}
} \ No newline at end of file
diff --git a/plugins/Login/lang/da.json b/plugins/Login/lang/da.json
index 9be1068669..e161d96fc8 100644
--- a/plugins/Login/lang/da.json
+++ b/plugins/Login/lang/da.json
@@ -16,7 +16,6 @@
"PasswordRepeat": "Adgangskode (gentag)",
"PasswordsDoNotMatch": "Adgangskoder er ikke ens.",
"PluginDescription": "Giver godkendelse via brugernavn og adgangskode samt nulstilling af adgangskode funktionalitet. Godkendelsesmetoden kan ændres ved hjælp af en anden logind udvidelse såsom LoginLDAP, som er tilgængelig på markedspladsen.",
- "RememberMe": "Husk mig",
- "ResetPasswordInstructions": "Indtast en ny adgangskode til din konto."
+ "RememberMe": "Husk mig"
}
} \ No newline at end of file
diff --git a/plugins/Login/lang/de.json b/plugins/Login/lang/de.json
index 0d606e4cf1..45eab04ffc 100644
--- a/plugins/Login/lang/de.json
+++ b/plugins/Login/lang/de.json
@@ -12,13 +12,15 @@
"LoginOrEmail": "Benutzername oder E-Mail",
"LoginPasswordNotCorrect": "Benutzername und Passwort sind nicht korrekt",
"LostYourPassword": "Passwort vergessen?",
+ "ChangeYourPassword": "Ändern Sie ihr Passwort",
"MailPasswordChangeBody": "Hallo %1$s,\n\nEine Anfrage zum Zurücksetzen des Passworts von %2$s wurde empfangen. Um die Passwortänderung zu bestätigen, damit Sie sich mit Ihren neuen Zugangsdaten anmelden können, besuchen Sie folgenden Link:\n\n%3$s\n\nAchtung: Das Ändern des Passworts wird auch Ihren token_auth ändern. Sie können den neuen token_auth bei Ihren Einstellungen einsehen.\n\nFalls Sie Ihren API token_auth in einem externen Programm oder für die Archivierung einsetzen, vergewissern Sie sich bitte, dass der token_auth aktualisiert wird, sonst werden die Anfragen an die API fehlschlagen.\n\nHinweis: Der Link ist nur 24 Stunden gültig.\n\nUnd vielen Dank, dass Sie Piwik verwenden!",
"MailTopicPasswordChange": "Passwortänderung bestätigen",
+ "NewPassword": "Neues Passwort",
+ "NewPasswordRepeat": "Neues Passwort (Wiederholung)",
"PasswordChanged": "Das Passwort wurde geändert.",
"PasswordRepeat": "Passwort (wiederholen)",
"PasswordsDoNotMatch": "Die Passwörter stimmen nicht überein.",
"PluginDescription": "Unterstützt Authentifizierung via Benutzername und Passwort sowie Password Reset Funktionalität. Die Authentifizierungsmethode kann durch ein anderes Login Plugin wie LoginLdap (verfügbar im Marketplace) geändert werden.",
- "RememberMe": "Angemeldet bleiben",
- "ResetPasswordInstructions": "Geben Sie ein neues Passwort für Ihren Account ein."
+ "RememberMe": "Angemeldet bleiben"
}
} \ No newline at end of file
diff --git a/plugins/Login/lang/el.json b/plugins/Login/lang/el.json
index 4657d11fb7..11260f055c 100644
--- a/plugins/Login/lang/el.json
+++ b/plugins/Login/lang/el.json
@@ -12,13 +12,15 @@
"LoginOrEmail": "Χρήστης ή Ηλεκτρονική διεύθυνση",
"LoginPasswordNotCorrect": "Το όνομα χρήστη και ο κωδικός δεν είναι σωστά",
"LostYourPassword": "Ξεχάσατε τον κωδικό σας;",
+ "ChangeYourPassword": "Αλλαγή του συνθηματικού σας",
"MailPasswordChangeBody": "Γεια σας %1$s,\n\nΈχει ληφθεί αίτηση αρχικοποίησης του συνθηματικού από %2$s. Για να επιβεβαιώσετε την αλλαγή συνθηματικού ώστε να μπορείτε να κάνετε είσοδο με τα νέα σας στοιχεία, επισκεφθείτε τον παρακάτω σύνδεσμο:\n\n%3$s\n\nΠροσοχή: Η αλλαγή του συνθηματικού θα προκαλέσει την αλλαγή του token_auth. Μπορείτε να δείτε το νέο σας token_auth στη σελίδα ρυθμίσεων σας.\n\nΑν χρησιμοποιείτε το token_auth με API από εξωτερικές εφαρμογές ή για την αρχειοθέτηση, βεβαιωθείτε να το ενημερώσετε, διαφορετικά οι κλήσεις στο API θα αποτυγχάνουν.\n\nΣημείωση: Ο σύνδεσμος θα λήξει σε 24 ώρες.\n\nΕυχαριστούμε που χρησιμοποιείτε το Piwik!",
"MailTopicPasswordChange": "Επιβεβαίωση Αλλαγής Κωδικού",
+ "NewPassword": "Νέο συνθηματικό",
+ "NewPasswordRepeat": "Νέο συνθηματικό (επανάληψη)",
"PasswordChanged": "Ο κωδικός σας έχει αλλάξει.",
"PasswordRepeat": "Κωδικός (επανάληψη)",
"PasswordsDoNotMatch": "Οι κωδικοί δεν ταιριάζουν.",
"PluginDescription": "Παρέχει αυθεντικοποίηση μέσω ονόματος χρήστη και συνθηματικού όπως επίσης και λειτουργικότητα επαναφοράς συνθηματικού. Η μέθοδος αυθεντικοποίησης μπορεί να αλλαχθεί χρησιμοποιώντας άλλο πρόσθετο, όπως το LoginLdap που υπάρχει διαθέσιμο στην Αγορά.",
- "RememberMe": "Απομνημόνευση",
- "ResetPasswordInstructions": "Εισάγετε έναν νέο κωδικό για τον λογαριασμό σας."
+ "RememberMe": "Απομνημόνευση"
}
} \ No newline at end of file
diff --git a/plugins/Login/lang/es.json b/plugins/Login/lang/es.json
index 79ee9ce391..ed0ad722d7 100644
--- a/plugins/Login/lang/es.json
+++ b/plugins/Login/lang/es.json
@@ -12,13 +12,15 @@
"LoginOrEmail": "Usuario o correo electrónico",
"LoginPasswordNotCorrect": "Usuario y contraseña incorrectos.",
"LostYourPassword": "¿Olvidó la contraseña?",
+ "ChangeYourPassword": "Cambiar su contraseña",
"MailPasswordChangeBody": "Hola %1$s,\n\nUna solicitud de reestablecimiento de contraseña fue recibida desde %2$s. Para confirmar este cambio de contraseña para iniciar sesión con sus nuevas credenciales, visite el siguiente enlace:\n\n%3$s\n\nAtención: Cambiar su contraseña hará también que cambie su token_auth. Puede verificarlo en su página de ajustes.\n\nSi está utilizando su API token_auth en cualquier aplicación externa o a solo fines de archivado, asegúrese de actualizar su token_auth en tanto que cualquier petición a la API generá un error.\n\nNota: este enlace caducará transcurridas 24 horas.\n\nGracias por usar Piwik!",
"MailTopicPasswordChange": "Confirma el cambio de contraseña",
+ "NewPassword": "Nueva contraseña",
+ "NewPasswordRepeat": "Nueva contraseña (repetir)",
"PasswordChanged": "Su contraseña ha sido modificada.",
"PasswordRepeat": "Contraseña (repetir)",
"PasswordsDoNotMatch": "Las contraseñas no coinciden.",
"PluginDescription": "Proporciona autentificación vía un nombre de usuario y contraseña así como también la funcionalidad de reestablecimiento de contraseña. El método de autentificación puede ser modificado usando otro complemento de inicio de sesión, tal como LoginLdap que se encuentra disponible en el Mercado.",
- "RememberMe": "Recordarme",
- "ResetPasswordInstructions": "Introduzca una nueva contraseña para su cuenta."
+ "RememberMe": "Recordarme"
}
} \ No newline at end of file
diff --git a/plugins/Login/lang/et.json b/plugins/Login/lang/et.json
index a446f10861..9162605678 100644
--- a/plugins/Login/lang/et.json
+++ b/plugins/Login/lang/et.json
@@ -11,7 +11,6 @@
"PasswordChanged": "Sinu salasõna on vahetatud.",
"PasswordRepeat": "Salasõna (kordus)",
"PasswordsDoNotMatch": "Salasõnad ei kattu.",
- "RememberMe": "Pea meeles",
- "ResetPasswordInstructions": "Sisesta oma konto jaoks uus salasõna."
+ "RememberMe": "Pea meeles"
}
} \ No newline at end of file
diff --git a/plugins/Login/lang/fa.json b/plugins/Login/lang/fa.json
index cad8c7308a..6794a94057 100644
--- a/plugins/Login/lang/fa.json
+++ b/plugins/Login/lang/fa.json
@@ -13,7 +13,6 @@
"PasswordChanged": "رمزعبور شما تغییر کرد.",
"PasswordRepeat": "تکرار رمزعبور",
"PasswordsDoNotMatch": "رمزعبور ها یکسان نیستند.",
- "RememberMe": "مرا به خاطر داشته باش",
- "ResetPasswordInstructions": "یک رمزعبور جدید برای حساب کاربری تان وارد کنید."
+ "RememberMe": "مرا به خاطر داشته باش"
}
} \ No newline at end of file
diff --git a/plugins/Login/lang/fi.json b/plugins/Login/lang/fi.json
index 23331808a5..5cac73e20f 100644
--- a/plugins/Login/lang/fi.json
+++ b/plugins/Login/lang/fi.json
@@ -15,7 +15,6 @@
"PasswordChanged": "Salasana on vaihdettu.",
"PasswordRepeat": "Salasana (uudelleen)",
"PasswordsDoNotMatch": "Salasanat eivät täsmää.",
- "RememberMe": "Muista minut",
- "ResetPasswordInstructions": "Anna uusi salasana."
+ "RememberMe": "Muista minut"
}
} \ No newline at end of file
diff --git a/plugins/Login/lang/fr.json b/plugins/Login/lang/fr.json
index ee65f9e94c..b5439e7b69 100644
--- a/plugins/Login/lang/fr.json
+++ b/plugins/Login/lang/fr.json
@@ -12,13 +12,15 @@
"LoginOrEmail": "Nom d'utilisateur ou courriel",
"LoginPasswordNotCorrect": "Mot de passe et nom d'utilisateur incorrects.",
"LostYourPassword": "Mot de passe perdu ?",
+ "ChangeYourPassword": "Changer de mot de passe",
"MailPasswordChangeBody": "Bonjour %1$s,\n\nUne demande de réinitialisation de mot de passe a été reçue depuis %2$s. Pour confirmer le changement de mot de passe afin de pouvoir vous authentifier avec vos nouveaux identifiants, cliquez sur le lien suivant :\n\n%3$s\n\nAttention: modifier le mot de passe va aussi changer votre token_auth. vous pourrez obtenir votre nouveau token_auth sur votre page de paramètres.\n\nSi vous utilisez votre token_auth d'API avec n'importe quelle application externe ou pour de l'archivage, assurez-vous de mettre à jour le token_auth ou bien les requêtes vers l'API vont échouer.\n\nNote : ce jeton expirera dans 24 heures.\n\nMerci d'utiliser Piwik !",
"MailTopicPasswordChange": "Confirmer le changement de mot de passe",
+ "NewPassword": "Nouveau mot de passe",
+ "NewPasswordRepeat": "Nouveau mot de passe (à nouveau)",
"PasswordChanged": "Votre mot de passe a été modifié",
"PasswordRepeat": "Mot de passe (répétez)",
"PasswordsDoNotMatch": "Les mots de passe ne correspondent pas.",
"PluginDescription": "Fournit une authentification via nom d'utilisateur et mot de passe ainsi qu'une fonctionnalité de réinitialisation. La méthode d'authentification peut être changée en utilisant un autre composant d'identification comme LoginLdap disponible de le Marché.",
- "RememberMe": "Se souvenir de moi",
- "ResetPasswordInstructions": "Entrez un nouveau mot de passe pour votre compte."
+ "RememberMe": "Se souvenir de moi"
}
} \ No newline at end of file
diff --git a/plugins/Login/lang/hi.json b/plugins/Login/lang/hi.json
index bed81a018f..3106aa56e0 100644
--- a/plugins/Login/lang/hi.json
+++ b/plugins/Login/lang/hi.json
@@ -15,7 +15,6 @@
"PasswordChanged": "आपका पासवर्ड बदल दिया गया है.",
"PasswordRepeat": "पासवर्ड (दोहराने)",
"PasswordsDoNotMatch": "पासवर्ड मेल नहीं खाते.",
- "RememberMe": "मुझे याद है",
- "ResetPasswordInstructions": "अपने खाते के लिए एक नया पासवर्ड दर्ज करें."
+ "RememberMe": "मुझे याद है"
}
} \ No newline at end of file
diff --git a/plugins/Login/lang/hu.json b/plugins/Login/lang/hu.json
index 5e7063ef85..c0062ab54b 100644
--- a/plugins/Login/lang/hu.json
+++ b/plugins/Login/lang/hu.json
@@ -16,7 +16,6 @@
"PasswordRepeat": "Jelszó (ismét)",
"PasswordsDoNotMatch": "Nem egyeznek a jelszavak",
"PluginDescription": "Hitelesítés felhasználónévvel és jelszóval, illetve tartalmaz jelszó visszaállítási funkciót. A hitelesítési metódus lecserélhető másik bejelentkezési bővítményre, mint például a LoginLdap, amely elérhető az Árúházban.",
- "RememberMe": "Megjegyzés",
- "ResetPasswordInstructions": "Adjon meg egy új jelszavat profiljához."
+ "RememberMe": "Megjegyzés"
}
} \ No newline at end of file
diff --git a/plugins/Login/lang/id.json b/plugins/Login/lang/id.json
index 54bc376680..fc7954fd4e 100644
--- a/plugins/Login/lang/id.json
+++ b/plugins/Login/lang/id.json
@@ -14,7 +14,6 @@
"PasswordChanged": "Sandi Anda telah berubah.",
"PasswordRepeat": "Sandi (ulangi)",
"PasswordsDoNotMatch": "Sandi tak sesuai.",
- "RememberMe": "Ingat Saya",
- "ResetPasswordInstructions": "Masukkan sebuah sandi baru untuk akun Anda."
+ "RememberMe": "Ingat Saya"
}
} \ No newline at end of file
diff --git a/plugins/Login/lang/it.json b/plugins/Login/lang/it.json
index 06fa2018d4..64cbefdc99 100644
--- a/plugins/Login/lang/it.json
+++ b/plugins/Login/lang/it.json
@@ -12,13 +12,15 @@
"LoginOrEmail": "Nome utente o E-mail",
"LoginPasswordNotCorrect": "Combinazione Nome utente e Password non corretta",
"LostYourPassword": "Hai perso la password?",
+ "ChangeYourPassword": "Cambia password",
"MailPasswordChangeBody": "Salve %1$s,\n\nÈ stata ricevuta una richiesta di cambio password da parte di %2$s. Per confermare questo cambio password puoi accedere con le tue nuove credenziali, seguendo questo link:\n\n%3$s\n\nAttenzione: Il cambio di password cambierà anche il tuo token_auth. Puoi vedere il nuovo token_auth nella tua pagina delle impostazioni.\n\nSe stai utilizzando il tuo token_auth API in applicazioni esterne o per archiviazione, assicurati di aggiornarlo, altrimenti le richieste API falliranno.\n\nNota: questo link scadrà tra 24 ore.\n\nE grazie per utilizzare Piwik!",
"MailTopicPasswordChange": "Conferma Cambio Password",
+ "NewPassword": "Nuova password",
+ "NewPasswordRepeat": "Nuova password (ripeti)",
"PasswordChanged": "La tua password è stata cambiata.",
"PasswordRepeat": "Password (ripeti)",
"PasswordsDoNotMatch": "La password non corrisponde.",
"PluginDescription": "Fornisce l'autenticazione tramite user name e password, e anche la funzione di reset della password. Il metodo di autenticazione può essere cambiato utilizzando un altro plugin di accesso, come LoginLdap disponibile nel Marketplace.",
- "RememberMe": "Ricordami",
- "ResetPasswordInstructions": "Immetti una nuova password per il tuo account."
+ "RememberMe": "Ricordami"
}
} \ No newline at end of file
diff --git a/plugins/Login/lang/ja.json b/plugins/Login/lang/ja.json
index 779840db0e..2e3a9e9e61 100644
--- a/plugins/Login/lang/ja.json
+++ b/plugins/Login/lang/ja.json
@@ -16,7 +16,6 @@
"PasswordRepeat": "パスワード(再入力)",
"PasswordsDoNotMatch": "パスワードが一致しません。",
"PluginDescription": "パスワードリセットの機能と同様にユーザ名とパスワードで認証を提供します。 Marketplace で利用可能な LoginLdap など別の Login プラグインを使用することによって、認証方法を変えることができます。",
- "RememberMe": "次回の入力を省略",
- "ResetPasswordInstructions": "あなたのアカウントの新しいパスワードを入力してください。"
+ "RememberMe": "次回の入力を省略"
}
} \ No newline at end of file
diff --git a/plugins/Login/lang/ko.json b/plugins/Login/lang/ko.json
index 48da0a8387..06a6a55fbc 100644
--- a/plugins/Login/lang/ko.json
+++ b/plugins/Login/lang/ko.json
@@ -12,12 +12,15 @@
"LoginOrEmail": "아이디 또는 이메일",
"LoginPasswordNotCorrect": "사용자이름 또는 비밀번호가 맞지 않습니다",
"LostYourPassword": "비밀번호를 잊으셨습니까?",
+ "ChangeYourPassword": "비밀번호 변경",
+ "MailPasswordChangeBody": "안녕하세요 %1$s\n\n%2$s으로부터 비밀번호 재설정 요청을 받았습니다. 이 비밀번호 변경을 확인하기 위해 새로운 자격 증명을 이용하여 로그인 할 수 있도록 아래 링크를 방문해주세요.\n\n%3$s\n\n주의: 비밀번호 변경은 당신의 토큰(token_auth)가 변경될 수 있습니다. 새로운 토큰을 당신의 설정 페이지에서 확인해주세요.\n\n만약 외부 애플리케이션이나 저장용으로 API 토큰을 사용하셨다면, 해당 API의 원할한 사용을 위해 토큰을 반드시 갱신해주세요.\n\n주의: 위의 링크는 24시간 안에 만료됩니다.\n\nPiwik를 사용해주셔서 감사합니다.",
"MailTopicPasswordChange": "비밀번호 변경 확인",
+ "NewPassword": "새 비밀번호",
+ "NewPasswordRepeat": "새 비밀번호 (재입력)",
"PasswordChanged": "비밀번호가 변경되었습니다.",
"PasswordRepeat": "비빌번호 (재입력)",
"PasswordsDoNotMatch": "비밀번호가 일치하지 않습니다.",
"PluginDescription": "아이디와 비밀번호를 통해 사용자 인증뿐만 아니라 비밀번호 재설정 기능까지 제공합니다. 마켓에서 구할 수 있는 LoginLdap와 같은 또 다른 로그인 플러그인을 사용하여 인증 방법을 변경할 수 있습니다.",
- "RememberMe": "계정 기억하기",
- "ResetPasswordInstructions": "계정에 사용할 새로운 비밀번호를 입력하세요."
+ "RememberMe": "계정 기억하기"
}
} \ No newline at end of file
diff --git a/plugins/Login/lang/nb.json b/plugins/Login/lang/nb.json
index 6e83c14cbf..27dc914edb 100644
--- a/plugins/Login/lang/nb.json
+++ b/plugins/Login/lang/nb.json
@@ -17,7 +17,6 @@
"PasswordRepeat": "Passord (gjenta)",
"PasswordsDoNotMatch": "Passordene stemmer ikke overens.",
"PluginDescription": "Gir autentisering med brukernavn og passord i tillegg til funksjonalitet for å gjenopprette passord. Autentiseringsmetoden kan endres ved å bruke en annen innloggingsutvidelse som LoginLdap, som er tilgjengelig via Markedsplassen.",
- "RememberMe": "Husk meg",
- "ResetPasswordInstructions": "Skriv inn et nytt passord for kontoen din."
+ "RememberMe": "Husk meg"
}
} \ No newline at end of file
diff --git a/plugins/Login/lang/nl.json b/plugins/Login/lang/nl.json
index d3b63d94fc..077e36b5c6 100644
--- a/plugins/Login/lang/nl.json
+++ b/plugins/Login/lang/nl.json
@@ -17,7 +17,6 @@
"PasswordRepeat": "Wachtwoord (herhaal)",
"PasswordsDoNotMatch": "Wachtwoorden komen niet overeen",
"PluginDescription": "Maakt het mogelijk authenticatie via gebruikersnaam en wachtwoord te laten verlopen, aslook de wachtwoord reset mogelijkheid. De authenticatie methode kan worden gewijzigd door gebruik te maken van een andere login plugin - zoals LoginLdap - die beschikbaar zijn in de marktplaats.",
- "RememberMe": "Onthoud mij",
- "ResetPasswordInstructions": "Voer een nieuw wachtwoord in voor je account."
+ "RememberMe": "Onthoud mij"
}
} \ No newline at end of file
diff --git a/plugins/Login/lang/pl.json b/plugins/Login/lang/pl.json
index 6355e10c8f..0bb184c142 100644
--- a/plugins/Login/lang/pl.json
+++ b/plugins/Login/lang/pl.json
@@ -14,7 +14,6 @@
"PasswordChanged": "Twoje hasło zostało zmienione.",
"PasswordRepeat": "Hasło (powtórz)",
"PasswordsDoNotMatch": "Hasła nie pasują.",
- "RememberMe": "Zapamiętaj mnie",
- "ResetPasswordInstructions": "Wprowadź nowe haslo dla twojego konta."
+ "RememberMe": "Zapamiętaj mnie"
}
} \ No newline at end of file
diff --git a/plugins/Login/lang/pt-br.json b/plugins/Login/lang/pt-br.json
index 030e427f24..fdf0fde88d 100644
--- a/plugins/Login/lang/pt-br.json
+++ b/plugins/Login/lang/pt-br.json
@@ -12,13 +12,15 @@
"LoginOrEmail": "Nome de Usuário ou E-mail",
"LoginPasswordNotCorrect": "Combinação errada de Nome de Usuário e senha.",
"LostYourPassword": "Esqueceu a sua senha?",
+ "ChangeYourPassword": "Trocar sua senha",
"MailPasswordChangeBody": "Olá %1$s,\n\nUm pedido de redefinição de senha foi recebido de %2$s. Para confirmar esta alteração de senha a fim de que você possa fazer o login com as suas novas credenciais, visite o seguinte link:\n\n%3$s\n\nAtenção: Modificar sua senha também modificará seu token_auth. Você pode procurar o seu novo token_auth na sua página de configurações.\n\nSe você estiver utilizando um API token_auth em qualquer aplicação externa ou para arquivamento, certifique-se de atualizar o token_auth como requisitado pelo API ou falhará de outra forma.\n\nObs.: este link irá expirar em 24 horas.\n\nE agradeço por usar Piwik!",
"MailTopicPasswordChange": "Confirme Alteração de Senha",
+ "NewPassword": "Nova senha",
+ "NewPasswordRepeat": "Nova senha (repetir)",
"PasswordChanged": "Sua senha foi alterada.",
"PasswordRepeat": "Senha (repetir)",
"PasswordsDoNotMatch": "Senhas não conferem.",
"PluginDescription": "Fornece autenticação através do nome de usuário e senha, bem como a funcionalidade de redefinição de senha. O método de autenticação pode ser alterado utilizando outro plug-in, como, por exemplo, o LoginLdap disponível no Mercado.",
- "RememberMe": "Lembrar-me",
- "ResetPasswordInstructions": "Digite uma nova senha para a sua conta."
+ "RememberMe": "Lembrar-me"
}
} \ No newline at end of file
diff --git a/plugins/Login/lang/ro.json b/plugins/Login/lang/ro.json
index 743855b8a1..6aebff609a 100644
--- a/plugins/Login/lang/ro.json
+++ b/plugins/Login/lang/ro.json
@@ -15,7 +15,6 @@
"PasswordChanged": "Parola ta a fost schimbată",
"PasswordRepeat": "Parolă (repetă)",
"PasswordsDoNotMatch": "Parolele nu se potrivesc.",
- "RememberMe": "Ţine-mă minte",
- "ResetPasswordInstructions": "Introduce o parolă nouă pentru contul tău."
+ "RememberMe": "Ţine-mă minte"
}
} \ No newline at end of file
diff --git a/plugins/Login/lang/ru.json b/plugins/Login/lang/ru.json
index 5429e3e738..00b70e072f 100644
--- a/plugins/Login/lang/ru.json
+++ b/plugins/Login/lang/ru.json
@@ -12,13 +12,15 @@
"LoginOrEmail": "Имя пользователя или E-mail",
"LoginPasswordNotCorrect": "Логин или пароль неверны",
"LostYourPassword": "Потеряли пароль?",
+ "ChangeYourPassword": "Измените пароль",
"MailPasswordChangeBody": "Привет %1$s,\n\n%2$s был получен запрос на сброс пароля. Чтобы подтвердить изменение пароля и чтобы было можно войти со своими новыми настройками, пройдите по следующей ссылке:\n\n%3$s\n\nВнимание: Изменение пароля также изменит ваш token_auth. Вы можете найти свой новый token_auth на своеon your settings page.\n\nЕсли вы используете свой API token_auth в каком-либо приложении для архивации, убедитесь, что вы обновили token_auth, так как в ином случае запросы к API потерпят неудачу.\n\nВнимание: эта ссылка станет недействительной через 24 часа.\n\nИ спасибо за то, что вы используете Piwik!",
"MailTopicPasswordChange": "Подтвердите смену пароля",
+ "NewPassword": "Новый пароль",
+ "NewPasswordRepeat": "Новый пароль (ещё раз)",
"PasswordChanged": "Ваш пароль был изменен.",
"PasswordRepeat": "Пароль еще раз",
"PasswordsDoNotMatch": "Пароли не совпадают.",
"PluginDescription": "Предоставляет авторизацию через имя пользователя и пароль, а также функцию сброса пароля. Способ авторизации может быть изменён если использовать другой Login плагин, такой как LoginLdap, доступный через Marketplace.",
- "RememberMe": "Запомнить меня",
- "ResetPasswordInstructions": "Введите новый пароль для вашего аккаунта."
+ "RememberMe": "Запомнить меня"
}
} \ No newline at end of file
diff --git a/plugins/Login/lang/sk.json b/plugins/Login/lang/sk.json
index 8402a1ff05..cdbc884839 100644
--- a/plugins/Login/lang/sk.json
+++ b/plugins/Login/lang/sk.json
@@ -14,7 +14,6 @@
"PasswordChanged": "Vaše heslo bolo zmenené.",
"PasswordRepeat": "Heslo (znovu)",
"PasswordsDoNotMatch": "Heslá sa nezhodujú.",
- "RememberMe": "Zapamätať si ma",
- "ResetPasswordInstructions": "Vložte nové heslo pre svoj účet."
+ "RememberMe": "Zapamätať si ma"
}
} \ No newline at end of file
diff --git a/plugins/Login/lang/sq.json b/plugins/Login/lang/sq.json
index e69d2a1491..c721ffeed4 100644
--- a/plugins/Login/lang/sq.json
+++ b/plugins/Login/lang/sq.json
@@ -1,24 +1,26 @@
{
"Login": {
"ConfirmationLinkSent": "Te email-i juaj u dërgua një lidhje ripohimi. Kontrolloni email-in tuaj dhe vizitoni atë lidhje që të autorizoni kërkesën tuaj për ndryshim të fjalëkalimit.",
- "ContactAdmin": "Arsye e mundshme: streha juaj mund të ketë çaktivizuar funksionin mail(). <br \/>Ju lutem, lidhuni me përgjegjësin e Piwik-ut tuaj.",
- "ExceptionInvalidSuperUserAccessAuthenticationMethod": "Një përdorues me të drejta Superpërdoruesi nuk mund të bëjë mirëfilltësimin e vetes duke përdorur mekanizmin '%s'.",
+ "ContactAdmin": "Arsye e mundshme: streha juaj mund të ketë çaktivizuar funksionin mail(). <br \/>Ju lutemi, lidhuni me përgjegjësin e Piwik-ut tuaj.",
+ "ExceptionInvalidSuperUserAccessAuthenticationMethod": "Një përdorues me të drejta Superpërdoruesi s’mund të bëjë mirëfilltësimin e vetes duke përdorur mekanizmin '%s'.",
"ExceptionPasswordMD5HashExpected": "Parametri i fjalëkalimit pritet të jetë një hash MD5 fjalëkalimi.",
- "InvalidNonceOrHeadersOrReferrer": "Siguria e formularit dështoi. Ju lutem, ringarkoni formularin dhe kontrolloni nëse janë të aktivizuara \"cookie\"-et tuaja. Nëse përdorni një shërbyes ndërmjetës, duhet ta formësoni %1$s Piwik-un që të pranojë titull ndërmjetësi%2$s i cili përcjell titull Strehe. Kontrolloni gjithashtu që titulli i Referuesit dërgohet saktë.",
+ "InvalidNonceOrHeadersOrReferrer": "Siguria e formularit dështoi. Ju lutemi, ringarkoni formularin dhe kontrolloni nëse janë të aktivizuara \"cookie\"-et tuaja. Nëse përdorni një shërbyes ndërmjetës, duhet ta formësoni %1$s Piwik-un që të pranojë krye ndërmjetësi%2$s i cili përcjell krye Strehe. Kontrolloni gjithashtu që kryet e Sjellësit dërgohen saktë.",
"InvalidNonceSSLMisconfigured": "Po ashtu, mund %1$sta detyroni Piwik-un të përdorë një lidhje të sigurt%2$s: te kartela juaj %3$s rregulloni %4$s nën ndarjen %5$s",
- "InvalidOrExpiredToken": "Elementi është i pavlefshëm ose ka skaduar",
- "InvalidUsernameEmail": "Emër përdoruesi dhe\/ose vendndodhje e-mail e pavlefshme",
+ "InvalidOrExpiredToken": "Elementi është i pavlefshëm ose ka skaduar.",
+ "InvalidUsernameEmail": "Emër përdoruesi dhe\/ose adresë email e pavlefshme.",
"LogIn": "Hyni",
- "LoginOrEmail": "Emër hyrjeje ose E-mail",
- "LoginPasswordNotCorrect": "Emër përdoruesi & Fjalëkalim jo të saktë",
+ "LoginOrEmail": "Emër përdoruesi ose Email",
+ "LoginPasswordNotCorrect": "Ndërthurje e gabuar Emri përdoruesi dhe fjalëkalimi.",
"LostYourPassword": "Humbët fjalëkalimin tuaj?",
+ "ChangeYourPassword": "Ndryshoni fjalëkalimin tuaj",
"MailPasswordChangeBody": "Njatjeta %1$s,\n\nPrej %2$s ka ardhur një kërkesë për ricaktim fjalëkalimi. Për ripohim të këtij ndryshimi fjalëkalimi, që të mund hyni me kredenciale të reja, vizitoni lidhjen vijuese:\n\n%3$s\n\nKujdes: Ndryshimi i fjalëkalimit do të sjellë edhe ndryshimin e token_auth tuaj. token_auth tuaj të ri mund ta shihni te faqja e rregullimeve tuaja.\n\nNëse token_auth tuaj për API e përdorni në ndonjë aplikacion të jashtëm ose për arkivim, sigurohuni që ta përditësoni token_auth atje, përndryshe kërkesat te API do të dështojnë.\n\nShënim: kjo lidhje do të skadojë pas 24 orësh.\n\nDhe faleminderit që përdorni Piwik-un!",
"MailTopicPasswordChange": "Ripohoni Ndryshimin e Fjalëkalimit",
+ "NewPassword": "Fjalëkalim i ri",
+ "NewPasswordRepeat": "Fjalëkalim i ri (përsëriteni)",
"PasswordChanged": "Fjalëkalimi juaj u ndryshua.",
"PasswordRepeat": "Fjalëkalim (sërish)",
"PasswordsDoNotMatch": "Fjalëkalimet nuk përputhen.",
"PluginDescription": "Ofron mirëfilltësim përmes emri përdoruesi dhe fjalëkalimi, si dhe funksionin e ricaktimit të fjalëkalimeve. Metoda e mirëfilltësimit mund të ndryshohet duke përdorur një tjetër shtojcë Hyrjesh, të tillë si LoginLdap, të cilën e gjeni te Marketplace-i.",
- "RememberMe": "Mbamë Mend",
- "ResetPasswordInstructions": "Jepni një fjalëkalim të ri për llogarinë tuaj."
+ "RememberMe": "Mbamë Mend"
}
} \ No newline at end of file
diff --git a/plugins/Login/lang/sr.json b/plugins/Login/lang/sr.json
index 219a6f58f8..b18e258823 100644
--- a/plugins/Login/lang/sr.json
+++ b/plugins/Login/lang/sr.json
@@ -5,18 +5,22 @@
"ExceptionInvalidSuperUserAccessAuthenticationMethod": "Korisnik sa superkorisničkim nivoom pristupa ne može biti autentifikovan korišćenjem mehanizma '%s'.",
"ExceptionPasswordMD5HashExpected": "Parametar za lozinku bi trebalo da bude MD5 hash lozinke.",
"InvalidNonceOrHeadersOrReferrer": "Problem sa sigurnošću. Molimo vas da proverite da li su kolačići (cookies) omogućeni i da ponovo učitate stranicu. Ukoliko se nalazite iza proxy servera, morate %1$s podesiti Piwik da prihvata proxy zaglavlje%2$s koje prosleđuje zaglavlje servera. Takođe, proverite da li je referer zaglavlje poslato kako treba.",
+ "InvalidNonceSSLMisconfigured": "Takođe možete %1$s naterati Piwik da koristi bezbednu konekciju%2$s: u datoteci sa podešavanjima %3$s postavite %4$s u sekciji %5$s",
"InvalidOrExpiredToken": "Token ili nije validan ili je istekao.",
"InvalidUsernameEmail": "Pogrešno korisničko ime i\/ili elektronska adresa",
"LogIn": "Prijavljivanje",
"LoginOrEmail": "Korisničko ime ili elektronska adresa",
"LoginPasswordNotCorrect": "Korisničko ime i lozinka nisu ispravni",
"LostYourPassword": "Zaboravili ste lozinku?",
+ "ChangeYourPassword": "Promenite vašu lozinku",
+ "MailPasswordChangeBody": "Pozdrav %1$s,\n\nSa %2$s je poslat zahtev za resetovanje lozinke. Ukoliko želite da potvrdite promenu lozinke kako biste mogli da se ponovo prijavite na sistem, otvorite sledeći link:\n\n%3$s\n\nPažnja: promenom lozinke menjate i vaš token_auth. Novi token_auth možete da nađete na vašoj stranici sa podešavanjima.\n\nUkoliko koristite API token_auth u nekoj od eksternih aplikacija ili za arhiviranje, pobrinite se da ga ažurirate jer, u protivnom, API zahtevi neće funkcionisati .\n\nOvaj link važi 24 sata.\n\nI hvala što koristite Piwik ;-)",
"MailTopicPasswordChange": "Potvrdite promenu lozinke",
+ "NewPassword": "Nova lozinka",
+ "NewPasswordRepeat": "Ponovite novu lozinku",
"PasswordChanged": "Vaša lozinka je promenjena.",
"PasswordRepeat": "Lozinka (ponovo)",
"PasswordsDoNotMatch": "Lozinka se ne poklapa",
"PluginDescription": "Omogućuje proveru korisnika putem koriničkog imena i lozinke kao i funkciju reseta zaboravljene lozinke. Metod provere se može promeniti korišćenjem nekog drugog dodatka za prijavu poput LoginLdap-a koji je dostupan na Marketu.",
- "RememberMe": "Zapamti me",
- "ResetPasswordInstructions": "Upišite novu lozinku za vaš nalog."
+ "RememberMe": "Zapamti me"
}
} \ No newline at end of file
diff --git a/plugins/Login/lang/sv.json b/plugins/Login/lang/sv.json
index ffcece6418..b8298ba4e4 100644
--- a/plugins/Login/lang/sv.json
+++ b/plugins/Login/lang/sv.json
@@ -18,7 +18,6 @@
"PasswordRepeat": "Lösenord (bekräfta)",
"PasswordsDoNotMatch": "Lösenorden matchar inte.",
"PluginDescription": "Tillhandahåller autentisering med användarnamn och lösenord samt lösenordsåterställning. Autentiseringsmetoden kan anpassas med en annan plugin som t.ex. LoginLdap från marknadsplatsen.",
- "RememberMe": "Kom ihåg mig",
- "ResetPasswordInstructions": "Skriv in ett nytt lösenord för ditt konto."
+ "RememberMe": "Kom ihåg mig"
}
} \ No newline at end of file
diff --git a/plugins/Login/lang/ta.json b/plugins/Login/lang/ta.json
index ac1ba4efd5..2bb48768af 100644
--- a/plugins/Login/lang/ta.json
+++ b/plugins/Login/lang/ta.json
@@ -7,7 +7,6 @@
"LoginPasswordNotCorrect": "பயனாளர்பெயர் மற்றும் கடவுச்சொல் பொருந்தவில்லை.",
"LostYourPassword": "கடவுச்சொல் மறந்து போனதா?",
"PasswordRepeat": "கடவுச்சொல் (மீண்டும்)",
- "RememberMe": "என்னை ஞாபகத்தில் கொள்",
- "ResetPasswordInstructions": "உங்களுடைய கணக்கிற்கு புதிய கடவுச்சொல்லை தருக."
+ "RememberMe": "என்னை ஞாபகத்தில் கொள்"
}
} \ No newline at end of file
diff --git a/plugins/Login/lang/th.json b/plugins/Login/lang/th.json
index c350a9d208..7c30c7b285 100644
--- a/plugins/Login/lang/th.json
+++ b/plugins/Login/lang/th.json
@@ -13,7 +13,6 @@
"PasswordChanged": "รหัสผ่านของคุณได้ถูกเปลี่ยนแปลงแล้ว",
"PasswordRepeat": "รหัสผ่าน (อีกครั้ง)",
"PasswordsDoNotMatch": "รหัสผ่านไม่ตรงกัน",
- "RememberMe": "จำฉันไว้ในระบบ",
- "ResetPasswordInstructions": "กรอกรหัสผ่านสำหรับบัญชีของคุณ"
+ "RememberMe": "จำฉันไว้ในระบบ"
}
} \ No newline at end of file
diff --git a/plugins/Login/lang/tl.json b/plugins/Login/lang/tl.json
index e11aa0e681..47d53458c0 100644
--- a/plugins/Login/lang/tl.json
+++ b/plugins/Login/lang/tl.json
@@ -15,7 +15,6 @@
"PasswordChanged": "Ang iyong password ay nabago na.",
"PasswordRepeat": "Password (ulitin)",
"PasswordsDoNotMatch": "Ang mga password ay hindi tugma.",
- "RememberMe": "Tandaan Ako",
- "ResetPasswordInstructions": "Magpasok ng isang bagong password para sa iyong account."
+ "RememberMe": "Tandaan Ako"
}
} \ No newline at end of file
diff --git a/plugins/Login/lang/tr.json b/plugins/Login/lang/tr.json
index 88f8d5975a..074e75e31f 100644
--- a/plugins/Login/lang/tr.json
+++ b/plugins/Login/lang/tr.json
@@ -15,7 +15,6 @@
"PasswordChanged": "Parolanız değiştirildi.",
"PasswordRepeat": "Parola onayı",
"PasswordsDoNotMatch": "Parola ve onayı aynı değil",
- "RememberMe": "Beni Hatırla",
- "ResetPasswordInstructions": "Hesabınıza yeni bir parola yazın."
+ "RememberMe": "Beni Hatırla"
}
} \ No newline at end of file
diff --git a/plugins/Login/lang/uk.json b/plugins/Login/lang/uk.json
index 90426fe99f..a9ce22941f 100644
--- a/plugins/Login/lang/uk.json
+++ b/plugins/Login/lang/uk.json
@@ -18,7 +18,6 @@
"PasswordRepeat": "Пароль ще раз",
"PasswordsDoNotMatch": "Паролі не співпадають.",
"PluginDescription": "Надає авторизацію через ім'я користувача і пароль, а також функцію скидання паролю. Спосіб авторизації може бути змінений якщо використовувати інший Login плагін, такий як LoginLdap, доступний через Маркет.",
- "RememberMe": "Запам'ятати мене",
- "ResetPasswordInstructions": "Введіть новий пароль для вашого облікового запису."
+ "RememberMe": "Запам'ятати мене"
}
} \ No newline at end of file
diff --git a/plugins/Login/lang/vi.json b/plugins/Login/lang/vi.json
index 924a7e60bc..5c660fe938 100644
--- a/plugins/Login/lang/vi.json
+++ b/plugins/Login/lang/vi.json
@@ -14,7 +14,6 @@
"PasswordChanged": "Mật khẩu của bạn đã được thay đổi",
"PasswordRepeat": "Mật khẩu (lặp lại)",
"PasswordsDoNotMatch": "Mật khẩu không phù hợp.",
- "RememberMe": "Nhớ tôi",
- "ResetPasswordInstructions": "Nhập một mật khẩu mới cho tài khoản của bạn."
+ "RememberMe": "Nhớ tôi"
}
} \ No newline at end of file
diff --git a/plugins/Login/lang/zh-cn.json b/plugins/Login/lang/zh-cn.json
index 3a2dd8aa47..165db49cc7 100644
--- a/plugins/Login/lang/zh-cn.json
+++ b/plugins/Login/lang/zh-cn.json
@@ -14,7 +14,6 @@
"PasswordChanged": "您的密码已修改。",
"PasswordRepeat": "密码(重复)",
"PasswordsDoNotMatch": "密码不一致。",
- "RememberMe": "记住密码",
- "ResetPasswordInstructions": "为您的账号输入新的密码。"
+ "RememberMe": "记住密码"
}
} \ No newline at end of file
diff --git a/plugins/MobileAppMeasurable/lang/ko.json b/plugins/MobileAppMeasurable/lang/ko.json
new file mode 100644
index 0000000000..f5512cf607
--- /dev/null
+++ b/plugins/MobileAppMeasurable/lang/ko.json
@@ -0,0 +1,7 @@
+{
+ "MobileAppMeasurable": {
+ "MobileApp": "모바일 앱",
+ "MobileApps": "모바일 앱",
+ "MobileAppDescription": "iOS와 안드로이드 혹은 다른 모바일 운영체제의 어플리케이션"
+ }
+} \ No newline at end of file
diff --git a/plugins/MobileAppMeasurable/lang/tr.json b/plugins/MobileAppMeasurable/lang/tr.json
new file mode 100644
index 0000000000..6a32b18af3
--- /dev/null
+++ b/plugins/MobileAppMeasurable/lang/tr.json
@@ -0,0 +1,7 @@
+{
+ "MobileAppMeasurable": {
+ "MobileApp": "Mobil Uygulama",
+ "MobileApps": "Mobil Uygulama",
+ "MobileAppDescription": "iOS Android ya da diğer mobil işletim sistemleri için doğal mobil uygulama."
+ }
+} \ No newline at end of file
diff --git a/plugins/MobileMessaging/lang/bg.json b/plugins/MobileMessaging/lang/bg.json
index ff1791594b..64d76a70f5 100644
--- a/plugins/MobileMessaging/lang/bg.json
+++ b/plugins/MobileMessaging/lang/bg.json
@@ -18,7 +18,6 @@
"Settings_PhoneActivated": "Телефонният номер е потвърден! Вече имате възможност да получавате кратки съобщения (SMS) с вашите статистики.",
"Settings_PhoneNumber": "Телефонен номер",
"Settings_PhoneNumbers_Add": "Добави нов телефонен номер",
- "Settings_PhoneNumbers_CountryCode_Help": "Ако не знаете телефонния код за вашата държава, може да го проверите тук",
"Settings_SMSAPIAccount": "Управление на профила за SMS приложно-програмен интерфейс",
"Settings_SMSProvider": "SMS провайдър",
"Settings_SuperAdmin": "Настройки на супер потребителя",
diff --git a/plugins/MobileMessaging/lang/ca.json b/plugins/MobileMessaging/lang/ca.json
index eab9e10d09..57162af424 100644
--- a/plugins/MobileMessaging/lang/ca.json
+++ b/plugins/MobileMessaging/lang/ca.json
@@ -17,7 +17,6 @@
"Settings_PhoneActivated": "Nombre de telèfon validat! Ara podeu rebre SMS amb les vostres estadístiques.",
"Settings_PhoneNumber": "Telèfon",
"Settings_PhoneNumbers_Add": "Afegir un nou telèfon",
- "Settings_PhoneNumbers_CountryCode_Help": "Si no sabeu el vostre codi de pais el podeu buscar aquí.",
"Settings_SMSAPIAccount": "Administra el compte de l'API de SMS",
"Settings_SMSProvider": "Proveïdor SMS",
"Settings_SuperAdmin": "Preferències del Super Usuari",
diff --git a/plugins/MobileMessaging/lang/cs.json b/plugins/MobileMessaging/lang/cs.json
index f8492f1f61..99b481b5ba 100644
--- a/plugins/MobileMessaging/lang/cs.json
+++ b/plugins/MobileMessaging/lang/cs.json
@@ -9,10 +9,14 @@
"PluginDescription": "Vytvářejte a stahujte vlastní SMS hlášení a nechte si je zasílat do svého telefonu denně, týdně nebo měsíčně.",
"Settings_APIKey": "Klíč k API",
"Settings_CountryCode": "Kód země",
+ "Settings_SelectCountry": "Vybrat zemi",
"Settings_CredentialNotProvided": "Než budete moci vytvářet a spravovat telefonní čísla, musíte připojit Piwik ke svému SMS účtu výše.",
"Settings_CredentialNotProvidedByAdmin": "Než budete moci vytvářet a spravovat telefonní čísla, požádejte svého administrátora, aby připojil Piwik k SMS účtu.",
- "Settings_CredentialProvided": ";Váš %s SMS účet je nastaven správně.",
+ "Settings_CredentialProvided": "Váš %s SMS API účet je nastaven správně!",
"Settings_DeleteAccountConfirm": "Opravdu chcete odstranit tento SMS účet?",
+ "Settings_DelegatedSmsProviderOnlyAppliesToYou": "Nastavený poskytovatel SMS bude použit pouze vámi a žádnými jinými uživateli.",
+ "Settings_DelegatedPhoneNumbersOnlyUsedByYou": "Nastavená telefonní čísla mohou být zobrazena a použita pouze vámi a žádnými dalšími uživateli.",
+ "Settings_EnterActivationCode": "Vložit aktivační kód",
"Settings_InvalidActivationCode": "Zadaný kód nebyl platný, prosím zkuste to znovu.",
"Settings_LetUsersManageAPICredential": "Povolit uživatelům správu vlastních pověření API SMS účtů",
"Settings_LetUsersManageAPICredential_No_Help": "Všichni uživatelé mohou přijímat hlášení prostřednictvím SMS a budou používat kredity vašeho účtu.",
@@ -21,7 +25,7 @@
"Settings_PhoneActivated": "Telefonní číslo ověřeno! Nyní můžete přijímat SMS se statistikami.",
"Settings_PhoneNumber": "Telefonní číslo",
"Settings_PhoneNumbers_Add": "Přidat nové telefonní číslo",
- "Settings_PhoneNumbers_CountryCode_Help": "Pokud nevíte telefonní kód vaší země, podívejte se zde",
+ "Settings_PhoneNumbers_CountryCode_Help": "Pokud neznáte telefonní předvolbu země, vyhledejte ji zde.",
"Settings_PhoneNumbers_Help": "Než budete moci přijímat SMS se statistikami, telefonní číslo musí být zadáno níže.",
"Settings_PhoneNumbers_HelpAdd": "Po stisknutí \"přidat\" bude na telefon odeslána SMS s kódem. Uživatel, který obdrží SMS by se měl přihlásit do Piwiku, kliknout na nastavení, pak na Mobilní zprávy a zadat kód. Poté bude moci dostávat statistiky do svého telefonu.",
"Settings_PleaseSignUp": "Pokud chcetevytvářet SMS hlášení a dostávat krátké zprávy o statistikách do svého telefonu, zaregistrujte se na SMS API a zadejte svoje informace níže.",
@@ -34,8 +38,8 @@
"Settings_VerificationCodeJustSent": "Právě jsme na zadané telefonní číslo odeslali SMS s kódem. Zadejte ho výše a stiskněte \"ověřit\".",
"SettingsMenu": "Mobilní zprávy",
"SMS_Content_Too_Long": "[příliš dlouhé]",
- "TopLinkTooltip": "Nechte si webové analýzy zasílat na e-mail nebo na svůj mobilní telefon.",
- "TopMenu": "E-mail a SMS hlášení",
+ "TopLinkTooltip": "Nechte si webové analýzy zasílat na email nebo na svůj mobilní telefon.",
+ "TopMenu": "Email a SMS hlášení",
"VerificationText": "Kód je %1$s. Pro ověření vašeh otelefonního čísla tento kód zkopírujte do formuláře přístupného na Piwik > %2$s > %3$s."
}
} \ No newline at end of file
diff --git a/plugins/MobileMessaging/lang/da.json b/plugins/MobileMessaging/lang/da.json
index 0f61cf4422..48c1f0774d 100644
--- a/plugins/MobileMessaging/lang/da.json
+++ b/plugins/MobileMessaging/lang/da.json
@@ -21,7 +21,6 @@
"Settings_PhoneActivated": "Telefonnummer er valideret! Du kan nu modtage SMS med din statistik.",
"Settings_PhoneNumber": "Telefonnummer",
"Settings_PhoneNumbers_Add": "Tilføj et nyt telefonnummer",
- "Settings_PhoneNumbers_CountryCode_Help": "Hvis du ikke kender telefonens landekode, søg efter dit land her",
"Settings_PhoneNumbers_Help": "Før modtagelse af SMS (tekstbeskeder) rapporter på telefonen, indtast telefonnummeret nedenfor.",
"Settings_PhoneNumbers_HelpAdd": "Når du klikker på \"Tilføj\", vil en sms med en kode sendes til telefonen. Den bruger, der modtager koden skal derefter logge ind på Piwik, klikke på Indstillinger, og klik derefter på mobilbeskeder. Når du har indtastet koden, vil brugeren være i stand til at modtage SMS rapporter på telefonen.",
"Settings_PleaseSignUp": "Hvis du vil oprette SMS-rapporter og modtage sms beskeder med hjemmesidernes statistik på din mobiltelefon, skal du tilmelde dig SMS API og indtaste oplysninger nedenfor.",
diff --git a/plugins/MobileMessaging/lang/de.json b/plugins/MobileMessaging/lang/de.json
index 4a704f36fd..e883d97198 100644
--- a/plugins/MobileMessaging/lang/de.json
+++ b/plugins/MobileMessaging/lang/de.json
@@ -9,10 +9,14 @@
"PluginDescription": "Erstellen Sie eigene SMS-Berichte, laden Sie diese herunter und lassen Sie diese täglich, wöchentlich oder monatlich auf Ihr Handy senden.",
"Settings_APIKey": "API Schlüssel",
"Settings_CountryCode": "Ländervorwahl",
+ "Settings_SelectCountry": "Land auswählen",
"Settings_CredentialNotProvided": "Bevor Sie Telefonnummern erstellen und verwalten können, verbinden Sie bitte Piwik mit Ihrem SMS Konto oberhalb.",
"Settings_CredentialNotProvidedByAdmin": "Bevor Sie Telefonnummern anlegen und verwalten können, bitten Sie Ihren Administrator darum Piwik mit einem SMS-Account zu verknüpfen.",
"Settings_CredentialProvided": "Ihr %s SMS-API Zugang ist korrekt konfiguriert.",
"Settings_DeleteAccountConfirm": "Sind Sie sicher, dass Sie das SMS Konto löschen möchten?",
+ "Settings_DelegatedSmsProviderOnlyAppliesToYou": "Der eingestellte SMS-Provider wird nur von Ihnen und nicht von anderen Benutzern verwendet.",
+ "Settings_DelegatedPhoneNumbersOnlyUsedByYou": "Die eingestellten Telefonnummern können nur von Ihnen und nicht von anderen Benutzern gesehen und verwendet werden.",
+ "Settings_EnterActivationCode": "Aktivierungscode eingeben",
"Settings_InvalidActivationCode": "Der eingegebene Code ist nicht korrekt, bitte probieren Sie es noch einmal.",
"Settings_LetUsersManageAPICredential": "Erlauben Sie Benutzern das verwalten von eigenen SMS API Konten",
"Settings_LetUsersManageAPICredential_No_Help": "Alle Benutzer können SMS Berichte empfangen und nutzen Ihr Kontoguthaben.",
@@ -21,7 +25,7 @@
"Settings_PhoneActivated": "Telefonnummer wurde überprüft! Sie können nun SMS mit Ihren Statistiken empfangen.",
"Settings_PhoneNumber": "Telefonnummer",
"Settings_PhoneNumbers_Add": "Neue Telefonnummer hinzufügen",
- "Settings_PhoneNumbers_CountryCode_Help": "Falls Sie die Ländervorwahl nicht wissen, suchen Sie hier Ihr Land",
+ "Settings_PhoneNumbers_CountryCode_Help": "Falls Sie die Ländervorwahl nicht wissen, suchen Sie hier Ihr Land.",
"Settings_PhoneNumbers_Help": "Bevor Sie SMS (Textnachrichten) auf dem Telefon empfangen können, müssen Sie unten die Telefonnummer eingeben.",
"Settings_PhoneNumbers_HelpAdd": "Wenn Sie auf \"Hinzufügen\" klicken wird eine SMS mit einem Code an Ihre Telefon versendet. Wenn Sie den Code empfangen loggen Sie sich bitte in Piwik ein, klicken auf Einstellungen und danach Mobile Messaging. Nach dem eingeben des Codes können Sie Textberichte auf diesem Telefon empfangen.",
"Settings_PleaseSignUp": "Um SMS Berichte zu erstellen und Textnachrichten mit Ihren Statistiken auf Ihrem Mobiltelefon empfangen zu können, registrieren Sie sich unterhalb für die SMS API.",
diff --git a/plugins/MobileMessaging/lang/el.json b/plugins/MobileMessaging/lang/el.json
index a51270908a..ddc3167a98 100644
--- a/plugins/MobileMessaging/lang/el.json
+++ b/plugins/MobileMessaging/lang/el.json
@@ -9,10 +9,14 @@
"PluginDescription": "Δημιουργία και λήψη προσαρμοσμένων αναφορών SMS και αποστολή στο κινητό σας σε καθημερινή, εβδομαδιαία ή μηνιαία βάση.",
"Settings_APIKey": "Κλειδί API",
"Settings_CountryCode": "Κωδικός Χώρας",
+ "Settings_SelectCountry": "Επιλέξτε χώρα",
"Settings_CredentialNotProvided": "Για να μπορέσετε να δημιουργήσετε και να διαχειριστείτε αριθμούς τηλεφώνου, μπορείτε να συνδέσετε το Piwik με το λογαριασμό SMS σας, παραπάνω.",
"Settings_CredentialNotProvidedByAdmin": "Για να μπορέσετε να δημιουργήσετε και να διαχειριστείτε αριθμούς τηλεφώνου, ζητήστε από τον διαχειριστή σας να συνδέσει το Piwik σε ένα λογαριασμό SMS.",
"Settings_CredentialProvided": "Ο λογαριασμός %s του SMS API σας, έχει ρυθμιστεί σωστά!",
"Settings_DeleteAccountConfirm": "Είστε σίγουρος ότι θέλετε να διαγράψετε τον λογαριασμό SMS;",
+ "Settings_DelegatedSmsProviderOnlyAppliesToYou": "Ο καθορισμένος πάροχος SMS θα χρησιμοποιείται μόνο από εσάς και όχι από άλλους χρήστες.",
+ "Settings_DelegatedPhoneNumbersOnlyUsedByYou": "Οι καθορισμένοι τηλεφωνικοί αριθμοί είναι αναγνώσιμοι μόνο από εσάς και όχι από άλλους χρήστες.",
+ "Settings_EnterActivationCode": "Εισάγετε κωδικό ενεργοποίησης",
"Settings_InvalidActivationCode": "Ο κώδικας που εισάγατε δεν ήταν έγκυρος, παρακαλώ προσπαθήστε ξανά.",
"Settings_LetUsersManageAPICredential": "Επιτρέπει στους χρήστες να διαχειρίζονται τα δικά τους διαπιστευτήρια SMS API",
"Settings_LetUsersManageAPICredential_No_Help": "Όλοι οι χρήστες έχουν τη δυνατότητα να λαμβάνουν Αναφορές SMS και θα χρησιμοποιηθούν οι πιστώσεις του λογαριασμού σας.",
@@ -21,7 +25,7 @@
"Settings_PhoneActivated": "Το Τηλέφωνο επικυρώθηκε! Μπορείτε τώρα να λάβετε SMS με τα στατιστικά σας.",
"Settings_PhoneNumber": "Αριθμός Τηλεφώνου",
"Settings_PhoneNumbers_Add": "Προσθήκη ενός νέου αριθμού τηλεφώνου",
- "Settings_PhoneNumbers_CountryCode_Help": "Εάν δεν γνωρίζετε τον κωδικό κλήσης της χώρας, κοιτάξτε για τη χώρα σας εδώ",
+ "Settings_PhoneNumbers_CountryCode_Help": "Εάν δεν γνωρίζετε τον τηλεφωνικό κωδικό κλήσης της χώρας, κοιτάξτε για τη χώρα σας εδώ.",
"Settings_PhoneNumbers_Help": "Πριν από τη λήψη αναφορών με SMS (μηνυμάτων κειμένου) σε ένα τηλέφωνο, ο αριθμός τηλεφώνου πρέπει να εισαχθεί παρακάτω.",
"Settings_PhoneNumbers_HelpAdd": "Όταν κάνετε κλικ στην επιλογή \"Προσθήκη\", ένα SMS που περιέχει έναν κωδικό θα σταλεί στο τηλέφωνο. Ο χρήστης που θα λάβει τον κωδικό πρέπει να συνδεθεί στο Piwik, να κάνει κλικ στο Ρυθμίσεις, στη συνέχεια κλικ στο Μηνύματα σε Κινητά. Μετά την εισαγωγή του κωδικού, ο χρήστης θα είναι σε θέση να λαμβάνει αναφορές κειμένου στο τηλέφωνό του.",
"Settings_PleaseSignUp": "Για να δημιουργήσετε αναφορές SMS και να λαμβάνετε σύντομα μηνύματα κειμένου με στατιστικά για τις ιστοσελίδες σας στο κινητό σας τηλέφωνο, μπορείτε να εγγραφείτε με το SMS API και εισάγετε τα στοιχεία σας παρακάτω.",
diff --git a/plugins/MobileMessaging/lang/es.json b/plugins/MobileMessaging/lang/es.json
index 68b8c3a083..92b180c34e 100644
--- a/plugins/MobileMessaging/lang/es.json
+++ b/plugins/MobileMessaging/lang/es.json
@@ -9,10 +9,14 @@
"PluginDescription": "Cree informes personalizados y descárguelos vía SMS a su teléfono móvil de forma diaria, semanal o mensual.",
"Settings_APIKey": "Clave API",
"Settings_CountryCode": "Código de país",
+ "Settings_SelectCountry": "Seleccionar país",
"Settings_CredentialNotProvided": "Antes de crear y administrar los números telefónicos, por favor conecte Piwik con su cuenta SMS.",
"Settings_CredentialNotProvidedByAdmin": "Antes que pueda crear y administrar números telefónicos, consulte con su administrador para conectar Piwik con una cuenta SMS.",
"Settings_CredentialProvided": "Su %s cuenta API SMS está correctamente configurada!",
"Settings_DeleteAccountConfirm": "¿Está seguro que desea borrar esta cuenta SMS?",
+ "Settings_DelegatedSmsProviderOnlyAppliesToYou": "El proveedor de SMS configurado solo podrá ser usado por usted y nadie más.",
+ "Settings_DelegatedPhoneNumbersOnlyUsedByYou": "Los números telefónicos configurados solo pueden ser vistos y utilizados por usted y nadie más.",
+ "Settings_EnterActivationCode": "Ingresar código de activación",
"Settings_InvalidActivationCode": "Código ingresado no es válido, inténtelo nuevamente.",
"Settings_LetUsersManageAPICredential": "Permitir a los usuarios administrar sus propias credenciales API de su SMS",
"Settings_LetUsersManageAPICredential_No_Help": "Todos los usuarios están habilitados a recibir Informes SMS y utilizarán los créditos de su cuenta de teléfono móvil.",
@@ -21,7 +25,7 @@
"Settings_PhoneActivated": "¡Número telefónico convalidado! Ahora puede recibir sus estadísticas en sus mensajes de texto.",
"Settings_PhoneNumber": "Número telefónico",
"Settings_PhoneNumbers_Add": "Agregar un nuevo número telefónico",
- "Settings_PhoneNumbers_CountryCode_Help": "Si desconoce cual es el código país de su teléfono, búsquelo aquí",
+ "Settings_PhoneNumbers_CountryCode_Help": "Si no conoce el código telefónico del país, búsquelo aquí.",
"Settings_PhoneNumbers_Help": "Antes de recibir los mensajes de texto (SMS) de los informes en un teléfono, el número de teléfono debe ser ingresado.",
"Settings_PhoneNumbers_HelpAdd": "Cuando haga clic en \"Agregar\", un SMS conteniendo un código será enviado al teléfono. El usuario que recibió el código debería ingresar a Piwik, clic en Configuraciones, clic en Mensajería móvil. Después de introducir el código, el usuario podrá recibir informes de texto en su móvil.",
"Settings_PleaseSignUp": "Para crear informes SMS y recibir mensajes de texto cortos con las estadísticas de sus sitios de internet en su teléfono móvil, por favor, enrólese con la API del SMS e ingrese su información abajo.",
diff --git a/plugins/MobileMessaging/lang/fa.json b/plugins/MobileMessaging/lang/fa.json
index 418407be1d..63f16b1b4d 100644
--- a/plugins/MobileMessaging/lang/fa.json
+++ b/plugins/MobileMessaging/lang/fa.json
@@ -20,7 +20,6 @@
"Settings_PhoneActivated": "شماره تلفن تأیید شد! اکنون شما می توانید پیامک آمارهایتان را دریافت کنید.",
"Settings_PhoneNumber": "شماره تلفن",
"Settings_PhoneNumbers_Add": "شماره تلفن جدید اضافه کن",
- "Settings_PhoneNumbers_CountryCode_Help": "اگر شما کد تلفن کشورتان را نمی دانید , اینجا به دنبال کشورتان بگردید",
"Settings_PhoneNumbers_Help": "پیش از اینکه گزارش های پیامکی (پیام های متنی) را با تلفن دریافت کنید , شماره تلفن را باید پایین وارد کنید.",
"Settings_SMSAPIAccount": "تنظیم اکانت SMS API",
"Settings_SMSProvider": "ارائه دهنده خدمات پیامک",
diff --git a/plugins/MobileMessaging/lang/fi.json b/plugins/MobileMessaging/lang/fi.json
index 1694513001..c742e77c2c 100644
--- a/plugins/MobileMessaging/lang/fi.json
+++ b/plugins/MobileMessaging/lang/fi.json
@@ -21,7 +21,6 @@
"Settings_PhoneActivated": "Puhelinnumero on todennettu! Nyt voit vastaanottaa tilastojasi tekstiviesteinä.",
"Settings_PhoneNumber": "Puhelinnumero",
"Settings_PhoneNumbers_Add": "Lisää uusi puhelinnumero",
- "Settings_PhoneNumbers_CountryCode_Help": "Jos et tiedä puhelinnumerosi maakoodia, hae maasi täältä",
"Settings_PhoneNumbers_Help": "Ennen kuin voit saada raportteja puhelimeesi SMS-viesteinä (tekstiviesteinä), sinun täytyy antaa puhelinnumerosi alle.",
"Settings_PhoneNumbers_HelpAdd": "Kun klikkaat \"Lisää\", puhelimeesi lähetetään SMS, joka sisältää koodin. Kirjaudu sisään Piwikiin, klikkaa Asetukset ja sitten Mobiiliviestintä. Kun olet antanut koodin, voit vastaanottaa raportteja puhelimeesi.",
"Settings_PleaseSignUp": "Luodaksesi SMS raportteja ja vastaanottaaksesi tekstiviestejä verkkosivusi tilastoista, kirjaudu SMS API:n avulla ja merkitse tiedot alle.",
diff --git a/plugins/MobileMessaging/lang/fr.json b/plugins/MobileMessaging/lang/fr.json
index 26ee3e98f0..1b90eb979c 100644
--- a/plugins/MobileMessaging/lang/fr.json
+++ b/plugins/MobileMessaging/lang/fr.json
@@ -9,10 +9,14 @@
"PluginDescription": "Créez et téléchargez des rapports par SMS personnalisés et recevez les sur votre mobile sur une base quotidienne, hebdomadaire ou mensuelle.",
"Settings_APIKey": "Clé API",
"Settings_CountryCode": "Code pays",
+ "Settings_SelectCountry": "Sélectionnez un pays",
"Settings_CredentialNotProvided": "Avant de pouvoir créer et gérer les numéros de téléphone veuillez connecter Piwik à votre compte SMS ci-dessus.",
"Settings_CredentialNotProvidedByAdmin": "Avant de pouvoir créer et gérer vos numéros de téléphone, veuille demander à votre administrateur de connecter Piwik à un compte SMS.",
"Settings_CredentialProvided": "Votre compte d'API SMS %s est correctement configuré!",
"Settings_DeleteAccountConfirm": "Êtes vous sûr(e) de vouloir supprimer ce compte SMS?",
+ "Settings_DelegatedSmsProviderOnlyAppliesToYou": "Le service d'envoi de SMS configuré ne sera utilisé que par vous et non par un autre utilisateur.",
+ "Settings_DelegatedPhoneNumbersOnlyUsedByYou": "Le numéro de téléphone configuré ne sera visible et utilisable que par vous et non par un autre utilisateur.",
+ "Settings_EnterActivationCode": "Entrer le code d'activation",
"Settings_InvalidActivationCode": "Le code entré n'est pas valide, veuillez réessayer.",
"Settings_LetUsersManageAPICredential": "Autoriser les utilisateur à gérer leur propre identifiants d'API SMS",
"Settings_LetUsersManageAPICredential_No_Help": "Tous le utilisateurs sont capables de recevoir des rapports SMS et utiliseront le crédit de leur compte.",
@@ -21,7 +25,7 @@
"Settings_PhoneActivated": "Numéro de téléphone validé! Vous pouvez maintenant recevoir vos statistiques.",
"Settings_PhoneNumber": "Numéro de téléphone",
"Settings_PhoneNumbers_Add": "Ajouter un nouveau numéro de téléphone",
- "Settings_PhoneNumbers_CountryCode_Help": "Si vous ne connaissez pas votre code pays, cherchez votre pays ici",
+ "Settings_PhoneNumbers_CountryCode_Help": "Si vous ne connaissez pas votre indicatif téléphonique de pays, sélectionnez votre pays ici.",
"Settings_PhoneNumbers_Help": "Avant de recevoir des rapports par SMS sur un téléphone, le numéro de téléphone doit être entré ci-dessous.",
"Settings_PhoneNumbers_HelpAdd": "Quand vous cliquez sur \"Ajouter\", un SMS contenant un code sera envoyé au téléphone. L'utilisateur qui recevra le code devra ensuite se connecter à Piwik, Cliquer sur Paramètres, puis sur Messagerie Mobile. Après avoir entré le code, l'utilisateur sera capable de recevoir des rapports sur son téléphone.",
"Settings_PleaseSignUp": "Pour créer un rapport SMS et en recevoir avec les statistiques de vos sites web sur votre téléphone mobile, veuillez vous enregistrer auprès d'une API SMS et entrer vos informations ci-dessous.",
diff --git a/plugins/MobileMessaging/lang/hi.json b/plugins/MobileMessaging/lang/hi.json
index ac074b88e5..09214a3711 100644
--- a/plugins/MobileMessaging/lang/hi.json
+++ b/plugins/MobileMessaging/lang/hi.json
@@ -21,7 +21,6 @@
"Settings_PhoneActivated": "फ़ोन नंबर मान्य है! अब आप अपने आँकड़ों के साथ एसएमएस प्राप्त कर सकते हैं.",
"Settings_PhoneNumber": "फोन नंबर",
"Settings_PhoneNumbers_Add": "एक नया फ़ोन नंबर जोड़ें",
- "Settings_PhoneNumbers_CountryCode_Help": "आपको फोन के देश कोड का पता नहीं है, तो यहाँ अपने देश के लिए देखो",
"Settings_PhoneNumbers_Help": "एसएमएस (पाठ संदेश) प्राप्त करने से पहले एक फोन पर रिपोर्ट, फोन नंबर नीचे दर्ज किया जाना चाहिए.",
"Settings_PhoneNumbers_HelpAdd": "यदि आप \"जोड़ें\" पर क्लिक करते हैं, एक कोड युक्त एक एसएमएस फ़ोन पर भेजा जाएगा. कोड प्राप्त करने के बाद उपयोगकर्ता Piwik पर लॉगइन करना चाहिए, मोबाइल संदेश पर फिर क्लिक करें, सेटिंग्स पर क्लिक करें. कोड को दर्ज करने के बाद उपयोगकर्ता अपने फोन पर टेक्स्ट रिपोर्ट प्राप्त करने में सक्षम हो जाएगा.",
"Settings_PleaseSignUp": "एसएमएस रिपोर्ट बनाने और अपने मोबाइल फोन पर अपने 'वेबसाइट के आँकड़े के साथ छोटे पाठ संदेश प्राप्त करने के लिए, एसएमएस एपीआई के साथ साइन अप और नीचे अपनी जानकारी दर्ज करें.",
diff --git a/plugins/MobileMessaging/lang/id.json b/plugins/MobileMessaging/lang/id.json
index be3b870245..bb2f063488 100644
--- a/plugins/MobileMessaging/lang/id.json
+++ b/plugins/MobileMessaging/lang/id.json
@@ -21,7 +21,6 @@
"Settings_PhoneActivated": "Nomor telepon tersahkan! Anda sekarang dapat menerima SMS dengan statististik Anda.",
"Settings_PhoneNumber": "Nomor Telepon",
"Settings_PhoneNumbers_Add": "Tambah sebuah Nomor Telepon Baru",
- "Settings_PhoneNumbers_CountryCode_Help": "Bila Anda tidak tahu kode negara telepon, lihat negara Anda di sini",
"Settings_PhoneNumbers_Help": "Sebelum menerima laporan SMS (pesan teks) dalam telepon, nomor telepon harus dimasukkan di bawah.",
"Settings_PhoneNumbers_HelpAdd": "Ketika Anda mengeklik \"Tambah\", sebuah SMS berisi kode akan dikirim ke telepon Anda. Pengguna penerima kode harus segera masuk-log ke Piwik, klik Pengaturan, lalu klik pada Pesan Bergerak. Setelah memasukkan kode, pengguna akan mampu menerima laporan teks dalam telepon miliknya.",
"Settings_PleaseSignUp": "Untuk membuat laporan SMS dan menerima pesan pendek dengan statistik situs Anda dalam telepon seluler, harap mendaftar dengan API SMS dan masukkan informasi Anda di bawah.",
diff --git a/plugins/MobileMessaging/lang/it.json b/plugins/MobileMessaging/lang/it.json
index cb4e358da5..87e95a0afe 100644
--- a/plugins/MobileMessaging/lang/it.json
+++ b/plugins/MobileMessaging/lang/it.json
@@ -9,10 +9,14 @@
"PluginDescription": "Crea e invia report personalizzati via SMS, con cadenza giornaliera, settimanale o mensile.",
"Settings_APIKey": "Chiave API",
"Settings_CountryCode": "Codice Nazione",
+ "Settings_SelectCountry": "Scegli nazione",
"Settings_CredentialNotProvided": "Prima di creare e gestire i numeri di telefono, si prega di collegare Piwik al tuo account SMS qui sopra.",
"Settings_CredentialNotProvidedByAdmin": "Prima di creare e gestire i numeri di telefono, contatta l'amministratore per collegare Piwik a un account SMS.",
"Settings_CredentialProvided": "Il tuo account %s SMS API è configurato correttamente!",
"Settings_DeleteAccountConfirm": "Sei sicuro di voler cancellare questo account SMS?",
+ "Settings_DelegatedSmsProviderOnlyAppliesToYou": "Il provider SMS configurato verrà utilizzato solo da te e da nessuno degli altri utenti.",
+ "Settings_DelegatedPhoneNumbersOnlyUsedByYou": "I numeri di telefono configurati saranno visti e utilizzati solo da te e da nessuno degli altri utenti.",
+ "Settings_EnterActivationCode": "Immetti codice di attivazione",
"Settings_InvalidActivationCode": "Il codice inserito non è valido, riprova.",
"Settings_LetUsersManageAPICredential": "Permetti a tutti gli utenti di gestire le proprio operatore SMS",
"Settings_LetUsersManageAPICredential_No_Help": "Tutti gli utenti potranno ricevere report SMS e utilizzeranno le credenziali del tuo account.",
@@ -21,7 +25,7 @@
"Settings_PhoneActivated": "Numero di telefono convalidato! Ora puoi ricevere gli SMS con le tue statistiche.",
"Settings_PhoneNumber": "Numero di telefomo",
"Settings_PhoneNumbers_Add": "Aggiungi Numero Telefonico",
- "Settings_PhoneNumbers_CountryCode_Help": "Se non conosci il prefisso internazionale del tuo Paese, cercalo qui",
+ "Settings_PhoneNumbers_CountryCode_Help": "Se desideri sapere il prefisso internazionale, cerca qui il tuo paese.",
"Settings_PhoneNumbers_Help": "Prima di ricevere SMS (messaggi di testo) su un telefono, bisogna inserirne qui sotto il numero.",
"Settings_PhoneNumbers_HelpAdd": "Quando si fa clic su \"Aggiungi\", un SMS contenente un codice sarà inviato al telefono. L'utente che riceve il codice deve quindi accedere a Piwik, fare clic su Impostazioni, quindi fare clic su Messaggeria Mobile. Dopo aver inserito il codice, l'utente potrà ricevere i report in formato di testo sul suo telefono.",
"Settings_PleaseSignUp": "Per creare SMS e ricevere brevi messaggi di testo con le statistiche dei tuoi siti web sul tuo cellulare, si prega di registrarsi con l'API SMS e immettere le informazioni qui di seguito.",
diff --git a/plugins/MobileMessaging/lang/ja.json b/plugins/MobileMessaging/lang/ja.json
index 7296a247ec..1e06701e34 100644
--- a/plugins/MobileMessaging/lang/ja.json
+++ b/plugins/MobileMessaging/lang/ja.json
@@ -21,7 +21,6 @@
"Settings_PhoneActivated": "電話番号が検証されました!あなたの統計情報をSMSで受け取る事ができます。",
"Settings_PhoneNumber": "電話番号",
"Settings_PhoneNumbers_Add": "新しい電話番号を追加",
- "Settings_PhoneNumbers_CountryCode_Help": "国番号が不明な場合、あなたの国をここで探してください。",
"Settings_PhoneNumbers_Help": "SMS レポート(テキストメッセージ)を受け取る前に、電話番号を以下に入力する必要があります。",
"Settings_PhoneNumbers_HelpAdd": "\"追加\" をクリックすると、コードを含むSMSが電話に送信されます。コードを受け取ったユーザーは、次に Piwik にログインし、設定をクリック、次にモバイルメッセージをクリックします。コードを入力後、ユーザー自身の電話にテキストメッセージを受け取れるようになります。",
"Settings_PleaseSignUp": "SMS レポートを作成し、携帯電話でウェブサイトの統計情報を含む短いテキストメッセージを受け取るには、SMS API でサインアップし、以下にあなたの情報を入力してください。",
diff --git a/plugins/MobileMessaging/lang/ko.json b/plugins/MobileMessaging/lang/ko.json
index 74f5ff5ed2..2d9881da17 100644
--- a/plugins/MobileMessaging/lang/ko.json
+++ b/plugins/MobileMessaging/lang/ko.json
@@ -21,7 +21,6 @@
"Settings_PhoneActivated": "전화 번호 확인! 이제 통계를 SMS로 받을 수 있습니다.",
"Settings_PhoneNumber": "전화번호",
"Settings_PhoneNumbers_Add": "전화번호 추가",
- "Settings_PhoneNumbers_CountryCode_Help": "전화 국가 코드를 모를 경우, 여기에서 국가를 찾을 수 있음",
"Settings_PhoneNumbers_Help": "SMS (문자 메시지)로 보고서를 수신하려면, 전화번호를 아래에 입력해야합니다.",
"Settings_PhoneNumbers_HelpAdd": "\"추가\"를 클릭하면, 당신의 휴대 전화로 인증코드가 포함된 SMS를 전송합니다. 코드를 받는 사용자는 Piwik에 로그인하고 설정에 들어가서 모바일 메시징을 클릭합니다. 인증코드를 입력한 후, 사용자는 자신의 휴대 전화로 문자 보고서를 받을 수 있습니다.",
"Settings_PleaseSignUp": "웹사이트 통계를 짧은 문자 메시지로 생성하여 휴대 전화의 SMS 보고서로 수신하려면, 아래에 정보를 입력하여 SMS API에 가입해 주세요.",
diff --git a/plugins/MobileMessaging/lang/nb.json b/plugins/MobileMessaging/lang/nb.json
index faea5eb984..ddc44db449 100644
--- a/plugins/MobileMessaging/lang/nb.json
+++ b/plugins/MobileMessaging/lang/nb.json
@@ -12,7 +12,7 @@
"Settings_SMSAPIAccount": "Behandle SMS API-konto",
"Settings_SMSProvider": "SMS-leverandør",
"Settings_SuperAdmin": "Superbruker-instillinger",
- "Settings_UpdateOrDeleteAccount": "\"Du kan også %1$soppdatere%2$s eller %3$sslette%4$s denne kontoen.",
+ "Settings_UpdateOrDeleteAccount": "Du kan også %1$soppdatere%2$s eller %3$sslette%4$s denne kontoen.",
"Settings_ValidatePhoneNumber": "Valider",
"Settings_VerificationCodeJustSent": "Vi har nettopp sendt en SMS til dette nummeret med en kode: Skriv inn denne koden ovenfor og klikk \"Valider\".",
"SettingsMenu": "Meldingstjenester",
diff --git a/plugins/MobileMessaging/lang/nl.json b/plugins/MobileMessaging/lang/nl.json
index 8c1c5f2276..1934d6548a 100644
--- a/plugins/MobileMessaging/lang/nl.json
+++ b/plugins/MobileMessaging/lang/nl.json
@@ -21,7 +21,6 @@
"Settings_PhoneActivated": "Telefoonnummer gevalideerd! Je kunt nu SMS berichten met uw statistieken ontvangen.",
"Settings_PhoneNumber": "Telefoonnummer",
"Settings_PhoneNumbers_Add": "Voeg een nieuw telefoonnummer toe",
- "Settings_PhoneNumbers_CountryCode_Help": "Indien je de landcode van je telefoonnummer niet weet, dan kun je hier je land opzoeken",
"Settings_PhoneNumbers_Help": "Voordat je SMS rapporten op een telefoon kunt ontvangen, moet het telefoonnummer hieronder worden ingegeven.",
"Settings_PhoneNumbers_HelpAdd": "Wanneer je klikt op \"Voeg toe\", zal een SMS met een code worden verzonden naar je telefoon. De gebruiker die de code ontvangt, moet dan inloggen in Piwik, op Instellingen klikken en daarna klikken op Mobiele berichten. Nadat de code is ingevoerd, zal de gebruiker tekst rapporten kunnen ontvangen vanaf zijn telefoon.",
"Settings_PleaseSignUp": "Om SMS rapporten aan te maken en SMS berichten met je website statistieken te ontvangen op je mobiele telefoon,gelieve in te loggen met de SMS API en je informatie hieronder in te vullen.",
diff --git a/plugins/MobileMessaging/lang/pt-br.json b/plugins/MobileMessaging/lang/pt-br.json
index 54e0c4239e..32abd348c0 100644
--- a/plugins/MobileMessaging/lang/pt-br.json
+++ b/plugins/MobileMessaging/lang/pt-br.json
@@ -9,10 +9,13 @@
"PluginDescription": "Criar e fazer download de relatórios personalizados SMS e tê-los enviado para o seu celular em uma base diária, semanal ou mensal.",
"Settings_APIKey": "API Key",
"Settings_CountryCode": "Código do país",
+ "Settings_SelectCountry": "Selecionar país",
"Settings_CredentialNotProvided": "Antes que você possa criar e gerenciar números de telefone, ligue Piwik na sua Conta SMS acima.",
"Settings_CredentialNotProvidedByAdmin": "Antes que você possa criar e gerenciar números de telefone, por favor, pergunte ao seu administrador para conectar o Piwik a uma conta SMS.",
"Settings_CredentialProvided": "Sua conta %s API SMS está configurada corretamente!",
"Settings_DeleteAccountConfirm": "Tem certeza de que deseja apagar esta conta SMS?",
+ "Settings_DelegatedSmsProviderOnlyAppliesToYou": "O provedor de SMS configurado será usado somente por você e não pelos outros usuários.",
+ "Settings_EnterActivationCode": "Entre com o código de ativação",
"Settings_InvalidActivationCode": "O Código informado não é válido, por favor tente novamente.",
"Settings_LetUsersManageAPICredential": "Permitem aos usuários gerenciar suas próprias credenciais SMS API",
"Settings_LetUsersManageAPICredential_No_Help": "Todos os usuários são capazes de receber relatórios de SMS e utilização de créditos da sua conta.",
@@ -21,7 +24,6 @@
"Settings_PhoneActivated": "Telefone validado! Agora você pode receber SMS com suas estatísticas.",
"Settings_PhoneNumber": "Número de telefone",
"Settings_PhoneNumbers_Add": "Adicionar novo número de telefone",
- "Settings_PhoneNumbers_CountryCode_Help": "Se você não sabe o código de telefone do seu país, procure aqui",
"Settings_PhoneNumbers_Help": "Antes de receber em seu telefone, relatórios SMS (mensagens de texto) o número do telefone deve ser inserido abaixo.",
"Settings_PhoneNumbers_HelpAdd": "Quando clicar em \"Adicionar\", um SMS contendo um código será enviado para o celular. O usuário receber o código deve, então, acessar Piwik, clique em Configurações e clique em mensagens móveis. Após digitar o código, o usuário será capaz de receber relatórios de texto em seu telefone.",
"Settings_PleaseSignUp": "Para criar relatórios de SMS e receber mensagens curtas de texto com as suas estatísticas de website \"em seu telefone móvel, inscreva-se com a API SMS e insira as informações abaixo.",
diff --git a/plugins/MobileMessaging/lang/ro.json b/plugins/MobileMessaging/lang/ro.json
index 60a35d16ac..bd4f3a92cd 100644
--- a/plugins/MobileMessaging/lang/ro.json
+++ b/plugins/MobileMessaging/lang/ro.json
@@ -21,7 +21,6 @@
"Settings_PhoneActivated": "Număr de telefon validat! Puteți primi acum SMS-uri cu statisticile.",
"Settings_PhoneNumber": "Număr de telefon",
"Settings_PhoneNumbers_Add": "Adaugă un Număr de Telefon nou",
- "Settings_PhoneNumbers_CountryCode_Help": "Dacă nu știți codul de țară pentru telefon, uita-te pentru țara ta aici",
"Settings_PhoneNumbers_Help": "Înainte de a primi SMS-uri (mesaje text), rapoartele pe un telefon, numărul de telefon trebuie să fie introdusă mai jos.",
"Settings_PhoneNumbers_HelpAdd": "Când faceți clic pe \"Add\", un SMS cu un cod va fi trimis la telefon. Utilizatorul primește codul ar trebui să intri, atunci la Piwik, faceți clic pe Settings, apoi faceți clic pe Mesagerie Mobile. După introducerea codului, utilizatorul va fi capabil de a primi rapoarte de text de pe telefonul lui.",
"Settings_PleaseSignUp": "Pentru a crea SMS rapoarte și pentru primi mesaje text scurte cu statisticile site-urilor dvs. pe telefonul mobil, vă rugăm să vă înscrieți cu API SMS și sa introduceți informațiile dvs. mai jos.",
diff --git a/plugins/MobileMessaging/lang/ru.json b/plugins/MobileMessaging/lang/ru.json
index e54e2c7748..5ee4e97e0f 100644
--- a/plugins/MobileMessaging/lang/ru.json
+++ b/plugins/MobileMessaging/lang/ru.json
@@ -21,7 +21,6 @@
"Settings_PhoneActivated": "Номер телефона успешно проверен! Теперь вы можете получать SMS со статистикой.",
"Settings_PhoneNumber": "Номер телефона",
"Settings_PhoneNumbers_Add": "Добавить новый номер телефона",
- "Settings_PhoneNumbers_CountryCode_Help": "Если Вы не знаете телефонный код Вашей страны, найдите свою страну здесь",
"Settings_PhoneNumbers_Help": "Для получения SMS (текстовых сообщений) с отчетами, введите ниже номер телефона.",
"Settings_PhoneNumbers_HelpAdd": "Когда Вы нажмете \"Добавить\", SMS-сообщение с кодом будет отправлено на указанный номер. Получивший код пользователь должен войти в Piwik, перейти в Настройки, а затем в Mobile Messaging. После того, как код будет введен, пользователь сможет получать текстовые отчеты на свой телефон.",
"Settings_PleaseSignUp": "Для создания SMS сообщений и получения коротких текстовых сообщений со статистикой ваших веб-сайтов, на свой мобильный телефон, пожалуйста, зарегистрируйтесь в SMS API и введите информацию ниже.",
diff --git a/plugins/MobileMessaging/lang/sq.json b/plugins/MobileMessaging/lang/sq.json
index 4cb815e3f1..4bd2239360 100644
--- a/plugins/MobileMessaging/lang/sq.json
+++ b/plugins/MobileMessaging/lang/sq.json
@@ -1,8 +1,45 @@
{
"MobileMessaging": {
- "Exception_UnknownProvider": "Emër mundësuesi '%1$s' i panjohur. Provoni më mirë një nga vijuesit: %2$s.",
+ "Exception_UnknownProvider": "Emër furnizuesi '%1$s' i panjohur. Provoni më mirë një nga vijuesit: %2$s.",
+ "MobileReport_AdditionalPhoneNumbers": "Mund të shtoni më tepër numra telefoni duke hyrë te",
+ "MobileReport_MobileMessagingSettingsLink": "faqja e rregullimeve për Mesazhe Celulari",
+ "MobileReport_NoPhoneNumbers": "Ju lutemi, aktivizoni të paktën një numër telefoni duke hyrë te",
+ "MultiSites_Must_Be_Activated": "Që të prodhohen tekste SMS për statistikat e sajtit tuaj, ju lutemi, aktivizoni shtojcën MultiSajte te Piwik-u.",
"PhoneNumbers": "Numra Telefonash",
+ "PluginDescription": "Krijoni dhe shkarkoni raporte vetjake SMS dhe bëni që të dërgohen te celulari juaj përditë, çdo javë ose çdo muaj.",
"Settings_APIKey": "Kyç API-sh",
- "Settings_CountryCode": "Kod Vendi"
+ "Settings_CountryCode": "Kod Vendi",
+ "Settings_SelectCountry": "Përzgjidhni vend",
+ "Settings_CredentialNotProvided": "Përpara se të mund të krijoni dhe administroni numra telefoni, ju lutemi, lidheni Piwik-un me Llogarinë tuaj SMS më sipër.",
+ "Settings_CredentialNotProvidedByAdmin": "Përpara se të mund të krijoni dhe administroni numra telefoni, ju lutemi, kërkojini përgjegjësit të instalimit tuaj të lidhë Piwik-un me një Llogari SMS.",
+ "Settings_CredentialProvided": "API juaj %s është e formësuar saktë!",
+ "Settings_DeleteAccountConfirm": "Jeni i sigurt se doni të fshihet kjo llogari SMS?",
+ "Settings_DelegatedSmsProviderOnlyAppliesToYou": "Furnizuesi i SMS-ve i formësuar do të përdoret vetëm nga ju, dhe jo nga ndonjë përdorues tjetër çfarëdo.",
+ "Settings_DelegatedPhoneNumbersOnlyUsedByYou": "Numrat e telefonave të formësuar mund të shihen dhe përdoren vetëm nga ju, dhe jo nga ndonjë përdorues tjetër çfarëdo.",
+ "Settings_EnterActivationCode": "Jepni kod aktivizimi",
+ "Settings_InvalidActivationCode": "Kodi i dhënë s’qe i vlefshëm, ju lutemi, riprovoni.",
+ "Settings_LetUsersManageAPICredential": "Lejoju përdoruesve të administrojnë furnizuesit e tyre SMS",
+ "Settings_LetUsersManageAPICredential_No_Help": "Krejt përdoruesit janë në gjendje të marrin Raporte SMS dhe do të përdorin kreditin e llogarisë tuaj.",
+ "Settings_LetUsersManageAPICredential_Yes_Help": "Çdo përdorues do të jetë në gjendje të rregullojë Llogarinë e vet API SMS dhe nuk do të përdorë kreditin tuaj.",
+ "Settings_ManagePhoneNumbers": "Administroni Numra Telefonash",
+ "Settings_PhoneActivated": "Numër telefoni i vlefshëm! Tani mund të merrni SMS me statistika tuajat.",
+ "Settings_PhoneNumber": "Numër Telefoni",
+ "Settings_PhoneNumbers_Add": "Shtoni një Numër Telefoni të ri",
+ "Settings_PhoneNumbers_CountryCode_Help": "Nëse nuk e dini kodin e telefonave për vendin tuaj, kontrolloni për vendin tuaj këtu.",
+ "Settings_PhoneNumbers_Help": "Përpara se të merren raporte me SMS (mesazhe tekst) në një telefon, duhet dhënë më poshtë numri i telefonit.",
+ "Settings_PhoneNumbers_HelpAdd": "Kur të klikoni \"Shtoje\", te telefoni do të dërgohet një SMS që përmban një kod. Përdoruesi që merr kodin do të duhej mandej të bënte hyrjen në Piwik, të klikonte mbi Rregullimet, dhe më pas të klikonte mbi Mesazhe Celulari. Pasi të japë kodin, përdoruesi do të jetë në gjendje të marrë raporte tekst në telefonin e vet.",
+ "Settings_PleaseSignUp": "Që të krijoni dhe të merrni në celularin tuaj raporte SMS me statistika nga sajti juaj, ju lutemi, bëni regjistrimin te API SMS dhe jepni më poshtë të dhënat tuaja.",
+ "Settings_SMSAPIAccount": "Administroni Llogari SMS API",
+ "Settings_SMSProvider": "Furnizues SMS-sh",
+ "Settings_SuperAdmin": "Rregullime Superpërdoruesi",
+ "Settings_SuspiciousPhoneNumber": "Nëse s’e merrni mesazhin tekst, mund të provoni pa zero në fillim, domethënë, %s",
+ "Settings_UpdateOrDeleteAccount": "Mundeni edhe ta %1$spërditësoni%2$s ose %3$sfshini%4$s këtë llogari.",
+ "Settings_ValidatePhoneNumber": "Vleftësoje",
+ "Settings_VerificationCodeJustSent": "Sapo dërguam një SMS me një kod te ky numër: ju lutemi, jepeni këtë kod më sipër dhe klikoni mbi \"Vleftësoje\".",
+ "SettingsMenu": "Mesazhe Celulari",
+ "SMS_Content_Too_Long": "[shumë i gjatë]",
+ "TopLinkTooltip": "Merrni Raporte Analizash Web drejt e te email-i ose celulari juaj.",
+ "TopMenu": "Raporte me Email & SMS",
+ "VerificationText": "Kodi është %1$s. Që të vleftësohet numri i telefonit tuaj dhe të merrni raporte Piwik me SMS, ju lutemi, kopjojeni këtë kot te formulari përkatës përmes Piwik-ut > %2$s > %3$s."
}
} \ No newline at end of file
diff --git a/plugins/MobileMessaging/lang/sr.json b/plugins/MobileMessaging/lang/sr.json
index d0c22a0182..e277e45801 100644
--- a/plugins/MobileMessaging/lang/sr.json
+++ b/plugins/MobileMessaging/lang/sr.json
@@ -9,10 +9,14 @@
"PluginDescription": "Napravite i preuzmite SMS izveštaje koji će vam biti slati na vaš mobilni dnevno, nedeljno i mesečno.",
"Settings_APIKey": "API ključ",
"Settings_CountryCode": "Kod zemlje",
+ "Settings_SelectCountry": "Izaberite zemlju",
"Settings_CredentialNotProvided": "Pre nego što budete u mogućnosti da upravljate brojevima telefona, molimo vas da povežete Piwik sa vašim SMS nalogom.",
"Settings_CredentialNotProvidedByAdmin": "Da biste bili u mogućnosti da kreirate i upravljate telefonskim brojevima, zamolite administratora da poveže Piwik sa SMS nalogom.",
"Settings_CredentialProvided": "Vaš %s SMS API je ispravno podešen.",
"Settings_DeleteAccountConfirm": "Da li ste sigurni da želite da obrišete ovaj SMS nalog?",
+ "Settings_DelegatedSmsProviderOnlyAppliesToYou": "Izabrani SMS provajder će biti korišćen samo za vas, ne i za ostale korisnike.",
+ "Settings_DelegatedPhoneNumbersOnlyUsedByYou": "Izabrane brojeve telefona možete videti i koristiti samo vi, ne i ostali korisnici.",
+ "Settings_EnterActivationCode": "Upišite aktivacioni kod",
"Settings_InvalidActivationCode": "Kod koji ste uneli nije dobar, pokušajte ponovo.",
"Settings_LetUsersManageAPICredential": "Omogući korisnicima da sami upravljaju svojim SMS API podešavanjima",
"Settings_LetUsersManageAPICredential_No_Help": "Svi korisnici će biti u mogućnosti da primaju SMS izveštaje i da koriste kredite sa vašeg naloga.",
@@ -21,7 +25,7 @@
"Settings_PhoneActivated": "Telefonski broj je validan! Sada možete da primate SMS poruke sa statistikama.",
"Settings_PhoneNumber": "Broj telefona",
"Settings_PhoneNumbers_Add": "Dodaj novi broj telefona",
- "Settings_PhoneNumbers_CountryCode_Help": "Ukoliko ne znate mobilni kod za zemlju, pogledajte ovde",
+ "Settings_PhoneNumbers_CountryCode_Help": "Ukoliko ne znati kod zemlje, potražite vašu zemlju ovde.",
"Settings_PhoneNumbers_Help": "Da biste bili u mogućnosti da primate SMS izveštaje na mobilni telefon, morate da upišete broj telefona.",
"Settings_PhoneNumbers_HelpAdd": "Kada budete kliknuli na \"Dodaj\", SMS sa kodom će biti poslat na mobilni. Korisnik koji bude primio kod bi onda trebalo da se prijavi na Piwik, klikne na Podešavanja pa na Mobilni. Nakon što unese kod korisnik će biti u mogućnosti da prima izveštaje na svoj mobilni telefon.",
"Settings_PleaseSignUp": "Da biste kreirali SMS izveštaje i primali poruke sa statistikama na mobilni, molimo vas da se prijavite sa SMS API-jem i da upišete svoje podatke.",
diff --git a/plugins/MobileMessaging/lang/sv.json b/plugins/MobileMessaging/lang/sv.json
index d7e3bfbd19..523182f6e3 100644
--- a/plugins/MobileMessaging/lang/sv.json
+++ b/plugins/MobileMessaging/lang/sv.json
@@ -21,7 +21,6 @@
"Settings_PhoneActivated": "Telefonnumret är validerat! Du kan nu få SMS med din statistik.",
"Settings_PhoneNumber": "Telefonnummer",
"Settings_PhoneNumbers_Add": "Lägg till ett nytt telefonnummer",
- "Settings_PhoneNumbers_CountryCode_Help": "Om du inte vet din telefons landskod, titta efter ditt land här",
"Settings_PhoneNumbers_Help": "Innan du får ett SMS (textmeddelande) rapporter i din telefon, behöver du skriva in ditt nummer här under.",
"Settings_PhoneNumbers_HelpAdd": "När du klickar på \"Lägg till\", kommer ett SMS som innehåller en kod att skickas till din telefon. Efter det ska du logga in på Piwik, klicka på inställningar och efter det Mobil Meddelanden. När du skrivit in din kod, kommer du kunna ta emot rapporter direkt till din telefon.",
"Settings_PleaseSignUp": "För att skapa SMS rapporter och få korta meddelanden med uppdateringar från din webbsidas mobiltelefon, var snäll att anmäl dig med hjälp av SMS API och skriv in informationen nedan.",
diff --git a/plugins/MobileMessaging/lang/tl.json b/plugins/MobileMessaging/lang/tl.json
index 36ffcd81d9..f4aa7dadb7 100644
--- a/plugins/MobileMessaging/lang/tl.json
+++ b/plugins/MobileMessaging/lang/tl.json
@@ -21,7 +21,6 @@
"Settings_PhoneActivated": "Ang numero ng telepono ay nabigyang-bisa! Maaari ka nang makatanggap ng SMS tungkol sa iyong stats.",
"Settings_PhoneNumber": "Phone Number",
"Settings_PhoneNumbers_Add": "Magdagdag ng bagong Numero ng Telepono",
- "Settings_PhoneNumbers_CountryCode_Help": "Kung hindi alam ang code ng telepono ng iyong bansa hanapin ang iyong bansa dito.",
"Settings_PhoneNumbers_Help": "Bago makatanggap ng SMS (text message) sa mga ulat sa isang telepono ang numero ang telepono ay dapat na maipasok sa baba.",
"Settings_PhoneNumbers_HelpAdd": "Kapag iyong na-click ang 'Add\" isang SMS na naglalaman ng code ay ipapadala sa iyong telepono. Ang user ay makakatanggap ng code na ito ay dapat na mag-login sa Piwik i-click ang settings pagkatapos ay e-click ang Mobile Messaging. Matapos na ipasok ang code ang user ay may matatanggap ng ulat mula sa kanyang phone.",
"Settings_PleaseSignUp": "Upang lumikha ng mga ulat sa SMS at tumanggap ng maikling mga text na mensahe patungkol sa stats ng iyong mga website sa iyong mobile phone mangyaring mag-sign up gamit ang SMS API at ipasok ang iyong impormasyon sa ibaba",
diff --git a/plugins/MobileMessaging/lang/tr.json b/plugins/MobileMessaging/lang/tr.json
index 3a034272ba..140295d19e 100644
--- a/plugins/MobileMessaging/lang/tr.json
+++ b/plugins/MobileMessaging/lang/tr.json
@@ -9,7 +9,6 @@
"Settings_PhoneActivated": "Telefon numarası doğrulandı! Artık istatistikleri SMS ile alabilirsiniz.",
"Settings_PhoneNumber": "Telefon Numarası",
"Settings_PhoneNumbers_Add": "Yeni telefon numarası ekle",
- "Settings_PhoneNumbers_CountryCode_Help": "Telefon ülke kodunu bilmiyorsanız, buradan ülkelere bakabilirsiniz.",
"Settings_SMSAPIAccount": "SMS API Hesabını Yönet",
"Settings_SMSProvider": "SMS Sağlayıcı",
"Settings_ValidatePhoneNumber": "Onayla",
diff --git a/plugins/MobileMessaging/lang/vi.json b/plugins/MobileMessaging/lang/vi.json
index 13c11448f8..0de49060f5 100644
--- a/plugins/MobileMessaging/lang/vi.json
+++ b/plugins/MobileMessaging/lang/vi.json
@@ -21,7 +21,6 @@
"Settings_PhoneActivated": "Số điện thoại đã xác nhận! Bạn có thể nhận tin nhắn SMS ngay bây giờ với số liệu thống kê của bạn.",
"Settings_PhoneNumber": "Số điện thoại",
"Settings_PhoneNumbers_Add": "Thêm một số điện thoại mới",
- "Settings_PhoneNumbers_CountryCode_Help": "Nếu bạn không biết mã điện thoại quốc gia, tìm kiếm quốc gia của bạn ở đây",
"Settings_PhoneNumbers_Help": "Trước khi nhận các báo cáo SMS (tin nhắn văn bản) trên điện thoại, số điện thoại phải được nhập phía dưới.",
"Settings_PhoneNumbers_HelpAdd": "Khi bạn click vào \"Thêm\", một tin nhắn SMS chứa một đoạn mã sẽ được gửi đến điện thoại. Người dùng nhận được đoạn mã sau đó phải đăng nhập vào Piwik, click vào Cài Đặt, sau đó click vào tin nhắn di động. Sau khi nhập đoạn mã, người dùng sẽ có thể nhận được các báo cáo văn bản trên điện thoại của mình.",
"Settings_PleaseSignUp": "Để tạo ra các báo cáo tin nhắn SMS và nhận tin nhắn văn bản ngắn với số liệu thống kê trang web của bạn trên điện thoại di động của bạn, xin vui lòng đăng ký với các API SMS và nhập thông tin của bạn dưới đây.",
diff --git a/plugins/MobileMessaging/lang/zh-cn.json b/plugins/MobileMessaging/lang/zh-cn.json
index 8dec33bdc4..ff57e36307 100644
--- a/plugins/MobileMessaging/lang/zh-cn.json
+++ b/plugins/MobileMessaging/lang/zh-cn.json
@@ -21,7 +21,6 @@
"Settings_PhoneActivated": "电话号码已验证! 您可以收到统计短信了。",
"Settings_PhoneNumber": "电话号码",
"Settings_PhoneNumbers_Add": "增加新的电话号码",
- "Settings_PhoneNumbers_CountryCode_Help": "如果您不知道国家区号,请在这里查询",
"Settings_PhoneNumbers_Help": "在手机上接收短信报表前,需要在下面输入电话号码。",
"Settings_PhoneNumbers_HelpAdd": "点击\"增加\"后,一条包含代码的短信将发到手机上,收到短信的用户需要登录 Piwik,点管理设置,然后点手机短信。输入代码后,用户就能在手机上收到文字报表了。",
"Settings_PleaseSignUp": "要创建短信报表并在手机上通过短信接收网站的统计信息,请注册短信 API 并在下面输入资料。",
diff --git a/plugins/Morpheus/stylesheets/ui/_map.less b/plugins/Morpheus/stylesheets/ui/_map.less
index 702dfa0787..e040f5a236 100644
--- a/plugins/Morpheus/stylesheets/ui/_map.less
+++ b/plugins/Morpheus/stylesheets/ui/_map.less
@@ -57,8 +57,7 @@
}
.uiTest .realTimeMap_datetime,
-/* remove the message only in the dashboard as the real time map in its own report shows the same message */
-.fullWidgetColumn .uiTest .showing_visits_of {
+.uiTest .realTimeMap_overlay {
visibility: hidden;
}
diff --git a/plugins/MultiSites/lang/ko.json b/plugins/MultiSites/lang/ko.json
index ce8aa8a772..628c455cf6 100644
--- a/plugins/MultiSites/lang/ko.json
+++ b/plugins/MultiSites/lang/ko.json
@@ -1,6 +1,8 @@
{
"MultiSites": {
"Evolution": "변화 추이",
+ "LoadingWebsites": "웹사이트 로딩중",
+ "PluginDescription": "유용한 '모든 웹사이트' 대시보드에서 모든 웹사이트와 앱을 보고 비교함",
"TopLinkTooltip": "웹사이트의 모든 웹분석 통계를 비교합니다.",
"Pagination": "%1$s - %2$s 의 %3$s"
}
diff --git a/plugins/MultiSites/lang/sq.json b/plugins/MultiSites/lang/sq.json
index cdcbe04e65..dc62297b5b 100644
--- a/plugins/MultiSites/lang/sq.json
+++ b/plugins/MultiSites/lang/sq.json
@@ -1,6 +1,9 @@
{
"MultiSites": {
- "Evolution": "Evolution",
+ "Evolution": "Evolucion",
+ "LoadingWebsites": "Po ngarkohen sajte",
+ "PluginDescription": "Shihni dhe krahasoni krejt sajtet dhe aplikacionet tuaja te ky pult i dobishëm 'Krejt Sajtet'.",
+ "TopLinkTooltip": "Krahasoni Analiza Web për krejt Sajtet tuaj.",
"Pagination": "%1$s - %2$s of %3$s"
}
} \ No newline at end of file
diff --git a/plugins/Overlay/client/followingpages.js b/plugins/Overlay/client/followingpages.js
index 3185b87b67..eb3ff3b80d 100644
--- a/plugins/Overlay/client/followingpages.js
+++ b/plugins/Overlay/client/followingpages.js
@@ -15,6 +15,9 @@ var Piwik_Overlay_FollowingPages = (function () {
/** Reference to create element function */
var c;
+ /** Counter for the largest clickRate on the page */
+ var maxClickRate = 0;
+
/** Load the following pages */
function load(callback) {
// normalize current location
@@ -63,7 +66,9 @@ var Piwik_Overlay_FollowingPages = (function () {
totalClicks += followingPages[i].referrals;
}
for (i = 0; i < followingPages.length; i++) {
- followingPages[i].clickRate = followingPages[i].referrals / totalClicks * 100;
+ var clickRate = followingPages[i].referrals / totalClicks * 100;
+ followingPages[i].clickRate = clickRate;
+ if (clickRate > maxClickRate) maxClickRate = clickRate;
}
}
@@ -167,8 +172,6 @@ var Piwik_Overlay_FollowingPages = (function () {
if( rate < 0.001 ) {
rate = '<0.001';
- } else if (rate < 1) {
- rate = Math.round( rate * 1000 ) / 1000;
} else if (rate < 10) {
rate = Math.round(rate * 10) / 10;
} else {
@@ -177,6 +180,9 @@ var Piwik_Overlay_FollowingPages = (function () {
var span = c('span').html(rate + '%');
var tagElement = c('div', 'LinkTag').append(span).hide();
+
+ tagElement.attr({'data-rateofmax': Math.round(100 * rate/maxClickRate)/100});
+
body.prepend(tagElement);
linkTag.add(tagElement).hover(function () {
@@ -251,17 +257,22 @@ var Piwik_Overlay_FollowingPages = (function () {
offset = linkTag.offset();
}
+ var zoomFactor = 1 + +tagElement.attr('data-rateofmax');
+ tagElement.css({'zoom':zoomFactor, 'opacity': zoomFactor/2 });
+ offset.top = offset.top / zoomFactor;
+ offset.left = offset.left / zoomFactor;
+
top = offset.top - tagHeight + 6;
left = offset.left - tagWidth + 10;
if (isRight = (left < 2)) {
tagElement.addClass('PIS_Right');
- left = offset.left + linkTag.outerWidth() - 10;
+ left = offset.left + linkTag.outerWidth() / zoomFactor - 10;
}
if (top < 2) {
tagElement.addClass(isRight ? 'PIS_BottomRight' : 'PIS_Bottom');
- top = offset.top + linkTag.outerHeight() - 6;
+ top = offset.top + linkTag.outerHeight() / zoomFactor - 6;
}
tagElement.css({
@@ -545,4 +556,4 @@ var Piwik_Overlay_FollowingPages = (function () {
};
-})(); \ No newline at end of file
+})();
diff --git a/plugins/Overlay/lang/cs.json b/plugins/Overlay/lang/cs.json
index d759cb3867..2f0c1c5e74 100644
--- a/plugins/Overlay/lang/cs.json
+++ b/plugins/Overlay/lang/cs.json
@@ -13,7 +13,7 @@
"OneClick": "1 kliknutí",
"OpenFullScreen": "Přejít na celou obrazovku (bez postranní lišty)",
"Overlay": "Překryv stránky",
- "PluginDescription": "Podívejte se na vaše analytická data jako na překryv na vašich stránkách. Zjistěte, kolik uživatelů kliklo na kterýkoliv odkaz. Poznámka: vyžaduje povolený zásuvný modul přechodů.",
+ "PluginDescription": "Podívejte se na analytická data jako na překryv na svých stránkách. Zjistěte, kolik uživatelů kliklo na jaký odkaz. Poznámka: vyžaduje povolený zásuvný modul přechodů.",
"RedirectUrlError": "Pokoušíte se spustit překryv pro stránku s url \"%1$s\". %2$s Žádná doména z nastavení Piwiku ale neodpovídá odkazu.",
"RedirectUrlErrorAdmin": "Doménu můžete jako další URL přidat v %1$snastavení%2$s.",
"RedirectUrlErrorUser": "Požádejte svého administrátora o přidání stránky jako další URL:."
diff --git a/plugins/Overlay/lang/sq.json b/plugins/Overlay/lang/sq.json
index 8e434a3547..12f9c6ef32 100644
--- a/plugins/Overlay/lang/sq.json
+++ b/plugins/Overlay/lang/sq.json
@@ -1,11 +1,21 @@
{
"Overlay": {
"Clicks": "%s klikime",
+ "ClicksFromXLinks": "%1$s klikime nga një prej %2$s lidhjeve",
"Domain": "Përkatësi",
+ "ErrorNotLoading": "Sesioni Përmbledhje Faqesh s’u nis dot ende.",
+ "ErrorNotLoadingDetails": "Ndoshta faqja e ngarkuar djathtas s’ka kod ndjekësi Piwik. Në këtë rast, provoni të hapni Përmbledhjen për një faqe tjetër që nga raporti për faqet.",
+ "ErrorNotLoadingDetailsSSL": "Meqë po e përdorni Piwik-un përmes https-je, shkaku më i mundshëm është që sajti juaj nuk e mbulon SSL-në. Provoni ta përdorni Piwik-n përmes http-je.",
+ "ErrorNotLoadingLink": "Klikoni këtu që të merrni më tepër ndihmëza diagnostikimi",
"Link": "Lidhje",
"Location": "Vend",
"NoData": "S’ka të dhëna për këtë faqe gjatë periudhës së përzgjedhur.",
"OneClick": "1 klikim",
- "OpenFullScreen": "Kalo sa krejt ekrani (pa anështyllë)"
+ "OpenFullScreen": "Kalo sa krejt ekrani (pa anështyllë)",
+ "Overlay": "Përmbledhje Faqeje",
+ "PluginDescription": "Shihni të dhënat tuaja statistikore si një Përmbledhje te sajti juaj aktual. Shihni sa herë kanë klikuar përdoruesit tuaj në secilën lidhje. Shënim: Lyp të aktivizuar shtojcën Tranzicione.",
+ "RedirectUrlError": "Po përpiqeni të hapni Përmbledhje Faqeje për URL-në \"%1$s\". %2$s Asnjë nga përkatësitë prej rregullimeve të Piwik-ut nuk përputhet me këtë lidhje.",
+ "RedirectUrlErrorAdmin": "Përkatësinë mund ta shtoni si URL shtesë %1$ste rregullimet%2$s.",
+ "RedirectUrlErrorUser": "Kërkojini përgjegjësit tuaj ta shtojë përkatësinë si URL shtesë."
}
} \ No newline at end of file
diff --git a/plugins/PrivacyManager/lang/en.json b/plugins/PrivacyManager/lang/en.json
index a4350a6fc2..0ad7f511cf 100644
--- a/plugins/PrivacyManager/lang/en.json
+++ b/plugins/PrivacyManager/lang/en.json
@@ -5,7 +5,7 @@
"AnonymizeIpExtendedHelp": "When users visit your website, Piwik will not use the full IP address (such as %1$s) but instead Piwik will anonymise it first (to %2$s). IP address anonymisation is one of the requirements set by the privacy laws in some countries such as Germany.",
"AnonymizeIpMaskLengtDescription": "Select how many bytes of the visitors' IPs should be masked.",
"AnonymizeIpMaskLength": "%1$s byte(s) - e.g. %2$s",
- "CannotLockSoDeleteLogActions": "The log_action table will not be purged: please grant the LOCK TABLES privilege to the '%s' MYSQL user.",
+ "CannotLockSoDeleteLogActions": "The log_action table will not be purged: please grant the LOCK TABLES privilege to the '%s' MySQL user.",
"ClickHereSettings": "Click here to access the %s settings.",
"CurrentDBSize": "Current database size",
"DBPurged": "DB purged.",
@@ -65,4 +65,4 @@
"UseDeleteLog": "Regularly delete old visitor logs from the database",
"UseDeleteReports": "Regularly delete old reports from the database"
}
-} \ No newline at end of file
+}
diff --git a/plugins/PrivacyManager/lang/nb.json b/plugins/PrivacyManager/lang/nb.json
index 8642afedbf..ea08bda3bc 100644
--- a/plugins/PrivacyManager/lang/nb.json
+++ b/plugins/PrivacyManager/lang/nb.json
@@ -1,6 +1,6 @@
{
"PrivacyManager": {
- "AnonymizeIpMaskLength": "%1$s byte(s) – f.eks %2$s",
+ "AnonymizeIpMaskLength": "%1$s byte(s) – f.eks. %2$s",
"ClickHereSettings": "Klikk her for å få tilgang til %s-innstillingene.",
"CurrentDBSize": "Nåværende databasestørrelse",
"DeleteDataDescription": "Du kan sette opp Piwik til å regelmessig slette gamle besøkslogger og\/eller behandlede rapporter for å holde databasen din liten.",
@@ -12,8 +12,8 @@
"DeleteMaxRowsNoLimit": "ingen grense",
"DeleteReportsOlderThan": "Slett rapporter eldre enn",
"DeleteDataSettings": "Slett gamle besøkslogger og -rapporter",
- "DoNotTrack_Disable": "Deaktiver Do Not Track støtte",
- "DoNotTrack_Enable": "Aktiver Do Not Track støtte",
+ "DoNotTrack_Disable": "Deaktiver Do Not Track-støtte",
+ "DoNotTrack_Enable": "Aktiver Do Not Track-støtte",
"EstimatedSpaceSaved": "Estimert plassbesparelse",
"GeolocationAnonymizeIpNote": "Merk: Geoposisjonering vil ha omtrent de samme resultatene med en byte anonymisert. Med to byte eller mer, vil geoposisjonering være unøyaktig.",
"KeepDataFor": "Behold all data for",
diff --git a/plugins/PrivacyManager/lang/sq.json b/plugins/PrivacyManager/lang/sq.json
index b9985194d3..708c63a31a 100644
--- a/plugins/PrivacyManager/lang/sq.json
+++ b/plugins/PrivacyManager/lang/sq.json
@@ -1,24 +1,68 @@
{
"PrivacyManager": {
- "AnonymizeIpDescription": "Përzgjidhni \"Po\" nëse doni që Piwik-u të mos gjurmojë adresa IP të përcaktuara qartë.",
+ "AnonymizeIpDescription": "Përzgjidhni \"Po\", nëse doni që Piwik-u të mos ndjekë adresa IP të përcaktuara qartë.",
"AnonymizeIpInlineHelp": "Anonimizoje bajtin(et) e fundit të adresave IP të vizitorëve, në pajtim me ligjet\/udhëzimet vendore mbi privatësinë.",
+ "AnonymizeIpExtendedHelp": "Kur përdoruesit vizitojnë sajtin tuaj, Piwik-u s’do të përdorë adresën e plotë IP (të tillë si %1$s), por në vend të kësaj Piwik-u së pari do ta anonimizojë (si %2$s). Anonimizimi i adresave IP është një nga domosdoshmëritë e vendosura nga ligjet mbi privatësinë në disa vende, si Gjermania, fjala vjen.",
"AnonymizeIpMaskLengtDescription": "Përzgjidhni sa bajte të maskohen te IP-ja e vizitorit.",
"AnonymizeIpMaskLength": "%1$s bajt(e) - p.sh. %2$s",
+ "CannotLockSoDeleteLogActions": "Tabela log_action nuk do të pastrohet: ju lutemi, akordojini privilegjin LOCK TABLES përdoruesit MySQL '%s'.",
"ClickHereSettings": "Klikoni këtu që të shkoni te rregullimet mbi %s.",
"CurrentDBSize": "Madhësia e tanishme e bazës së të dhënave",
+ "DBPurged": "DB-ja u pastrua.",
+ "DeleteBothConfirm": "Ju ndan një hap nga aktivizimi i fshirjes së të dhënave të regjistrave & fshirjes së të dhënave të raporteve. Kjo do t’ju heqë përgjithmonë mundësinë të shihni të dhëna të vjetra statistikore. Jeni i sigurt se doni të bëhet kjo?",
+ "DeleteDataDescription": "Piwik-un mund ta formësoni të fshijë rregullisht regjistra të vjetër vizitorësh dhe\/ose raporte të përpunuar, për ta mbajtur të vogël madhësinë e bazë suaj të të dhënave.",
+ "DeleteDataDescription2": "Nëse dëshirohet, raportet e parapërpunuar nuk do të fshihen, do të fshihen vetëm të dhënat e regjistrave për vizita, parje faqesh dhe shndërrime. Ose, mund të fshihen raportet e parapërpunuar dhe të mbahen të dhënat e regjistrave.",
"DeleteDataInterval": "Fshiji të dhënat e vjetra çdo",
+ "DeleteOldVisitorLogs": "Fshi regjistra të vjetër vizitorësh",
+ "DeleteOldArchivedReports": "Fshi raporte të arkivuar të vjetër",
"DeleteLogDescription2": "Kur aktivizoni fshirjen e vetvetishme të regjistrimeve, duhet të siguroheni që janë përpunuar krejt raportet e ditës së mëparshme, që të mos humbni të dhëna.",
"DeleteLogInfo": "Regjistrimet nga tabelat vijuese do të fshihen: %s",
+ "DeleteLogsConfirm": "Ju ndan një hap nga aktivizimi i fshirjes së të dhënave të regjistrave. Nëse hiqen të dhëna regjistrash të vjetër, dhe s’janë krijuar ende raporte, nuk do të jeni në gjendje të shihni të dhëna statistikore të së kaluarës. Jeni i sigurt se doni të bëhet kjo?",
"DeleteLogsOlderThan": "Fshi regjistrime më të vjetër se",
"DeleteMaxRows": "Numër maksimum rreshtash për t’u fshirë njëherazi:",
"DeleteMaxRowsNoLimit": "pa kufi",
+ "DeleteReportsConfirm": "Ju ndan një hap nga aktivizimi i fshirjes së të dhënave të raporteve. Nëse hiqen raportet e vjetër, do t’ju duhet t’i ripërpunoni ata, pa të mund t’i shihni. Jeni i sigurt se doni të bëhet kjo?",
+ "DeleteReportsDetailedInfo": "Të dhënat prej tabelash arkivi numerik baze të dhënash (%1$s) dhe tabelash arkivi blob (%2$s) do të fshihen.",
+ "DeleteReportsInfo": "Në u aktivizoftë, raportet e vjetër do të fshihen. %1$sJu këshillojmë ta aktivizoni vetëm kur hapësira juaj për baza të dhënash është e kufizuar.%2$s",
+ "DeleteReportsInfo2": "Nëse nuk keni aktivizuar \"%s\", raportet e vjetër do të rikrijohen vetvetiu kur të kërkohet.",
+ "DeleteReportsInfo3": "Nëse e keni aktivizuar \"%s\", të dhënat do të humbin përgjithmonë.",
+ "DeleteReportsOlderThan": "Fshi raporte më të vjetër se",
+ "DeleteSchedulingSettings": "Planifikoni fshirje të dhënash të vjetra",
+ "DeleteDataSettings": "Fshi regjistra dhe raporte të vjetër përdoruesish",
+ "DoNotTrack_Description": "Mos Më Gjurmo është një propozim teknik dhe rregulli që u lejon përdoruesve të zgjedhin lënien jashtë gjurmimit nga sajtet që vizitojnë, përfshi shërbime analizash, rrjete reklamash, dhe platforma shoqërore.",
+ "DoNotTrack_Disable": "Çaktivizoni mbulimin e Mos Më Gjurmo-së",
+ "DoNotTrack_Disabled": "Piwik-u i ndjek krejt vizitorët, edhe kur ata kanë zgjedhur \"Nuk dua të gjurmohem\" në shfletuesin e tyre.",
+ "DoNotTrack_DisabledMoreInfo": "Këshillojmë të respektoni privatësinë e vizitorëve tuaj dhe të aktivizoni mbulimin e Mos Më Gjurmo-së.",
+ "DoNotTrack_Enable": "Aktivizoni mbulimin e Mos Më Gjurmo-së",
+ "DoNotTrack_Enabled": "Po e respektoni Privatësinë e përdoruesve tuaj. Bravo!",
+ "DoNotTrack_EnabledMoreInfo": "Kur përdoruesit kanë zgjedhur në shfletuesin e tyre \"Nuk dua të gjurmohem\" (DoNotTrack është i aktivizuar) atëherë Piwik-u nuk do t’i ndjekë këto vizita.",
+ "DoNotTrack_SupportDNTPreference": "Përkrahni parapëlqimin Mos Më Gjurmo",
+ "EstimatedDBSizeAfterPurge": "Madhësi e pritshme për bazën e të dhënave pas pastrimit",
+ "EstimatedSpaceSaved": "Hapësirë që pritet të kursehet",
+ "GeolocationAnonymizeIpNote": "Shënim: Gjeovendëzimi do të ketë përafërsisht të njëjtat përfundime me 1 bajt të anonimizuar. Me 2 ose më shumë bajte, Gjeovendëzimi do të jetë i pasaktë.",
+ "GetPurgeEstimate": "Merrni parashikim pastrimi",
+ "KeepBasicMetrics": "Mba vlerat bazë (vizita, parje faqesh, mesatare kthimesh, shndërrime objektivash, shndërrime e-tregti, etj.)",
+ "KeepDataFor": "Mba krejt të dhënat për",
+ "KeepReportSegments": "Për të dhëna të mbajtura më sipër, mbaj edhe raporte të segmentuar",
"LastDelete": "Fshirja e fundit u krye më",
- "LeastDaysInput": "Ju lutem, jepni një numër ditësh më të madh se %s.",
+ "LeastDaysInput": "Ju lutemi, jepni një numër ditësh më të madh se %s.",
+ "LeastMonthsInput": "Ju lutemi, tregoni një numër muajsh më të madh se %s.",
"MenuPrivacySettings": "Privatësi",
"NextDelete": "Fshirja pasuese është planifikuar më",
+ "PluginDescription": "Shtoni Privatësinë për përdoruesit tuaj dhe bëjeni instalimin tuaj të Piwik-ut të përputhshëm me ligjshmërinë vendore mbi privatësinë.",
+ "PurgeNow": "Pastroje DB-në Tani",
+ "PurgeNowConfirm": "Ju ndan një hap nga fshirja përgjithmonë e të dhënave nga baza juaj e të dhënave. Jeni i sigurt se doni të vazhdohet?",
+ "PurgingData": "Po pastrohen të dhënat…",
+ "RecommendedForPrivacy": "E këshilluar për privatësi",
+ "ReportsDataSavedEstimate": "Madhësi baze të dhënash",
+ "SaveSettingsBeforePurge": "Keni ndryshuar rregullimet për fshirje të dhënash. Ju lutemi, ruajini ato përpara se të nisni një pastrim.",
+ "SeeAlsoOurOfficialGuidePrivacy": "Shihni edhe udhërrëfyesin tonë zyrtar: %1$sPrivatësi Analizash Web%2$s",
"Teaser": "Në këtë faqe, mund ta përshtatni Piwik-un që privatësia në të të jetë në pajtim me legjislacionin në fuqi, duke: %1$s anonimizuar IP-të e vizitorëve%2$s, %3$s hequr automatikisht nga baza e të dhënave regjistrime të vjetër vizitorësh%4$s, dhe %5$s duke ofruar një mekanizëm Opt-out për sajtin tuaj%6$s.",
"TeaserHeadline": "Rregullime Privatësie",
+ "UseAnonymizedIpForVisitEnrichment": "Përdor edhe adresa IP të Anonimizuara kur pasurohen vizita.",
+ "UseAnonymizedIpForVisitEnrichmentNote": "Shtojca të tilla si Gjeovendëzim përmes IP-sh dhe Furnizuesish përmirësojnë tejtëdhënat e përdoruesve. Si parazgjedhje, këto shtojca përdorin adresa IP të anonimizuara. Nëse përzgjidhni 'Jo', atëherë do të përdoren adresa IP të plota, të paanonimizuara, që do të thotë më pak privatësi, por më tepër saktësi të dhënash.",
"UseAnonymizeIp": "Anonimizoni adresat IP të Vizitorëve",
- "UseDeleteLog": "Fshiji rregullisht te baza e të dhënave regjistrimet e vjetra të përdoruesve"
+ "UseDeleteLog": "Fshiji rregullisht te baza e të dhënave regjistrimet e vjetra të përdoruesve",
+ "UseDeleteReports": "Fshi rregullisht raporte të vjetër prej bazës së të dhënave"
}
} \ No newline at end of file
diff --git a/plugins/Provider/lang/sq.json b/plugins/Provider/lang/sq.json
index 9209a1ba31..7eeda74f11 100644
--- a/plugins/Provider/lang/sq.json
+++ b/plugins/Provider/lang/sq.json
@@ -1,9 +1,9 @@
{
"Provider": {
- "ColumnProvider": "Mundësues",
- "PluginDescription": "Raporton Mundësuesit e Shërbimit Internet të vizitorëve.",
- "ProviderReportDocumentation": "Ky raport ju tregon cilët Mundësues Shërbimi Internet kanë përdorur vizitorët tuaj për të hyrë te sajti. Për më tepër hollësi mund të klikoni mbi emrin e një mundësuesi. %s Nëse Piwik s’arrin ta përcaktojë mundësuesin për një vizitor, e tregon thjesht si IP.",
- "WidgetProviders": "Mundësuesa",
- "ProviderReportFooter": "Mundësues i panjohur do të thotë që adresa IP s’u kërkua dot."
+ "ColumnProvider": "Furnizues",
+ "PluginDescription": "Raporton Furnizuesin e Shërbimit Internet të vizitorëve.",
+ "ProviderReportDocumentation": "Ky raport ju tregon cilët Furnizues Shërbimi Internet kanë përdorur vizitorët tuaj për të hyrë te sajti. Për më tepër hollësi mund të klikoni mbi emrin e një furnizuesi. %s Nëse Piwik-u s’arrin ta përcaktojë furnizuesin për një vizitor, e tregon thjesht si IP.",
+ "WidgetProviders": "Furnizues",
+ "ProviderReportFooter": "Furnizues i panjohur do të thotë që adresa IP s’u kërkua dot."
}
} \ No newline at end of file
diff --git a/plugins/Referrers/Reports/GetReferrerType.php b/plugins/Referrers/Reports/GetReferrerType.php
index c09f8c6d17..16a11d295b 100644
--- a/plugins/Referrers/Reports/GetReferrerType.php
+++ b/plugins/Referrers/Reports/GetReferrerType.php
@@ -57,6 +57,7 @@ class GetReferrerType extends Base
->setName('General_EvolutionOverPeriod')
->setSubcategoryId('General_Overview')
->setAction('getEvolutionGraph')
+ ->setOrder(9)
->setIsNotWidgetizable()
->forceViewDataTable(Evolution::ID)
->addParameters(array(
diff --git a/plugins/Referrers/lang/sq.json b/plugins/Referrers/lang/sq.json
index 8ea57774b4..2c63b1f9d5 100644
--- a/plugins/Referrers/lang/sq.json
+++ b/plugins/Referrers/lang/sq.json
@@ -23,12 +23,12 @@
"PluginDescription": "Raporton të dhëna Sjellësish: Motorë Kërkimesh, Fjalëkyçe, Sajte, Fushata, Media Shoqërore, Zëra të Drejtpërdrejtë.",
"Referrer": "Sjellës",
"ReferrerName": "Emër Sjellësi",
- "Referrers": "Referuesa",
- "ReferrersOverview": "Përmbledhje Referuesish",
- "ReferrerTypes": "Lloje Referuesish",
+ "Referrers": "Sjellës",
+ "ReferrersOverview": "Përmbledhje Sjellësish",
+ "ReferrerTypes": "Lloje Sjellësish",
"SearchEngines": "Motorë Kërkimesh",
"SearchEnginesDocumentation": "Një vizitori i është treguar sajti juaj nga një motor kërkimesh. Për më tepër hollësira, %1$s shihni %2$s raportin.",
- "SearchEnginesReportDocumentation": "Ky raport shfaq cilët motorë kërkimi sollën përdorues te sajti juaj web. %s Duke klikuar mbi një rresht të tabelës, mund të shihni se për çfarë po kërkonin përdoruesit që përdorën një motor të caktuar kërkimesh.",
+ "SearchEnginesReportDocumentation": "Ky raport shfaq cilët motorë kërkimi sollën përdorues te sajti juaj. %s Duke klikuar mbi një rresht të tabelës, mund të shihni se për çfarë po kërkonin përdoruesit që përdorën një motor të caktuar kërkimesh.",
"SocialFooterMessage": "Ky është një nëngrup i raportit të Sajteve në të majtë. Lë jashtë sajte të tjerë, që kështu të mundeni të krahasoni drejtpërsëdrejti sjellësit tuaj nga rrjete shoqërore.",
"Socials": "Rrjete Shoqërore",
"SocialsReportDocumentation": "Ky raport shfaq rrjetet shoqërore që prunë vizitorë te sajti juaj.<br \/>Duke klikuar mbi një rresht të tabelës, mund të shihni se prej cilave faqe të rrjetit shoqëror erdhën vizitorët te sajti juaj.",
diff --git a/plugins/Resolution/lang/sq.json b/plugins/Resolution/lang/sq.json
index cf56a59f9f..f6247dcc93 100644
--- a/plugins/Resolution/lang/sq.json
+++ b/plugins/Resolution/lang/sq.json
@@ -7,6 +7,6 @@
"Resolutions": "Qartësi",
"WidgetGlobalVisitors": "Formësime globale vizitorësh",
"WidgetGlobalVisitorsDocumentation": "Ky raport shfaq formësimet e përgjithshme më të rëndomta të përdorura nga vizitorët tuaj. Formësimi përmban të dhënat për sistemin operativ, llojin e shfletuesit dhe qartësinë e ekranit.",
- "WidgetResolutions": "Qartësi ekrani"
+ "WidgetResolutions": "Qartësi Ekrani"
}
} \ No newline at end of file
diff --git a/plugins/RssWidget/stylesheets/rss.less b/plugins/RssWidget/stylesheets/rss.less
index 11f4d9dbbe..5becda42f3 100644
--- a/plugins/RssWidget/stylesheets/rss.less
+++ b/plugins/RssWidget/stylesheets/rss.less
@@ -31,3 +31,9 @@
font-size: 13px;
color: #333333;
}
+
+/* hide changing blog post title and date in UI test */
+.uiTest .rss-title, .uiTest .rss-date {
+ visibility:hidden;
+
+} \ No newline at end of file
diff --git a/plugins/SEO/Metric/Bing.php b/plugins/SEO/Metric/Bing.php
index 71553ffc6e..b0805548d4 100644
--- a/plugins/SEO/Metric/Bing.php
+++ b/plugins/SEO/Metric/Bing.php
@@ -18,7 +18,7 @@ use Psr\Log\LoggerInterface;
*/
class Bing implements MetricsProvider
{
- const URL = 'http://www.bing.com/search?mkt=en-US&q=site%3A';
+ const URL = 'http://www.bing.com/search?setlang=en-US&rdr=1&q=site%3A';
/**
* @var LoggerInterface
@@ -37,8 +37,8 @@ class Bing implements MetricsProvider
try {
$response = str_replace('&nbsp;', ' ', Http::sendHttpRequest($url, $timeout = 10, @$_SERVER['HTTP_USER_AGENT']));
- if (preg_match('#([0-9\,]+) results#i', $response, $p)) {
- $pageCount = NumberFormatter::getInstance()->formatNumber((int)str_replace(',', '', $p[1]));
+ if (preg_match('#([0-9,\.]+) results#i', $response, $p)) {
+ $pageCount = NumberFormatter::getInstance()->formatNumber((int)str_replace(array(',', '.'), '', $p[1]));
} else {
$pageCount = 0;
}
diff --git a/plugins/SEO/Metric/Dmoz.php b/plugins/SEO/Metric/Dmoz.php
index c7b8860a89..05e8e1a0e9 100644
--- a/plugins/SEO/Metric/Dmoz.php
+++ b/plugins/SEO/Metric/Dmoz.php
@@ -38,7 +38,7 @@ class Dmoz implements MetricsProvider
try {
$response = Http::sendHttpRequest(self::URL . urlencode($domain), $timeout = 10, @$_SERVER['HTTP_USER_AGENT']);
- preg_match('#DMOZ Sites[^\(]+\([0-9]-[0-9]+ of ([0-9]+)\)#', $response, $p);
+ preg_match('#[0-9] - [0-9]+ of ([0-9]+)#', $response, $p);
if (!empty($p[1])) {
$value = NumberFormatter::getInstance()->formatNumber((int)$p[1]);
} else {
diff --git a/plugins/SEO/Metric/DomainAge.php b/plugins/SEO/Metric/DomainAge.php
index a059b49572..836011b12e 100644
--- a/plugins/SEO/Metric/DomainAge.php
+++ b/plugins/SEO/Metric/DomainAge.php
@@ -35,6 +35,8 @@ class DomainAge implements MetricsProvider
public function getMetrics($domain)
{
+ $domain = str_replace('www.', '', $domain);
+
$ages = array();
$age = $this->getAgeArchiveOrg($domain);
@@ -72,9 +74,8 @@ class DomainAge implements MetricsProvider
*/
private function getAgeArchiveOrg($domain)
{
- $url = str_replace('www.', '', $domain);
- $data = $this->getUrl('http://wayback.archive.org/web/*/' . urlencode($url));
- preg_match('#<a href=\"([^>]*)' . preg_quote($url) . '/\">([^<]*)<\/a>#', $data, $p);
+ $data = $this->getUrl('http://wayback.archive.org/web/*/' . urlencode($domain));
+ preg_match('#<a href=\"([^>]*)' . preg_quote($domain) . '/\">([^<]*)<\/a>#', $data, $p);
if (!empty($p[2])) {
$value = strtotime($p[2]);
if ($value === false) {
@@ -93,9 +94,7 @@ class DomainAge implements MetricsProvider
*/
private function getAgeWhoIs($domain)
{
- $url = preg_replace('/^www\./', '', $domain);
- $url = 'http://www.who.is/whois/' . urlencode($url);
- $data = $this->getUrl($url);
+ $data = $this->getUrl('http://www.who.is/whois/' . urlencode($domain));
preg_match('#(?:Creation Date|Created On|created|Registered on)\.*:\s*([ \ta-z0-9\/\-:\.]+)#si', $data, $p);
if (!empty($p[1])) {
$value = strtotime(trim($p[1]));
@@ -115,9 +114,7 @@ class DomainAge implements MetricsProvider
*/
private function getAgeWhoisCom($domain)
{
- $url = preg_replace('/^www\./', '', $domain);
- $url = 'http://www.whois.com/whois/' . urlencode($url);
- $data = $this->getUrl($url);
+ $data = $this->getUrl('http://www.whois.com/whois/' . urlencode($domain));
preg_match('#(?:Creation Date|Created On|created):\s*([ \ta-z0-9\/\-:\.]+)#si', $data, $p);
if (!empty($p[1])) {
$value = strtotime(trim($p[1]));
diff --git a/plugins/SEO/Metric/Google.php b/plugins/SEO/Metric/Google.php
index 7abd82b371..4247ec138f 100644
--- a/plugins/SEO/Metric/Google.php
+++ b/plugins/SEO/Metric/Google.php
@@ -36,13 +36,11 @@ class Google implements MetricsProvider
public function getMetrics($domain)
{
$pageCount = $this->fetchIndexedPagesCount($domain);
- $pageRank = $this->fetchPageRank($domain);
$logo = SearchEngine::getInstance()->getLogoFromUrl('http://google.com');
return array(
new Metric('google-index', 'SEO_Google_IndexedPages', $pageCount, $logo, null, null, 'General_Pages'),
- new Metric('pagerank', 'Google PageRank', $pageRank, $logo, null, null, '/10'),
);
}
@@ -53,8 +51,8 @@ class Google implements MetricsProvider
try {
$response = str_replace('&nbsp;', ' ', Http::sendHttpRequest($url, $timeout = 10, @$_SERVER['HTTP_USER_AGENT']));
- if (preg_match('#([0-9\,]+) results#i', $response, $p)) {
- return NumberFormatter::getInstance()->formatNumber((int)str_replace(',', '', $p[1]));
+ if (preg_match('#([0-9,\.]+) results#i', $response, $p)) {
+ return NumberFormatter::getInstance()->formatNumber((int)str_replace(array(',', '.'), '', $p[1]));
} else {
return 0;
}
@@ -64,109 +62,4 @@ class Google implements MetricsProvider
}
}
- public function fetchPageRank($domain)
- {
- $chwrite = $this->checkHash($this->hashURL($domain));
-
- $url = "http://toolbarqueries.google.com/tbr?client=navclient-auto&ch=" . $chwrite . "&features=Rank&q=info:" . $domain . "&num=100&filter=0";
-
- try {
- $response = Http::sendHttpRequest($url, $timeout = 10, @$_SERVER['HTTP_USER_AGENT']);
-
- preg_match('#Rank_[0-9]:[0-9]:([0-9]+){1,}#si', $response, $p);
-
- return isset($p[1]) ? $p[1] : null;
- } catch (\Exception $e) {
- $this->logger->warning('Error while getting Google PageRank for SEO stats: {message}', array('message' => $e->getMessage()));
- return null;
- }
- }
-
- /**
- * Generate a hash for a url
- *
- * @param string $string
- * @return int
- */
- private function hashURL($string)
- {
- $Check1 = $this->strToNum($string, 0x1505, 0x21);
- $Check2 = $this->strToNum($string, 0, 0x1003F);
-
- $Check1 >>= 2;
- $Check1 = (($Check1 >> 4) & 0x3FFFFC0) | ($Check1 & 0x3F);
- $Check1 = (($Check1 >> 4) & 0x3FFC00) | ($Check1 & 0x3FF);
- $Check1 = (($Check1 >> 4) & 0x3C000) | ($Check1 & 0x3FFF);
-
- $T1 = (((($Check1 & 0x3C0) << 4) | ($Check1 & 0x3C)) << 2) | ($Check2 & 0xF0F);
- $T2 = (((($Check1 & 0xFFFFC000) << 4) | ($Check1 & 0x3C00)) << 0xA) | ($Check2 & 0xF0F0000);
-
- return ($T1 | $T2);
- }
-
- /**
- * Generate a checksum for the hash string
- *
- * @param int $hashnum
- * @return string
- */
- private function checkHash($hashnum)
- {
- $CheckByte = 0;
- $Flag = 0;
-
- $HashStr = sprintf('%u', $hashnum);
- $length = strlen($HashStr);
-
- for ($i = $length - 1; $i >= 0; $i--) {
- $Re = $HashStr{$i};
- if (1 === ($Flag % 2)) {
- $Re += $Re;
- $Re = (int)($Re / 10) + ($Re % 10);
- }
- $CheckByte += $Re;
- $Flag++;
- }
-
- $CheckByte %= 10;
- if (0 !== $CheckByte) {
- $CheckByte = 10 - $CheckByte;
- if (1 === ($Flag % 2)) {
- if (1 === ($CheckByte % 2)) {
- $CheckByte += 9;
- }
- $CheckByte >>= 1;
- }
- }
-
- return '7' . $CheckByte . $HashStr;
- }
-
- /**
- * Convert numeric string to int
- *
- * @param string $Str
- * @param int $Check
- * @param int $Magic
- * @return int
- */
- private function strToNum($Str, $Check, $Magic)
- {
- $Int32Unit = 4294967296; // 2^32
-
- $length = strlen($Str);
- for ($i = 0; $i < $length; $i++) {
- $Check *= $Magic;
- // If the float is beyond the boundaries of integer (usually +/- 2.15e+9 = 2^31),
- // the result of converting to integer is undefined
- // refer to http://www.php.net/manual/en/language.types.integer.php
- if ($Check >= $Int32Unit) {
- $Check = ($Check - $Int32Unit * (int)($Check / $Int32Unit));
- //if the check less than -2^31
- $Check = ($Check < -2147483648) ? ($Check + $Int32Unit) : $Check;
- }
- $Check += ord($Str{$i});
- }
- return $Check;
- }
}
diff --git a/plugins/SEO/lang/sq.json b/plugins/SEO/lang/sq.json
index d602da9078..45e3294bdc 100644
--- a/plugins/SEO/lang/sq.json
+++ b/plugins/SEO/lang/sq.json
@@ -1,6 +1,6 @@
{
"SEO": {
- "PluginDescription": "Kjo shtojcë përfton dhe shfaq matje SEO: renditje web Alexa, Google Pagerank, numër faqesh të përfshira në tregues dhe paslidhje të sajtit të përzgjedhur në atë çast.",
+ "PluginDescription": "Kjo shtojcë përfton dhe shfaq vlera SEO: renditje web Alexa, Google Pagerank, numër faqesh të përfshira në tregues dhe paslidhje të sajtit të përzgjedhur në atë çast.",
"AlexaRank": "Renditje Alexa",
"Bing_IndexedPages": "Faqe të indeksuara nga Bing",
"Dmoz": "Zëra DMOZ",
diff --git a/plugins/ScheduledReports/lang/bg.json b/plugins/ScheduledReports/lang/bg.json
index 528614f8fc..092a2476f1 100644
--- a/plugins/ScheduledReports/lang/bg.json
+++ b/plugins/ScheduledReports/lang/bg.json
@@ -1,6 +1,5 @@
{
"ScheduledReports": {
- "AggregateReportsFormat": "(по избор) Покажете опции",
"AggregateReportsFormat_GraphsOnly": "Покажете само графики (без докладни таблици)",
"AggregateReportsFormat_TablesAndGraphs": "Покажете докладни таблици и графики за всички доклади.",
"AggregateReportsFormat_TablesOnly": "(по подразбиране) Покажи таблицата с отчетите (Графики само за ключови метрични данни)",
diff --git a/plugins/ScheduledReports/lang/ca.json b/plugins/ScheduledReports/lang/ca.json
index 3e5a3934f7..3e9f9ad7b7 100644
--- a/plugins/ScheduledReports/lang/ca.json
+++ b/plugins/ScheduledReports/lang/ca.json
@@ -1,6 +1,5 @@
{
"ScheduledReports": {
- "AggregateReportsFormat": "(opcional) mostrar les opcions",
"AggregateReportsFormat_GraphsOnly": "Mostra només els gràfics (sense taules)",
"AggregateReportsFormat_TablesAndGraphs": "Mostrar les taules i els gràfics per a tots els informes.",
"AggregateReportsFormat_TablesOnly": "(per defecte) Mostra les taules d'informe (Gràfiques només per les mètriques clau)",
diff --git a/plugins/ScheduledReports/lang/cs.json b/plugins/ScheduledReports/lang/cs.json
index cb0eaca715..553908c7e8 100644
--- a/plugins/ScheduledReports/lang/cs.json
+++ b/plugins/ScheduledReports/lang/cs.json
@@ -1,10 +1,10 @@
{
"ScheduledReports": {
- "AggregateReportsFormat": "Možnosti zobrazení",
+ "AggregateReportsFormat": "Zobrazit možnosti",
"AggregateReportsFormat_GraphsOnly": "Pouze zobrazit grafy (ne tabulky hlášení)",
"AggregateReportsFormat_TablesAndGraphs": "Zobrazit tabulky hlášení a grafy pro všechna hlášení",
"AggregateReportsFormat_TablesOnly": "(Výchozí) zobrazit tabulky hlášení (grafy pouze pro klíčová měření)",
- "AlsoSendReportToTheseEmails": "Odesílat hlášení také na tyto e-maily (jeden e-mail na řádek):",
+ "AlsoSendReportToTheseEmails": "Odesílat hlášení také na tyto emaily (jeden email na řádek):",
"AreYouSureDeleteReport": "Opravdu chcete odstranit toto hlášení a jeho plán?",
"CancelAndReturnToReports": "Zrušit a %1$svrátit se k seznamu hlášení%2$s",
"CreateAndScheduleReport": "Vytvořit a naplánovat hlášení",
@@ -17,7 +17,7 @@
"EmailSchedule": "Plánování zasílání hlášení",
"EvolutionGraph": "Zobrazit historické grafy pro %s nejvyšších hodnot",
"FrontPage": "Hlavní strana",
- "PersonalEmailReports": "Osobní e-mailová hlášení",
+ "PersonalEmailReports": "Osobní emailová hlášení",
"MonthlyScheduleHelp": "Měsíční plán: hlášení bude odesláno první den měsíce",
"MustBeLoggedIn": "Musíte být přihlášen, abyste mohl vytvářet vlastní hlášení.",
"NoRecipients": "Toto hlášení nemá příjemce",
@@ -26,24 +26,24 @@
"PleaseFindAttachedFile": "Prosím najděte v přiloženém souboru %1$s hlášení pro %2$s",
"SentFromX": "Odesláno z %s.",
"PleaseFindBelow": "Najděte níže vaše %1$s hlášení pro %2$s.",
- "PluginDescription": "Vytvořte vlastní e-mailová hlášení a naplánujte jejich zaslání denně, týdně nebo měsíčně jednomu nebo více lidem. Je podporováno několik formátů (HTML, PDF, CSV, obrázky).",
+ "PluginDescription": "Vytvořte vlastní emailová hlášení a naplánujte jejich zaslání denně, týdně nebo měsíčně jednomu nebo více lidem. Je podporováno několik formátů (HTML, PDF, CSV, obrázky).",
"ReportFormat": "Formát hlášení",
"ReportHour": "Odeslat hlášení v %s hodin",
- "ReportHourWithUTC": "Odeslat hlášení v %1$s hodin (%2$s hodin UTC)",
+ "ReportHourWithUTC": "%s hodin UTC",
"ReportIncludeNWebsites": "Hlášení bude obsahovat hlavní měření pro všechny weby, které mají aspoň jednu návštěvu (z %s aktuálně dostupných webů).",
"ReportSent": "Hlášení posláno",
"ReportsIncluded": "Zahrnuté statistiky",
"ReportType": "Odeslat hlášení pomocí",
"ReportUpdated": "Hlášení aktualizováno",
- "Segment_Deletion_Error": "Tento segment nemůže být smazán nebo zneviditelněn, protože se používá k vytváření e-mailových hlášení %s. Zkuste to znovu poté, co jej z těchto hlášení odstraníte.",
- "Segment_Help": "Můžete zvolit existující segment, který bude aplikován na data v tomto e-mailovém hlášení. Segmenty můžete vytvářet a upravovat vlastní segmenty na vaší nástěnce %1$s(klikněte zde pro otevření)%2$s, pak klikněte na box \"%3$s\", pak \"%4$s\".",
+ "Segment_Deletion_Error": "Tento segment nemůže být smazán nebo zneviditelněn, protože se používá k vytváření emailových hlášení %s. Zkuste to znovu poté, co jej z těchto hlášení odstraníte.",
+ "Segment_Help": "Můžete zvolit existující segment, který bude aplikován na data v tomto emailovém hlášení. Segmenty můžete vytvářet a upravovat vlastní segmenty na vaší nástěnce %1$s(klikněte zde pro otevření)%2$s, pak klikněte na box \"%3$s\", pak \"%4$s\".",
"SegmentAppliedToReports": "Segment %s je aplikován na hlášení.",
"SendReportNow": "Odeslat hlášení ihned",
"SendReportTo": "Odeslat hlášení",
"SentToMe": "Odeslat hlášení mně",
"TableOfContent": "Seznam hlášení",
"ThereIsNoReportToManage": "Pro stránky %s neexistuje žádné hlášení, které lze spravovat",
- "TopLinkTooltip": "Vytvářejte vlastní hlášení, která budou automaticky doručena na vaši nebo zákazníkovu e-mailovou adresu.",
+ "TopLinkTooltip": "Vytvářejte vlastní hlášení, která budou automaticky doručena na vaši nebo zákazníkovu emailovou adresu.",
"TopOfReport": "Zpět nahoru",
"UpdateReport": "Aktualizovat hlášení",
"WeeklyScheduleHelp": "Týdenní plán: hlášení bude odesláno každé pondělí"
diff --git a/plugins/ScheduledReports/lang/da.json b/plugins/ScheduledReports/lang/da.json
index 6df700fd82..5cbc27fb05 100644
--- a/plugins/ScheduledReports/lang/da.json
+++ b/plugins/ScheduledReports/lang/da.json
@@ -1,6 +1,5 @@
{
"ScheduledReports": {
- "AggregateReportsFormat": "(valgfrit) Visningsindstillinger",
"AggregateReportsFormat_GraphsOnly": "Vis kun diagrammer (ingen tabeller)",
"AggregateReportsFormat_TablesAndGraphs": "Vis tabeller og diagrammer for alle rapporter",
"AggregateReportsFormat_TablesOnly": "(standard) Vis tabeller (diagrammer kun for nøglemålinger)",
diff --git a/plugins/ScheduledReports/lang/de.json b/plugins/ScheduledReports/lang/de.json
index 05da1537f2..a3b3e22057 100644
--- a/plugins/ScheduledReports/lang/de.json
+++ b/plugins/ScheduledReports/lang/de.json
@@ -1,6 +1,6 @@
{
"ScheduledReports": {
- "AggregateReportsFormat": "(optional) Anzeigeoptionen",
+ "AggregateReportsFormat": "Anzeigeoptionen",
"AggregateReportsFormat_GraphsOnly": "Nur Graphen anzeigen (keine Tabellenberichte)",
"AggregateReportsFormat_TablesAndGraphs": "Tabellen und Graphen für alle Berichte anzeigen",
"AggregateReportsFormat_TablesOnly": "(Standard) Tabellenberichte anzeigen (Graphen nur für die wichtigsten Metriken)",
@@ -29,6 +29,7 @@
"PluginDescription": "Erstellen Sie eigene Berichte und planen Sie deren täglichen, wöchentlichen oder monatlichen Versand an einen oder mehrere Empfänger. Diverse Berichtsformate werden unterstützt (HTML, PDF, CSV, Bilder).",
"ReportFormat": "Berichtsformat",
"ReportHour": "Bericht senden um %s Uhr",
+ "ReportHourWithUTC": "%s Uhr UTC",
"ReportIncludeNWebsites": "Dieser Bericht wird die Hauptmetriken für alle Websites enthalten, die mindestens einen Besuch haben (von den %s derzeit verfügbaren Websites).",
"ReportSent": "Bericht wurde versendet",
"ReportsIncluded": "Beinhaltete Statistiken",
diff --git a/plugins/ScheduledReports/lang/el.json b/plugins/ScheduledReports/lang/el.json
index 10f56acac4..3ee9562f17 100644
--- a/plugins/ScheduledReports/lang/el.json
+++ b/plugins/ScheduledReports/lang/el.json
@@ -1,6 +1,6 @@
{
"ScheduledReports": {
- "AggregateReportsFormat": "(προαιρετικό) Προβολή επιλογών",
+ "AggregateReportsFormat": "Επιλογές εμφάνισης",
"AggregateReportsFormat_GraphsOnly": "Προβολή μόνο Διαγραμμάτων (κανένας πίνακας αναφοράς)",
"AggregateReportsFormat_TablesAndGraphs": "Προβολή πινάκων Αναφοράς και Διαγραμμάτων για όλες τις αναφορές",
"AggregateReportsFormat_TablesOnly": "(προεπιλογή) Προβολή Πινάκων Αναφορών (Διαγράμματα μόνο για μετρήσεις κλειδιού)",
@@ -29,7 +29,7 @@
"PluginDescription": "Δημιουργεί προσαρμοσμένες αναφορές και τις προγραμματίζει για καθημερινή, εβδομαδιαία ή μηνιαία αναφορά σε ένα ή περισσότερα άτομα. Υποστηρίζονται αρκετοί τύποι αναφορών (html, pdf, csv, εικόνες).",
"ReportFormat": "Μορφή Αναφοράς",
"ReportHour": "Αποστολή αναφοράς στις %s",
- "ReportHourWithUTC": "Αποστολή αναφοράς στις %1$s (%2$s ώρα UTC)",
+ "ReportHourWithUTC": "%s ώρα UTC",
"ReportIncludeNWebsites": "Η αναφορά θα περιλαμβάνει βασικές μετρήσεις για όλες τις ιστοσελίδες που έχουν τουλάχιστον μια επισκεψη (από τις συνολικά %s διαθέσιμες ιστοσελίδες).",
"ReportSent": "Η αναφορά στάλθηκε.",
"ReportsIncluded": "Συμπερίληψη στατιστικών",
diff --git a/plugins/ScheduledReports/lang/es.json b/plugins/ScheduledReports/lang/es.json
index 7e0f117781..6d51b4340a 100644
--- a/plugins/ScheduledReports/lang/es.json
+++ b/plugins/ScheduledReports/lang/es.json
@@ -1,6 +1,6 @@
{
"ScheduledReports": {
- "AggregateReportsFormat": "(opcional) Mostrar opciones",
+ "AggregateReportsFormat": "Opciones de visualización",
"AggregateReportsFormat_GraphsOnly": "Mostrar sólo gráficas (sin informe de tablas)",
"AggregateReportsFormat_TablesAndGraphs": "Mostrar Informe de tablas y gráficas para todos los informes",
"AggregateReportsFormat_TablesOnly": "(por defecto) Mostrar Reporte de tablas (gráficas sólo para mediciones clave)",
@@ -29,7 +29,7 @@
"PluginDescription": "Cree informes personalizados y prográmelos para ser enviados por correo electrónico diaria, semanal o mensualmente a uno o varias personas. Algunos formatos de informe están soportados (html, pdf, csv, imágenes).",
"ReportFormat": "Formato del informe",
"ReportHour": "Enviar informe a las %s horas",
- "ReportHourWithUTC": "Enviar informe a las %1$s en punto (%2$s UTC)",
+ "ReportHourWithUTC": "%s en punto UTC",
"ReportIncludeNWebsites": "El informe incluirá las principales métricas para todos los sitios de internet con al menos una visita (de todo %s los sitios de internet disponibles).",
"ReportSent": "Informe enviado",
"ReportsIncluded": "Estadísticas incluidas",
diff --git a/plugins/ScheduledReports/lang/et.json b/plugins/ScheduledReports/lang/et.json
index f3e3e743cf..548a0a68fa 100644
--- a/plugins/ScheduledReports/lang/et.json
+++ b/plugins/ScheduledReports/lang/et.json
@@ -1,6 +1,5 @@
{
"ScheduledReports": {
- "AggregateReportsFormat": "(valikuline) Kuvamise seaded",
"AggregateReportsFormat_GraphsOnly": "Kuva ainult graafikud (tabelid puuduvad)",
"AggregateReportsFormat_TablesAndGraphs": "Kuva tabelid ja graafikud kõikidele raportitele",
"AggregateReportsFormat_TablesOnly": "(vaikimisi) Kuva raportite tabelid (ja olulistele mõõdikutele ka graafikud)",
diff --git a/plugins/ScheduledReports/lang/fa.json b/plugins/ScheduledReports/lang/fa.json
index 5d9fb1af8e..cc47bafad7 100644
--- a/plugins/ScheduledReports/lang/fa.json
+++ b/plugins/ScheduledReports/lang/fa.json
@@ -1,6 +1,5 @@
{
"ScheduledReports": {
- "AggregateReportsFormat": "(اختیاری) گزینه های نمایش)",
"AggregateReportsFormat_GraphsOnly": "نمایش ها نمودار ها تنها (بدون جداول گزارش)",
"AggregateReportsFormat_TablesAndGraphs": "نمایش جداول گزارش و نمودار برای همه گزارش ها",
"AggregateReportsFormat_TablesOnly": "(پیش فرض) نمایش جدول گزارش (نمودار فقط برای معیارهای کلیدی)",
diff --git a/plugins/ScheduledReports/lang/fi.json b/plugins/ScheduledReports/lang/fi.json
index 28cece703c..9fd1de2d20 100644
--- a/plugins/ScheduledReports/lang/fi.json
+++ b/plugins/ScheduledReports/lang/fi.json
@@ -1,6 +1,5 @@
{
"ScheduledReports": {
- "AggregateReportsFormat": "(optionaalinen) Näyttöasetukset",
"AggregateReportsFormat_GraphsOnly": "Näytä vain kuvaajat (ei raporttien taulukoita)",
"AggregateReportsFormat_TablesAndGraphs": "Näytä taulukot ja kuvaajat kaikille raporteille",
"AggregateReportsFormat_TablesOnly": "(oletus) Näytä rapottien taulukot (kuvaajat vain tärkeimmille arvoille)",
diff --git a/plugins/ScheduledReports/lang/fr.json b/plugins/ScheduledReports/lang/fr.json
index 25681b63fc..b19c88196c 100644
--- a/plugins/ScheduledReports/lang/fr.json
+++ b/plugins/ScheduledReports/lang/fr.json
@@ -1,6 +1,6 @@
{
"ScheduledReports": {
- "AggregateReportsFormat": "Options d'affichage (optionnel)",
+ "AggregateReportsFormat": "Options d'affichage",
"AggregateReportsFormat_GraphsOnly": "Afficher uniquement les graphiques (pas de tableau de valeur)",
"AggregateReportsFormat_TablesAndGraphs": "Afficher les tableaux de rapport et les graphiques pour tous les rapports",
"AggregateReportsFormat_TablesOnly": "(défaut) afficher les tableaux de rapport (Graphique uniquement pour les indicateurs clés)",
@@ -29,6 +29,7 @@
"PluginDescription": "Créez des rapports personnalisés et planifiez de les envoyer par courriel quotidiennement, hebdomadairement ou mensuellement à une ou plusieurs personnes. Plusieurs formats de rapports sont supportés (html, pdf, csv, images).",
"ReportFormat": "Format du rapport",
"ReportHour": "Envoyer le rapport à %s",
+ "ReportHourWithUTC": "%s pile UTC",
"ReportIncludeNWebsites": "Le rapport incluera les métriques principales pour tous les sites web qui ont au moins une visite (depuis les %s sites web actuellement disponibles)",
"ReportSent": "Rapport envoyé",
"ReportsIncluded": "Statistiques incluses",
diff --git a/plugins/ScheduledReports/lang/hi.json b/plugins/ScheduledReports/lang/hi.json
index 9edabca7fb..03e19c6827 100644
--- a/plugins/ScheduledReports/lang/hi.json
+++ b/plugins/ScheduledReports/lang/hi.json
@@ -1,6 +1,5 @@
{
"ScheduledReports": {
- "AggregateReportsFormat": "(वैकल्पिक) प्रदर्शन विकल्प",
"AggregateReportsFormat_GraphsOnly": "रेखांकन सिर्फ (कोई रिपोर्ट तालिकाएँ नहीं ) प्रदर्शित करें",
"AggregateReportsFormat_TablesAndGraphs": "सभी रिपोर्टों के लिए रिपोर्ट तालिकाएँ और रेखांकन प्रदर्शित",
"AggregateReportsFormat_TablesOnly": "(डिफ़ॉल्ट) प्रदर्शन की रिपोर्ट तालिकाएँ(केवल प्रमुख मैट्रिक का रेखाचित्र)",
diff --git a/plugins/ScheduledReports/lang/id.json b/plugins/ScheduledReports/lang/id.json
index a3a23bca06..615403f76c 100644
--- a/plugins/ScheduledReports/lang/id.json
+++ b/plugins/ScheduledReports/lang/id.json
@@ -1,6 +1,5 @@
{
"ScheduledReports": {
- "AggregateReportsFormat": "(pilihan) Tampilkan pilihan",
"AggregateReportsFormat_GraphsOnly": "Hanya tampilkan Grafik (tanpa tabel laporan)",
"AggregateReportsFormat_TablesAndGraphs": "Tampilkan tabel dan Grafik Laporan untuk seluruh Laporan",
"AggregateReportsFormat_TablesOnly": "(asali) Tampilkan tabel Laporan (Grafik hanya kunci metrik)",
diff --git a/plugins/ScheduledReports/lang/it.json b/plugins/ScheduledReports/lang/it.json
index f554f5d432..33b98e0898 100644
--- a/plugins/ScheduledReports/lang/it.json
+++ b/plugins/ScheduledReports/lang/it.json
@@ -1,6 +1,6 @@
{
"ScheduledReports": {
- "AggregateReportsFormat": "(opzionale) Mostra opzioni",
+ "AggregateReportsFormat": "Opzioni visualizzazione",
"AggregateReportsFormat_GraphsOnly": "Mostra solo Grafici (niente tabelle report)",
"AggregateReportsFormat_TablesAndGraphs": "Mostra tabelle e Grafici per tutti i report",
"AggregateReportsFormat_TablesOnly": "(predefinito) Mostra tabelle (Grafici solo per le metriche chiave)",
@@ -29,6 +29,7 @@
"PluginDescription": "Crea dei report personalizzati e li programma per l'invio tramite email ogni giorno, settimana o mese a una o più persone. Sono supportati svariati formati (html, pdf, csv, immagini).",
"ReportFormat": "Formato report",
"ReportHour": "Invia report alle %s",
+ "ReportHourWithUTC": "%s UTC",
"ReportIncludeNWebsites": "Il report comprenderà le principali metriche per tutti i siti web che hanno almeno una visita (dai %s siti web attualmente disponibili).",
"ReportSent": "Report inviato",
"ReportsIncluded": "Statistiche incluse",
diff --git a/plugins/ScheduledReports/lang/ja.json b/plugins/ScheduledReports/lang/ja.json
index b3231e5abb..48c4f1c72b 100644
--- a/plugins/ScheduledReports/lang/ja.json
+++ b/plugins/ScheduledReports/lang/ja.json
@@ -1,6 +1,5 @@
{
"ScheduledReports": {
- "AggregateReportsFormat": "(任意)表示オプション",
"AggregateReportsFormat_GraphsOnly": "グラフのみを表示(表は表示しない)",
"AggregateReportsFormat_TablesAndGraphs": "全てのリポートでリポート表とグラフを表示",
"AggregateReportsFormat_TablesOnly": "(デフォルト)リポート表を表示(グラフはキーメトリックスのみ)",
diff --git a/plugins/ScheduledReports/lang/ko.json b/plugins/ScheduledReports/lang/ko.json
index d9976eb6e4..845d1654f5 100644
--- a/plugins/ScheduledReports/lang/ko.json
+++ b/plugins/ScheduledReports/lang/ko.json
@@ -1,6 +1,6 @@
{
"ScheduledReports": {
- "AggregateReportsFormat": "(선택 사항) 표시 옵션",
+ "AggregateReportsFormat": "표시 옵션",
"AggregateReportsFormat_GraphsOnly": "그래프만 표시 (표는 표시하지 않음)",
"AggregateReportsFormat_TablesAndGraphs": "모든 보고서에서 테이블 및 그래프 보기",
"AggregateReportsFormat_TablesOnly": "(기본) 보고표 표시 (그래프는 키 메트릭스만)",
@@ -29,6 +29,7 @@
"PluginDescription": "맞춤형 보고서를 만들고 이를 매일, 주간, 월간 한 사람 혹은 여러 명에게 이메일을 보냅니다. 보고서 형식은 다양한 형식(html, pdf, csv, 이미지 등)을 지원합니다.",
"ReportFormat": "보고서 형식",
"ReportHour": "%s시 정각에 보고서 보내기",
+ "ReportHourWithUTC": "%s 시 UTC",
"ReportIncludeNWebsites": "이 보고서는 하나 이상의 방문있는 모든 웹사이트에 대한 주요 통계를 포함합니다(현재 %s 웹사이트에서 가능).",
"ReportSent": "보고서 보내기",
"ReportsIncluded": "보고서에 포함할 정보",
diff --git a/plugins/ScheduledReports/lang/nb.json b/plugins/ScheduledReports/lang/nb.json
index 8cebd44bfa..80b97e9f22 100644
--- a/plugins/ScheduledReports/lang/nb.json
+++ b/plugins/ScheduledReports/lang/nb.json
@@ -1,6 +1,5 @@
{
"ScheduledReports": {
- "AggregateReportsFormat": "(valgfritt) Visningsinnstillinger",
"AggregateReportsFormat_GraphsOnly": "Vis kun grafer (ingen rapport-tabeller)",
"AggregateReportsFormat_TablesAndGraphs": "Vis rapporttabeller og grafer for alle rapporter",
"AggregateReportsFormat_TablesOnly": "(standard) Vis rapporttabeller (grafer kun for nøkkeltall)",
diff --git a/plugins/ScheduledReports/lang/nl.json b/plugins/ScheduledReports/lang/nl.json
index b1843bb88e..316cf9ce63 100644
--- a/plugins/ScheduledReports/lang/nl.json
+++ b/plugins/ScheduledReports/lang/nl.json
@@ -1,6 +1,5 @@
{
"ScheduledReports": {
- "AggregateReportsFormat": "(optioneel) Weergaveopties",
"AggregateReportsFormat_GraphsOnly": "Toon alleen Grafieken (geen tabellen)",
"AggregateReportsFormat_TablesAndGraphs": "Toon zowel tabellen en grafieken voor alle rapporten",
"AggregateReportsFormat_TablesOnly": "(standaard) Toon tabellen (grafieken alleen voor belangrijke gegevens)",
diff --git a/plugins/ScheduledReports/lang/pl.json b/plugins/ScheduledReports/lang/pl.json
index ba349d0aeb..0bb296edd7 100644
--- a/plugins/ScheduledReports/lang/pl.json
+++ b/plugins/ScheduledReports/lang/pl.json
@@ -1,6 +1,5 @@
{
"ScheduledReports": {
- "AggregateReportsFormat": "Wyświetl opcje (opcjonalnie)",
"AggregateReportsFormat_GraphsOnly": "Wyświetlane wykresów (brak tabeli raportu)",
"AggregateReportsFormat_TablesAndGraphs": "Wyświetlane tabeli i wykresów dla wszystkich raportów",
"AggregateReportsFormat_TablesOnly": "(domyślny) Wyświetlane tabele raportu (wykresy tylko dla kluczowych wskaźników)",
diff --git a/plugins/ScheduledReports/lang/pt-br.json b/plugins/ScheduledReports/lang/pt-br.json
index e12cfc3eed..ea741547df 100644
--- a/plugins/ScheduledReports/lang/pt-br.json
+++ b/plugins/ScheduledReports/lang/pt-br.json
@@ -1,6 +1,6 @@
{
"ScheduledReports": {
- "AggregateReportsFormat": "(opcional) Opções de exibição",
+ "AggregateReportsFormat": "Opções de exibição",
"AggregateReportsFormat_GraphsOnly": "Exibir gráficos apenas (sem tabelas do relatório)",
"AggregateReportsFormat_TablesAndGraphs": "Mostra tabelas de Informações e Gráficos para todos os relatórios",
"AggregateReportsFormat_TablesOnly": "(padrão) Exibir relatório em tabelas (Gráficos apenas para as principais métricas)",
diff --git a/plugins/ScheduledReports/lang/pt.json b/plugins/ScheduledReports/lang/pt.json
index 18c1db9140..16d007ad0f 100644
--- a/plugins/ScheduledReports/lang/pt.json
+++ b/plugins/ScheduledReports/lang/pt.json
@@ -1,6 +1,5 @@
{
"ScheduledReports": {
- "AggregateReportsFormat": "(opcional) Opções de Visualização",
"AggregateReportsFormat_GraphsOnly": "Apenas Visualiza Gráfico (sem tabelas de relatório)",
"AggregateReportsFormat_TablesAndGraphs": "Exibir tabelas de Relatório e Gráficos para todos os relatórios",
"AggregateReportsFormat_TablesOnly": "(por omissão) Visualização de tabelas de relatórios (gráficos apenas para métricas chave)",
diff --git a/plugins/ScheduledReports/lang/ro.json b/plugins/ScheduledReports/lang/ro.json
index 5fb7404789..cea5fab7c6 100644
--- a/plugins/ScheduledReports/lang/ro.json
+++ b/plugins/ScheduledReports/lang/ro.json
@@ -1,6 +1,5 @@
{
"ScheduledReports": {
- "AggregateReportsFormat": "(opţional) opţiuni de vizualizare",
"AggregateReportsFormat_GraphsOnly": "Numai graficele de afișare (nu tabele raport)",
"AggregateReportsFormat_TablesAndGraphs": "Afiseaza tabele raport și grafice pentru toate rapoartele",
"AggregateReportsFormat_TablesOnly": "(implicit) Raport tabele de afișare (Diagramele numai pentru indicatorii cheie)",
diff --git a/plugins/ScheduledReports/lang/ru.json b/plugins/ScheduledReports/lang/ru.json
index d29d3b263e..41d1577dc8 100644
--- a/plugins/ScheduledReports/lang/ru.json
+++ b/plugins/ScheduledReports/lang/ru.json
@@ -1,6 +1,5 @@
{
"ScheduledReports": {
- "AggregateReportsFormat": "(необязательно) Настройки отображения",
"AggregateReportsFormat_GraphsOnly": "Отображать только графики (без отчетных таблиц)",
"AggregateReportsFormat_TablesAndGraphs": "Отображать таблицы и графики для всех отчетов",
"AggregateReportsFormat_TablesOnly": "(по умолчанию) Отображать таблицы отчетов (графики только для ключевых показетелей)",
diff --git a/plugins/ScheduledReports/lang/sl.json b/plugins/ScheduledReports/lang/sl.json
index 6d88992f8c..08a39be38a 100644
--- a/plugins/ScheduledReports/lang/sl.json
+++ b/plugins/ScheduledReports/lang/sl.json
@@ -1,6 +1,5 @@
{
"ScheduledReports": {
- "AggregateReportsFormat": "(opcijsko) Opcije prikaza",
"AlsoSendReportToTheseEmails": "Poročila pošlji tudi na sledeče emaile (en email v vsako vrstico):",
"AreYouSureDeleteReport": "Ste prepričani, da želite izbrisati to poročilo in urnik?",
"CreateReport": "Ustvari poročilo",
diff --git a/plugins/ScheduledReports/lang/sq.json b/plugins/ScheduledReports/lang/sq.json
index 9cc1a288a3..37a546999c 100644
--- a/plugins/ScheduledReports/lang/sq.json
+++ b/plugins/ScheduledReports/lang/sq.json
@@ -1,9 +1,9 @@
{
"ScheduledReports": {
- "AggregateReportsFormat": "(opsionale) Shfaqni mundësitë",
+ "AggregateReportsFormat": "Mundësi shfaqjeje",
"AggregateReportsFormat_GraphsOnly": "Shfaq vetëm Grafikë (pa tabela raporti)",
"AggregateReportsFormat_TablesAndGraphs": "Shfaq tabela Raporti dhe Grafikë për krejt raportet",
- "AggregateReportsFormat_TablesOnly": "(parazgjedhje) Shfaq tabela Raporti (Grafikë vetëm për matjet kyçe)",
+ "AggregateReportsFormat_TablesOnly": "(parazgjedhje) Shfaq tabela Raporti (Grafikë vetëm për vlerat kyçe)",
"AlsoSendReportToTheseEmails": "Dërgoje raportin edhe te këto email-e (një email për rresht):",
"AreYouSureDeleteReport": "Jeni i sigurt se doni të fshihet ky raport dhe planifikimi për të?",
"CancelAndReturnToReports": "Anuloje dhe %1$skthehu te lista e raporteve%2$s",
@@ -11,32 +11,33 @@
"CreateReport": "Krijoje Raportin",
"CustomVisitorSegment": "Segment Vetjak i Vizitorit",
"DescriptionOnFirstPage": "Përshkrimi i raportit do të shfaqet te faqja e parë e raportit.",
- "DisplayFormat_TablesOnly": "Shfaq vetëm Tabela (jo grafikë)",
+ "DisplayFormat_TablesOnly": "Shfaq vetëm Tabela (pa grafikë)",
"EmailHello": "Tungjatjeta,",
"EmailReports": "Dërgo Raportet Me Email",
"EmailSchedule": "Plan Dërgimi me Email",
- "EvolutionGraph": "Shfaq Grafikë Historie për %s vlerat kryesuese",
+ "EvolutionGraph": "Shfaq Grafikë Historik për %s vlerat kryesuese",
"FrontPage": "Faqja Ballore",
"PersonalEmailReports": "Raporte Personalë Me Email",
"MonthlyScheduleHelp": "Planifikim mujor: raporti do të dërgohet ditën e parë të çdo muaji.",
- "MustBeLoggedIn": "Duhet të jeni i futur që të krijoni dhe të planifikoni raporte të personalizuar.",
+ "MustBeLoggedIn": "Duhet të jeni i futur, që të krijoni dhe të planifikoni raporte vetjakë.",
"NoRecipients": "Ky raport s’ka marrës",
"Pagination": "Faqja %1$s nga %2$s",
"PiwikReports": "Raporte Piwik",
- "PleaseFindAttachedFile": "Ju lutem, shihni te kartela bashkangjitur %1$s raportin tuaj për %2$s.",
+ "PleaseFindAttachedFile": "Ju lutemi, shihni te kartela bashkëngjitur %1$s raportin tuaj për %2$s.",
"SentFromX": "Dërguar prej %s.",
- "PleaseFindBelow": "Ju lutem, shihni më poshtë raportin tuaj %1$s për %2$s.",
+ "PleaseFindBelow": "Ju lutemi, shihni më poshtë raportin tuaj %1$s për %2$s.",
"PluginDescription": "Krijoni raporte vetjakë dhe planifikoni për ta dërgimin me email përditë, për javë ose për muaj, te një ose disa vetë. Mbulohen një numër formatesh raportesh (html, pdf, csv, figura).",
"ReportFormat": "Format Raporti",
"ReportHour": "Dërgoje raportin më %s",
- "ReportIncludeNWebsites": "Raporti do të përfshijë matjet kryesore për krejt sajtet që kanë të paktën një vizitë (prej sajtesh %s të përdorshëm deri sot).",
+ "ReportHourWithUTC": "në orën %s UTC",
+ "ReportIncludeNWebsites": "Raporti do të përfshijë vlerat kryesore për krejt sajtet që kanë të paktën një vizitë (prej sajtesh %s të përdorshëm deri sot).",
"ReportSent": "Raporti u dërgua",
"ReportsIncluded": "Përfshi statistikat",
"ReportType": "Dërgoje raportin përmes",
"ReportUpdated": "Raporti u përditësua",
"Segment_Deletion_Error": "Ky segment s’mund të fshihet ose të bëhet i padukshëm për përdoruesit e tjerë, ngaqë përdoret për të prodhuar raport(e) email për %s. Ju lutemi, riprovoni pas heqjes së këtij segmenti nga ky raport(e).",
"Segment_Help": "Mund të zgjidhni një segment ekzistues vetjak për ta zbatuar mbi të dhënat për këtë raport email. Segmente vetjakë mund të krijoni dhe përpunoni te pulti juaj %1$s(klikoni këtu që ta hapni)%2$s, mandej të klikoni mbi kutinë \"%3$s\", mandej \"%4$s\".",
- "SegmentAppliedToReports": "Segmenti '%s' është zbatuar për këtë raport.",
+ "SegmentAppliedToReports": "Për raportet është zbatuar segmenti '%s'.",
"SendReportNow": "Dërgoje Raportin tani",
"SendReportTo": "Raportin dërgoje te",
"SentToMe": "Dërgoma mua",
diff --git a/plugins/ScheduledReports/lang/sr.json b/plugins/ScheduledReports/lang/sr.json
index 4361ff7d96..a3fe0da785 100644
--- a/plugins/ScheduledReports/lang/sr.json
+++ b/plugins/ScheduledReports/lang/sr.json
@@ -1,6 +1,6 @@
{
"ScheduledReports": {
- "AggregateReportsFormat": "Prikaži opcije (opciono)",
+ "AggregateReportsFormat": "Opcije prikaza",
"AggregateReportsFormat_GraphsOnly": "Prikaži samo grafikone (bez tabela)",
"AggregateReportsFormat_TablesAndGraphs": "Prikaži i tabele i grafikone",
"AggregateReportsFormat_TablesOnly": "Prikaži tabele izveštaja i grafikone za ključne metrike (podrazumevano)",
@@ -29,6 +29,7 @@
"PluginDescription": "Kreirajte sopstvene izveštaje i zakažite njihovo slanje putem elektronske pošte dnevno, nedeljno ili mesečno jednoj ili više osoba. Više različitih formata je podržano (HTML, PDF, CSV, slike).",
"ReportFormat": "Format izveštaja",
"ReportHour": "Pošalji izveštaj u %s",
+ "ReportHourWithUTC": "%s sati UTC",
"ReportIncludeNWebsites": "Izveštaj će obuhvatiti glavne metrike za sve sajtove koji imaju barem jednu posetu (od ukupno %s sajtova koliko je trenutno dostupno).",
"ReportSent": "Izveštaj je poslat",
"ReportsIncluded": "Statistika uključena",
diff --git a/plugins/ScheduledReports/lang/sv.json b/plugins/ScheduledReports/lang/sv.json
index 1eec17bb67..42bc2d5999 100644
--- a/plugins/ScheduledReports/lang/sv.json
+++ b/plugins/ScheduledReports/lang/sv.json
@@ -1,6 +1,5 @@
{
"ScheduledReports": {
- "AggregateReportsFormat": "(frivilligt) Visningsalternativ",
"AggregateReportsFormat_GraphsOnly": "Visa endast diagram (inga rapporttabeller)",
"AggregateReportsFormat_TablesAndGraphs": "Visa rapporttabeller och diagram för alla rapporter",
"AggregateReportsFormat_TablesOnly": "(standard) Visa rapporttabeller (Diagram endast för nyckeltal)",
diff --git a/plugins/ScheduledReports/lang/tl.json b/plugins/ScheduledReports/lang/tl.json
index 8cb29c4914..7eb513ff42 100644
--- a/plugins/ScheduledReports/lang/tl.json
+++ b/plugins/ScheduledReports/lang/tl.json
@@ -1,6 +1,5 @@
{
"ScheduledReports": {
- "AggregateReportsFormat": "(opsyonal) mga pagpipilian sa display",
"AggregateReportsFormat_GraphsOnly": "Display Graph lamang (walang mga talahanayan ng ulat).",
"AggregateReportsFormat_TablesAndGraphs": "Ipakita ang mga talahanayan ng Ulat at Graph para sa lahat ng mga ulat",
"AggregateReportsFormat_TablesOnly": "(default) Ipakita ang mga table ng Report(mga graph lamang para sa mga key metric)",
diff --git a/plugins/ScheduledReports/lang/tr.json b/plugins/ScheduledReports/lang/tr.json
index b7955341bd..2f7a831635 100644
--- a/plugins/ScheduledReports/lang/tr.json
+++ b/plugins/ScheduledReports/lang/tr.json
@@ -1,6 +1,5 @@
{
"ScheduledReports": {
- "AggregateReportsFormat": "Ekran seçenekleri (isteğe bağlı)",
"AggregateReportsFormat_GraphsOnly": "Sadece Grafikleri Göster (tabloları gösterme)",
"AggregateReportsFormat_TablesAndGraphs": "Rapor Tabloları ve Grafileri tüm raporlar için göster",
"AggregateReportsFormat_TablesOnly": "(varsayılan) Rapor Tablolarını Göster (Grafikler için sadece anahtar metrikler)",
diff --git a/plugins/ScheduledReports/lang/uk.json b/plugins/ScheduledReports/lang/uk.json
index 0e65e66090..3ed750852d 100644
--- a/plugins/ScheduledReports/lang/uk.json
+++ b/plugins/ScheduledReports/lang/uk.json
@@ -1,6 +1,5 @@
{
"ScheduledReports": {
- "AggregateReportsFormat": "(необов'язково) Параметри відображення",
"AggregateReportsFormat_GraphsOnly": "Відображати тільки графіки (без звітних таблиць)",
"AggregateReportsFormat_TablesAndGraphs": "Відображати таблиці і графіки для всіх звітів",
"AggregateReportsFormat_TablesOnly": "(за замовчуванням) Відображати таблиці звітів (графіки тільки для ключових показетелей)",
diff --git a/plugins/ScheduledReports/lang/vi.json b/plugins/ScheduledReports/lang/vi.json
index 1ea0d5984f..7f198c7c38 100644
--- a/plugins/ScheduledReports/lang/vi.json
+++ b/plugins/ScheduledReports/lang/vi.json
@@ -1,6 +1,5 @@
{
"ScheduledReports": {
- "AggregateReportsFormat": "(tùy chọn) Tùy chọn hiển thị",
"AggregateReportsFormat_GraphsOnly": "Chỉ hiển thị đồ thị (không có bảng báo cáo)",
"AggregateReportsFormat_TablesAndGraphs": "Báo cáo hiển thị bảng và đồ thị cho tất cả các báo cáo",
"AggregateReportsFormat_TablesOnly": "(mặc định) Hiển thị các bảng báo cáo (Các đồ thị chỉ dành cho các số liệu chính)",
diff --git a/plugins/ScheduledReports/lang/zh-cn.json b/plugins/ScheduledReports/lang/zh-cn.json
index 4966be70e1..88d0ee50d3 100644
--- a/plugins/ScheduledReports/lang/zh-cn.json
+++ b/plugins/ScheduledReports/lang/zh-cn.json
@@ -1,6 +1,5 @@
{
"ScheduledReports": {
- "AggregateReportsFormat": "(可选) 显示选项",
"AggregateReportsFormat_GraphsOnly": "仅显示图形 (不显示报表)",
"AggregateReportsFormat_TablesAndGraphs": "显示报表和所有图表",
"AggregateReportsFormat_TablesOnly": "(默认) 显示报表 (图形仅显示关键指标)",
diff --git a/plugins/ScheduledReports/templates/_addReport.twig b/plugins/ScheduledReports/templates/_addReport.twig
index ac7840337a..5201911d3d 100644
--- a/plugins/ScheduledReports/templates/_addReport.twig
+++ b/plugins/ScheduledReports/templates/_addReport.twig
@@ -119,7 +119,7 @@
</div>
<div class='col s12 m6'>
{% endif %}
- <div class='reportCategory'>{{ category }}</div>
+ <h3 class='reportCategory'>{{ category }}</h3>
<ul class='listReports'>
{% for report in reports %}
<li>
diff --git a/plugins/SegmentEditor/lang/nl.json b/plugins/SegmentEditor/lang/nl.json
index 146d2b363f..8b898275ac 100644
--- a/plugins/SegmentEditor/lang/nl.json
+++ b/plugins/SegmentEditor/lang/nl.json
@@ -7,6 +7,7 @@
"AutoArchivePreProcessed": "gesegmenteerde rapporten worden voor verwerkt (sneller, vereist archive.php cron)",
"AutoArchiveRealTime": "gesegmenteerde rapporten worden realtime verwerkt",
"ChooseASegment": "Kies een segment",
+ "CurrentlySelectedSegment": "Geselecteerd segment: %s",
"DataAvailableAtLaterDate": "De gesegmenteerde analyse rapporten zullen op een later tijdstip beschikbaar komen. Excuses voor het ongemak.",
"DefaultAllVisits": "Alle bezoeken",
"DragDropCondition": "Sleep en verplaats voorwaarde",
@@ -17,14 +18,21 @@
"SaveAndApply": "Bewaar & Pas Toe",
"SegmentDisplayedAllWebsites": "alle websites",
"SegmentDisplayedThisWebsiteOnly": "alleen deze website",
+ "SegmentIsDisplayedForWebsite": "en verwerkt voor",
"SegmentNotApplied": "Segment '%s' niet toegepast",
"SegmentNotAppliedMessage": "Je probeert data op te vragen voor aangepast segment '%s', deze Piwik omgeving is op dit moment, vanwege performance redenen, ingericht om geen rapporten in realtime te verwerken.",
+ "SelectSegmentOfVisits": "Selecteer een segment van bezoeken:",
"ThisSegmentIsVisibleTo": "Dit segment is zichtbaar voor:",
"VisibleToAllUsers": "alle gebruikers",
"VisibleToMe": "mij",
"YouMayChangeSetting": "Als alternatief kun je er voor kiezen om de instelling binnen het configuratie bestand (%1$s) aan te passen, of wijzig dit Segment en kies '%2$s'.",
+ "VisibleToSuperUser": "Zichtbaar voor jou omdat je Super User rechten hebt",
+ "SharedWithYou": "Gedeeld met jou",
"YouMustBeLoggedInToCreateSegments": "Je moet ingelogd zijn om Bezoekers segmenten te bewerken of aan te maken.",
"YouDontHaveAccessToCreateSegments": "U heeft niet het benodigde toegangsniveau om segmenten te maken en bewerken.",
- "AddingSegmentForAllWebsitesDisabled": "Het toevoegen van segmenten voor alle websites is uitgeschakeld."
+ "AddingSegmentForAllWebsitesDisabled": "Het toevoegen van segmenten voor alle websites is uitgeschakeld.",
+ "CustomSegment": "Custom segment",
+ "SegmentOperatorIsNullOrEmpty": "is null of leeg",
+ "SegmentOperatorIsNotNullNorEmpty": "is null of leeg"
}
} \ No newline at end of file
diff --git a/plugins/SegmentEditor/lang/sq.json b/plugins/SegmentEditor/lang/sq.json
index b8d7dbd9ce..fa757a8a5d 100644
--- a/plugins/SegmentEditor/lang/sq.json
+++ b/plugins/SegmentEditor/lang/sq.json
@@ -1,7 +1,41 @@
{
"SegmentEditor": {
+ "PluginDescription": "Krijoni dhe ripërdorni Segmente vetjakë vizitorësh me Përpunuesin e Segmenteve.",
"AddANDorORCondition": "Shtoni kusht %s",
+ "AddNewSegment": "Shtoni segment të ri",
+ "AreYouSureDeleteSegment": "Jeni i sigurt se doni të fshihet ky segment?",
+ "AutoArchivePreProcessed": "raportet e segmentuar janë të parapërgatitur (më të shpejtë, lyp cron)",
+ "AutoArchiveRealTime": "raportet e segmentuar përpunohen aty për aty",
+ "ChangingSegmentDefinitionConfirmationNotProcessedOnRequest": "Ju ndan një hap nga ndryshimi i përkufizimit të segmentit. Raportet e analizave tuaja për këtë segment të ri s’do të jenë gati pa u ripërpunuar raportet. Mund të duhen disa orë për shfaqjen e të dhënave të raporteve për këtë segment. Të vazhdohet sido qoftë?",
+ "ChangingSegmentDefinitionConfirmationProcessedOnRequest": "Ju ndan një hap nga ndryshimi i përkufizimit të segmentit. Raportet e analizave tuaja për këtë segment të ri do të ripërpunohen pasi kjo të kërkohet nga ju herës tjetër. Mund të duhen pak minuta për shfaqjen e raporteve tuaj. Të vazhdohet sido qoftë?",
"ChooseASegment": "Zgjidhni një segment",
- "DefaultAllVisits": "Krejt vizitat"
+ "CurrentlySelectedSegment": "Segmenti i përzgjedhur tani: %s",
+ "DataAvailableAtLaterDate": "Raportet e segmentuar të statistikave do të jenë gati më vonë. Kërkojmë ndjesë për vonesën.",
+ "DefaultAllVisits": "Krejt vizitat",
+ "DragDropCondition": "Kusht Merr & Vër",
+ "HideMessageInFuture": "Fshihe këtë mesazh në të ardhmen",
+ "LoadingSegmentedDataMayTakeSomeTime": "Përpunimi i të dhënave sipas segmentesh vizitorësh mund të hajë ca minuta…",
+ "OperatorAND": "DHE",
+ "OperatorOR": "OSE",
+ "SaveAndApply": "Ruaje & Zbatoje",
+ "SegmentDisplayedAllWebsites": "krejt sajtet",
+ "SegmentDisplayedThisWebsiteOnly": "vetëm këtë sajt",
+ "SegmentIsDisplayedForWebsite": "dhe përpunuar për",
+ "SegmentNotApplied": "S’u zbatua segmenti '%s'",
+ "SegmentNotAppliedMessage": "Po kërkoni të dhëna për Segmentin Vetjak '%s', ky formësim i Piwik-ut e pengon përpunimin e atypëratyshëm të raporteve, për arsye funksionimi.",
+ "SelectSegmentOfVisits": "Përzgjidhni një segment vizitash",
+ "ThisSegmentIsVisibleTo": "Ky segment është i dukshëm për:",
+ "VisibleToAllUsers": "krejt përdoruesit",
+ "VisibleToMe": "mua",
+ "YouMayChangeSetting": "Përndryshe mund ta ndryshoni këtë rregullim te kartela e formësimit (%1$s), ose përpunojeni këtë Segment dhe zgjidhni '%2$s'.",
+ "VisibleToSuperUser": "I dukshëm për ju, ngaqë keni hyrje Superpërdoruesi",
+ "SharedWithYou": "Ndarë me ju",
+ "YouMustBeLoggedInToCreateSegments": "Që të krijoni dhe përpunoni segmente vetjakë vizitorësh, duhet të keni bërë hyrjen.",
+ "YouDontHaveAccessToCreateSegments": "Nuk keni shkallë të nevojshme hyrjesh për krijim dhe përpunim segmentesh.",
+ "AddingSegmentForAllWebsitesDisabled": "Shtimi i segmenteve për krejt sajtet është çaktivizuar.",
+ "SegmentXIsAUnionOf": "%s është një bashkim i këtyre segmenteve:",
+ "CustomSegment": "Segment Vetjak",
+ "SegmentOperatorIsNullOrEmpty": "është null ose i zbrazët",
+ "SegmentOperatorIsNotNullNorEmpty": "s’është null ose i zbrazët"
}
} \ No newline at end of file
diff --git a/plugins/SegmentEditor/lang/sr.json b/plugins/SegmentEditor/lang/sr.json
index 0fd868bdbf..7375099c69 100644
--- a/plugins/SegmentEditor/lang/sr.json
+++ b/plugins/SegmentEditor/lang/sr.json
@@ -6,24 +6,36 @@
"AreYouSureDeleteSegment": "Da li ste sigurni da želite da obrišete ovaj segment?",
"AutoArchivePreProcessed": "segmentirani izveštaji su unapred pripremljeni (brže, zahteva archive.php cron)",
"AutoArchiveRealTime": "segmentirani izveštaji se obrađuju u realnom vremenu",
+ "ChangingSegmentDefinitionConfirmationNotProcessedOnRequest": "Ukoliko promenite definiciju segmenta, vaši analitički izveštaji za ovaj novi segment neće biti raspoloživi dok se izveštaji ne regenerišu. Može potrajati nekoliko sati pre nego što se izveštaji za ovaj segment budu pojavili. Da li želite da nastavite?",
+ "ChangingSegmentDefinitionConfirmationProcessedOnRequest": "Ukoliko promenite definiciju segmenta, vaši analitički izveštaji za ovaj novi segment će se regenerisati na vaš sledeći zahtev. Može potrajati nekoliko minuta pre nego što se izveštaji budu pojavili. Da li želite da nastavite?",
"ChooseASegment": "Izaberite segment",
+ "CurrentlySelectedSegment": "Trenutno izabran segment: %s",
"DataAvailableAtLaterDate": "Vaš segmentirani analitički izveštaj će biti na raspolaganju nešto kasnije. Izvinjavamo se zbog neprijatnosti.",
"DefaultAllVisits": "Sve posete",
"DragDropCondition": "Prevuci i Pusti uslov",
+ "HideMessageInFuture": "Ne prikazuj ovu poruku ubuduće",
"LoadingSegmentedDataMayTakeSomeTime": "Obrada podataka može potrajati par trenutaka...",
"OperatorAND": "I",
"OperatorOR": "ILI",
"SaveAndApply": "Sačuvaj i primeni",
"SegmentDisplayedAllWebsites": "svi sajtovi",
"SegmentDisplayedThisWebsiteOnly": "samo ovaj sajt",
+ "SegmentIsDisplayedForWebsite": "i procesiran za",
"SegmentNotApplied": "Segment '%s' nije primenjen.",
"SegmentNotAppliedMessage": "Zahtevali ste podatke za korisnički definisani segment '%s' a trenutne postavke Piwik-a sprečavaju procesiranje izveštaja u realnom vremenu zbog očuvanja nivoa performansi.",
+ "SelectSegmentOfVisits": "Izaberite segment poseta:",
"ThisSegmentIsVisibleTo": "Ovaj segment je vidljiv:",
"VisibleToAllUsers": "svi korisnici",
"VisibleToMe": "meni",
"YouMayChangeSetting": "Takođe možete promeniti podešavanja i u datoteci %1$s ili izmenom segmenta i izborom '%2$s'.",
+ "VisibleToSuperUser": "Vidljivi vama zato što imate superkorisnički pristup",
+ "SharedWithYou": "Deljeni sa vama",
"YouMustBeLoggedInToCreateSegments": "Morate biti prijavljeni kako biste mogli da kreirate i menjate segmente.",
"YouDontHaveAccessToCreateSegments": "Nemate odgovarajući nivo pristupa da biste kreirali i menjali segmente.",
- "AddingSegmentForAllWebsitesDisabled": "Dodavanje segmenata za sve sajtove je onemogućeno."
+ "AddingSegmentForAllWebsitesDisabled": "Dodavanje segmenata za sve sajtove je onemogućeno.",
+ "SegmentXIsAUnionOf": "%s je unija ovih segmenata:",
+ "CustomSegment": "Korisnički definisan segment",
+ "SegmentOperatorIsNullOrEmpty": "je prazan ili nije definisan",
+ "SegmentOperatorIsNotNullNorEmpty": "niti je prazan niti je nedefinisan"
}
} \ No newline at end of file
diff --git a/plugins/SitesManager/lang/cs.json b/plugins/SitesManager/lang/cs.json
index 3edb945e24..9a27b5e8d6 100644
--- a/plugins/SitesManager/lang/cs.json
+++ b/plugins/SitesManager/lang/cs.json
@@ -33,6 +33,7 @@
"GlobalListExcludedQueryParameters": "Globální seznam vynechaných URL parametrů",
"GlobalListExcludedUserAgents": "Globální seznam uživatelských agentů k vyloučení",
"GlobalListExcludedUserAgents_Desc": "Pokud řetězec uživatelského agenta obsahuje některý ze zadaných řetězců, tento návštěvník bude vyloučen z Piwiku.",
+ "GlobalSettings": "Obecná nastavení",
"GlobalWebsitesSettings": "Nastavení globálních webových stránek",
"HelpExcludedIps": "Zatejte seznam IP adrese, jednu na řádek, které chcete vynechat ze záznamů Piwiku. Můžete použít zástupné znaky např. %1$s nebo %2$s",
"JsTrackingTagHelp": "Zde je JavaScriptový zaznamenávací tag pro vložení na všechny vaše stránky",
@@ -44,6 +45,7 @@
"ListOfQueryParametersToBeExcludedOnAllWebsites": "URL parametry uvedené níže budou vynechány z URL pro všechny www adresy",
"ListOfQueryParametersToExclude": "Zadejte seznam URL parametrů, jeden na řádek, které budou vynechány z hlášení Piwiku",
"MainDescription": "Vaše analýzy webu potřebují Web! Přidejte, aktualizujte, nebo vymažte je a zobrazte si JavaScriptový kód pro vložení do vaších stránek.",
+ "MenuManage": "Spravovat",
"NotAnEcommerceSite": "Žádná stránka obchodu",
"NotFound": "Žádné www nenalezený pro",
"NoWebsites": "Nemáte žádný Weby k administraci.",
@@ -75,6 +77,7 @@
"TrackingSiteSearch": "Sledování interního vyhledávání na stránkách",
"TrackingTags": "Zaznamenávací tagy pro %s",
"Urls": "URL",
+ "Type": "Typ",
"UTCTimeIs": "UTC čas je %s",
"OnlyMatchedUrlsAllowed": "Sledovat návštěvy a akce pouze tehdy, pokud URL akce začíná jednou z výše uvedených URL.",
"OnlyMatchedUrlsAllowedHelp": "Pokud je povoleno, Piwik bude sledovat interní akce pouze tehdy, když je URL stránky jednou ze známých URL vašeho webu. To zabrání lidem, aby zahltili analýzu URL jiných stránek.",
diff --git a/plugins/SitesManager/lang/de.json b/plugins/SitesManager/lang/de.json
index e5248d2e60..fb33dfc319 100644
--- a/plugins/SitesManager/lang/de.json
+++ b/plugins/SitesManager/lang/de.json
@@ -33,6 +33,7 @@
"GlobalListExcludedQueryParameters": "Globale Liste von GET-Parametern, die ignoriert werden",
"GlobalListExcludedUserAgents": "Globale Liste aller ausgeschlossenen Browser Agenten",
"GlobalListExcludedUserAgents_Desc": "Falls der übermittelte Browser Agent des Besuchers einen der angegebenen Begriffe enthält, wird der Besucher von Piwik ignoriert.",
+ "GlobalSettings": "Globale Einstellungen",
"GlobalWebsitesSettings": "Globale Website-Einstellungen",
"HelpExcludedIps": "Geben Sie eine Liste von IPs an (eine pro Zeile), die von Piwik beim Erfassen von Besuchen ignoriert werden sollen. Es können Wildcards wie z.B. %1$s oder %2$s genutzt werden.",
"JsTrackingTagHelp": "Hier ist der JavaScript-Tracking-Code, den Sie in all Ihre Seiten einfügen müssen",
@@ -44,6 +45,7 @@
"ListOfQueryParametersToBeExcludedOnAllWebsites": "Die untenstehenden GET-Parameter werden von allen URLs aller Websites ignoriert.",
"ListOfQueryParametersToExclude": "Geben Sie eine Liste von GET-Parametern an (einer pro Zeile), die vom Seiten-URL-Bericht ignoriert werden sollen.",
"MainDescription": "Ihre Webanalyse benötigt Websites! Websites können hinzugefügt, aktualisiert und gelöscht werden. Hier wird auch der JavaScript-Code gezeigt, der in Ihre Websites eingefügt werden muss.",
+ "MenuManage": "Verwalten",
"NotAnEcommerceSite": "Dies ist keine Ecommerce Seite",
"NotFound": "Keine Websites gefunden für",
"NoWebsites": "Es ist noch keine Website zum administrieren vorhanden.",
@@ -75,6 +77,7 @@
"TrackingSiteSearch": "Die interne Suche auswerten",
"TrackingTags": "Tracking-Code für %s",
"Urls": "URLs",
+ "Type": "Typ",
"UTCTimeIs": "UTC-Zeit ist %s.",
"OnlyMatchedUrlsAllowed": "Zeichne Besuche und Aktionen nur auf wenn die Aktions-URL mit einer der oben genannten URLs beginnt.",
"OnlyMatchedUrlsAllowedHelp": "Wenn aktiviert zeichnet Piwik nur noch interne Aktionen auf bei denen die Seiten-URL eine der bekannten URLs der Website ist. Dies hindert andere daran Ihre Analyse mit URLs von anderen Websites zu verfälschen.",
diff --git a/plugins/SitesManager/lang/el.json b/plugins/SitesManager/lang/el.json
index a6b2092a5a..f66bbfc5df 100644
--- a/plugins/SitesManager/lang/el.json
+++ b/plugins/SitesManager/lang/el.json
@@ -33,6 +33,7 @@
"GlobalListExcludedQueryParameters": "Καθολικός κατάλογος από παραμέτρους Ερωτήματος URL για αποκλεισμό",
"GlobalListExcludedUserAgents": "Καθολική λίστα πελατών χρήστη για αποκλεισμό",
"GlobalListExcludedUserAgents_Desc": "Εάν η συμβολοσειρά (string) του αντιπροσώπου χρήστη του επισκέπτη σας περιέχει οποιαδήποτε από τις συμβολοσειρές που έχετε ορίσει, ο επισκέπτης θα αποκλείεται από το Piwik.",
+ "GlobalSettings": "Καθολικές ρυθμίσεις",
"GlobalWebsitesSettings": "Καθολικές ρυθμίσεις ιστοσελίδων",
"HelpExcludedIps": "Εισάγετε τη λίστα των διευθύνσεων IP, μία ανά γραμμή, που επιθυμείτε να αποκλείσετε από την ανίχνευση του Piwik. Μπορείτε να χρησιμοποιήσετε χαρακτήρες μπαλαντέρ, π.χ. %1$s ή %2$s",
"JsTrackingTagHelp": "Εδώ είναι ο κώδικας Παρακολούθησης JavaScript για να συμπεριληφθεί στις σελίδες σας",
@@ -44,6 +45,7 @@
"ListOfQueryParametersToBeExcludedOnAllWebsites": "Οι παράμετροι Ερωτήματος URLs παρακάτω θα αποκλειστούν από URLs σε όλες τις ιστοσελίδες.",
"ListOfQueryParametersToExclude": "Εισάγετε τον κατάλογο των Παραμέτρων Ερωτημάτων URL, ένα ανά γραμμή, για να αποκλειστεί από τις αναφορές Σελίδας URLs.",
"MainDescription": "Το σύστημα αναλυτικών αναφορών χρειάζεται ιστοσελίδες! Προσθέστε, ενημερώστε, διαγράψτε ιστοσελίδες και εμφανίστε τον κώδικα Javascript που θα εισαχθεί στις ιστοσελίδες σας.",
+ "MenuManage": "Διαχείριση",
"NotAnEcommerceSite": "Δεν είναι ιστοσελίδα Ηλεκτρονικού Εμπορίου",
"NotFound": "Δεν βρέθηκαν ιστοσελίδες για",
"NoWebsites": "Δεν έχετε κάποια ιστοσελίδα για να διαχειριστείτε.",
@@ -75,6 +77,7 @@
"TrackingSiteSearch": "Καταγραφή Εσωτερικής Αναζήτησης Ιστοσελίδας",
"TrackingTags": "Κώδικας εποπτείας για %s",
"Urls": "Διευθύνσεις URL",
+ "Type": "Τύπος",
"UTCTimeIs": "Ο Παγκόσμιος χρόνος είναι %s.",
"OnlyMatchedUrlsAllowed": "Να παρακολουθούνται οι επισκέψεις και οι ενέργειες μόνο όταν η διεύθυνση URL ξεκινάει με μία από τις παραπάνω διευθύνσεις URL.",
"OnlyMatchedUrlsAllowedHelp": "Όταν είναι ενεργοποιημένο, το Piwik θα παρακολουθεί εσωτερικές ενέργειες όταν η διεύθυνση URL είναι μία από τις γνωστές διευθύνσεις URL για τον ιστοτόπο σας. Αυτό αποτρέπει τρίτους από ανεπιθύμητη κίνηση στα αναλυτικά σας με διευθύνσεις URL από τρίτους ιστοτόπους.",
diff --git a/plugins/SitesManager/lang/es.json b/plugins/SitesManager/lang/es.json
index 703e87b049..051a970ee1 100644
--- a/plugins/SitesManager/lang/es.json
+++ b/plugins/SitesManager/lang/es.json
@@ -33,6 +33,7 @@
"GlobalListExcludedQueryParameters": "Lista global de parámetros de consulta de URL a excluir",
"GlobalListExcludedUserAgents": "Lista global de agentes de usuario a excluir",
"GlobalListExcludedUserAgents_Desc": "Si la cadena del usuario agente de determinado visitante contiene alguna de las cadenas que ha especificado, el visitante será excluido de Piwik.",
+ "GlobalSettings": "Ajustes globales",
"GlobalWebsitesSettings": "Configuraciónes globales de los sitios de internet",
"HelpExcludedIps": "Ingrese la lista de direcciones IP, una por línea, que desea excluir de ser rastreadas por Piwik. Puede utilizar caracteres comodín, por ejemplo. %1$s o %2$s",
"JsTrackingTagHelp": "Aquí está el código de rastreo JavaScript a incluir en todas sus páginas",
@@ -44,6 +45,7 @@
"ListOfQueryParametersToBeExcludedOnAllWebsites": "Los parámetros de consulta URL a continuación serán excluidos de las URLs de todos los sitios de internet.",
"ListOfQueryParametersToExclude": "Ingrese la lista de parámetros de consulta de URL, uno por línea, para excluirlos de los informes de URLs de página.",
"MainDescription": "¡Su informe de análisis necesita sitios de internet! Agregue, actualice, elimine sitios y muestre el código JavaScript a insertar en sus páginas.",
+ "MenuManage": "Administrar",
"NotAnEcommerceSite": "No es un sitio de comercio electrónico",
"NotFound": "Ningún sitio de internet encontrado",
"NoWebsites": "No posee ningún sitio de internet para administrar.",
@@ -75,6 +77,7 @@
"TrackingSiteSearch": "Seguimiento en el Buscador interno del sitio",
"TrackingTags": "Código de seguimiento para %s",
"Urls": "URLs",
+ "Type": "Tipo",
"UTCTimeIs": "La hora UTC es %s.",
"OnlyMatchedUrlsAllowed": "Solo rastrear visitas y acciones cuando la acción URL comienza con una de las siguientes URLs.",
"OnlyMatchedUrlsAllowedHelp": "Cuando es habilitado, Piwik solo rastreará acciones internas cuando la URL de la página es una URL conocida del sitio. Esto evita que la gente genere datos basura en sus analíticas con direcciones URL de otros sitios.",
diff --git a/plugins/SitesManager/lang/fr.json b/plugins/SitesManager/lang/fr.json
index 0da2650ea0..cff810a8e6 100644
--- a/plugins/SitesManager/lang/fr.json
+++ b/plugins/SitesManager/lang/fr.json
@@ -33,6 +33,7 @@
"GlobalListExcludedQueryParameters": "Liste globale des paramètres URL des requêtes à exclure",
"GlobalListExcludedUserAgents": "Liste globale des agents utilisateurs à exclure.",
"GlobalListExcludedUserAgents_Desc": "Si le user agent du visiteur contient n'importe laquelle des chaines de caractères que vous avez spécifiées, le visiteur sera exclu de Piwik.",
+ "GlobalSettings": "Paramètrès généraux",
"GlobalWebsitesSettings": "Paramètres généraux des sites web",
"HelpExcludedIps": "Entrez une liste d'adresses IP, une par ligne, que vous souhaitez exclure des statistiques Piwik. Vous pouvez utiliser des caractères jokers ex %1$s ou %2$s",
"JsTrackingTagHelp": "Ci-dessous le code JavaScript à inclure dans toutes vos pages",
@@ -44,6 +45,7 @@
"ListOfQueryParametersToBeExcludedOnAllWebsites": "Les paramètres ci-dessous seront exclus des statistiques de tous les sites web.",
"ListOfQueryParametersToExclude": "Entrez la liste des paramètres URL, un par ligne, à exclure des rapports des URL de pages.",
"MainDescription": "Piwik a besoin de sites pour générer des rapports ! Ajoutez, éditez et supprimez des sites, et voyez le code JavaScript à inclure dans vos pages.",
+ "MenuManage": "Gérer",
"NotAnEcommerceSite": "N'est pas un site d'e-commerce",
"NotFound": "Aucun site trouvé pour",
"NoWebsites": "Vous n'avez aucun site Internet à administrer.",
@@ -75,6 +77,7 @@
"TrackingSiteSearch": "Suivi de la recherche interne sur le site",
"TrackingTags": "Code de suivi pour %s",
"Urls": "URLs",
+ "Type": "Type",
"UTCTimeIs": "L'heure UTC est %s.",
"OnlyMatchedUrlsAllowed": "Effectue le suivi des visites et actions uniquement quand l'URL d'action commence avec une des URLs ci-dessus.",
"OnlyMatchedUrlsAllowedHelp": "Quand activé, Piwik va effectuer le suivi des actions uniquement quand l'URL de la page est une des URLs de votre site web. Ceci empêche les gens de spammer vos données d'analyse avec des URLs d'autres sites web.",
diff --git a/plugins/SitesManager/lang/it.json b/plugins/SitesManager/lang/it.json
index 6a98627981..530b1fb71e 100644
--- a/plugins/SitesManager/lang/it.json
+++ b/plugins/SitesManager/lang/it.json
@@ -33,6 +33,7 @@
"GlobalListExcludedQueryParameters": "Lista globale di parametri Query URL da escludere",
"GlobalListExcludedUserAgents": "Lista globale degli user agent da escludere",
"GlobalListExcludedUserAgents_Desc": "Se la stringa dello user agent del visitatore contiene una delle stringhe da te specificate, il visitatore sarà escluso da Piwik.",
+ "GlobalSettings": "Impostazioni generali",
"GlobalWebsitesSettings": "Impostazioni globali per i siti",
"HelpExcludedIps": "Scrivi la lista di indirizzi IP, uno per riga, che vuoi escludere dal tracking di Piwik. Puoi usare dei caratteri jolly, ad esempio %1$s o %2$s",
"JsTrackingTagHelp": "Qui è visualizzato il codice JavaScript da includere in tutte le pagine che vuoi vengano controllate da Piwik",
@@ -44,6 +45,7 @@
"ListOfQueryParametersToBeExcludedOnAllWebsites": "I parametri URL Query qui sotto saranno esclusi dagli URL su tutti i siti.",
"ListOfQueryParametersToExclude": "Inserisci l'elenco dei parametri di ricerca URL, uno per riga, da escludere dai reports URL Pagina.",
"MainDescription": "Per generare i report dei tuoi siti web, devi configurarli in Piwik! Aggiungi, aggiorna, cancella i siti web e visualizza il codice JavaScript da inserire nelle tue pagine.",
+ "MenuManage": "Amministrazione",
"NotAnEcommerceSite": "Sito non Ecommerce",
"NotFound": "Nessun sito trovato per",
"NoWebsites": "Non hai configurato alcun sito web da amministrare.",
@@ -75,6 +77,7 @@
"TrackingSiteSearch": "Tracciamento Ricerca Interna Sito",
"TrackingTags": "Codice traking per %s",
"Urls": "Indirizzi",
+ "Type": "Tipo",
"UTCTimeIs": "Tempo UTC è %s.",
"OnlyMatchedUrlsAllowed": "Traccia visite e azioni solo quando l'URL del visitatore comincia con uno degli URL qui sopra.",
"OnlyMatchedUrlsAllowedHelp": "Quando abilitato, Piwik traccerà le azioni interne solo quando l'URL Pagina è una delle URL conosciute del sito. Questo evita che la gente spammi le tue statistiche con URL di altri siti web.",
diff --git a/plugins/SitesManager/lang/ko.json b/plugins/SitesManager/lang/ko.json
index ece14f44c0..8aa0518bb3 100644
--- a/plugins/SitesManager/lang/ko.json
+++ b/plugins/SitesManager/lang/ko.json
@@ -33,6 +33,7 @@
"GlobalListExcludedQueryParameters": "전체 제외 쿼리 URL 매개변수",
"GlobalListExcludedUserAgents": "제외할 사용자 에이전트의 글로벌 목록",
"GlobalListExcludedUserAgents_Desc": "방문자의 사용자 에이전트 문자열에 지정한 문자열이 포함되어 있는 경우, Piwik의 방문기록에서 제외됩니다.",
+ "GlobalSettings": "전체 글로벌 설정",
"GlobalWebsitesSettings": "일반 웹사이트 설정",
"HelpExcludedIps": "Piwik 추적에서 제외할 IP 목록을 한 줄에 하나씩 입력합니다. IP에는 와일드 카드 (예: %1$s와 %2$s)을 사용할 수 있습니다.",
"JsTrackingTagHelp": "모든 페이지를 포함한 자바스크립트 트래킹 태그입니다.",
@@ -44,6 +45,7 @@
"ListOfQueryParametersToBeExcludedOnAllWebsites": "다음 쿼리 URL 매개변수는 전체 웹사이트의 URL에서 제외됩니다.",
"ListOfQueryParametersToExclude": "페이지 URL의 보고서에서 제외할 URL 쿼리 매개변수의 목록을 한 줄에 하나씩 입력합니다.",
"MainDescription": "웹 분석 보고서는 웹사이트가 필요합니다! 이 곳에서 웹사이트를 추가하거나 갱신하거나 삭제할 수 있고, 페이지에 삽입할 자바스크립트를 확인할 수 있니다.",
+ "MenuManage": "관리",
"NotAnEcommerceSite": "전자상거래 사이트가 아님",
"NotFound": "웹사이트를 찾을 수 없습니다:",
"NoWebsites": "관리할 웹사이트를 가지고 있지 않습니다.",
@@ -75,9 +77,11 @@
"TrackingSiteSearch": "사이트 내부 검색 추적",
"TrackingTags": "%s의 추적 코드",
"Urls": "URL",
+ "Type": "유형",
"UTCTimeIs": "UTC 시간은 %s입니다.",
"OnlyMatchedUrlsAllowed": "위에 적혀진 URL들 중 하나에서 시작될 경우에만 방문자를 추적합니다.",
"OnlyMatchedUrlsAllowedHelp": "이것이 활성화 될 경우, Piwik는 페이지 URL이 당신 웹사이트의 알려진 URL일 경우에만 내부 추적만을 수행한다. 이를 통해, 사람들이 분석 결과를 통해 다른 사이트에 스팸을 보내는 것을 방지할 수 있다.",
+ "OnlyMatchedUrlsAllowedHelpExamples": "도메인과 경로는 정확히 맞아야 하며, 각각의 유효한 서브 도메인은 독립적으로 명기되어야 합니다. 예를 들어 알려진 URL이 'http:\/\/example.com\/path'과 'http:\/\/good.example.com'이라면, 'http:\/\/example.com\/otherpath' 혹은 'http:\/\/bad.example.com'에 대한 추적 요청은 무시됩니다.",
"WebsitesManagement": "웹사이트 관리",
"XManagement": "%s 관리",
"ChooseMeasurableTypeHeadline": "무엇을 측정하고 싶으십니까?",
diff --git a/plugins/SitesManager/lang/pt-br.json b/plugins/SitesManager/lang/pt-br.json
index db3421b966..1083187d00 100644
--- a/plugins/SitesManager/lang/pt-br.json
+++ b/plugins/SitesManager/lang/pt-br.json
@@ -33,6 +33,7 @@
"GlobalListExcludedQueryParameters": "Lista global de parâmetros Query URL para excluir",
"GlobalListExcludedUserAgents": "Lista global de user agents para excluir",
"GlobalListExcludedUserAgents_Desc": "Se a seqüência de user agent do visitante tiver qualquer uma das seqüências que você especificar, o visitante será excluído do Piwik.",
+ "GlobalSettings": "Configurações globais",
"GlobalWebsitesSettings": "Configurações globais de websites",
"HelpExcludedIps": "Entre com a lista de IPs, um por linha, que você deseja excluir por ter sido rastreado pelo Piwik. Você pode usar wildcards, ex: %1$s ou %2$s",
"JsTrackingTagHelp": "Aqui está a tag de rastreamento JavaScript a ser incluída em todas as suas páginas",
@@ -44,6 +45,7 @@
"ListOfQueryParametersToBeExcludedOnAllWebsites": "Os parâmetros Query URL abaixo serão excluidos das URLs em todos os websites",
"ListOfQueryParametersToExclude": "Entre com a lista de parâmetros URL Query, uma por linha, para excluir os relátorios das páginas URL",
"MainDescription": "Seus relatórios de Web Analytics precisam de websites! Adiciona, atualiza, elimina websites, e mostra o JavaScript necessário para inserir em suas páginas.",
+ "MenuManage": "Gerenciar",
"NotAnEcommerceSite": "Não é um site de Ecommerce",
"NotFound": "Nenhum site encontrado para",
"NoWebsites": "Você não tem nenhum site para administrar.",
@@ -75,6 +77,7 @@
"TrackingSiteSearch": "Acompanhamento de pesquisa interna do site",
"TrackingTags": "Rastreando tags para %s",
"Urls": "URLs",
+ "Type": "Tipo",
"UTCTimeIs": "UTC tempo é %s.",
"OnlyMatchedUrlsAllowed": "Rastreia visitas e ações apenas quando a URL da ação começa com uma das URLs acima.",
"OnlyMatchedUrlsAllowedHelp": "Quando ativado, Piwik só irá rastrear ações internas quando a URL da página for uma das URLs reconhecidas para o seu website. Isso impede que pessoas enviem spams para a sua análise com URLs de outros websites.",
diff --git a/plugins/SitesManager/lang/sq.json b/plugins/SitesManager/lang/sq.json
index 12f4251a22..7ec934e80d 100644
--- a/plugins/SitesManager/lang/sq.json
+++ b/plugins/SitesManager/lang/sq.json
@@ -4,22 +4,22 @@
"AddMeasurable": "Shtoni një të matshme të re",
"AdvancedTimezoneSupportNotFound": "S’u gjet mbulim i thelluar zonash kohore te PHP-ja juaj (mbuluar nga PHP 5.2 e më të rinj). Mundeni prapëseprapë të zgjidhni dorazi një shmangie UTC.",
"AliasUrlHelp": "Këshillohet, por s’është e domosdoshme, të jepen URL të ndryshme, një për rresht, që vizitorët tuaj t’i përdorin për të hyrë në këtë sajt. URL-të alias për sajtin nuk kanë për t’u dukur te raporti Sjellës > Sajte. Mbani shënim që s’është e domosdoshme të jepen URL me apo pa 'www', ngaqë Piwik-u i ka vetvetiu parasysh që të dyja trajtat.",
- "ChangingYourTimezoneWillOnlyAffectDataForward": "Ndryshimi i zonës suaj kohore do të prekë vetëm të dhënat pas kësaj e tutje, nuk do të zbatohet për të më parshmet.",
+ "ChangingYourTimezoneWillOnlyAffectDataForward": "Ndryshimi i zonës suaj kohore do të prekë vetëm të dhënat pas kësaj e tutje, nuk do të zbatohet për të mëparshmet.",
"ChooseCityInSameTimezoneAsYou": "Zgjidhni një qytet nën të njëjtën zonë kohore me ju.",
"Currency": "Monedhë",
"CurrencySymbolWillBeUsedForGoals": "Simboli i monedhës do të shfaqet në krah të të ardhurave nga Objektivat.",
- "DefaultCurrencyForNewWebsites": "Monedhë parazgjedhje për sajte të rinj",
- "DefaultTimezoneForNewWebsites": "Zonë Kohore parazgjedhje për sajte të rinj",
+ "DefaultCurrencyForNewWebsites": "Monedhë Parazgjedhje për sajte të rinj",
+ "DefaultTimezoneForNewWebsites": "Zonë Kohore Parazgjedhje për sajte të rinj",
"DeleteConfirm": "Jeni i sigurt se doni të hiqet sajti %s?",
- "DisableSiteSearch": "Mos gjurmo Kërkime në Sajt",
+ "DisableSiteSearch": "Mos ndiq Kërkime në Sajt",
"EcommerceHelp": "Po u aktivizua, te raporti \"Objektiva\" do të shfaqet një ndarje e re, \"E-tregti\".",
"EnableEcommerce": "Me E-tregti të aktivizuar",
- "EnableSiteSearch": "Kërkimi në Sajt është i aktivizuar",
+ "EnableSiteSearch": "Ndjekja e Kërkimeve në Sajt është e aktivizuar",
"EnableSiteSpecificUserAgentExclude": "Aktivizoni përjashtim agjenti përdoruesi për sajte të dhënë.",
"EnableSiteSpecificUserAgentExclude_Help": "Nëse ju duhet të përjashtoni agjentë të ndryshëm përdoruesi për sajte të ndryshëm, i vini shenjë kësaj kutize, klikoni mbi Ruaje dhe %1$sshtojeni agjentin e përdoruesi më sipër%2$s.",
"ExceptionDeleteSite": "Heqja e këtij sajti s’është e mundur, ngaqë është i vetmi sajt i regjistruar. Së pari, shtoni një sajt të ri, mandej hiqni këtë këtu.",
"ExceptionEmptyName": "Sajti s’mund të jetë i zbrazët.",
- "ExceptionInvalidCurrency": "Monedha \"%1$s\" nuk është një nga të vlefshmet. Ju lutemi, jepni një simbol monedhe të vlefshme (p.sh. %2$s).",
+ "ExceptionInvalidCurrency": "Monedha \"%1$s\" s’është një nga të vlefshmet. Ju lutemi, jepni një simbol monedhe të vlefshme (p.sh. %2$s).",
"ExceptionInvalidIPFormat": "IP-ja që duhet përjashtuar \"%1$s\" s’ka format të vlefshëm IP-sh (p.sh. %2$s).",
"ExceptionInvalidTimezone": "Zona kohore \"%s\" s’është një nga të vlefshmet. Ju lutemi, jepni një zonë kohore të vlefshme.",
"ExceptionInvalidUrl": "Url-ja '%s' s’është URL e vlefshme.",
@@ -27,31 +27,33 @@
"ExcludedIps": "IP të Përjashtuara",
"ExcludedParameters": "Parametra të Përjashtuar",
"ExcludedUserAgents": "Agjentë Përdoruesish të Përjashtuar",
- "GlobalExcludedUserAgentHelp1": "Jepni listën e agjentëve të përdoruesit që duhen përjashtuar nga gjurmimi prej Piwik-ut.",
- "GlobalExcludedUserAgentHelp2": "Këtë mund ta përdorni për përjashtim bot-esh nga gjurmimi.",
+ "GlobalExcludedUserAgentHelp1": "Jepni listën e agjentëve të përdoruesit që duhen përjashtuar nga ndjekja prej Piwik-ut.",
+ "GlobalExcludedUserAgentHelp2": "Këtë mund ta përdorni për përjashtim bot-esh nga ndjekja.",
"GlobalListExcludedIps": "Listë globale IP-sh të përjashtuara",
"GlobalListExcludedQueryParameters": "Listë globale parametrash URL-sh Kërkese që duhen përjashtuar",
"GlobalListExcludedUserAgents": "Listë globale agjentësh përdoruesish për përjashtim",
"GlobalListExcludedUserAgents_Desc": "Nëse vargu i agjentit të përdoruesit për një vizitor përmban një nga vargjet që përcaktoni, vizitori do të përjashtohet nga Piwik-u.",
+ "GlobalSettings": "Rregullime globale",
"GlobalWebsitesSettings": "Rregullime globale për sajte",
- "HelpExcludedIps": "Jepni listën e IP-ve, një për rresht, që dëshironi të përjashtohen nga gjurmimi prej Piwik-ut. Mund të përdorni shenja të gjithëpushtetshme, p.sh. %1$s ose %2$s",
- "JsTrackingTagHelp": "Kjo është etiketa JavaScript e Gjurmimit që duhet përfshirë në krejt faqet tuaja",
- "KeepURLFragments": "Gjurmim fragmentesh URL-sh Faqesh",
- "KeepURLFragmentsHelp": "Nëse kutiza më poshtë lihet pa shenjë, fragmentet e URL-ve të Faqeve (gjithçka pas %1$s) do të hiqen nga gjurmimet: %2$s do të gjurmohet si %3$s",
- "KeepURLFragmentsHelp2": "Këtë rregullim mund ta anashkaloni më sipër, për sajte individualë.",
- "KeepURLFragmentsLong": "Mbaji fragmentet e URL-ve të Faqeve kur gjurmohen URL Faqesh",
- "ListOfIpsToBeExcludedOnAllWebsites": "IP-të më poshtë do të përjashtohen nga gjurmimi për krejt sajtet.",
+ "HelpExcludedIps": "Jepni listën e IP-ve, një për rresht, që dëshironi të përjashtohen nga ndjekja prej Piwik-ut. Mund të përdorni shenja të gjithëpushtetshme, p.sh. %1$s ose %2$s",
+ "JsTrackingTagHelp": "Kjo është etiketa JavaScript e Ndjekjes që duhet përfshirë në krejt faqet tuaja",
+ "KeepURLFragments": "Ndjekje fragmentesh URL-sh Faqesh",
+ "KeepURLFragmentsHelp": "Nëse kutiza më poshtë lihet pa shenjë, fragmentet e URL-ve të Faqeve (gjithçka pas %1$s) do të hiqen nga ndjekjet: %2$s do të ndiqet si %3$s",
+ "KeepURLFragmentsHelp2": "Për sajtet individualë, këtë rregullim mund ta anashkaloni më sipër.",
+ "KeepURLFragmentsLong": "Mbaji fragmentet e URL-ve të Faqeve kur ndiqen URL Faqesh",
+ "ListOfIpsToBeExcludedOnAllWebsites": "IP-të më poshtë do të përjashtohen nga ndjekja në krejt sajtet.",
"ListOfQueryParametersToBeExcludedOnAllWebsites": "Parametrat për URL-ra Kërkesash më poshtë do të përjashtohen nga URL-të për krejt sajtet.",
"ListOfQueryParametersToExclude": "Jepni listën e Parametrave për URL-ra Kërkesash, një për rresht, që duhen përjashtuar nga raportet për URL-ra Faqesh.",
"MainDescription": "Raportet tuaja Analizash Web lypin sajte! Shtoni, përditësoni, hiqni sajte, dhe shfaqni JavaScript-in për futje në faqet tuaja.",
+ "MenuManage": "Administroni",
"NotAnEcommerceSite": "Jo sajt E-tregtie",
"NotFound": "S’u gjetën sajte për",
"NoWebsites": "S’keni ndonjë sajt për ta administruar.",
- "OnlyOneSiteAtTime": "Mund të përpunoni vetëm një sajt në herë. Ju lutemt, Ruani ose Anuloni ndryshimet tuaja të tanishme te sajti %s.",
+ "OnlyOneSiteAtTime": "Mund të përpunoni vetëm një sajt në herë. Ju lutemi, Ruani ose Anuloni ndryshimet tuaja të tanishme te sajti %s.",
"PiwikOffersEcommerceAnalytics": "Piwik-u ju mundëson ndjekje & raportim të thelluar Analizash E-tregtie. Mësoni më tepër rreth %1$s Analizash E-tregtie%2$s.",
"PiwikWillAutomaticallyExcludeCommonSessionParameters": "Piwik-u do t’i përjashtojë vetvetiu parametrat e zakonshëm të sesioneve (%s).",
"PluginDescription": "Administrimi i sajteve ju lejon të shtoni sajt të ri dhe të përpunoni sajte ekzistues.",
- "SearchCategoryDesc": "Piwik-u mund të gjurmojë edhe kategorinë e Kërkimit për çdo fjalëkyç kërkimi të brendshëm në sajt.",
+ "SearchCategoryDesc": "Piwik-u mund të ndjekë edhe kategorinë e Kërkimit për çdo fjalëkyç kërkimi të brendshëm në sajt.",
"SearchCategoryLabel": "Parametër kategorie",
"SearchCategoryParametersDesc": "Mund të jepni një listë parametrash kërkesash që përcaktojnë kategori kërkimesh, ndarë me presje.",
"SearchKeywordLabel": "Parametër kërkese",
@@ -62,23 +64,24 @@
"SelectACity": "Përzgjidhni një qytet",
"SelectDefaultCurrency": "Mund të përzgjidhni monedhën parazgjedhje për sajtet e rinj.",
"SelectDefaultTimezone": "Mund të përzgjidhni zonën kohore parazgjedhje për sajtet e rinj.",
- "ShowTrackingTag": "Shihni kodin e Gjurmimit",
+ "ShowTrackingTag": "Shihni kodin e Ndjekjes",
"Sites": "Sajte",
- "SiteSearchUse": "Mund ta përdorni Piwik-un për të gjurmuar dhe raportuar se çfarë kërkojnë vizitorët me motorin e kërkimeve të brendshme në sajtin tuaj .",
+ "SiteSearchUse": "Mund ta përdorni Piwik-un për të ndjekur dhe raportuar se çfarë kërkojnë vizitorët me motorin e kërkimeve të brendshme në sajtin tuaj .",
"SiteWithoutDataTitle": "Ende s’ka të dhëna të regjistruara",
- "SiteWithoutDataDescription": "Për këtë sajt s’janë gjurmuar ende të dhëna analitike",
- "SiteWithoutDataSetupTracking": "Ju lutemi, rregulloni te sajti juaj %1$skod gjurmimi JavaScript%2$s, nëse s’e keni bërë tashmë.",
- "SiteWithoutDataMessageDisappears": "Ky mesazh do të zhduket sapo të ketë ndoca të dhëna të gjurmuara për këtë sajt.",
+ "SiteWithoutDataDescription": "Për këtë sajt s’janë ndjekur ende të dhëna analitike.",
+ "SiteWithoutDataSetupTracking": "Ju lutemi, rregulloni te sajti juaj %1$skodin e ndjekjeve JavaScript%2$s, nëse s’e keni bërë tashmë.",
+ "SiteWithoutDataMessageDisappears": "Ky mesazh do të zhduket sapo të ketë ndoca të dhëna të ndjekura për këtë sajt.",
"SiteWithoutDataSetupGoals": "Ndoshta mund të donit, ndërkohë, të %1$scaktoni ndonjë objektiv%2$s.",
"SuperUserAccessCan": "Një përdorues me hyrje Superpërdoruesi mundet gjithashtu %1$s të caktojë rregullime të përgjithshme%2$s për sajte të rinj.",
"Timezone": "Zonë kohore",
- "TrackingSiteSearch": "Gjurmim Kërkimesh Brenda Sajti",
- "TrackingTags": "Kod gjurmimi për %s",
+ "TrackingSiteSearch": "Ndjekje Kërkimesh Brenda Sajti",
+ "TrackingTags": "Kod ndjekjeje për %s",
"Urls": "URL-ra",
+ "Type": "Lloj",
"UTCTimeIs": "Koha UTC është %s.",
- "OnlyMatchedUrlsAllowed": "Gjurmo vizita dhe veprime vetëm kur URL-ja e veprimit fillon me një nga URL-të më sipër.",
- "OnlyMatchedUrlsAllowedHelp": "Në qoftë e aktivizuar, Piwik-u do të gjurmojë veprime të brendshme vetëm kur URL-ja e Faqes është një nga URL-të e njohura për sajtin tuaj. Kjo pengon shfrytëzimin e padëshiruar të analizave tuaja përmes URL-sh për sajte të tjerë.",
- "OnlyMatchedUrlsAllowedHelpExamples": "Përkatësia dhe shtegu duhet të përputhen saktësisht dhe çdo nënpërkatësi e vlefshme duhet të specifikohet veçmas. Për shembull. kur URL-të e ditura janë 'http:\/\/shembull.com\/shteg' dhe 'http:\/\/imirë.shembull.com', kërkesat për gjurmim të 'http:\/\/shembull.com\/shtegtjetër' ose 'http:\/\/ikeq.shembull.com' shpërfillen.",
+ "OnlyMatchedUrlsAllowed": "Ndiq vizita dhe veprime vetëm kur URL-ja e veprimit fillon me një nga URL-të më sipër.",
+ "OnlyMatchedUrlsAllowedHelp": "Në qoftë e aktivizuar, Piwik-u do të ndjekë veprime të brendshme vetëm kur URL-ja e Faqes është një nga URL-të e njohura për sajtin tuaj. Kjo pengon shfrytëzimin e padëshiruar të analizave tuaja përmes URL-sh për sajte të tjerë.",
+ "OnlyMatchedUrlsAllowedHelpExamples": "Përkatësia dhe shtegu duhet të përputhen saktësisht dhe çdo nënpërkatësi e vlefshme duhet të specifikohet veçmas. Për shembull. kur URL-të e ditura janë 'http:\/\/shembull.com\/shteg' dhe 'http:\/\/imirë.shembull.com', kërkesat për ndjekje të 'http:\/\/shembull.com\/shtegtjetër' ose 'http:\/\/ikeq.shembull.com' shpërfillen.",
"WebsitesManagement": "Administrim Sajtesh",
"XManagement": "Administroni %s",
"ChooseMeasurableTypeHeadline": "Ç’do të donit të matnit?",
diff --git a/plugins/SitesManager/lang/sr.json b/plugins/SitesManager/lang/sr.json
index 06529fa19c..7b13e8bc62 100644
--- a/plugins/SitesManager/lang/sr.json
+++ b/plugins/SitesManager/lang/sr.json
@@ -33,6 +33,7 @@
"GlobalListExcludedQueryParameters": "Globalna lista parametara za izuzeće",
"GlobalListExcludedUserAgents": "Globalna lista korisničkih agenata za izuzeće",
"GlobalListExcludedUserAgents_Desc": "Ukoliko naziv korisničkog agenta sadrži makar jednu od ovih reči, posetioc će biti isključen iz praćenja.",
+ "GlobalSettings": "Globalna podešavanja",
"GlobalWebsitesSettings": "Globalna podešavanja za sajtove",
"HelpExcludedIps": "Navedite listu IP adresa, jednu po liniji, koje želite da izuzmete iz Piwik analize. Možete koristiti i džokere poput %1$s i %2$s",
"JsTrackingTagHelp": "Ovo je JavaScript kod koji je potrebno da postavite na sve stranice vašeg sajta",
@@ -44,6 +45,7 @@
"ListOfQueryParametersToBeExcludedOnAllWebsites": "Sledeći parametri će biti izuzeti iz praćenja na svim sajtovima.",
"ListOfQueryParametersToExclude": "Navedite listu parametara, jedan po liniji, koje treba izuzeti iz izveštaja",
"MainDescription": "Potrebni su vam sajtovi da biste mogli da pratite izveštaje. Dodajte, izmenite ili uklonite sajtove, pogledajte JavaScript kod koji je potrebno postaviti na vaše stranice.",
+ "MenuManage": "Upravljanje",
"NotAnEcommerceSite": "Nije sajt za elektronske porudžbine",
"NotFound": "Nije nađen nijedan sajt za",
"NoWebsites": "Nemate nijedan sajt",
@@ -67,14 +69,19 @@
"SiteSearchUse": "Možete koristiti Piwik za praćenje i kreiranje izveštaja o tome šta posetioci traže na vašem sajtu koristeći polje za pretragu.",
"SiteWithoutDataTitle": "Nikakvi podaci do sad nisu zabeleženi",
"SiteWithoutDataDescription": "Još uvek nema analitičkih podataka za ova sajt.",
+ "SiteWithoutDataSetupTracking": "Molimo vas da postavite %1$sJavaScript kod za praćenje%2$s na vaš sajt ukoliko to već niste učinili.",
+ "SiteWithoutDataMessageDisappears": "Ova poruka će nestati čim se zabeleži neki saobraćaj na sajtu.",
+ "SiteWithoutDataSetupGoals": "U međuvremenu možete da %1$spostavite neke ciljeve %2$s.",
"SuperUserAccessCan": "Korisnik sa superkorisničkim nivoom pristupa može i da %1$spostavi globalna podešavanja%2$s za nove sajtove.",
"Timezone": "Vremenska zona",
"TrackingSiteSearch": "Praćenje pretraživanja sajta",
"TrackingTags": "Kod za praćenje za %s",
"Urls": "Adresa",
+ "Type": "Tip",
"UTCTimeIs": "UTC vreme je %s.",
"OnlyMatchedUrlsAllowed": "Prati posete i akcije samo kada URL akcije počinje sa nekom od sledećih adresa.",
"OnlyMatchedUrlsAllowedHelp": "Ukoliko uključite ovu opciju, Pivik će pratiti samo akcije koje imaju neke veze sa adresama vašeg sajta. Na taj način ćete sprečiti spemovanje vaše analitike adresama drugih sajtova.",
+ "OnlyMatchedUrlsAllowedHelpExamples": "Domen i putanja moraju da se poklapaju a svaki validan poddomen mora da bude naveden posebno. Na primer, ako su navedeni URL-ovi 'http:\/\/example.com\/path' i 'http:\/\/good.example.com', onda će zahtevi za 'http:\/\/example.com\/otherpath' i 'http:\/\/bad.example.com' biti ignorisani.",
"WebsitesManagement": "Upravljanje sajtovima",
"XManagement": "Upravljanje sa %s",
"ChooseMeasurableTypeHeadline": "Šta biste voleli da merite?",
diff --git a/plugins/TestRunner/Commands/GenerateTravisYmlFile.php b/plugins/TestRunner/Commands/GenerateTravisYmlFile.php
index a99c3ae4f0..dfb2d366cd 100644
--- a/plugins/TestRunner/Commands/GenerateTravisYmlFile.php
+++ b/plugins/TestRunner/Commands/GenerateTravisYmlFile.php
@@ -33,7 +33,7 @@ class GenerateTravisYmlFile extends ConsoleCommand
->addOption('artifacts-pass', null, InputOption::VALUE_REQUIRED,
"Password to the Piwik build artifacts server. Will be encrypted in the .travis.yml file.")
->addOption('github-token', null, InputOption::VALUE_REQUIRED,
- "Github token of a user w/ push access to this repository. Used to auto-commit updates to the "
+ "GitHub token of a user w/ push access to this repository. Used to auto-commit updates to the "
. ".travis.yml file and checkout dependencies. Will be encrypted in the .travis.yml file.\n\n"
. "If not supplied, the .travis.yml will fail the build if it needs updating.")
->addOption('php-versions', null, InputOption::VALUE_OPTIONAL,
@@ -70,4 +70,4 @@ class GenerateTravisYmlFile extends ConsoleCommand
return $returnCode;
}
-} \ No newline at end of file
+}
diff --git a/plugins/Transitions/lang/cs.json b/plugins/Transitions/lang/cs.json
index 3f23cbf3ab..06db321f77 100644
--- a/plugins/Transitions/lang/cs.json
+++ b/plugins/Transitions/lang/cs.json
@@ -4,6 +4,9 @@
"DirectEntries": "Přímé záznamy",
"ErrorBack": "Přejít k předchozí akci",
"ExitsInline": "%s východy",
+ "NumPageviews": "%s zobrazení",
+ "NumDownloads": "%s stažení",
+ "NumOutlinks": "%s externích odkazů",
"FromCampaigns": "Z kampaní",
"FromPreviousPages": "Z interních stránek",
"FromPreviousPagesInline": "%s z interních stránek",
diff --git a/plugins/Transitions/lang/de.json b/plugins/Transitions/lang/de.json
index a14d88fd16..9a8d3cf3c7 100644
--- a/plugins/Transitions/lang/de.json
+++ b/plugins/Transitions/lang/de.json
@@ -4,6 +4,9 @@
"DirectEntries": "Direkte Eingaben",
"ErrorBack": "Gehe zurück zur letzten Aktion",
"ExitsInline": "%s Ausstiege",
+ "NumPageviews": "%s Seitenansichten",
+ "NumDownloads": "%s Downloads",
+ "NumOutlinks": "%s ausgehende Verweise",
"FromCampaigns": "Von Kampagnen",
"FromPreviousPages": "Von internen Seiten",
"FromPreviousPagesInline": "%s von internen Seiten",
diff --git a/plugins/Transitions/lang/el.json b/plugins/Transitions/lang/el.json
index f30597667d..c076368416 100644
--- a/plugins/Transitions/lang/el.json
+++ b/plugins/Transitions/lang/el.json
@@ -4,6 +4,9 @@
"DirectEntries": "Άμεσες Εισαγωγές",
"ErrorBack": "Μετάβαση στην προηγούμενη ενέργεια",
"ExitsInline": "%s έξοδοι",
+ "NumPageviews": "%s προβολές σελίδων",
+ "NumDownloads": "%s λήψεις",
+ "NumOutlinks": "%s σύνδεσμοι προς εξωτερικό",
"FromCampaigns": "Από Εκστρατείες",
"FromPreviousPages": "Από Εσωτερικές Σελίδες",
"FromPreviousPagesInline": "%s από εσωτερικές σελίδες",
diff --git a/plugins/Transitions/lang/es.json b/plugins/Transitions/lang/es.json
index c8c2722c3e..a4df085a46 100644
--- a/plugins/Transitions/lang/es.json
+++ b/plugins/Transitions/lang/es.json
@@ -4,6 +4,9 @@
"DirectEntries": "Ingresos directos",
"ErrorBack": "Regresar a la acción anterior",
"ExitsInline": "%s salidas",
+ "NumPageviews": "%s páginas visitadas",
+ "NumDownloads": "%s descargas",
+ "NumOutlinks": "%s enlaces salientes",
"FromCampaigns": "Desde campañas",
"FromPreviousPages": "Desde páginas internas",
"FromPreviousPagesInline": "%s desde páginas internas",
diff --git a/plugins/Transitions/lang/fr.json b/plugins/Transitions/lang/fr.json
index 40144865d8..18f96b15aa 100644
--- a/plugins/Transitions/lang/fr.json
+++ b/plugins/Transitions/lang/fr.json
@@ -4,6 +4,9 @@
"DirectEntries": "Entrées directes",
"ErrorBack": "Retour à l'action précédente",
"ExitsInline": "%s sorties",
+ "NumPageviews": "%s pages vues",
+ "NumDownloads": "%s téléchargements",
+ "NumOutlinks": "%s liens sortant",
"FromCampaigns": "Depuis les campagnes",
"FromPreviousPages": "Depuis des pages internes",
"FromPreviousPagesInline": "%s depuis des pages internes",
diff --git a/plugins/Transitions/lang/it.json b/plugins/Transitions/lang/it.json
index 258c954172..e663181d83 100644
--- a/plugins/Transitions/lang/it.json
+++ b/plugins/Transitions/lang/it.json
@@ -4,6 +4,9 @@
"DirectEntries": "Accessi Diretti",
"ErrorBack": "Torna all'azione precedente",
"ExitsInline": "%s uscite",
+ "NumPageviews": "%s pagine viste",
+ "NumDownloads": "%s download",
+ "NumOutlinks": "%s outlinks",
"FromCampaigns": "Da Campagne",
"FromPreviousPages": "Da Pagine Interne",
"FromPreviousPagesInline": "%s da pagine interne",
diff --git a/plugins/Transitions/lang/pt-br.json b/plugins/Transitions/lang/pt-br.json
index 1337a9abf9..a2b952ade2 100644
--- a/plugins/Transitions/lang/pt-br.json
+++ b/plugins/Transitions/lang/pt-br.json
@@ -4,6 +4,9 @@
"DirectEntries": "Entradas diretas",
"ErrorBack": "Voltar para a ação anterior",
"ExitsInline": "%s saídas",
+ "NumPageviews": "%s exibições de página",
+ "NumDownloads": "%s baixados",
+ "NumOutlinks": "%s links externos",
"FromCampaigns": "De campanhas",
"FromPreviousPages": "De Páginas internas",
"FromPreviousPagesInline": "%s de páginas internas",
diff --git a/plugins/Transitions/lang/sq.json b/plugins/Transitions/lang/sq.json
index c634ea624a..aac7e132e1 100644
--- a/plugins/Transitions/lang/sq.json
+++ b/plugins/Transitions/lang/sq.json
@@ -1,14 +1,31 @@
{
"Transitions": {
"BouncesInline": "%s kthime",
+ "DirectEntries": "Hyrje të Drejtpërdrejta",
"ErrorBack": "Kthehu te veprimi i mëparshëm",
"ExitsInline": "%s largime",
+ "NumPageviews": "%s parje faqesh",
+ "NumDownloads": "%s shkarkime",
+ "NumOutlinks": "%s lidhje për jashtë",
"FromCampaigns": "Prej Fushatash",
"FromPreviousPages": "Prej Faqesh të Brendshme",
"FromPreviousPagesInline": "%s prej faqesh të brendshme",
"FromPreviousSiteSearches": "Prej Kërkimesh të Brendshme",
+ "FromPreviousSiteSearchesInline": "%s prej kërkimesh të brendshme",
"FromSearchEngines": "Prej Motorë Kërkimesh",
"FromWebsites": "Prej Sajtesh",
- "IncomingTraffic": "Trafik ardhës"
+ "IncomingTraffic": "Trafik ardhës",
+ "LoopsInline": "%s ringarkime faqesh",
+ "NoDataForAction": "S’ka të dhëna për %s",
+ "NoDataForActionDetails": "Ose veprimi nuk ka parje faqesh gjatë periudhës %s, ose është i pavlefshëm.",
+ "OutgoingTraffic": "Trafik ikës",
+ "PluginDescription": "Raporton, në një raport të ri Tranzicionesh, veprime të mëparshme dhe në vijim për çdo URL faqeje, i passhëm te raportet mbi Veprimet përmes një ikone të re.",
+ "ShareOfAllPageviews": "Kjo faqe pati %1$s parje faqesh (%2$s e krejt parjeve të faqeve)",
+ "ToFollowingPages": "Te Faqe të Brendshme",
+ "ToFollowingPagesInline": "%s te faqe të brendshme",
+ "ToFollowingSiteSearches": "Kërkime të Brendshme",
+ "ToFollowingSiteSearchesInline": "%s kërkime të brendshme",
+ "XOfAllPageviews": "%s e krejt parjeve të kësaj faqeje",
+ "XOutOfYVisits": "%1$s (nga %2$s gjithsej)"
}
} \ No newline at end of file
diff --git a/plugins/Transitions/lang/sr.json b/plugins/Transitions/lang/sr.json
index e5f227c4b1..8accabc7e8 100644
--- a/plugins/Transitions/lang/sr.json
+++ b/plugins/Transitions/lang/sr.json
@@ -4,6 +4,9 @@
"DirectEntries": "Direktni ulasci",
"ErrorBack": "Vrati se na prethodnu akciju",
"ExitsInline": "%s izlaza",
+ "NumPageviews": "%s prikaza stranica",
+ "NumDownloads": "%s preuzimanja",
+ "NumOutlinks": "%s izlaznih linkova",
"FromCampaigns": "Iz kampanja",
"FromPreviousPages": "Od internih stranica",
"FromPreviousPagesInline": "%s sa internih strana",
diff --git a/plugins/UserCountry/lang/cs.json b/plugins/UserCountry/lang/cs.json
index 1cb446b3c0..6b493e14d0 100644
--- a/plugins/UserCountry/lang/cs.json
+++ b/plugins/UserCountry/lang/cs.json
@@ -94,5 +94,8 @@
"UpdaterWasLastRun": "Aktualizátor byl naposledy spuštěn v %s.",
"UpdaterWillRunNext": "Další spuštění je naplánováno na %s.",
"WidgetLocation": "Umístění návštěvníka"
+ },
+ "Intl": {
+ "Country_TI": "Tibet"
}
} \ No newline at end of file
diff --git a/plugins/UserCountry/lang/da.json b/plugins/UserCountry/lang/da.json
index 4f45a6045f..a6bffe4c11 100644
--- a/plugins/UserCountry/lang/da.json
+++ b/plugins/UserCountry/lang/da.json
@@ -94,5 +94,8 @@
"UpdaterWasLastRun": "Opdateringen blev sidst blev kørt den %s.",
"UpdaterWillRunNext": "Næste planlagte kørsel %s.",
"WidgetLocation": "Besøgendes lokation"
+ },
+ "Intl": {
+ "Country_TI": "Tibet"
}
} \ No newline at end of file
diff --git a/plugins/UserCountry/lang/de.json b/plugins/UserCountry/lang/de.json
index f05987dbb8..66a1ec0458 100644
--- a/plugins/UserCountry/lang/de.json
+++ b/plugins/UserCountry/lang/de.json
@@ -94,5 +94,8 @@
"UpdaterWasLastRun": "Die Aktualisierung wurde zuletzt ausgeführt am %s.",
"UpdaterWillRunNext": "Nächste Ausführung geplant für %s.",
"WidgetLocation": "Besucherstandort"
+ },
+ "Intl": {
+ "Country_TI": "Tibet"
}
} \ No newline at end of file
diff --git a/plugins/UserCountry/lang/el.json b/plugins/UserCountry/lang/el.json
index 5572e74b9f..ae15673e31 100644
--- a/plugins/UserCountry/lang/el.json
+++ b/plugins/UserCountry/lang/el.json
@@ -94,5 +94,8 @@
"UpdaterWasLastRun": "Το πρόγραμμα ενημέρωσης εκτελέστηκε τελευταία στις %s.",
"UpdaterWillRunNext": "Είναι προγραμματισμένο για εκτέλεση στις %s.",
"WidgetLocation": "Τοποθεσία Επισκέπτη"
+ },
+ "Intl": {
+ "Country_TI": "Θιβέτ"
}
} \ No newline at end of file
diff --git a/plugins/UserCountry/lang/es.json b/plugins/UserCountry/lang/es.json
index 128812867c..1d1855be8f 100644
--- a/plugins/UserCountry/lang/es.json
+++ b/plugins/UserCountry/lang/es.json
@@ -94,5 +94,8 @@
"UpdaterWasLastRun": "El actualizador se ejecutó por última vez en %s.",
"UpdaterWillRunNext": "Está programada la ejecución para el %s.",
"WidgetLocation": "Ubicación del visitante"
+ },
+ "Intl": {
+ "Country_TI": "Tíbet"
}
} \ No newline at end of file
diff --git a/plugins/UserCountry/lang/fr.json b/plugins/UserCountry/lang/fr.json
index edcc4274b8..bc6f551059 100644
--- a/plugins/UserCountry/lang/fr.json
+++ b/plugins/UserCountry/lang/fr.json
@@ -94,5 +94,8 @@
"UpdaterWasLastRun": "La dernière mise à jour a été effectuée le %s.",
"UpdaterWillRunNext": "Est planifié pour s'exécuter le %s.",
"WidgetLocation": "Emplacement du visiteur"
+ },
+ "Intl": {
+ "Country_TI": "Tibet"
}
} \ No newline at end of file
diff --git a/plugins/UserCountry/lang/it.json b/plugins/UserCountry/lang/it.json
index 46c3e44206..50c957751b 100644
--- a/plugins/UserCountry/lang/it.json
+++ b/plugins/UserCountry/lang/it.json
@@ -94,5 +94,8 @@
"UpdaterWasLastRun": "Il programma di aggiornamento è stato eseguito per l'ultima volta il %s.",
"UpdaterWillRunNext": "È programmato per essere eseguito il %s.",
"WidgetLocation": "Posizione Visitatore"
+ },
+ "Intl": {
+ "Country_TI": "Tibet"
}
} \ No newline at end of file
diff --git a/plugins/UserCountry/lang/ko.json b/plugins/UserCountry/lang/ko.json
index 0ef8232311..7d4a215095 100644
--- a/plugins/UserCountry/lang/ko.json
+++ b/plugins/UserCountry/lang/ko.json
@@ -94,5 +94,8 @@
"UpdaterWasLastRun": "%s에 마지막 업데이트 확인",
"UpdaterWillRunNext": "%s에 실행이 계획되어 있습니다.",
"WidgetLocation": "방문자 위치"
+ },
+ "Intl": {
+ "Country_TI": "티베트"
}
} \ No newline at end of file
diff --git a/plugins/UserCountry/lang/pt-br.json b/plugins/UserCountry/lang/pt-br.json
index 10b8452b7d..224ddc906f 100644
--- a/plugins/UserCountry/lang/pt-br.json
+++ b/plugins/UserCountry/lang/pt-br.json
@@ -94,5 +94,8 @@
"UpdaterWasLastRun": "O atualizador foi executado pela última vez em %s.",
"UpdaterWillRunNext": "A próxima execução está programada para ser executada em %s.",
"WidgetLocation": "Localização dos visitantes"
+ },
+ "Intl": {
+ "Country_TI": "Tibet"
}
} \ No newline at end of file
diff --git a/plugins/UserCountry/lang/sq.json b/plugins/UserCountry/lang/sq.json
index 162318efa0..708c0c4fd2 100644
--- a/plugins/UserCountry/lang/sq.json
+++ b/plugins/UserCountry/lang/sq.json
@@ -1,34 +1,101 @@
{
"UserCountry": {
"AssumingNonApache": "S’gjendet dot funksioni apache_get_modules function, po merret i mirëqenë si shërbyes non-Apache.",
+ "CannotFindGeoIPDatabaseInArchive": "S’gjendet dot kartela %1$s në arkivin tar %2$s!",
+ "CannotFindGeoIPServerVar": "Ndryshorja %s s’është rregulluar. Shërbyesi juaj mund të mos jetë formësuar si duhet.",
+ "CannotFindPeclGeoIPDb": "S’u gjet dot bazë të dhënash vendesh, rajonesh apo qytetesh për modulin GeoIP PECL. Sigurohuni që baza juaj e të dhënave GeoIP gjendet te %1$s dhe është emërtuar %2$s ose %3$s, përndryshe moduli PECL nuk do ta vërë re.",
+ "CannotListContent": "S’paraqet dot lëndën për %1$s: %2$s",
+ "CannotLocalizeLocalIP": "Adresa IP %s është një adresë vendore dhe s’gjeolokalizohet dot.",
+ "CannotSetupGeoIPAutoUpdating": "Duket se bazat tuaja të të dhënave GeoIP i depozitoni jashtë Piwik-ut (e dimë ngaqë s’ka baza të dhënash te nëndrejtoria misc, por GeoIP-ja juaj funksionon). Piwik-u s’i përditëson dot vetvetiu bazat tuaja të të dhënave GeoIP, nëse gjenden jashtë drejtorisë misc.",
+ "CannotUnzipDatFile": "S’çzipoi dot kartelën dat te %1$s: %2$s",
"City": "Qytet",
"CityAndCountry": "%1$s, %2$s",
"Continent": "Kontinent",
"Country": "Vend",
"country_a1": "Ndërmjetës Anonim",
- "country_a2": "Mundësues Satelitor",
+ "country_a2": "Furnizues Satelitor",
"country_cat": "Bashkësi që flasin Katalançe",
"country_o1": "Vend Tjetër",
"country_ti": "Tibet",
- "CurrentLocationIntro": "Sipas këtij mundësuesi, vendi juaj i tanishëm është",
+ "CurrentLocationIntro": "Sipas këtij furnizuesi, gjendeni në",
+ "DefaultLocationProviderDesc1": "Furnizuesi parazgjedhje i vendeve e hamendëson vendin e një vizitori bazuar në gjuhën e përdorur prej tyre.",
+ "DefaultLocationProviderDesc2": "Kjo s’është shumë e saktë, ndaj %1$skëshillojmë instalimin dhe përdorimin e %2$sGeoIP%3$s.%4$s",
+ "DefaultLocationProviderExplanation": "Po përdorni furnizuesin parazgjedhje të vendeve, që do të thotë se Piwik do ta hamendësojë vendin e vizitorit bazuar në gjuhën që ky përdor. %1$sLexoni këtë%2$s që të mësoni se si të rregulloni gjeovendëzim më të saktë.",
"DistinctCountries": "%s vende ndaras",
"DownloadingDb": "Po shkarkohet %s",
+ "DownloadNewDatabasesEvery": "Përditësoji bazat e të dhënave çdo",
+ "FatalErrorDuringDownload": "Ndodhi një gabim fatal teksa shkarkohej kjo kartelë. Mund të ketë diçka gabim me lidhjen tuaj internet, me bazën tuaj të të dhënave GeoIP që shkarkuat ose me Piwik-un. Provoni ta shkarkoni dhe instaloni dorazi.",
+ "FoundApacheModules": "Piwik-u gjeti modulet Apache vijues",
"FromDifferentCities": "qytete të ndryshme",
+ "GeoIPCannotFindMbstringExtension": "S’gjendet dot funksioni %1$s. Ju lutemi, sigurohuni që zgjerimi %2$s është i instaluar dhe i ngarkuar.",
"GeoIPDatabases": "Baza të dhënash GeoIP",
- "GeoIpLocationProviderNotRecomnended": "Gjeovendëzimi funksionon, por nuk po përdorni një nga mundësuesit e këshilluar.",
+ "GeoIPDocumentationSuffix": "Që të mund të shihni të dhëna për këtë raport, duhet të rregulloni GeoIP-në te skeda e përgjegjësit për Gjeovendëzimin. Bazat komerciale të të dhënave GeoIP %1$sMaxmind%2$s janë më të sakta se sa ato falas. Që të shihni se sa të sakta janë, klikoni %3$skëtu%4$s.",
+ "GeoIPImplHasAccessTo": "Ky sendërtim i GeoIP-së mund të përdorë llojet vijuese të bazave të të dhënave",
+ "GeoIPIncorrectDatabaseFormat": "Baza juaj e të dhënave GeoIP nuk duket se është në formatin e duhur. Mund të jetë e dëmtuar. Sigurohuni se po përdorni versionin dyor dhe provoni ta zëvendësoni me një kopje tjetër.",
+ "GeoIpLocationProviderDesc_Pecl1": "Ky furnizues vendesh përdor një bazë të dhënash GeoIP dhe një modul PECL për të përcaktuar me saktësi dhe efikasitet vendin e vizitorëve tuaj.",
+ "GeoIpLocationProviderDesc_Pecl2": "Me këtë furnizues s’ka kufizime, ndaj është ai që këshillojmë të përdoret.",
+ "GeoIpLocationProviderDesc_Php1": "Ky furnizues vendesh është më i thjeshti për t’u instaluar, ngaqë nuk lyp formësim shërbyesish (ideal për strehim të përbashkët!). Përdor një bazë të dhënash GeoIP dhe API-n PHP të MaxMind-it, për të përcaktuar saktë vendin e vizitorëve tuaj.",
+ "GeoIpLocationProviderDesc_Php2": "Nëse sajti juaj ka shumë trafik, mund të shihni se ky furnizues vendesh është shumë i ngadaltë. Në këtë rast, do të duhej të instaloni %1$szgjerimin PECL%2$s ose një %3$smodul shërbyesi%4$s.",
+ "GeoIpLocationProviderDesc_ServerBased1": "Ky furnizues vendesh përdor modulin GeoIP që është instaluar në shërbyesin tuaj HTTP. Ky furnizues është i shpejtë dhe i saktë, por %1$smund të përdoret vetëm me ndjekje normale shfletuesi.%2$s",
+ "GeoIpLocationProviderDesc_ServerBased2": "Nëse keni për të importuar kartela regjistër ose ju duhet të bëni diçka tjetër që lyp caktim adresash IP, përdorni %1$ssendërtimin GeoIP PECL (e këshilluar)%2$s ose %3$ssendërtimin GeoIP PHP%4$s.",
+ "GeoIpLocationProviderDesc_ServerBasedAnonWarn": "Shënime: Anonimizimi i IP-ve nuk ka efekt për vendet e raportuara nga ky furnizues. Përpara se ta ta përdorni me anonimizim IP-sh, sigurohuni që kjo nuk cenon ndonjë ligj privatësie subjekt i të cilit mund të jeni.",
+ "GeoIpLocationProviderNotRecomnended": "Gjeovendëzimi funksionon, por nuk po përdorni një nga furnizuesit e këshilluar.",
+ "GeoIPNoServerVars": "Piwik-u s’gjen dot ndryshore GeoIP %s.",
+ "GeoIPPeclCustomDirNotSet": "S’është caktuar mundësia %s PHP ini.",
+ "GeoIPServerVarsFound": "Piwik-u kap ndryshoret vijuese GeoIP %s",
+ "GeoIPUpdaterInstructions": "Jepni më poshtë lidhjet e shkarkimeve për bazat tuaja të të dhënave. Nëse keni blerë baza të dhënash nga %3$sMaxMind%4$s, këto lidhje mund t’i gjeni %1$skëtu%2$s. Ju lutemi, lidhuni me %3$sMaxMind%4$s, nëse keni probleme me hyrjen në to.",
+ "GeoIPUpdaterIntro": "Piwik-u po administron përditësime për bazat vijuese të të dhënave GeoIP",
+ "GeoLiteCityLink": "Nëse përdorni bazën e të dhënave GeoLite City, përdorni këtë lidhje: %1$s%2$s%3$s",
"Geolocation": "Gjeovendëzim",
"GeolocationPageDesc": "Në këtë faqe mund të ndryshoni mënyrën se si përcakton Piwik-u vendndodhjet e vizitorëve.",
+ "getCityDocumentation": "Ky raport shfaq qytetet ku gjendeshin vizitorët tuaj kur përdorën sajtin tuaj.",
+ "getContinentDocumentation": "Ky raport shfaq kontinentet ku gjendeshin vizitorët tuaj kur përdorën sajtin tuaj.",
+ "getCountryDocumentation": "Ky raport shfaq vendet ku gjendeshin vizitorët tuaj kur përdorën sajtin tuaj.",
+ "getRegionDocumentation": "Ky raport shfaq rajonet ku gjendeshin vizitorët tuaj kur përdorën sajtin tuaj.",
+ "HowToInstallApacheModule": "Si ta instaloj modulin GeoIP për Apache?",
+ "HowToInstallGeoIPDatabases": "Si t’i marr bazat e të dhënave GeoIP?",
"HowToInstallGeoIpPecl": "Si ta instaloj zgjerimin GeoIP PECL?",
+ "HowToInstallNginxModule": "Si ta instaloj modulin GeoIP për Nginx?",
+ "HowToSetupGeoIP": "Si të rregullohet gjeovendëzim i saktë me GeoIP?",
+ "HowToSetupGeoIP_Step1": "%1$sShkarkoni%2$s bazën e të dhënave GeoLite City prej %3$sMaxMind%4$s.",
+ "HowToSetupGeoIP_Step2": "Përftojeni këtë kartelë dhe kopjojeni përfundimin, %1$s te nëndrejtoria %2$smisc%3$s e Piwik-ut (këtë mund ta bëni me FTP ose SSH).",
+ "HowToSetupGeoIP_Step3": "Ringarkoni këtë skenë. Furnizuesi %1$sGeoIP (PHP)%2$s tani do të jetë %3$sinstaluar%4$s. Përzgjidheni.",
+ "HowToSetupGeoIP_Step4": "Dhe mbaruat! Sapo e rregulluat Piwik-un të përdorë GeoIP, që do të thotë se do të jeni në gjendje të shihni rajonet dhe qytetet e vizitorëve tuaj, tok me të dhëna shumë të sakta të vendit.",
+ "HowToSetupGeoIPIntro": "Nuk duket se keni rregulluar Gjeovendëzim të saktë. Kjo është një veçori e dobishme dhe pa të nuk do të shihni të dhëna të sakta dhe të plota vendesh për vizitorët tuaj. Ja se si mund të filloni ta përdorni shpejt e shpejt:",
"HttpServerModule": "Modul Shërbyesi HTTP",
+ "InvalidGeoIPUpdatePeriod": "Periudhë e pavlefshme për përditësuesin GeoIP: %1$s. Vlera të vlefshme janë %2$s.",
+ "IPurchasedGeoIPDBs": "Kam blerë %1$sbaza të dhënash më të sakta nga MaxMind%2$s dhe dua të rregulloj përditësime të vetvetishme.",
"ISPDatabase": "Bazë të Dhënash MShI",
+ "IWantToDownloadFreeGeoIP": "Dua të shkarkoj bazën e lirë të të dhënave GeoIP…",
+ "Latitude": "Gjerësi gjeografike",
"Location": "Vend",
- "LocationProvider": "Furnizues Vendndodhjesh",
+ "LocationDatabase": "Bazë të dhënash Vendi",
+ "LocationDatabaseHint": "Një bazë të dhënash vendi është bazë të dhënash vendesh, rajonesh ose qytetesh.",
+ "LocationProvider": "Furnizues Vendesh",
+ "Longitude": "Gjatësi gjeografike",
+ "NoDataForGeoIPReport1": "S’ka të dhëna për këtë raport, ngaqë s’ka të dhëna vendesh ose adresat IP të vizitorëve s’gjeovendëzohen dot.",
+ "NoDataForGeoIPReport2": "Që të aktivizoni gjeovendëzim të saktë, ndryshoni rregullimet %1$skëtu%2$s dhe përdorni një %3$sbazë të dhënash në nivel qytetesh%4$s.",
"Organization": "Organizëm",
"OrgDatabase": "Bazë të dhënash Organizmi",
+ "PeclGeoIPNoDBDir": "Moduli PECL po kërkon për baza të dhënash te %1$s, por kjo drejtori nuk ekziston. Ju lutemi, krijojeni dhe shtoni në të baza të dhënash GeoIP. Përndryshe, mund të caktoni për %2$s drejtorinë e saktë te kartela juaj php.ini.",
+ "PeclGeoLiteError": "Baza juaj e të dhënave GeoIP te %1$s është emërtuar %2$s. Për fat të keq, moduli PECL nuk do ta njohë me këtë emër. Ju lutemi, riemërtojeni si %3$s.",
+ "PiwikNotManagingGeoIPDBs": "Piwik-u hëpërhë s’administron ndonjë bazë të dhënash GeoIP.",
+ "PluginDescription": "Raporton vendndodhjen e vizitorëve tuaj: vend, rajon, qytet dhe koordinata gjeografike (gjerësi gjeografike\/gjatësi gjeografike).",
"Region": "Rajon",
+ "SetupAutomaticUpdatesOfGeoIP": "Rregulloni përditësime të vetvetishme të bazave të të dhënave GeoIP",
"SubmenuLocations": "Vende",
+ "TestIPLocatorFailed": "Piwik-u provoi të kontrollojë vendin e një adrese të njohur IP (%1$s), por shërbyesi juaj u përgjigj me %2$s. Nëse ky furnizues është formësuar si duhet, duhej të përgjigjej me %3$s.",
+ "ThisUrlIsNotAValidGeoIPDB": "Kartela e shkarkuar s’është bazë të dhënash GeoIP e vlefshme. Ju lutemi, rikontrolloni URL-në ose shkarkojeni kartelën dorazi.",
+ "ToGeolocateOldVisits": "Që të kini të dhëna vendesh për vizitat tuaja të vjetra, përdorni programthin e përshkruar %1$skëtu%2$s.",
+ "UnsupportedArchiveType": "U has lloj i pambuluar arkivi %1$s.",
"UpdaterHasNotBeenRun": "Përditësuesi s’është xhiruar ndonjëherë.",
"UpdaterIsNotScheduledToRun": "S’është vënë në plan të xhirohet në të ardhmen.",
- "WidgetLocation": "Vendndodhje Vizitori"
+ "UpdaterScheduledForNextRun": "Është vënë në plan të xhirojë gjatë përmbushjes së ardhshme të urdhrit cron core:archive.",
+ "UpdaterWasLastRun": "Përditësuesi u xhirua së fundi më %s.",
+ "UpdaterWillRunNext": "Është planifikuar të xhirojë sërish më %s.",
+ "WidgetLocation": "Vend Vizitori"
+ },
+ "Intl": {
+ "Country_TI": "Tibet"
}
} \ No newline at end of file
diff --git a/plugins/UserCountry/lang/sr.json b/plugins/UserCountry/lang/sr.json
index 679e14cf22..e91c2ca2f1 100644
--- a/plugins/UserCountry/lang/sr.json
+++ b/plugins/UserCountry/lang/sr.json
@@ -94,5 +94,8 @@
"UpdaterWasLastRun": "Poslednja provera je izvršena %s.",
"UpdaterWillRunNext": "Sledeće izvršenje je zakazano za %s.",
"WidgetLocation": "Lokacija posetioca"
+ },
+ "Intl": {
+ "Country_TI": "Tibet"
}
} \ No newline at end of file
diff --git a/plugins/UserCountryMap/lang/da.json b/plugins/UserCountryMap/lang/da.json
index 516085af7f..0296b42a48 100644
--- a/plugins/UserCountryMap/lang/da.json
+++ b/plugins/UserCountryMap/lang/da.json
@@ -1,5 +1,6 @@
{
"UserCountryMap": {
+ "PluginDescription": "Denne udvidelse leverer de to widgets Besøgerkort og Real-tid kort. Bemærk: Kræver at BrugerLand udvidelsen er aktiveret.",
"AndNOthers": "og %s andre",
"Cities": "Byer",
"Countries": "Lande",
diff --git a/plugins/UserCountryMap/lang/sq.json b/plugins/UserCountryMap/lang/sq.json
index a5d35eb293..f6a1249dec 100644
--- a/plugins/UserCountryMap/lang/sq.json
+++ b/plugins/UserCountryMap/lang/sq.json
@@ -1,9 +1,11 @@
{
"UserCountryMap": {
+ "PluginDescription": "Kjo shtojcë ofron widget-et Hartë Vizitorësh dhe Hartë Në Kohë Reale. Shënim: Lyp shtojcën UserCountry të aktivizuar.",
"AndNOthers": "dhe %s të tjerë",
"Cities": "Qytete",
"Countries": "Vende",
"DaysAgo": "%s ditë më parë",
+ "GoalConversions": "%s shndërrime objektivash",
"HoursAgo": "%s orë më parë",
"map": "hartë",
"MinutesAgo": "%s minuta më parë",
@@ -11,7 +13,13 @@
"NoVisit": "Pa vizita",
"RealTimeMap": "Hartë e Atypëratyshme",
"Regions": "Rajone",
+ "Searches": "%s kërkime",
"SecondsAgo": "%s sekonda më parë",
- "VisitorMap": "Hartë Vizitorësh"
+ "ShowingVisits": "Vizita të gjeovendëzuara, për pjesën e fundit të",
+ "Unlocated": "<b>%s<\/b> %p e vizitës prej %c s’u gjeovendëzua dot.",
+ "VisitorMap": "Hartë Vizitorësh",
+ "WorldWide": "Anembanë Botës",
+ "WithUnknownRegion": "%s me rajon të panjohur",
+ "WithUnknownCity": "%s me qytet të panjohur"
}
} \ No newline at end of file
diff --git a/plugins/UserId/lang/sq.json b/plugins/UserId/lang/sq.json
index 2c8c14380c..0ba6d31f39 100644
--- a/plugins/UserId/lang/sq.json
+++ b/plugins/UserId/lang/sq.json
@@ -1,5 +1,7 @@
{
"UserId": {
- "UserReportTitle": "Përdorues"
+ "UserId": "ID përdoruesi",
+ "UserReportTitle": "Përdorues",
+ "PluginDescription": "Shfaq raporte përdoruesi"
}
} \ No newline at end of file
diff --git a/plugins/UserId/lang/sr.json b/plugins/UserId/lang/sr.json
index 9f34d4a7cb..d555080267 100644
--- a/plugins/UserId/lang/sr.json
+++ b/plugins/UserId/lang/sr.json
@@ -1,5 +1,7 @@
{
"UserId": {
- "UserReportTitle": "Korisnici"
+ "UserId": "Korisnik",
+ "UserReportTitle": "Korisnici",
+ "PluginDescription": "Prikazuje izveštaj po korisniku"
}
} \ No newline at end of file
diff --git a/plugins/UserLanguage/lang/sq.json b/plugins/UserLanguage/lang/sq.json
index 83ee7ab2d1..44cda016bb 100644
--- a/plugins/UserLanguage/lang/sq.json
+++ b/plugins/UserLanguage/lang/sq.json
@@ -1,7 +1,7 @@
{
"UserLanguage": {
"BrowserLanguage": "Gjuhë shfletuesi",
- "LanguageCode": "Kod Gjuhe",
+ "LanguageCode": "Kod gjuhe",
"PluginDescription": "Raporton gjuhën e përdorur nga shfletuesit e vizitorëve tuaj."
}
} \ No newline at end of file
diff --git a/plugins/UsersManager/lang/cs.json b/plugins/UsersManager/lang/cs.json
index 9fdb38e570..314db261a6 100644
--- a/plugins/UsersManager/lang/cs.json
+++ b/plugins/UsersManager/lang/cs.json
@@ -16,14 +16,14 @@
"ConfirmProhibitOtherUsersSuperUserAccess": "Opravdu chcete odstranit super-uživatelský přístup pro '%s'? Tento uživatel přijde o všechna práva a o přístup ke všem stránkám. Nezapomeňte mu poté povolit přístup k těm které potřebuje, je-li to nutné.",
"DeleteConfirm": "Jste si jistí, že chcete vymazat uživatele %s?",
"Email": "E-mail",
- "EmailYourAdministrator": "%1$sPošlete administrátorovi e-mail o tomto problému%2$s.",
- "EnterUsernameOrEmail": "Zadejte uživatelské jméno nebo e-mailovou adresu",
+ "EmailYourAdministrator": "%1$sPošlete administrátorovi email o tomto problému%2$s.",
+ "EnterUsernameOrEmail": "Zadejte uživatelské jméno nebo emailovou adresu",
"ExceptionAccessValues": "Parametr přístupu musí mít jednu z následujících hodnot: [ %s ]",
"ExceptionAdminAnonymous": "Nemůžete dát 'admin' přístup 'anonymous' uživateli.",
"ExceptionDeleteDoesNotExist": "Uživatel '%s' neexistuje a proto nemůže být vymazán.",
"ExceptionDeleteOnlyUserWithSuperUserAccess": "Smazání uživatele %s není možné.",
"ExceptionEditAnonymous": "'Anonymous' uživatel nemůže být upraven, nebo vymazán. Je použit Piwikem k definici uživatele, který ještě není přihlášen. Například můžete zveřejnit vaše statistiky udělením oprávnění 'view' uživateli 'anonymous'.",
- "ExceptionEmailExists": "Uživatel s e-mailem '%s' již existuje.",
+ "ExceptionEmailExists": "Uživatel s emailem '%s' již existuje.",
"ExceptionInvalidEmail": "E-mail nemá platný formát.",
"ExceptionInvalidLoginFormat": "Uživatelské jméno musí být v rozmezí %1$s až %2$s znaků a obsahovat pouze písmena, čísla, či následující znaky '_' '-' '.' '@' '+'",
"ExceptionInvalidPassword": "Délka hesla msí být větší, než %1$s znaků.",
@@ -34,12 +34,12 @@
"ExceptionUserDoesNotExist": "Uživatel '%s' neexistuje.",
"ExceptionYouMustGrantSuperUserAccessFirst": "Musí zůstat alespoň jeden uživatel se super-uživatelským přístupem. Nejdříve ho někomu přidělte.",
"ExceptionUserHasViewAccessAlready": "Tento uživatel má již přístup k této webové stránce.",
- "ExceptionNoValueForUsernameOrEmail": "Zadejte prosím uživatelské jméno nebo e-mailovou adresu.",
+ "ExceptionNoValueForUsernameOrEmail": "Zadejte prosím uživatelské jméno nebo emailovou adresu.",
"ExcludeVisitsViaCookie": "Vynechat vaše navštěvy pomocí cookie",
"ForAnonymousUsersReportDateToLoadByDefault": "Datum hlášení, které se má načíst jako výchozí pro anonymní uživatele",
- "GiveViewAccess": "Povolit přístup pro čtení",
+ "GiveViewAccess": "Povolit práva prohlížení pro %1$s",
"GiveViewAccessTitle": "Povolí existujícímu uživateli zobrazování hlášení pro %s",
- "GiveViewAccessInstructions": "Pro přiřazení práv k zobrazení %s existujícímu uživateli, zadejte jeho uživatelské jméno nebo e-mailovou adresu",
+ "GiveViewAccessInstructions": "Pro přiřazení práv k zobrazení %s existujícímu uživateli, zadejte jeho uživatelské jméno nebo emailovou adresu",
"IfYouWouldLikeToChangeThePasswordTypeANewOne": "Pokud chcete změnit heslo, zapiště jej. Jinak jej nevyplňujte.",
"InjectedHostCannotChangePwd": "Aktuálně navštěvujete Piwik s neznámým hostitelem %1$s. Dokud tento problém nevyřešíte, nemůžete změnit heslo.",
"LastSeen": "Naposledy spatřen",
diff --git a/plugins/UsersManager/lang/de.json b/plugins/UsersManager/lang/de.json
index 4aec094e01..202b84ef8c 100644
--- a/plugins/UsersManager/lang/de.json
+++ b/plugins/UsersManager/lang/de.json
@@ -37,7 +37,7 @@
"ExceptionNoValueForUsernameOrEmail": "Bitte geben Sie einen Benutzernamen oder eine E-Mail-Adresse ein.",
"ExcludeVisitsViaCookie": "Ihre Besuche von der Erfassung via Cookie ausschließen",
"ForAnonymousUsersReportDateToLoadByDefault": "Bericht, der für Gast-Besucher (\"anonymous\") standardmäßig geladen wird",
- "GiveViewAccess": "Lese-Rechte erteilen",
+ "GiveViewAccess": "Gewähren Sie Zugriff auf %1$s",
"GiveViewAccessTitle": "Einem bestehenden Benutzer die Berechtigung geben Berichte für %s zu sehen",
"GiveViewAccessInstructions": "Um einem bestehenden Benutzer Lese-Berechtigung für %s zu geben, geben Sie dessen Benutzername oder E-Mail-Adresse ein.",
"IfYouWouldLikeToChangeThePasswordTypeANewOne": "Wenn Sie Ihr Passwort ändern möchten, geben Sie ein neues ein. Ansonsten lassen Sie dieses Feld frei.",
diff --git a/plugins/UsersManager/lang/el.json b/plugins/UsersManager/lang/el.json
index f91b549e61..0b1351f5e7 100644
--- a/plugins/UsersManager/lang/el.json
+++ b/plugins/UsersManager/lang/el.json
@@ -37,7 +37,7 @@
"ExceptionNoValueForUsernameOrEmail": "Παρακαλώ εισάγετε ένα όνομα χρήστη ή διεύθυνση ηλ. ταχυδρομείου.",
"ExcludeVisitsViaCookie": "Αποκλείστε τις επισκέψεις σας με χρήση cookie",
"ForAnonymousUsersReportDateToLoadByDefault": "Για ανώνυμους χρήστες, αναφορά ημερομηνίας που θα φορτώνεται ως προεπιλογή",
- "GiveViewAccess": "Να δοθεί δικαίωμα εμφάνισης",
+ "GiveViewAccess": "Να δοθεί πρόσβαση εμφάνισης για %1$s",
"GiveViewAccessTitle": "Να δοθεί σε υπάρχοντα χρήστη δικαίωμα να βλέπει τις αναφορές για το %s",
"GiveViewAccessInstructions": "Για να δώσετε σε υπάρχοντα χρήστη δικαίωμα πρόσβασης στο %s εισάγετε το όνομα χρήστη ή την διεύθυνση ηλ. ταχυδρομείου του χρήστη",
"IfYouWouldLikeToChangeThePasswordTypeANewOne": "Αν θέλετε να αλλάξετε τον κωδικό πρόσβασης εισάγετε ένα νέο. Διαφορετικά αφήστε το κενό.",
diff --git a/plugins/UsersManager/lang/es.json b/plugins/UsersManager/lang/es.json
index 57277f127b..bd78ae4caa 100644
--- a/plugins/UsersManager/lang/es.json
+++ b/plugins/UsersManager/lang/es.json
@@ -37,7 +37,7 @@
"ExceptionNoValueForUsernameOrEmail": "Por favor introduce usuario o correo electrónico.",
"ExcludeVisitsViaCookie": "Excluir sus visitas usando una cookie",
"ForAnonymousUsersReportDateToLoadByDefault": "Para los usuarios anónimos, fecha del informe a cargar por defecto",
- "GiveViewAccess": "Otorgar acceso a la visualización",
+ "GiveViewAccess": "Otorgar acceso a la visualización de %1$s",
"GiveViewAccessTitle": "Otorgar a un actual usuario acceso a ver los informes de %s",
"GiveViewAccessInstructions": "Para otorgar atributos de visualización a actuales usuarios de %s suministre o el nombre de usuario o su correo electrónico",
"IfYouWouldLikeToChangeThePasswordTypeANewOne": "Si desea cambiar la contraseña ingrese una nueva. Si no, déjelo vacío.",
diff --git a/plugins/UsersManager/lang/fi.json b/plugins/UsersManager/lang/fi.json
index a9a274d80b..b969d6b2e4 100644
--- a/plugins/UsersManager/lang/fi.json
+++ b/plugins/UsersManager/lang/fi.json
@@ -35,7 +35,6 @@
"ExceptionNoValueForUsernameOrEmail": "Kirjoita käyttäjätunnus tai sähköpostiosoite.",
"ExcludeVisitsViaCookie": "Poista käyntiesi seuraaminen cookiella",
"ForAnonymousUsersReportDateToLoadByDefault": "Lataa anonyymeille käyttäjille oletuksena",
- "GiveViewAccess": "Anna katseluoikeus",
"GiveViewAccessTitle": "Anna olemassaolevalle käyttäjälle oikeus katsoa %s:n raportteja",
"IfYouWouldLikeToChangeThePasswordTypeANewOne": "Jos haluat vaihtaa salasanan, kirjoita uusi. Muuten jätä tyhjäksi.",
"InjectedHostCannotChangePwd": "Olet sivulla tällä hetkellä tuntemattoman isännän kautta (%1$s). Et voi vaihtaa salasanaasi ennen kuin tämä ongelma on korjattu.",
diff --git a/plugins/UsersManager/lang/fr.json b/plugins/UsersManager/lang/fr.json
index 284efeb145..4abd93e590 100644
--- a/plugins/UsersManager/lang/fr.json
+++ b/plugins/UsersManager/lang/fr.json
@@ -37,7 +37,7 @@
"ExceptionNoValueForUsernameOrEmail": "Veuillez entrer un nom d'usager ou une adresse courriel.",
"ExcludeVisitsViaCookie": "Excluez vos visites en utilisant un cookie",
"ForAnonymousUsersReportDateToLoadByDefault": "Pour les utilisateurs anonymes, date du rapport à charger par défaut",
- "GiveViewAccess": "Donner un accès de visualisation",
+ "GiveViewAccess": "Donner un accès de visualisation à %1$s",
"GiveViewAccessTitle": "Donner un accès à un utilisateur existant pour afficher les rapports de %s",
"GiveViewAccessInstructions": "Pour donner un accès en visualisation à utilisateur existant à %s entrez son nom d'utilisateur ou adresse courriel",
"IfYouWouldLikeToChangeThePasswordTypeANewOne": "Si vous souhaitez modifier votre mot de passe tapez en un nouveau. Sinon laissez le champ vide.",
diff --git a/plugins/UsersManager/lang/it.json b/plugins/UsersManager/lang/it.json
index bcf3d01289..e45cfba8aa 100644
--- a/plugins/UsersManager/lang/it.json
+++ b/plugins/UsersManager/lang/it.json
@@ -37,7 +37,7 @@
"ExceptionNoValueForUsernameOrEmail": "Per favore inserisci un nome utente o un indirizzo email.",
"ExcludeVisitsViaCookie": "Escludi le tue visite usando un cookie",
"ForAnonymousUsersReportDateToLoadByDefault": "Per utenti anonimi, data report da caricare di default",
- "GiveViewAccess": "Dai l'accesso in lettura",
+ "GiveViewAccess": "Da' accesso in lettura a %1$s",
"GiveViewAccessTitle": "Dai a un utente esistente l'accesso per vedere i report per %s",
"GiveViewAccessInstructions": "Per dare a un utente esistente l'accesso in visione per %s inserisci il nome utente o l'indirizzo email di un utente esistente",
"IfYouWouldLikeToChangeThePasswordTypeANewOne": "Se vuoi cambiare la password scrivine qui una nuova. Altrimenti lascia pure in bianco.",
diff --git a/plugins/UsersManager/lang/ko.json b/plugins/UsersManager/lang/ko.json
index 36ec99f57e..8cc4e4c4ca 100644
--- a/plugins/UsersManager/lang/ko.json
+++ b/plugins/UsersManager/lang/ko.json
@@ -7,11 +7,13 @@
"AnonymousUserHasViewAccess": "참고: %1$s 사용자는 이 웹사이트의 %2$s 접근을 가집니다.",
"AnonymousUserHasViewAccess2": "당신의 분석 보고서와 방문자 정보가 공개됩니다.",
"ApplyToAllWebsites": "모든 웹사이트에 적용",
+ "ChangeAllConfirm": "모든 웹사이트에 대한 '%s' 권한을 변경하시겠습니까?",
"ChangePasswordConfirm": "비밀번호를 변경하면 토큰도 변경됩니다. 정말 계속 하시겠습니까?",
"ClickHereToDeleteTheCookie": "Cookie를 삭제하고 Piwik이 당신의 방문도 추적하려면 여기를 클릭합니다.",
"ClickHereToSetTheCookieOnDomain": "%s의 Piwik에 추적하는 웹사이트에서 자신의 방문을 제외하는 Cookie를 설정하려면 여기를 클릭합니다.",
"ConfirmGrantSuperUserAccess": "정말 '%s'에게 슈퍼 유저 권한을 부여하시겠습니까? 경고: 해당 사용자는 모든 웹사이트에 대해 접근이 가능하며 관리자가 할 수 있는 일을 할 수 있습니다.",
"ConfirmProhibitMySuperUserAccess": "%s, 정말 당신의 슈퍼 유저 권한을 제거하시겠습니까? 당신은 모든 사이트에 대한 모든 권한과 접근이 제거되고 Piwik에서 로그아웃이 진행됩니다.",
+ "ConfirmProhibitOtherUsersSuperUserAccess": "정말로 '%s'의 슈퍼 유저 권한을 제거하시겠습니까? 해당 사용자는 모든 웹사이트에 대한 권한과 접근이 차단됩니다. 만약 필요하다면 이후 특정 웹사이트에 권한을 설정해주는 것을 권장합니다.",
"DeleteConfirm": "사용자 %s 님을 삭제하시겠습니까?",
"Email": "이메일",
"EmailYourAdministrator": "%1$s이 문제를 관리자에게 이메일로 보내기%2$s.",
@@ -23,6 +25,9 @@
"ExceptionEditAnonymous": "익명 사용자는 편집이나 삭제를 할 수 없습니다. Piwik에서 아직 로그인하지 않은 사용자를 골라낼 때 사용하기 때문입니다. 예를 들어, '보기' 접근을 '익명' 사용자에게 주어서 당신의 상태를 공개할 수 있습니다.",
"ExceptionEmailExists": "'%s' 의 이메일을 가진 사용자는 이미 존재합니다.",
"ExceptionInvalidEmail": "이메일이 유효한 형식이 아닙니다.",
+ "ExceptionInvalidLoginFormat": "사용자 이름은 반드시 %1$s 에서 %2$s 사이의 글자 수여야 하고 오직 문자, 숫자, 또는 '_', '-', '.', '@', '+'만 포함해야 합니다.",
+ "ExceptionInvalidPassword": "비밀번호 길이는 최소 %1$s 글자 이상이어야 합니다.",
+ "ExceptionLoginExists": "'%s' 님은 이미 존재합니다.",
"ExceptionPasswordMD5HashExpected": "UsersManager.getTokenAuth는 MD5 해시 값의 비밀번호 (32자 길이의 문자열)을 사용하고 있습니다. 이 메소드를 호출하기 전에 암호에 md5() 함수를 호출합니다.",
"ExceptionRemoveSuperUserAccessOnlySuperUser": "사용자 '%s'의 슈퍼 유저 권한 제거가 가능하지 않습니다.",
"ExceptionSuperUserAccess": "해당 사용자는 슈퍼 유저 권한을 가지고 있기에 Piwik 내 모든 웹사이트에 대해서 접근 가능하고 수정 역시 가능합니다. 해당 유저의 슈퍼 유저 권한을 제거한 후 다시 시도해보세요.",
@@ -32,11 +37,13 @@
"ExceptionNoValueForUsernameOrEmail": "사용자 이름 혹은 이메일 주소를 넣어주세요.",
"ExcludeVisitsViaCookie": "자신의 방문 제외 (Cookie 사용)",
"ForAnonymousUsersReportDateToLoadByDefault": "anonymous 사용자를 위한 기본 보고서 날짜",
- "GiveViewAccess": "보기 권한 주기",
+ "GiveViewAccess": "%1$s 에게 보기 권한 주기",
"GiveViewAccessTitle": "%s 보고서를 볼 수 있는 권한을 현 사용자에게 부여",
+ "GiveViewAccessInstructions": "기존 사용자에게 %s 의 보기 권한을 주기 위해 그 사용자 이름 혹은 이메일 주소를 입력하세요.",
"IfYouWouldLikeToChangeThePasswordTypeANewOne": "비밀번호를 변경하려면 새 비밀번호를 입력합니다. 변경하지 않으면 비워 둡니다.",
"InjectedHostCannotChangePwd": "현재 알 수 없는 호스트 (%1$s)로 방문했습니다. 이 문제가 해결될 때까지 사용자는 자신의 비밀번호를 변경할 수 없습니다.",
"LastSeen": "최근 본",
+ "MainDescription": "어떤 사용자가 어떤 웹사이트를 접근시킬지 결정할 수 있습니다. \"모든 웹사이트에 적용\"을 선택함으로써 모든 웹사이트의 권한을 한번에 설정할 수 있습니다.",
"ManageAccess": "관리 접근",
"MenuAnonymousUserSettings": "anonymous 사용자 설정",
"MenuUsers": "사용자",
@@ -45,6 +52,7 @@
"PersonalSettings": "개인 설정",
"NoteNoAnonymousUserAccessSettingsWontBeUsed2": "참고: 익명 사용자가 접근할 수있는 웹사이트가 없기 때문에 당신은 이 섹션의 설정을 변경할 수 없습니다.",
"NoUsersExist": "아직 사용자가 없습니다.",
+ "PluginDescription": "사용자 관리에서 당신은 새로운 사용자를 추가하고, 현재 사용자들을 수정하며 그들에게 웹사이트를 보거나 관리할 수 있도록 권한을 줄 수 있습니다.",
"PrivAdmin": "관리자",
"PrivNone": "접근할 수 없음",
"PrivView": "보기",
diff --git a/plugins/UsersManager/lang/pt-br.json b/plugins/UsersManager/lang/pt-br.json
index ca0fa05007..32f4fcfbac 100644
--- a/plugins/UsersManager/lang/pt-br.json
+++ b/plugins/UsersManager/lang/pt-br.json
@@ -36,7 +36,6 @@
"ExceptionNoValueForUsernameOrEmail": "Por favor, digite um nome de usuário ou endereço de e-mail.",
"ExcludeVisitsViaCookie": "Excluir suas visitas usando cookie",
"ForAnonymousUsersReportDateToLoadByDefault": "Para usuários anônimos, reportar dara para carregar por padrão",
- "GiveViewAccess": "Permitir acesso de visualização",
"GiveViewAccessTitle": "Dar a usuário existente acesso para visualizar relatórios de %s",
"GiveViewAccessInstructions": "Para dar acesso a um usuário existente para %s digite o nome de usuário ou endereço de e-mail de um usuário existente",
"IfYouWouldLikeToChangeThePasswordTypeANewOne": "Se você quiser mudar a senha, digite uma nova. Caso contrário, deixe em branco.",
diff --git a/plugins/UsersManager/lang/sq.json b/plugins/UsersManager/lang/sq.json
index 7abaca0f00..1c99347f45 100644
--- a/plugins/UsersManager/lang/sq.json
+++ b/plugins/UsersManager/lang/sq.json
@@ -9,8 +9,8 @@
"ApplyToAllWebsites": "Zbatoje për tërë sajtet",
"ChangeAllConfirm": "Jeni i sigurt se doni t’i jepni përdoruesit '%s' hyrje në krejt sajtet?",
"ChangePasswordConfirm": "Ndryshimi i fjalëkalimit do të sjellë gjithashtu ndryshimin e “token_auth” të përdoruesit. Doni vërtet të vazhdohet?",
- "ClickHereToDeleteTheCookie": "Klikoni këtu që të fshihet \"cookie\" dhe që ta bëni Piwik-un të gjurmojë vizitat tuaja",
- "ClickHereToSetTheCookieOnDomain": "Klikoni këtu që të vendoset një \"cookie\" që do të përjashtojë vizitat tuaja në sajte të gjurmuar nga Piwik-u %s",
+ "ClickHereToDeleteTheCookie": "Klikoni këtu që të fshihet \"cookie\" dhe që ta bëni Piwik-un të ndjekë vizitat tuaja",
+ "ClickHereToSetTheCookieOnDomain": "Klikoni këtu që të vendoset një \"cookie\" që do të përjashtojë vizitat tuaja në sajte të ndjekur nga Piwik-u %s",
"ConfirmGrantSuperUserAccess": "Doni t’i akordoni '%s' hyrje Supepërdoruesi? Kujdes: përdoruesi do të ketë hyrje në krejt sajtet dhe do të jetë në gjendje të kryejë veprime administratori.",
"ConfirmProhibitMySuperUserAccess": "%s, doni vërtet t’i hiqni vetes të drejta Superpërdoruesi? Do të humbni krejt lejet dhe hyrjen në krejt sajtet dhe do të dilni nga Piwik-u.",
"ConfirmProhibitOtherUsersSuperUserAccess": "Doni vërtet të hiqni hyrje Superpërdoruesi prej '%s'? Përdoruesi do të humbë krejt lejet dhe hyrjet në krejt sajtet. Sigurohuni t’i lejoni hyrje më pas, në sajtet e nevojshme, nëse është rasti.",
@@ -20,29 +20,30 @@
"EnterUsernameOrEmail": "Jepni një emër përdoruesi ose adresë email",
"ExceptionAccessValues": "Parametri duhet të ketë një nga vlerat vijuese: [ %s ]",
"ExceptionAdminAnonymous": "S’mund t’i jepni hyrje 'administratori' përdoruesit 'anonim'.",
- "ExceptionDeleteDoesNotExist": "Përdoruesi '%s' s'ekziston, ndaj s’mund të bëhet fshirje.",
+ "ExceptionDeleteDoesNotExist": "Përdoruesi '%s' s'ekziston, ndaj s’mund të fshihet.",
"ExceptionDeleteOnlyUserWithSuperUserAccess": "Fshirja e përdoruesit '%s' s’është e mundur.",
- "ExceptionEditAnonymous": "Përdoruesi anonim nuk mund të fshihet apo përpunohet të dhënat e tij. Përdoret nga Piwik-u për të përkufizuar një përdorues që s’ka bërë ende hyrjen. Për shembull, mund t’i bëni statistikat tuaja publike duke lejuar hyrje për 'parje' për përdoruesin 'anonim'.",
+ "ExceptionEditAnonymous": "Përdoruesi anonim nuk mund të fshihet, as mund të përpunohet të dhënat e tij. Përdoret nga Piwik-u për të përkufizuar një përdorues që s’ka bërë ende hyrjen. Për shembull, mund t’i bëni statistikat tuaja publike duke lejuar hyrje për 'parje' për përdoruesin 'anonim'.",
"ExceptionEmailExists": "Ka tashmë një përdorues me email-in '%s'.",
"ExceptionInvalidEmail": "Email-i s’është në format të vlefshëm.",
"ExceptionInvalidLoginFormat": "Emri i përdoruesit duhet të jetë ndërmjet %1$s dhe %2$s shenja i gjatë dhe të përmbajë vetëm shkronja, numra, ose shenjën '_' ose '-' ose '.' ose '@' ose '+'",
+ "ExceptionInvalidPassword": "Gjatësia e fjalëkalimeve duhet të jetë më e madhe se %1$s shenja.",
"ExceptionLoginExists": "Ka tashmë një përdorues '%s'.",
- "ExceptionPasswordMD5HashExpected": "UsersManager.getTokenAuth pret një fjalëkalim hash MD5 (varg 32 shenja të gjatë). Ju lutemi, zbatojeni funksionin md5() mbi fjalëkalimin përpara zbatimit të kësaj metode",
+ "ExceptionPasswordMD5HashExpected": "UsersManager.getTokenAuth pret një fjalëkalim hash MD5 (varg 32 shenja të gjatë). Ju lutemi, zbatojeni funksionin md5() mbi fjalëkalimin përpara zbatimit të kësaj metode.",
"ExceptionRemoveSuperUserAccessOnlySuperUser": "Heqja e lejeve Superpërdoruesi për përdoruesin '%s' s’është e mundur.",
"ExceptionSuperUserAccess": "Ky përdorues ka hyrje Superpërdoruesi dhe ka tashmë leje të hyjë dhe modifikojë krejt sajtet në këtë instalim Piwik-u. Mund t’ia hiqni të drejtat e Superpërdoruesit këtij përdoruesi dhe të riprovoni.",
"ExceptionUserDoesNotExist": "Përdoruesi '%s' s’ekziston.",
- "ExceptionYouMustGrantSuperUserAccessFirst": "Duhet të ketë të paktën një përdorues me hyrje Superpërdoruesi. Ju lutemi, akordojini së pari të drejta Superpërdoruesi një përdoruesi.",
+ "ExceptionYouMustGrantSuperUserAccessFirst": "Duhet të ketë të paktën një përdorues me hyrje Superpërdoruesi. Ju lutemi, së pari akordojini të drejta Superpërdoruesi një përdoruesi tjetër.",
"ExceptionUserHasViewAccessAlready": "Ky përdorues ka tashmë hyrje në këtë sajt.",
"ExceptionNoValueForUsernameOrEmail": "Ju lutemi, jepni një emër përdoruesi ose adresë email.",
"ExcludeVisitsViaCookie": "Përjashtoni vizitat tuaja, përmes përdorimit të një \"cookie\"",
"ForAnonymousUsersReportDateToLoadByDefault": "Datë raporti që duhet ngarkuar si parazgjedhje për përdoruesit anonimë",
- "GiveViewAccess": "Jepni hyrje për parje",
+ "GiveViewAccess": "Jepini %1$s hyrje për parje",
"GiveViewAccessTitle": "Jepini një përdoruesi ekzistues hyrje për të parë raportet për %s",
"GiveViewAccessInstructions": "Për t’i dhënë një përdoruesi ekzistues hyrje për parje të raporteve për %s jepni emrin e përdoruesit ose adresën email të një përdoruesi ekzistues",
"IfYouWouldLikeToChangeThePasswordTypeANewOne": "Nëse dëshironi të ndryshoni fjalëkalimin, shtypni një të ri. Përndryshe lëreni të zbrazët.",
- "InjectedHostCannotChangePwd": "Po e vizitoni me një strehë të panjohur (%1$s). S’mund ta ndryshoni fjalëkaliminm, pa ndrequr këtë problem.",
+ "InjectedHostCannotChangePwd": "Po e vizitoni me një strehë të panjohur (%1$s). S’mund ta ndryshoni fjalëkalimin, pa ndrequr këtë problem.",
"LastSeen": "Këndej pari së fundi më",
- "MainDescription": "Vendosni cilët përdorues kanë hyrje te sajtet tuaj. Mund jepni edhe hyrje për te krejt sajtet njëherësh, duke zgjedhur \"Zbatoje për krejt sajtet\" te përzgjedhësi i sajtit.",
+ "MainDescription": "Vendosni cilët përdorues kanë hyrje te sajtet tuaj. Mund të jepni edhe hyrje për te krejt sajtet njëherësh, duke zgjedhur \"Zbatoje për krejt sajtet\" te përzgjedhësi i sajtit.",
"ManageAccess": "Administroni hyrjet",
"MenuAnonymousUserSettings": "Rregullime përdoruesi anonim",
"MenuUsers": "Përdorues",
@@ -50,9 +51,9 @@
"MenuPersonal": "Personal",
"PersonalSettings": "Rregullime personale",
"NoteNoAnonymousUserAccessSettingsWontBeUsed2": "Shënim: Nuk mund të ndryshoni rregullimet në këtë ndarje, ngaqë s’keni ndonjë sajt ku mund të hyhet si përdorues anonim.",
- "NoUsersExist": "Ende nuk ka përdorues",
+ "NoUsersExist": "Ende nuk ka përdorues.",
"PluginDescription": "Administrimi i Përdoruesve ju lejon të shtoni përdorues të rinj, përpunoni përdoruesit ekzistues dhe t’u jepni atyre hyrje për të parë ose administruar sajte.",
- "PrivAdmin": "Admin",
+ "PrivAdmin": "Përgjegjës",
"PrivNone": "Pa hyrje",
"PrivView": "Pamje",
"ReportDateToLoadByDefault": "Datë raporti që duhet ngarkuar si parazgjedhje",
@@ -65,7 +66,7 @@
"TypeYourPasswordAgain": "Shtypeni sërish fjalëkalimin e ri.",
"User": "Përdorues",
"UsersManagement": "Administrim Përdoruesish",
- "UsersManagementMainDescription": "Krijoni përdoruesa të rinj ose përditësoni përdoruesit ekzistues. Mandej mund t’u caktoni lejet më sipër.",
+ "UsersManagementMainDescription": "Krijoni përdorues të rinj ose përditësoni përdoruesit ekzistues. Mandej mund t’u caktoni lejet më sipër.",
"WhenUsersAreNotLoggedInAndVisitPiwikTheyShouldAccess": "Kur përdoruesit nuk janë të futur dhe vizitojnë Piwik-un, do të duhej të hynin",
"YourUsernameCannotBeChanged": "Emri juaj i përdoruesit s’mund të ndryshohet.",
"YourVisitsAreIgnoredOnDomain": "%1$sVizitat tuaja te %2$s %3$s janë shpërfillur nga Piwik-u (te shfletuesi juaj u gjet \"cookie\" për shpërfillje nga Piwik-u).",
diff --git a/plugins/UsersManager/lang/sr.json b/plugins/UsersManager/lang/sr.json
index 2f09cf69e1..5c75a9a8ea 100644
--- a/plugins/UsersManager/lang/sr.json
+++ b/plugins/UsersManager/lang/sr.json
@@ -7,14 +7,17 @@
"AnonymousUserHasViewAccess": "Pažnja: korisnik %1$s ima %2$s nivo pristupa ovom sajtu.",
"AnonymousUserHasViewAccess2": "Vaši analitički podaci i informacije o vašim posetiocima su javno vidljivi.",
"ApplyToAllWebsites": "Primeni na sve sajtove",
+ "ChangeAllConfirm": "Da li ste sigurni da korisniku '%s' želite da dodelite pristup svim sajtovima?",
"ChangePasswordConfirm": "Promena lozinke će prouzrokovati i promenu korisnikovog token_auth. Da li ste sigurni da želite da nastavite?",
"ClickHereToDeleteTheCookie": "Kliknite ovde kako biste obrisali kolačić i time omogućili Piwik da prati i vaše posete",
"ClickHereToSetTheCookieOnDomain": "Kliknite ovde kako biste postavili kolačić i time onemogućili Piwik da prati i vaše posete %s",
"ConfirmGrantSuperUserAccess": "Da li zaista želite da '%s' dodelite superkorisnički nivo pristupa? Pažnja: korisnik će dobiti pristup svim sajtovima i moći će da vrši administrativne zadatke.",
"ConfirmProhibitMySuperUserAccess": "%s, da li zaista želite sebi da uklonite superkorisnički nivo pristupa? Izgubićete sva prava i pristup svim sajtovima i bićete odjavljeni sa Piwik-a.",
+ "ConfirmProhibitOtherUsersSuperUserAccess": "Da li zaista želite da uklonite superkorisnički nivo pristupa korisniku '%s'? Ovaj korisnik će izgubiti sva prava i pristup sajtovima. Postarajte se da posle toga dodelite prava pristupa sajtovima ukoliko je to potrebno.",
"DeleteConfirm": "Da li ste sigurni da želite da obrišete korisnika %s?",
"Email": "Elektronska adresa",
"EmailYourAdministrator": "%1$sObavestite administratora o ovom problemu%2$s.",
+ "EnterUsernameOrEmail": "Upišite korisničko ime ili mejl adresu",
"ExceptionAccessValues": "Parametar pristupa mora da ima jednu od sledećih vrednosti: [ %s ]",
"ExceptionAdminAnonymous": "Ne možete dozvoliti 'admin' privilegije anonimnom korisniku.",
"ExceptionDeleteDoesNotExist": "Korisnik '%s' ne postoji pa stoga ni ne može biti obrisan.",
@@ -22,16 +25,25 @@
"ExceptionEditAnonymous": "Podaci o anonimnom korisniku ne mogu biti menjani ili obrisani. Anonimni korisnik služi da bi Piwik mogao da razlikuje korisnika koji se još nije prijavio na sistem. Primera radi, svoju statistiku možete učiniti javnom tako što ćete anonimnom korisniku dozvoliti 'prikaz' pristup.",
"ExceptionEmailExists": "Korisnik sa elektronskom adresom '%s' već postoji.",
"ExceptionInvalidEmail": "Elektronska adresa nije validna.",
+ "ExceptionInvalidLoginFormat": "Korisničko ime mora biti dugačko između %1$s i %2$s znakova i može da sadrži samo slova, brojeve ili znakove '_', '-', '.', '@' i '+'",
+ "ExceptionInvalidPassword": "Dužina lozinke mora biti veća od %1$s znakova.",
+ "ExceptionLoginExists": "Korisničko ime '%s' već postoji.",
"ExceptionPasswordMD5HashExpected": "UsersManager.getTokenAuth očekuje MD5 hash lozinku (niz od 32 znaka). Molimo vas da primenite funkciju md5() nad lozinkom pre poziva ovog metoda. Hvala.",
"ExceptionRemoveSuperUserAccessOnlySuperUser": "Uklanjanje superkorisničkog nivoa pristupa korisniku '%s' nije moguće.",
"ExceptionSuperUserAccess": "Ovaj korisnik već ima superkorisnički nivo pristupa. Možete mu ukloniti taj nivo i pokušati ponovo.",
"ExceptionUserDoesNotExist": "Korisnik '%s' ne postoji.",
"ExceptionYouMustGrantSuperUserAccessFirst": "Mora postojati barem jedan korisnik sa superkorisničkim pristupom. Molimo vas da prvo dodelite superkorisnički pristup nekom od korisnika.",
+ "ExceptionUserHasViewAccessAlready": "Ovaj korisnik već ima pristup ovom sajtu.",
+ "ExceptionNoValueForUsernameOrEmail": "Molimo vas da upišete korisničko ime ili mejl adresu.",
"ExcludeVisitsViaCookie": "Isključite vaše posete pomoću kolačića",
"ForAnonymousUsersReportDateToLoadByDefault": "Za anonimne korisnike, datum izveštaja koji podrazumevano treba prikazati je:",
+ "GiveViewAccess": "Dodeli pristup prikaza za %1$s",
+ "GiveViewAccessTitle": "Dodeli postojećem korisniku pristup prikaza izveštaja za %s",
+ "GiveViewAccessInstructions": "Ukoliko želite da postojećem korisniku dodelite pristup prikaza za %s, upišite korisničko ime ili mejl adresu tog korisnika",
"IfYouWouldLikeToChangeThePasswordTypeANewOne": "Ukoliko želite da promenite lozinku, upišite novu. U suprotnom ostavite polje prazno",
"InjectedHostCannotChangePwd": "Trenutno pristupate sa nepoznatog hosta (%1$s). Lozinku ne možete promeniti dok ovo ne ispravite.",
"LastSeen": "Poslednji put viđen",
+ "MainDescription": "Odredite koji korisnici imaju pristup vašim sajtovima. Možete im dodeliti prostup svim sajtovima izborom opcije \"Primeni na sve sajtove\".",
"ManageAccess": "Kontrola pristupa",
"MenuAnonymousUserSettings": "Podešavanja anonimnih korisnika",
"MenuUsers": "Korisnici",
@@ -40,6 +52,7 @@
"PersonalSettings": "Lična podešavanja",
"NoteNoAnonymousUserAccessSettingsWontBeUsed2": "Ne možete menjati podešavanja u ovoj sekciji zato što nemate nijedan sajt kojem se može pristupiti kao anonimni korisnik.",
"NoUsersExist": "Još uvek nema korisnika.",
+ "PluginDescription": "Upravljanje korisnicima vam omogućuje dodavanje novih korisnika, izmenu postojećih kao i dodelu pristupa za prikaz i administraciju sajtova.",
"PrivAdmin": "Administracija",
"PrivNone": "Nema pristup",
"PrivView": "Prikaz",
diff --git a/plugins/UsersManager/lang/sv.json b/plugins/UsersManager/lang/sv.json
index 9a971c3045..cef49d3da6 100644
--- a/plugins/UsersManager/lang/sv.json
+++ b/plugins/UsersManager/lang/sv.json
@@ -36,7 +36,6 @@
"ExceptionNoValueForUsernameOrEmail": "Ange ett användarnamn eller en e-postadress.",
"ExcludeVisitsViaCookie": "Exkludera spårning av dina besök",
"ForAnonymousUsersReportDateToLoadByDefault": "Rapport som laddas som standard för anonyma användare.",
- "GiveViewAccess": "Ge visningsbehörighet",
"GiveViewAccessTitle": "Ge en existerande användare behörighet att visa rapporter för %s",
"GiveViewAccessInstructions": "För att ge en befintlig användare läsrättighet för %s skriv in användarnamnet eller e-postadressen för den befintliga användaren.",
"IfYouWouldLikeToChangeThePasswordTypeANewOne": "Om du vill ändra ditt lösenord så skriver du in det nya, annars lämnar du fältet tomt.",
diff --git a/plugins/UsersManager/lang/uk.json b/plugins/UsersManager/lang/uk.json
index f393b6bb68..a0537fc782 100644
--- a/plugins/UsersManager/lang/uk.json
+++ b/plugins/UsersManager/lang/uk.json
@@ -36,7 +36,6 @@
"ExceptionNoValueForUsernameOrEmail": "Будь ласка, введіть ім'я користувача або email адресу.",
"ExcludeVisitsViaCookie": "Cookie виключення з статистики",
"ForAnonymousUsersReportDateToLoadByDefault": "Звіт для анонімних користувачів відображається за",
- "GiveViewAccess": "Дати доступ на перегляд",
"GiveViewAccessTitle": "Дати існуючому користувачу доступ для перегляду звітів для %s",
"GiveViewAccessInstructions": "Щоб дати існуючому користувачу доступ для перегляду %s введіть логін або адресу електронної пошти для існуючого користувача",
"IfYouWouldLikeToChangeThePasswordTypeANewOne": "Якщо ви хочете змінити пароль, введіть новий. Інакше залиште поле порожнім.",
diff --git a/plugins/VisitFrequency/lang/am.json b/plugins/VisitFrequency/lang/am.json
index ac40a80c7a..f55d347ffd 100644
--- a/plugins/VisitFrequency/lang/am.json
+++ b/plugins/VisitFrequency/lang/am.json
@@ -3,9 +3,6 @@
"ColumnActionsByReturningVisits": "በመልስ ጉብኝቶች የተወሰዱ ርምጃዎች",
"ColumnBounceRateForReturningVisits": "የመልስ ጉብኝቶች ተመላሽ ፍጥነት",
"ColumnReturningVisits": "መልስ ጉበኝቶች",
- "ReturnActions": "%s በመልስ ጉብኝቶች የተወሰዱ ርምጃዎች",
- "ReturnBounceRate": "%s መልስ ጉብኝቶች ተመላሽ ሆነዋል (ከአንድ ድር ጣቢያ በኋላ ገፁን ትተዋል)",
- "ReturnVisits": "%s መልስ ጉብኝቶች",
"SubmenuFrequency": "ድግግሞሽ",
"WidgetGraphReturning": "የመልስ ጉብኝቶች ግራፍ",
"WidgetOverview": "የድግግሞሽ አጠቃላይ እይታ"
diff --git a/plugins/VisitFrequency/lang/ar.json b/plugins/VisitFrequency/lang/ar.json
index b7d3503d08..6c813ee6ac 100644
--- a/plugins/VisitFrequency/lang/ar.json
+++ b/plugins/VisitFrequency/lang/ar.json
@@ -5,11 +5,6 @@
"ColumnAvgActionsPerReturningVisit": "متوسط السلوكيات لكل زيارة عائدة",
"ColumnBounceRateForReturningVisits": "معدل الارتداد للزوار العائدين",
"ColumnReturningVisits": "الزيارات العائدة",
- "ReturnActions": "%s سلوك بواسطة الزيارات المتكررة",
- "ReturnAverageVisitDuration": "%s متوسط طول الزيارة للزائر المتكرر",
- "ReturnAvgActions": "%s سلوك لكل زيارة متكررة",
- "ReturnBounceRate": "%s زيارة متكررة مرتدة (غادر الموقع من أول صفحة)",
- "ReturnVisits": "%s زيارة عائدة",
"SubmenuFrequency": "التكرار",
"WidgetGraphReturning": "رسم بياني للزيارات المتكررة",
"WidgetOverview": "نظرة عامة على التكرار"
diff --git a/plugins/VisitFrequency/lang/be.json b/plugins/VisitFrequency/lang/be.json
index a3bff9797a..81e61cdd28 100644
--- a/plugins/VisitFrequency/lang/be.json
+++ b/plugins/VisitFrequency/lang/be.json
@@ -5,13 +5,8 @@
"ColumnAvgActionsPerReturningVisit": "Сяр. колькасць дзеянняў за паўторнае наведванне",
"ColumnBounceRateForReturningVisits": "Паказчык адмоў для паўторных наведванняў",
"ColumnReturningVisits": "Паўторныя наведванні",
- "ReturnActions": "%s дзеянняў за паўторныя наведванні",
- "ReturnAverageVisitDuration": "%s сярэдняя працягласць наведванняў для вяртаючыхся наведвальнікаў",
- "ReturnAvgActions": "%s дзеянняў за паўторнае наведванне",
- "ReturnBounceRate": "%s раз карыстачы выйшлі пасля прагляду адной старонкі",
"ReturningVisitDocumentation": "Паўторнае наведванне (у адрозненне ад новага наведвання) зрабіў той, хто наведаў вэб-сайт па крайняй меры двойчы.",
"ReturningVisitsDocumentation": "Гэта агляд паўторных наведванняў.",
- "ReturnVisits": "%s паўторных наведванняў",
"SubmenuFrequency": "Чашчыня",
"WidgetGraphReturning": "Графік паўторных наведванняў",
"WidgetOverview": "Агляд чашчыні наведванняў"
diff --git a/plugins/VisitFrequency/lang/bg.json b/plugins/VisitFrequency/lang/bg.json
index d7a31df672..302f68d45e 100644
--- a/plugins/VisitFrequency/lang/bg.json
+++ b/plugins/VisitFrequency/lang/bg.json
@@ -10,13 +10,8 @@
"ColumnReturningVisits": "Върнали се посетители",
"ColumnSumVisitLengthReturning": "Време прекарано по време на повторните посещения (в секунди)",
"ColumnUniqueReturningVisitors": "Уникални повторни посетители",
- "ReturnActions": "%s действия от върнали се посетители",
- "ReturnAverageVisitDuration": "%s средна продължителност на посещенията от върналите се посетители",
- "ReturnAvgActions": "%s дейности на върналите се посетители",
- "ReturnBounceRate": "%s върнали се потребители, които са отскочили (напуснали са сайта още след първата страница)",
"ReturningVisitDocumentation": "Повторно посещение (за разлиса от ново посещение) се прави от някой, който е посещавал сайта поне веднъж в миналото.",
"ReturningVisitsDocumentation": "Това е преглед на повторните посещения.",
- "ReturnVisits": "%s върнали се посетители",
"SubmenuFrequency": "Честота",
"WidgetGraphReturning": "Графика на завърналите се посетители",
"WidgetOverview": "Резюме на честотата"
diff --git a/plugins/VisitFrequency/lang/ca.json b/plugins/VisitFrequency/lang/ca.json
index ce826bca32..2597a40168 100644
--- a/plugins/VisitFrequency/lang/ca.json
+++ b/plugins/VisitFrequency/lang/ca.json
@@ -10,13 +10,8 @@
"ColumnReturningVisits": "Visitants que retornen (antics)",
"ColumnSumVisitLengthReturning": "Temps total dels visitants que retornen (en segons)",
"ColumnUniqueReturningVisitors": "Visitants únics que retornen",
- "ReturnActions": "Els visitants que han tornat han fet %s accions",
- "ReturnAverageVisitDuration": "%s duració mitja de la vistia dels usuaris que retornen.",
- "ReturnAvgActions": "%s accions per visitant que retorna",
- "ReturnBounceRate": "%s visitants antics han rebotat (abandonat el lloc després de veure una pàgina)",
"ReturningVisitDocumentation": "Un visitant que retorna és (al contrari d'un visitant nou) un usuari que ja ha visitat el vostre lloc web almenys una vegada en el passat.",
"ReturningVisitsDocumentation": "Això es una visió global dels visitants que retornen.",
- "ReturnVisits": "Han tornat %s visitants",
"SubmenuFrequency": "Freqüència",
"WidgetGraphReturning": "Gràfic de les visites que han tornat",
"WidgetOverview": "Resum de la freqüència"
diff --git a/plugins/VisitFrequency/lang/cs.json b/plugins/VisitFrequency/lang/cs.json
index a33726371a..acd4a63368 100644
--- a/plugins/VisitFrequency/lang/cs.json
+++ b/plugins/VisitFrequency/lang/cs.json
@@ -9,16 +9,16 @@
"ColumnNbReturningVisitsConverted": "Počet zkonvertovaných vracejících se návštěv",
"ColumnReturningVisits": "Opětovných návštěv",
"ColumnSumVisitLengthReturning": "Celkový čas strávený vracejícími se návštěvníky (v sekundách)",
- "ColumnUniqueReturningVisitors": "Unikátní vracející se návštěvníci",
+ "ColumnUniqueReturningVisitors": "Jedineční vracející se návštěvníci",
"ColumnReturningUsers": "Vracející se uživatelé",
"PluginDescription": "Hlásí měření prvního času pro nové a vracející se návštěvníky.",
- "ReturnActions": "%s akcí za opakovanou návštěvu",
- "ReturnAverageVisitDuration": "%s průměrná dělka návštěvy pro navracející se návštěvníky",
- "ReturnAvgActions": "%s akcí na navracejících se návštěvníka",
- "ReturnBounceRate": "%s opakujících se návštěv odešlo (opustilo web po jedné stránce)",
+ "ReturnActions": "akcí za opakovanou návštěvu",
+ "ReturnAverageVisitDuration": "průměrná dělka návštěvy pro vracející se návštěvníky",
+ "ReturnAvgActions": "akcí na vrátivšího se návštěvníka",
+ "ReturnBounceRate": "Vracející se návštěvy se odrazily (opustily webové stránce po jedné stránce)",
"ReturningVisitDocumentation": "Vracející se návštěva je návštěvník, který již stránku aspoň jednou navštívil.",
"ReturningVisitsDocumentation": "Toto je přehled vracejících se návštěvníků.",
- "ReturnVisits": "%s opakujících se návštěv",
+ "ReturnVisits": "vrátivších se návštěv",
"SubmenuFrequency": "Frekvence",
"WidgetGraphReturning": "Graf opakujících se návštěv",
"WidgetOverview": "Přehled frekvencí"
diff --git a/plugins/VisitFrequency/lang/da.json b/plugins/VisitFrequency/lang/da.json
index e53427da9d..8428e1ad00 100644
--- a/plugins/VisitFrequency/lang/da.json
+++ b/plugins/VisitFrequency/lang/da.json
@@ -12,13 +12,8 @@
"ColumnUniqueReturningVisitors": "Unikke tilbagevendende besøgende",
"ColumnReturningUsers": "Tilbagevendende brugere",
"PluginDescription": "Rapporter målinger om førstegangs nye besøgende og tilbagevendende besøgende.",
- "ReturnActions": "%s handlinger af tilbagevendende besøg",
- "ReturnAverageVisitDuration": "%s gns. Besøgsvarighed for tilbagevendende besøgende",
- "ReturnAvgActions": "%s gns. handlinger pr. tilbagevendende besøg",
- "ReturnBounceRate": "%s tilbagevendende besøg er blevet afvist (har forladt hjemmesiden efter en sidevisning)",
"ReturningVisitDocumentation": "Et tilbagevendende besøg (i modsætning til et nyt besøg) foretages af en person, der har besøgt hjemmesiden mindst en gang før.",
"ReturningVisitsDocumentation": "Oversigt over tilbagevendende besøg.",
- "ReturnVisits": "%s tilbagevendende besøg",
"SubmenuFrequency": "Hyppighed",
"WidgetGraphReturning": "Tilbagevendende besøg",
"WidgetOverview": "Hyppighedsoversigt"
diff --git a/plugins/VisitFrequency/lang/de.json b/plugins/VisitFrequency/lang/de.json
index d5167699ae..f73c477726 100644
--- a/plugins/VisitFrequency/lang/de.json
+++ b/plugins/VisitFrequency/lang/de.json
@@ -12,13 +12,13 @@
"ColumnUniqueReturningVisitors": "Eindeutige wiederkehrende Besucher",
"ColumnReturningUsers": "Wiederkehrende Benutzer",
"PluginDescription": "Liefert Metriken über erstmalige und wiederkehrende Besucher.",
- "ReturnActions": "%s Aktionen von wiederkehrenden Besuchen",
- "ReturnAverageVisitDuration": "%s durchschnittliche Aufenthaltszeit bei wiederkehrenden Besuchen",
- "ReturnAvgActions": "%s Aktionen pro wiederkehrendem Besuch",
- "ReturnBounceRate": "%s wiederkehrende Besuche sind abgesprungen (haben die Website nach einer Seite verlassen)",
+ "ReturnActions": "Aktionen von wiederkehrenden Besuchen",
+ "ReturnAverageVisitDuration": "durchschnittliche Verweildauer wiederkehrender Besucher",
+ "ReturnAvgActions": "Aktionen pro wiederkehrendem Besuch",
+ "ReturnBounceRate": "Absprung wiederkehrender Besucher (Verlassen der Webseite nach einer Seite)",
"ReturningVisitDocumentation": "Ein wiederkehrender Besuch wird (im Vergleich zu einem neuen Besuch) von jemandem gemacht, der bereits mindestens einmal die Website besucht hat.",
"ReturningVisitsDocumentation": "Dies ist eine Übersicht über die wiederkehrenden Besuche.",
- "ReturnVisits": "%s wiederkehrende Besuche",
+ "ReturnVisits": "wiederkehrende Besucher",
"SubmenuFrequency": "Häufigkeit",
"WidgetGraphReturning": "Graph der wiederkehrenden Besuche",
"WidgetOverview": "Häufigkeitsübersicht"
diff --git a/plugins/VisitFrequency/lang/el.json b/plugins/VisitFrequency/lang/el.json
index 7ee2c599f0..484f115d8a 100644
--- a/plugins/VisitFrequency/lang/el.json
+++ b/plugins/VisitFrequency/lang/el.json
@@ -12,13 +12,13 @@
"ColumnUniqueReturningVisitors": "Μοναδικοί επιστρεφόμενοι επισκέπτες",
"ColumnReturningUsers": "Επιστρέφοντες Χρήστες",
"PluginDescription": "Αναφέρει μετρικές σχετικά με τους νέους επισκέπτες και αυτούς που ξαναέρχονται.",
- "ReturnActions": "%s δραστηριότητες από τις επιστρεφόμενες επισκέψεις",
- "ReturnAverageVisitDuration": "%s μέση διάρκεια επισκέψεων για επιστρεφόμενους Επισκέπτες",
- "ReturnAvgActions": "%s δραστηριότητες ανά επιστρεφόμενη επίσκεψη",
- "ReturnBounceRate": "%s επιστρεφόμενες επισκέψεις έχουν απομακρυνθεί (άφησαν την ιστοσελίδα μετά από μια σελίδα)",
+ "ReturnActions": "ενέργειες από επιστρεφόμενες επισκέψεις",
+ "ReturnAverageVisitDuration": "μέση διάρκεια επίσκεψης για επιστρεφόμενους επισκέπτες",
+ "ReturnAvgActions": "ενέργειες ανά επιστρεφόμενη επίσκεψη",
+ "ReturnBounceRate": "υπήρξε αναπήδηση των επιστρεφόμενων επισκέψεων (άφησαν τον ιστοτόπο μετά από μία σελίδα)",
"ReturningVisitDocumentation": "Μια επιστρεφόμενη επίσκεψη είναι (σε αντίθεση με μια νέα επίσκεψη) αυτή που έγινε από κάποιον που έχει επισκευφτεί την ιστοσελίδα ήδη μια φορά.",
"ReturningVisitsDocumentation": "Αυτή είναι μια επισκόπηση των επιστρεφόμενων επισκέψεων.",
- "ReturnVisits": "%s επιστρεφόμενες επισκέψεις",
+ "ReturnVisits": "επιστρεφόμενες επισκέψεις",
"SubmenuFrequency": "Συχνότητα",
"WidgetGraphReturning": "Γράφημα επιστρεφόμενων επισκέψεων",
"WidgetOverview": "Επισκόπηση συχνότητας"
diff --git a/plugins/VisitFrequency/lang/es.json b/plugins/VisitFrequency/lang/es.json
index ad14a5d0c0..e4f2b65dc8 100644
--- a/plugins/VisitFrequency/lang/es.json
+++ b/plugins/VisitFrequency/lang/es.json
@@ -12,13 +12,13 @@
"ColumnUniqueReturningVisitors": "Visitantes únicos que regresan",
"ColumnReturningUsers": "Usuarios que retornan",
"PluginDescription": "Informa métricas acerca de la primera vez de los visitantes y de los visitantes que regresan.",
- "ReturnActions": "%s acciones realizadas por los visitantes que regresan",
- "ReturnAverageVisitDuration": "%s duración promedio de la visita de los visitantes que regresan",
- "ReturnAvgActions": "%s acciones por visitante que ha vuelto",
- "ReturnBounceRate": "%s rebotes visitas que han vuelto (abandonaron el sitio después de una página)",
+ "ReturnActions": "acciones de los visitantes frecuentes",
+ "ReturnAverageVisitDuration": "duración promedio de la visita de los visitantes frecuentes",
+ "ReturnAvgActions": "acciones de visitantes frecuentes",
+ "ReturnBounceRate": "visitantes que han vuelto (abandonaron el sitio después de una página)",
"ReturningVisitDocumentation": "Una visita que regresa es (contrario a la nueva visita) aquel que ha visitado anteriormente su sitio de internet al menos una vez.",
"ReturningVisitsDocumentation": "Esta es una visión general de los visitantes que regresan.",
- "ReturnVisits": "%s visitantes que han vuelto",
+ "ReturnVisits": "visitas frecuentes",
"SubmenuFrequency": "Frecuencia",
"WidgetGraphReturning": "Visitas que regresan en el tiempo",
"WidgetOverview": "Vista general de frecuencia"
diff --git a/plugins/VisitFrequency/lang/et.json b/plugins/VisitFrequency/lang/et.json
index a17989c001..00574c0ea6 100644
--- a/plugins/VisitFrequency/lang/et.json
+++ b/plugins/VisitFrequency/lang/et.json
@@ -10,12 +10,7 @@
"ColumnReturningVisits": "Korduvad külastused",
"ColumnSumVisitLengthReturning": "Korduvate külastuste kogu lehel viibitud aeg (sek)",
"ColumnUniqueReturningVisitors": "Unikaalsed korduvkülastajad",
- "ReturnActions": "%s tegevust korduval külastusel",
- "ReturnAverageVisitDuration": "%s keskmine külastuse kestvus korduvatel külastustel",
- "ReturnAvgActions": "%s tegevust korduvatel külastustel",
- "ReturnBounceRate": "%s korduvaid külastajaid põrkas (lahkus peale ühe lehe kuvamist)",
"ReturningVisitsDocumentation": "See on korduvate külastuste ülevaade.",
- "ReturnVisits": "%s korduvat külastust",
"SubmenuFrequency": "Sagedus",
"WidgetGraphReturning": "Korduvate külastuste graafik",
"WidgetOverview": "Sageduse ülevaade"
diff --git a/plugins/VisitFrequency/lang/eu.json b/plugins/VisitFrequency/lang/eu.json
index d47d153531..9000a8608d 100644
--- a/plugins/VisitFrequency/lang/eu.json
+++ b/plugins/VisitFrequency/lang/eu.json
@@ -3,9 +3,6 @@
"ColumnActionsByReturningVisits": "Itzulerako bisiten ekintzak",
"ColumnBounceRateForReturningVisits": "Itzulerako bisiten errebotatze-tasa",
"ColumnReturningVisits": "Itzulerako bisitak",
- "ReturnActions": "%s ekintza itzulerako bisitek",
- "ReturnBounceRate": "%s itzulerako bisita errebotatu dira (webgunea utzi dute orri bat ikusi ondoren)",
- "ReturnVisits": "%s itzulerako bisita",
"SubmenuFrequency": "Maiztasuna",
"WidgetGraphReturning": "Itzulerako bisiten grafikoa",
"WidgetOverview": "Maiztasunaren ikuspegi orokorra"
diff --git a/plugins/VisitFrequency/lang/fa.json b/plugins/VisitFrequency/lang/fa.json
index aa4cc67529..646404e35c 100644
--- a/plugins/VisitFrequency/lang/fa.json
+++ b/plugins/VisitFrequency/lang/fa.json
@@ -10,12 +10,8 @@
"ColumnReturningVisits": "بازدید کننده بازگشتی",
"ColumnSumVisitLengthReturning": "مجموع مدت زمان حضور توسط بازدید کنندگان باز می گردند (بر حسب ثانیه)",
"ColumnUniqueReturningVisitors": "بازدید بازگشتی یکتا",
- "ReturnActions": "%s فعالیت توسط بازدیدهای برگشتی",
- "ReturnAverageVisitDuration": "%s متوسط مدت بازدید بازدیدکنندگان برگشتی",
- "ReturnAvgActions": "%s فعالیت به ازای هر بازدید بازگشتی",
"ReturningVisitDocumentation": "سفر بازگشت است (به عنوان مخالف به یک سفر جدید) با کسی است که حداقل یک بار قبل از بازدید از وب سایت ساخته شده است.",
"ReturningVisitsDocumentation": "این یک نمای کلی از بازدیدکننده داشته است بازگشت است.",
- "ReturnVisits": "%s بازدید های بازگشتی",
"SubmenuFrequency": "تکرار",
"WidgetGraphReturning": "گراف بازدید کننده بازگشتی",
"WidgetOverview": "نمایش تکرار"
diff --git a/plugins/VisitFrequency/lang/fi.json b/plugins/VisitFrequency/lang/fi.json
index 4bee78edcc..cbdf744972 100644
--- a/plugins/VisitFrequency/lang/fi.json
+++ b/plugins/VisitFrequency/lang/fi.json
@@ -12,13 +12,8 @@
"ColumnUniqueReturningVisitors": "Yksilölliset palaavat kävijät",
"ColumnReturningUsers": "Palaavat käyttäjät",
"PluginDescription": "Raportoi metriikat ensimmäisen kerran kävijöistä ja palaavista vierailijoista",
- "ReturnActions": "%s toimintoa palaavilta käyttäjiltä",
- "ReturnAverageVisitDuration": "%s keskimääräinen käynnin pituus palaaville kävijöille",
- "ReturnAvgActions": "%s toimintoa \/ palaava käynti",
- "ReturnBounceRate": "%s palaavista käynneistä oli lyhyitä (vain yksi sivunlataus)",
"ReturningVisitDocumentation": "Palaava käynti (vs. uusi käynti) on kävijä, joka on käynyt sivulla vähintään kerran aikaisemminkin.",
"ReturningVisitsDocumentation": "Tämä on palaavien käyntien yleiskatsaus.",
- "ReturnVisits": "%s palaavaa käyntiä",
"SubmenuFrequency": "Yleisyys",
"WidgetGraphReturning": "Palaavat käynnit",
"WidgetOverview": "Yleiskatsaus yleisyydestä"
diff --git a/plugins/VisitFrequency/lang/fr.json b/plugins/VisitFrequency/lang/fr.json
index aebc3e3169..2e90a3d1f9 100644
--- a/plugins/VisitFrequency/lang/fr.json
+++ b/plugins/VisitFrequency/lang/fr.json
@@ -12,13 +12,13 @@
"ColumnUniqueReturningVisitors": "Visiteurs uniques de retour",
"ColumnReturningUsers": "Visiteurs connus",
"PluginDescription": "Fournit des métriques à propos de vos nouveaux visiteurs et de vos visiteurs connus.",
- "ReturnActions": "%s actions de visites de visiteurs connus",
- "ReturnAverageVisitDuration": "%s durée moyenne de la visite des visiteurs connus",
- "ReturnAvgActions": "%s actions par visiteur connu",
- "ReturnBounceRate": "%s visiteurs connus ont survolé (quitté le site après une page)",
+ "ReturnActions": "actions par les visiteurs connus",
+ "ReturnAverageVisitDuration": "durée moyenne de visite pour les visiteurs connus",
+ "ReturnAvgActions": "actions par visiteur connu",
+ "ReturnBounceRate": "visiteurs connus ayant survolé (quitté le site après une page)",
"ReturningVisitDocumentation": "Une visite de retour (par opposition à une nouvelle visite) est effectuée par quelqu'un qui a déjà visité le site web au moins une fois auparavant.",
"ReturningVisitsDocumentation": "Ceci est un aperçu des visites de retour.",
- "ReturnVisits": "%s visites de visiteurs connus",
+ "ReturnVisits": "visiteurs connus",
"SubmenuFrequency": "Fréquence",
"WidgetGraphReturning": "Graphique de visites de visiteurs connus",
"WidgetOverview": "Récapitulatif de la Fréquence"
diff --git a/plugins/VisitFrequency/lang/gl.json b/plugins/VisitFrequency/lang/gl.json
index 6c6c9fc9bc..7814f0508a 100644
--- a/plugins/VisitFrequency/lang/gl.json
+++ b/plugins/VisitFrequency/lang/gl.json
@@ -1,7 +1,5 @@
{
"VisitFrequency": {
- "ReturnActions": "%s accións realizadas polos visitantes que voltaron",
- "ReturnVisits": "%s visitantes que voltaron",
"SubmenuFrequency": "Frecuencia",
"WidgetGraphReturning": "Gráfico de visitantes que volven",
"WidgetOverview": "Listado de frecuencias"
diff --git a/plugins/VisitFrequency/lang/he.json b/plugins/VisitFrequency/lang/he.json
index da419b8354..03d30056fc 100644
--- a/plugins/VisitFrequency/lang/he.json
+++ b/plugins/VisitFrequency/lang/he.json
@@ -8,11 +8,7 @@
"ColumnReturningVisits": "ביקורים חוזרים",
"ColumnSumVisitLengthReturning": "סך הזמן ע״י מבקרים חוזרים (שניות)",
"ColumnUniqueReturningVisitors": "מבקרים חוזרים ייחודיים",
- "ReturnActions": "%s פעולות ע״י ביקורים חוזרים",
- "ReturnAverageVisitDuration": "%s משך ביקור ממוצע למבקרים חוזרים",
- "ReturnAvgActions": "%s פעולות לביקור חוזר",
"ReturningVisitsDocumentation": "זו סקירה של ביקורים חוזרים.",
- "ReturnVisits": "%s ביקורים חוזרים",
"SubmenuFrequency": "תדירות",
"WidgetGraphReturning": "ביקורים חוזרים לאורך זמן",
"WidgetOverview": "סקירת תדירות"
diff --git a/plugins/VisitFrequency/lang/hi.json b/plugins/VisitFrequency/lang/hi.json
index 6d979525bd..c70aa3e00c 100644
--- a/plugins/VisitFrequency/lang/hi.json
+++ b/plugins/VisitFrequency/lang/hi.json
@@ -11,9 +11,6 @@
"ColumnSumVisitLengthReturning": "(सेकंड में) लौट आगंतुकों द्वारा खर्च किए गए कुल समय",
"ColumnUniqueReturningVisitors": "अनोखा लौट आगंतुकों",
"ColumnReturningUsers": "रिटर्निंग दौरा",
- "ReturnAverageVisitDuration": "आगंतुकों लौटने के लिए %s औसत यात्रा की अवधि",
- "ReturnAvgActions": "लौटने यात्रा के प्रति %s की कार्रवाई",
- "ReturningVisitsDocumentation": "इस लौटने यात्राओं का एक सिंहावलोकन है।",
- "ReturnVisits": "%s ओर लौटने का दौरा"
+ "ReturningVisitsDocumentation": "इस लौटने यात्राओं का एक सिंहावलोकन है।"
}
} \ No newline at end of file
diff --git a/plugins/VisitFrequency/lang/hu.json b/plugins/VisitFrequency/lang/hu.json
index fb5912e367..fe0d9b44d4 100644
--- a/plugins/VisitFrequency/lang/hu.json
+++ b/plugins/VisitFrequency/lang/hu.json
@@ -12,13 +12,8 @@
"ColumnUniqueReturningVisitors": "Egyedi visszatérő látogatók",
"ColumnReturningUsers": "Visszatérő látogatók",
"PluginDescription": "Jelentés az új és a visszatérő látogatókról.",
- "ReturnActions": "%s akció ismétlődő látogatások során",
- "ReturnAverageVisitDuration": "%s a látogatás átlagos időtartama a visszatérő látogatók esetén",
- "ReturnAvgActions": "%s akció ismétlődő látogatás során",
- "ReturnBounceRate": "%s ismétlődő látogatás végződött visszafordulással (egy weblap megtekintése után elhagyták a weboldalt)",
"ReturningVisitDocumentation": "A visszatérő látogatás (az új látogatással ellentétben) olyasvalakit jelöl, aki korábban már legalább egyszer meglátogatta a webhelyet.",
"ReturningVisitsDocumentation": "Ez egy összefoglaló nézet a visszatérő látogatásokról.",
- "ReturnVisits": "%s ismétlődő látogatás",
"SubmenuFrequency": "Gyakoriság",
"WidgetGraphReturning": "Ismétlődő látogatások diagramja",
"WidgetOverview": "Gyakoriság áttekintése"
diff --git a/plugins/VisitFrequency/lang/id.json b/plugins/VisitFrequency/lang/id.json
index d44b555ef2..b51e1c5c5d 100644
--- a/plugins/VisitFrequency/lang/id.json
+++ b/plugins/VisitFrequency/lang/id.json
@@ -12,13 +12,8 @@
"ColumnUniqueReturningVisitors": "Pengnjung kembali unik",
"ColumnReturningUsers": "Penguna kembali",
"PluginDescription": "Laporan matriks mengenai pengunjung baru dan pengunjung kembali.",
- "ReturnActions": "%s tindakan tiap kunjungan kembali",
- "ReturnAverageVisitDuration": "%s rerata waktu kunjungan pengunjung kembali",
- "ReturnAvgActions": "%s tindakan tiap kunjungan kembali",
- "ReturnBounceRate": "%s kunjungan kembali dengan pentalan (meninggalkan situs setelah kunjungan satu halaman)",
"ReturningVisitDocumentation": "Kunjungan kembali (lawan dari kunjungan baru) dibuat oleh seseorang yang telah mengunjungi situs sekali sebelumnya.",
"ReturningVisitsDocumentation": "Ini merupakan iktisar kujungan kembali.",
- "ReturnVisits": "%s kunjungan kembali",
"SubmenuFrequency": "Frekuensi",
"WidgetGraphReturning": "Grafik kunjungan kembali",
"WidgetOverview": "Iktisar Frekuensi"
diff --git a/plugins/VisitFrequency/lang/is.json b/plugins/VisitFrequency/lang/is.json
index df1821a460..4bec70d65a 100644
--- a/plugins/VisitFrequency/lang/is.json
+++ b/plugins/VisitFrequency/lang/is.json
@@ -5,11 +5,6 @@
"ColumnAvgActionsPerReturningVisit": "Meðalfj. aðgerða fyrir endurkomur",
"ColumnBounceRateForReturningVisits": "Skopphraði fyrir endurkomur",
"ColumnReturningVisits": "Endurkomur",
- "ReturnActions": "%s aðgerðir hjá endurkomum",
- "ReturnAverageVisitDuration": "%s meðalheimsóknartími fyrir endurkomur",
- "ReturnAvgActions": "%s aðgerðir á hverja endurkomu",
- "ReturnBounceRate": "%s endurkomur hafa skoppað (yfirgefið vefinn eftir eina síðu)",
- "ReturnVisits": "%s endurkomur",
"SubmenuFrequency": "Tíðni",
"WidgetGraphReturning": "Línurit yfir endurkomur",
"WidgetOverview": "Tíðniyfirlit"
diff --git a/plugins/VisitFrequency/lang/it.json b/plugins/VisitFrequency/lang/it.json
index 313e48cc90..95aa565027 100644
--- a/plugins/VisitFrequency/lang/it.json
+++ b/plugins/VisitFrequency/lang/it.json
@@ -12,13 +12,13 @@
"ColumnUniqueReturningVisitors": "Visitatori unici di ritorno",
"ColumnReturningUsers": "Utenti di Ritorno",
"PluginDescription": "Restituisce le metriche riguardanti i nuovi visitatori e quelli di ritorno.",
- "ReturnActions": "%s azioni delle visite di ritorno",
- "ReturnAverageVisitDuration": "%s media durata visita per visitatori di ritorno",
- "ReturnAvgActions": "%s azioni per visita di ritorno",
- "ReturnBounceRate": "Il %s dei visitatori di ritorno hanno rimbalzato (hanno lasciato il sito dopo aver visto una sola pagina)",
+ "ReturnActions": "azioni da visite di ritorno",
+ "ReturnAverageVisitDuration": "durata media di una visita per i visitatori di ritorno",
+ "ReturnAvgActions": "azioni per visite di ritorno",
+ "ReturnBounceRate": "visite di ritorno rimbalzate (che hanno lasciato il sito dopo una pagina)",
"ReturningVisitDocumentation": "Una visita di ritorno è fatta (al contrario di una nuova visita) da qualcuno che ha visitato il sito almeno una volta in precedenza.",
"ReturningVisitsDocumentation": "Questa è una panoramica delle visite di ritorno.",
- "ReturnVisits": "%s visite di ritorno",
+ "ReturnVisits": "visite di ritorno",
"SubmenuFrequency": "Frequenza",
"WidgetGraphReturning": "Visite di Ritorno nel Tempo",
"WidgetOverview": "Riepilogo Frequenza"
diff --git a/plugins/VisitFrequency/lang/ja.json b/plugins/VisitFrequency/lang/ja.json
index f6cc0890b9..4735915260 100644
--- a/plugins/VisitFrequency/lang/ja.json
+++ b/plugins/VisitFrequency/lang/ja.json
@@ -12,13 +12,8 @@
"ColumnUniqueReturningVisitors": "ユニークリピートビジット",
"ColumnReturningUsers": "戻ってきたユーザー",
"PluginDescription": "初めての新しいビジターやリピーターに関するレポートメトリック。",
- "ReturnActions": "%s リピートビジットによるアクション数",
- "ReturnAverageVisitDuration": "%s リピートビジットの平均ビジット継続時間",
- "ReturnAvgActions": "%s リピートビジット単位のアクション数",
- "ReturnBounceRate": "%s 直帰したリピートビジット(1ページを表示後にウェブサイトを離れた)",
"ReturningVisitDocumentation": "リピートビジットは(新規ビジットとは対照的に)、少なくとも一回は以前にウェブサイトを訪問した人によって行われます。",
"ReturningVisitsDocumentation": "リピートビジットの概観です。",
- "ReturnVisits": "%s リピートビジット",
"SubmenuFrequency": "頻度",
"WidgetGraphReturning": "リピートビジットのグラフ",
"WidgetOverview": "頻度の概観"
diff --git a/plugins/VisitFrequency/lang/ka.json b/plugins/VisitFrequency/lang/ka.json
index 40026b989b..9c30327f99 100644
--- a/plugins/VisitFrequency/lang/ka.json
+++ b/plugins/VisitFrequency/lang/ka.json
@@ -5,11 +5,6 @@
"ColumnAvgActionsPerReturningVisit": "საშ. ქმედება დაბრუნებულ ვიზიტზე",
"ColumnBounceRateForReturningVisits": "უსარგებლო შესვლები დაბრუნებული ვიზიტორებისთვის",
"ColumnReturningVisits": "დაბრუნებული ვიზიტები",
- "ReturnActions": "%s ქმედება დაბრუნებული ვიზიტების მიხედვით",
- "ReturnAverageVisitDuration": "%s ვიზიტის საშუალო ხანგრძლივობა დაბრუნებული ვიზიტებისთვის",
- "ReturnAvgActions": "%s ქმედება დაბრუნებულ ვიზიტზე",
- "ReturnBounceRate": "%s დაბრუნებული ვიზიტი იყო უსარგებლო შესვლა (ერთი გვერდის ნახვის შემდეგ გავიდა)",
- "ReturnVisits": "%s დაბრუნებული ვიზიტი",
"SubmenuFrequency": "სიხშირე",
"WidgetGraphReturning": "დაბრუნებული ვიზიტების გრაფიკი",
"WidgetOverview": "სიხშირის მიმოხილვა"
diff --git a/plugins/VisitFrequency/lang/ko.json b/plugins/VisitFrequency/lang/ko.json
index 7a5880db1c..3195c9cbb1 100644
--- a/plugins/VisitFrequency/lang/ko.json
+++ b/plugins/VisitFrequency/lang/ko.json
@@ -6,19 +6,19 @@
"ColumnBounceCountForReturningVisits": "돌아온 방문의 반송수",
"ColumnBounceRateForReturningVisits": "돌아온 방문의 반송률",
"ColumnMaxActionsInReturningVisit": "돌아온 방문당 최대 활동 수",
- "ColumnNbReturningVisitsConverted": "돌아온 방무자 수",
+ "ColumnNbReturningVisitsConverted": "돌아온 방문자 수",
"ColumnReturningVisits": "돌아온 방문 수",
"ColumnSumVisitLengthReturning": "리피터의 총 머문 시간 (초)",
"ColumnUniqueReturningVisitors": "고유한 돌아온 방문자",
"ColumnReturningUsers": "돌아온 사용자",
"PluginDescription": "처음 방문한 방문자와 다시 돌아온 방문자에 대한",
- "ReturnActions": "%s 돌아온 방문의 활동",
- "ReturnAverageVisitDuration": "%s 돌아온 방문자의 평균 방문 시간",
- "ReturnAvgActions": "%s 돌아온 방문당 활동",
- "ReturnBounceRate": "%s 돌아온 방문의 반송률 (첫 페이지에서 이탈)",
+ "ReturnActions": "재방문에 의한 활동",
+ "ReturnAverageVisitDuration": "돌아온 방문자의 평균 방문 시간",
+ "ReturnAvgActions": "재방문 당 활동",
+ "ReturnBounceRate": "돌아온 방문의 반송률 (첫 페이지에서 이탈)",
"ReturningVisitDocumentation": "돌아온 방문은 (신규 방문과는 대조적으로), 적어도 한 번은 이전에 웹 사이트를 방문한 사람에 의해 이루어집니다.",
"ReturningVisitsDocumentation": "돌아온 방문 개요입니다.",
- "ReturnVisits": "%s 돌아온 방문",
+ "ReturnVisits": "재방문",
"SubmenuFrequency": "빈도",
"WidgetGraphReturning": "돌아온 방문 수 그래프",
"WidgetOverview": "빈도 개요"
diff --git a/plugins/VisitFrequency/lang/lt.json b/plugins/VisitFrequency/lang/lt.json
index bebd734943..6109733a0a 100644
--- a/plugins/VisitFrequency/lang/lt.json
+++ b/plugins/VisitFrequency/lang/lt.json
@@ -5,11 +5,6 @@
"ColumnAvgActionsPerReturningVisit": "Vidutiniškai atlikta sugrįžtančio lankytojo veiksmų",
"ColumnBounceRateForReturningVisits": "Šoklumo reitingas tarp sugrįžtančių",
"ColumnReturningVisits": "Sugrįžtančių apsilankymai",
- "ReturnActions": "%s sugrįžtančių veiksmai",
- "ReturnAverageVisitDuration": "%s sugrįžtančio lankytojo apsilankymo trukmės vidurkis",
- "ReturnAvgActions": "%s veiksmų iš sugrįžtančio lankytojo",
- "ReturnBounceRate": "%s šoklumo reitingas tarp sugrįžtančių (paliko svetainę po pirmojo puslapio)",
- "ReturnVisits": "%s sugrįžtančių apsilankymai",
"SubmenuFrequency": "Pasikartojimai",
"WidgetGraphReturning": "Sugrįžtančių grafikas",
"WidgetOverview": "Pasikartojimų peržiūra"
diff --git a/plugins/VisitFrequency/lang/nb.json b/plugins/VisitFrequency/lang/nb.json
index 204710d88b..2e9ed196b2 100644
--- a/plugins/VisitFrequency/lang/nb.json
+++ b/plugins/VisitFrequency/lang/nb.json
@@ -12,13 +12,8 @@
"ColumnUniqueReturningVisitors": "Unike tilbakevendende besøkere",
"ColumnReturningUsers": "Tilbakevendende brukere",
"PluginDescription": "Rapporterer tall om dine nye og tilbakevendende besøkere.",
- "ReturnActions": "%s handlinger av de tilbakevendende besøkerne",
- "ReturnAverageVisitDuration": "%s gj.snitt. besøksvarighet for tilbakevendende besøk",
- "ReturnAvgActions": "%s handlinger per tilbakevendende besøk",
- "ReturnBounceRate": "%s tilbakevendende besøk har sprettet (forlatt siden etter en side).",
"ReturningVisitDocumentation": "Et tilbakevendende besøk (i motsetning til et nytt besøk) er gjort av noen som har besøkt nettstedet minst én gang før.",
"ReturningVisitsDocumentation": "Dette er en oversikt over tilbakevendende besøk.",
- "ReturnVisits": "%s tilbakevendende besøk",
"SubmenuFrequency": "Frekvens",
"WidgetGraphReturning": "Tilbakevendende besøk over tid",
"WidgetOverview": "Frekvens-oversikt"
diff --git a/plugins/VisitFrequency/lang/nl.json b/plugins/VisitFrequency/lang/nl.json
index 5b88515e09..5934ba705e 100644
--- a/plugins/VisitFrequency/lang/nl.json
+++ b/plugins/VisitFrequency/lang/nl.json
@@ -12,13 +12,8 @@
"ColumnUniqueReturningVisitors": "Unieke terugkerende bezoekers",
"ColumnReturningUsers": "Terugkerende Gebruikers",
"PluginDescription": "Rapporteert metrics over nieuwe bezoekers en terugkerende bezoekers.",
- "ReturnActions": "%s acties tijdens terugkerende bezoeken",
- "ReturnAverageVisitDuration": "%s gemiddelde duur bezoek voor terugkerende bezoekers",
- "ReturnAvgActions": "%s acties per terugkerend bezoek",
- "ReturnBounceRate": "%s terugkerende bezoeken die de website verlieten na één pagina.",
"ReturningVisitDocumentation": "Een terugkerend bezoek is (in tegenstelling tot een nieuw bezoek) gemaakt door iemand die de website teminste één keer eerder heeft bezocht.",
"ReturningVisitsDocumentation": "Dit is een overzicht van de terugkerende bezoekers.",
- "ReturnVisits": "%s terugkerende bezoeken",
"SubmenuFrequency": "Frequentie",
"WidgetGraphReturning": "Grafiek terugkerende bezoeken",
"WidgetOverview": "Frequentie overzicht"
diff --git a/plugins/VisitFrequency/lang/nn.json b/plugins/VisitFrequency/lang/nn.json
index 46ca22a839..3db7bc6a37 100644
--- a/plugins/VisitFrequency/lang/nn.json
+++ b/plugins/VisitFrequency/lang/nn.json
@@ -4,10 +4,6 @@
"ColumnAvgActionsPerReturningVisit": "Gjen. handlingar per tilbakevendande vitjing",
"ColumnBounceRateForReturningVisits": "Hopprate for Tilbakevendande Vitjarar",
"ColumnReturningVisits": "Tilbakevendande Vitjarar",
- "ReturnActions": "%s handlingar frå dei tilbakevendande vitjarane",
- "ReturnAvgActions": "%s handlingar per tilbakevendande vitjing",
- "ReturnBounceRate": "%s tilbakevendande vitjarar hev hoppa (forsvunne frå nettstaden etter ei sidevising)",
- "ReturnVisits": "%s tilbakevendande vitjingar",
"SubmenuFrequency": "Frekvens",
"WidgetGraphReturning": "Graf tilbakevendande vitjarar",
"WidgetOverview": "Frekvensoversikt"
diff --git a/plugins/VisitFrequency/lang/pl.json b/plugins/VisitFrequency/lang/pl.json
index c8b8aadc05..81f9bfec0a 100644
--- a/plugins/VisitFrequency/lang/pl.json
+++ b/plugins/VisitFrequency/lang/pl.json
@@ -8,11 +8,6 @@
"ColumnReturningVisits": "Powtórne odwiedziny",
"ColumnSumVisitLengthReturning": "Całkowity czas spędzony przez powracających użytkowników (w sekundach)",
"ColumnReturningUsers": "Powracający Użytkownicy",
- "ReturnActions": "%s działań przypadających na powtórne odwiedziny",
- "ReturnAverageVisitDuration": "%s średni czas trwania odwiedzin przy powtórnych odsłonach",
- "ReturnAvgActions": "%s działań przypadających na powtórne odwiedziny",
- "ReturnBounceRate": "%s powtórnych odsłon które zostały odrzucone (opuścili serwis po wizycie na jednej stronie)",
- "ReturnVisits": "%s powtórnych wizyt",
"SubmenuFrequency": "Częstotliwość",
"WidgetGraphReturning": "Wykres powtórnych odwiedzin",
"WidgetOverview": "Częstotliwość przeglądania"
diff --git a/plugins/VisitFrequency/lang/pt-br.json b/plugins/VisitFrequency/lang/pt-br.json
index d918330170..f7358f427b 100644
--- a/plugins/VisitFrequency/lang/pt-br.json
+++ b/plugins/VisitFrequency/lang/pt-br.json
@@ -12,13 +12,12 @@
"ColumnUniqueReturningVisitors": "Visitantes únicos que retornaram",
"ColumnReturningUsers": "Usuários que Voltaram",
"PluginDescription": "Informa métricas sobre sua primeira vez, novos visitantes e visitantes que voltaram.",
- "ReturnActions": "%s ações por visitante de retorno",
- "ReturnAverageVisitDuration": "%s média da duração da visita para visitantes que retornam",
- "ReturnAvgActions": "%s ações por visita retornada",
- "ReturnBounceRate": "%s visitantes de retorno rejeitaram (deixaram o website após uma página)",
+ "ReturnActions": "ações por visitas retornadas",
+ "ReturnAverageVisitDuration": "média da duração da visita por visitantes que retornaram",
+ "ReturnAvgActions": "ações por visita retornada",
"ReturningVisitDocumentation": "Uma visita de retorno é (em oposição a uma nova visita) feito por alguém que tenha visitado o site pelo menos uma vez antes.",
"ReturningVisitsDocumentation": "Esta é uma visão geral das visitas de retorno.",
- "ReturnVisits": "%s visitantes de retorno",
+ "ReturnVisits": "visitas de retorno",
"SubmenuFrequency": "Frequência",
"WidgetGraphReturning": "Gráfico de Visitantes de Retorno",
"WidgetOverview": "Visão Geral da Frequência"
diff --git a/plugins/VisitFrequency/lang/pt.json b/plugins/VisitFrequency/lang/pt.json
index 1a5589bc8c..40c8401d48 100644
--- a/plugins/VisitFrequency/lang/pt.json
+++ b/plugins/VisitFrequency/lang/pt.json
@@ -10,13 +10,8 @@
"ColumnReturningVisits": "Visitas de Retorno",
"ColumnSumVisitLengthReturning": "Tempo total passado por visitantes de retorno (em segundos)",
"ColumnUniqueReturningVisitors": "Visitas de retorno únicas",
- "ReturnActions": "%s ações pelos visitantes de retorno",
- "ReturnAverageVisitDuration": "%s duração média de visita por visitantes de retorno",
- "ReturnAvgActions": "%s ações por visita de retorno",
- "ReturnBounceRate": "%s visitas de retorno ressaltaram (saíram do website depois de uma página)",
"ReturningVisitDocumentation": "Uma visita de retorno é (em oposição a uma nova visita) feita por alguém que já visitou o site pelo menos uma vez antes.",
"ReturningVisitsDocumentation": "Isto é uma visão geral das visitas de returno",
- "ReturnVisits": "%s visitantes de retorno",
"SubmenuFrequency": "Frequência",
"WidgetGraphReturning": "Gráfico de visitantes de retorno",
"WidgetOverview": "Visão geral da frequência"
diff --git a/plugins/VisitFrequency/lang/ro.json b/plugins/VisitFrequency/lang/ro.json
index 5083cc1f8e..63a71f5eaa 100644
--- a/plugins/VisitFrequency/lang/ro.json
+++ b/plugins/VisitFrequency/lang/ro.json
@@ -10,13 +10,8 @@
"ColumnReturningVisits": "Reintoarcere vizite",
"ColumnSumVisitLengthReturning": "Timpul total petrecut de vizitatori reintorsi (în secunde",
"ColumnUniqueReturningVisitors": "Vizitatori unici se reîntorc",
- "ReturnActions": "%s actiuni ale vizitatorilor intorsi",
- "ReturnAverageVisitDuration": "%s Durata medie de vizita pentru retintoacerea vizitelor",
- "ReturnAvgActions": "%s acțiuni pe revenirea vizita",
- "ReturnBounceRate": "%s vizite reîntoarse au sărit (au părăsit site-ul după o singură pagină)",
"ReturningVisitDocumentation": "O vizită reventoarsa este ( spre deosebire de o nouă vizită) realizate de către cineva care a vizitat site-ul cel puțin o dată înainte.",
"ReturningVisitsDocumentation": "Aceasta este o imagine de ansamblu a vizitelor care se întorc.",
- "ReturnVisits": "%s vizitatori intorsi",
"SubmenuFrequency": "Frecventa",
"WidgetGraphReturning": "Graficul vizitelor intoarse",
"WidgetOverview": "Rezumat periodic"
diff --git a/plugins/VisitFrequency/lang/ru.json b/plugins/VisitFrequency/lang/ru.json
index dc2857b997..ae8b0fd83f 100644
--- a/plugins/VisitFrequency/lang/ru.json
+++ b/plugins/VisitFrequency/lang/ru.json
@@ -11,13 +11,8 @@
"ColumnSumVisitLengthReturning": "Общее время, проведенное вернувшимися посетителями (в секундах)",
"ColumnUniqueReturningVisitors": "Уникальные вернувшиеся посетители",
"ColumnReturningUsers": "Вернувшиеся пользователи",
- "ReturnActions": "%s действий за повторные посещения",
- "ReturnAverageVisitDuration": "%s средняя продолжительность посещения возвратившимся пользователями",
- "ReturnAvgActions": "%s действий за повторное посещение",
- "ReturnBounceRate": "%s раз пользователи отскочили (вышли после просмотра одной страницы)",
"ReturningVisitDocumentation": "Вернувшийся посетитель (не путать с новым посещением) - это тот, кто хотя бы раз посещал сайт ранее.",
"ReturningVisitsDocumentation": "Это обзор повторных (вернувшихся) посещений.",
- "ReturnVisits": "%s повторных посещений",
"SubmenuFrequency": "Частота",
"WidgetGraphReturning": "График повторных посещений",
"WidgetOverview": "Обзор частоты посещений"
diff --git a/plugins/VisitFrequency/lang/sk.json b/plugins/VisitFrequency/lang/sk.json
index f021e634c6..ea8c6df76e 100644
--- a/plugins/VisitFrequency/lang/sk.json
+++ b/plugins/VisitFrequency/lang/sk.json
@@ -5,11 +5,6 @@
"ColumnAvgActionsPerReturningVisit": "Priemerný čas pre vracajúcich sa návštevníkov (v sekundách)",
"ColumnBounceRateForReturningVisits": "Miera odskočení vracajúcich sa návštev",
"ColumnReturningVisits": "Vracajúce sa návštevy",
- "ReturnActions": "počet akcií vracajúcich sa: %s",
- "ReturnAverageVisitDuration": "%s priemerná dĺžka návštevy u vracajúcich sa návštevníkov",
- "ReturnAvgActions": "%s akcie pre vracajúcej sa návšteve",
- "ReturnBounceRate": "%s vracajúcich sa návštev odskočilo (odišli po zobrazení jednej stránky)",
- "ReturnVisits": "počet vracajúcich sa: %s",
"SubmenuFrequency": "Frekvencia",
"WidgetGraphReturning": "Graf vracajúcich sa",
"WidgetOverview": "Prehľad frekvencií"
diff --git a/plugins/VisitFrequency/lang/sl.json b/plugins/VisitFrequency/lang/sl.json
index 59ae9ed4e8..7d26cf7f3d 100644
--- a/plugins/VisitFrequency/lang/sl.json
+++ b/plugins/VisitFrequency/lang/sl.json
@@ -2,11 +2,6 @@
"VisitFrequency": {
"ColumnAvgActionsPerReturningVisit": "Povpr. število akcij na ponovni obisk",
"ColumnReturningVisits": "Ponovni obiski",
- "ReturnActions": "%s akcij od ponovnih obiskov",
- "ReturnAverageVisitDuration": "%s povprečno trajanje obiska pri ponovnem obiskovalcu",
- "ReturnAvgActions": "%s akcij na ponovni obisk",
- "ReturnBounceRate": "%s ponovnih obiskov je bilo odbojev (so zapustili stran po ogledu ene strani)",
- "ReturnVisits": "%s ponovnih obiskov",
"SubmenuFrequency": "Frekvenca",
"WidgetGraphReturning": "Ponovni obiski",
"WidgetOverview": "Frekvenčni pregled"
diff --git a/plugins/VisitFrequency/lang/sq.json b/plugins/VisitFrequency/lang/sq.json
index 92027d1642..58a0ef2dd2 100644
--- a/plugins/VisitFrequency/lang/sq.json
+++ b/plugins/VisitFrequency/lang/sq.json
@@ -1,26 +1,26 @@
{
"VisitFrequency": {
"ColumnActionsByReturningVisits": "Veprime nga Vizita Rikthim",
- "ColumnAverageVisitDurationForReturningVisitors": "Mesatare Zgjatjeje Vizite për Vizitorë të Rikthyer (në sekonda)",
+ "ColumnAverageVisitDurationForReturningVisitors": "Mesatare Kohëzgjatjeje Vizite për Vizitorë të Rikthyer (në sekonda)",
"ColumnAvgActionsPerReturningVisit": "Mesatare Veprimesh për vizita të Rikthyerish",
"ColumnBounceCountForReturningVisits": "Numër Kthimesh për Vizita Me Rikthim",
"ColumnBounceRateForReturningVisits": "Mesatare Kthimesh për Vizita Rikthim",
"ColumnMaxActionsInReturningVisit": "Maksimum veprimesh në një vizitë rikthim",
"ColumnNbReturningVisitsConverted": "Numër vizitash me rikthim të shndërruara",
"ColumnReturningVisits": "Vizita Rikthim",
- "ColumnSumVisitLengthReturning": "Kohë e shpenzuar nga vizitorë të rikthyer (në sekonda) gjithsej",
+ "ColumnSumVisitLengthReturning": "Kohë gjithsej shpenzuar nga vizitorë të rikthyer (në sekonda)",
"ColumnUniqueReturningVisitors": "Vizitorë të rikthyer unikë",
"ColumnReturningUsers": "Përdorues të Rikthyer",
- "PluginDescription": "Raporton matje mbi vizitorë të rinj që vijnë për herë të parë dhe vizitorë të rikthyer.",
- "ReturnActions": "%s veprime nga vizita rikthim",
- "ReturnAverageVisitDuration": "%s mesatare zgjatjeje vizite për vizitorë të rikthyer",
- "ReturnAvgActions": "%s veprime për vizitë të rikthyer",
- "ReturnBounceRate": "janë kthyer mbrapsht %s vizita rikthim (e kanë lënë sajtin pas një faqeje)",
+ "PluginDescription": "Raporton vlera mbi vizitorë të rinj që vijnë për herë të parë dhe vizitorë të rikthyer.",
+ "ReturnActions": "veprime sipas vizitash rikthim",
+ "ReturnAverageVisitDuration": "kohëzgjatje mesatare vizitash për vizitorë të rikthyer",
+ "ReturnAvgActions": "veprime për vizitë të rikthyer",
+ "ReturnBounceRate": "vizita rikthim që janë kthyer mbrapsht (e kanë lënë sajtin pas një faqeje)",
"ReturningVisitDocumentation": "Vizitë rikthim (ndryshe nga një vizitë e re) është e bërë nga dikush që e ka vizituar sajtin të paktën një herë më përpara.",
- "ReturningVisitsDocumentation": "Kjo është një përmbledhje e vizitave rikthim",
- "ReturnVisits": "%s vizita rikthim",
+ "ReturningVisitsDocumentation": "Kjo është një përmbledhje e vizitave rikthim.",
+ "ReturnVisits": "vizita rikthim",
"SubmenuFrequency": "Shpeshti",
- "WidgetGraphReturning": "Grafik Vizitash Rikthim",
+ "WidgetGraphReturning": "Grafik Rrjedhe Vizitash Rikthim",
"WidgetOverview": "Përmbledhje Shpeshtie"
}
} \ No newline at end of file
diff --git a/plugins/VisitFrequency/lang/sr.json b/plugins/VisitFrequency/lang/sr.json
index 8e9192aa92..0b44889851 100644
--- a/plugins/VisitFrequency/lang/sr.json
+++ b/plugins/VisitFrequency/lang/sr.json
@@ -12,13 +12,13 @@
"ColumnUniqueReturningVisitors": "Jedinstvenih ponovnih posetilaca",
"ColumnReturningUsers": "Posetioci koji se vraćaju",
"PluginDescription": "Podaci o posetiocima koji us prvi put na vašem sajtu i onima koji se vraćaju.",
- "ReturnActions": "Broj akcija od strane ponovnih poseta: %s",
- "ReturnAverageVisitDuration": "Prosečno trajanje posete od strane ponovnih posetilaca: %s",
- "ReturnAvgActions": "Broj akcija po ponovnoj poseti: %s",
- "ReturnBounceRate": "Broj poseta koje su odbijene (napustile sajt posle samo jedne stranice) %s",
+ "ReturnActions": "akcije od strane ponovnih poseta",
+ "ReturnAverageVisitDuration": "prosečno trajanje posete od strane ponovnih posetilaca",
+ "ReturnAvgActions": "akcije po ponovnoj poseti",
+ "ReturnBounceRate": "broj poseta koje su se odbile (napustile sajt posle samo jedne stranice)",
"ReturningVisitDocumentation": "Posetioc koji se vraća je (za razliku od novog posetioca) neko ko je bar jednom posetio sajt u prošlosti.",
"ReturningVisitsDocumentation": "Ovo je pregled posetilaca koji se vraćaju",
- "ReturnVisits": "Broj ponovnih poseta: %s",
+ "ReturnVisits": "ponovne posete",
"SubmenuFrequency": "Učestalost",
"WidgetGraphReturning": "Grafikon ponovnih poseta",
"WidgetOverview": "Pregled učestalosti"
diff --git a/plugins/VisitFrequency/lang/sv.json b/plugins/VisitFrequency/lang/sv.json
index 6a03383e62..e3fc788ba1 100644
--- a/plugins/VisitFrequency/lang/sv.json
+++ b/plugins/VisitFrequency/lang/sv.json
@@ -12,13 +12,8 @@
"ColumnUniqueReturningVisitors": "Unika återkommande besökare",
"ColumnReturningUsers": "Återkommande användare",
"PluginDescription": "Rapport om förstagångsbesökare och återkommande användare.",
- "ReturnActions": "%s händelser av de återkommande besöken",
- "ReturnAverageVisitDuration": "%s genomsnittlig besökstid för återkommande besökare",
- "ReturnAvgActions": "%s händelser per återkommande besök",
- "ReturnBounceRate": "%s återkommande besök har studsat (lämnat efter en sidvisning)",
"ReturningVisitDocumentation": "Ett återkommande besök är (till skillnad från ett nytt besök) en besökare som besökt webbplatsen minst en gång tidigare.",
"ReturningVisitsDocumentation": "Detta är en översikt av återkommande besök.",
- "ReturnVisits": "%s återkommande besök",
"SubmenuFrequency": "Frekvens",
"WidgetGraphReturning": "Graf över återkommande besök",
"WidgetOverview": "Frekvensöversikt"
diff --git a/plugins/VisitFrequency/lang/th.json b/plugins/VisitFrequency/lang/th.json
index 2073ede04c..da58d52024 100644
--- a/plugins/VisitFrequency/lang/th.json
+++ b/plugins/VisitFrequency/lang/th.json
@@ -5,11 +5,6 @@
"ColumnAvgActionsPerReturningVisit": "เฉลี่ยการดำเนินการต่อกลับมาเข้าชม",
"ColumnBounceRateForReturningVisits": "อัตราการเด้งของผู้เข้าชมที่กลับมา",
"ColumnReturningVisits": "ผู้เข้าชมที่กลับมา",
- "ReturnActions": "%s ดำเนินการโดยการกลับมาเข้าชม",
- "ReturnAverageVisitDuration": "%s ค่าเฉลี่ยของเข้าเข้าชมระยะเวลาสำหรับการส่งกลับผู้เข้าชม",
- "ReturnAvgActions": "%s ดำเนินต่อกลับมาเข้าชม",
- "ReturnBounceRate": "%s ที่กลับมาเข้าชมได้ (ซ้ายเว็บไซต์หลังจากหนึ่งหน้า)",
- "ReturnVisits": "%s กลับมาเข้าชม",
"SubmenuFrequency": "ความถี่ของผู้เข้าชม",
"WidgetGraphReturning": "กราฟของผู้เข้าชม",
"WidgetOverview": "ภาพรวมความถี่ผู้เข้าชมที่กลับมา"
diff --git a/plugins/VisitFrequency/lang/tl.json b/plugins/VisitFrequency/lang/tl.json
index 111567881d..9460507647 100644
--- a/plugins/VisitFrequency/lang/tl.json
+++ b/plugins/VisitFrequency/lang/tl.json
@@ -10,13 +10,8 @@
"ColumnReturningVisits": "Mga bumabalik na pagbisita",
"ColumnSumVisitLengthReturning": "Kabuuang oras na ginugol ng mga bumabalik na bisita (sa segundo)",
"ColumnUniqueReturningVisitors": "Natatanging mga bumabalik na bisita",
- "ReturnActions": "Mga pagkilos %s ng mga bumabalik na mga bisita.",
- "ReturnAverageVisitDuration": "%s ang karaniwang tagal ng pagbisita para sa mga bumabalik na bisita",
- "ReturnAvgActions": "pagkilos %s bawat bumabalik na pagbisita",
- "ReturnBounceRate": "%s pagbalikna pagbisita ay nagbounce (umalis sa website pagkatapos ng isang pahina)",
"ReturningVisitDocumentation": "Ang muling pagbisita ay (kumpara sa isang bagong pagbisita) na ginawa ng isang tao na binisita ang website ng hindi bababa sa isang beses bago.",
"ReturningVisitsDocumentation": "Ito ay isang pangkalahatang-ideya sa mga bumabalik na pagbisita.",
- "ReturnVisits": "%s mga bumabalik na mga pagbisita",
"SubmenuFrequency": "Kadalasan",
"WidgetGraphReturning": "Mga bumabalik na pagbisita sa paglipas ng panahon",
"WidgetOverview": "Frequency Overview"
diff --git a/plugins/VisitFrequency/lang/tr.json b/plugins/VisitFrequency/lang/tr.json
index 45b4c613f9..133eb9bc3a 100644
--- a/plugins/VisitFrequency/lang/tr.json
+++ b/plugins/VisitFrequency/lang/tr.json
@@ -12,13 +12,8 @@
"ColumnUniqueReturningVisitors": "Tekil geri gelen ziyaretçi sayısı",
"ColumnReturningUsers": "Geri Gelen Kullanıcılar",
"PluginDescription": "İlk kez gelen ziyaretçiler ile geri gelen ziyaretçi ölçeklerini raporlar.",
- "ReturnActions": "Geri gelen ziyaretlerin eylemleri %s",
- "ReturnAverageVisitDuration": "Geri gelen ziyaretçilerin ortalama ziyaret süresi %s",
- "ReturnAvgActions": "Her geri gelen ziyaret için %s eylem",
- "ReturnBounceRate": "%s geri gelen ziyaret sekti (bir sayfadan sonra siteyi terk etti)",
"ReturningVisitDocumentation": "Geri gelen ziyaret (yeni ziyaretten farklı olarak) daha önce siteyi en az bir kez ziyaret etmiş birisi tarafından yapılır.",
"ReturningVisitsDocumentation": "Geri gelen ziyaretlerin özeti.",
- "ReturnVisits": "%s geri gelen ziyaret",
"SubmenuFrequency": "Sıklık",
"WidgetGraphReturning": "Zamana Göre Geri Gelen Ziyaretler",
"WidgetOverview": "Sıklık Özeti"
diff --git a/plugins/VisitFrequency/lang/uk.json b/plugins/VisitFrequency/lang/uk.json
index f27b04150f..b0e4bc89ca 100644
--- a/plugins/VisitFrequency/lang/uk.json
+++ b/plugins/VisitFrequency/lang/uk.json
@@ -12,13 +12,8 @@
"ColumnUniqueReturningVisitors": "Унікальні відвідувачі що повернулися",
"ColumnReturningUsers": "Відвідувачі що повернулися",
"PluginDescription": "Звіти метрик нових відвідувачів і постійних відвідувачів.",
- "ReturnActions": "%s переглядів сторінок повторними відвідувачами",
- "ReturnAverageVisitDuration": "%s середня тривалість візиту для повторного відвідувача",
- "ReturnAvgActions": "%s дій на повнорного відвідувача",
- "ReturnBounceRate": "%s повторних відвідувачів відмовили (залишили веб-сайт після перегляду одніє сторінки)",
"ReturningVisitDocumentation": "Повторний візит (на відміну від нового візиту) зробленого кимось, хто відвідував сайт хоча б один раз.",
"ReturningVisitsDocumentation": "Це огляд візитів що повернулися.",
- "ReturnVisits": "%s повторних відвідувань",
"SubmenuFrequency": "Частота",
"WidgetGraphReturning": "Графік повторних відвідувань",
"WidgetOverview": "Огляд частоти"
diff --git a/plugins/VisitFrequency/lang/vi.json b/plugins/VisitFrequency/lang/vi.json
index af35016631..c660a72a9f 100644
--- a/plugins/VisitFrequency/lang/vi.json
+++ b/plugins/VisitFrequency/lang/vi.json
@@ -10,13 +10,8 @@
"ColumnReturningVisits": "Các lượt truy cập quay lại",
"ColumnSumVisitLengthReturning": "Tổng số thời gian dành cho khách truy cập quay lại (tính bằng giây)",
"ColumnUniqueReturningVisitors": "Các khách truy cập quay lại duy nhất (unique)",
- "ReturnActions": "%s hành động của các lượt truy cập quay lại",
- "ReturnAverageVisitDuration": "thời gian truy cập trung bình %s cho các khách truy cập quay lại",
- "ReturnAvgActions": "%s Hành động của mỗi lượt truy cập quay lại",
- "ReturnBounceRate": "%s lượt truy cập quay lại đã bị thải hồi (rời khỏi trang web sau mỗi lượt truy cập trang)",
"ReturningVisitDocumentation": "Một truy cập quay lại (trái ngược với một truy cập mới) được thực hiện bởi một người nào đó đã truy cập trang web ít nhất một lần trước đó.",
"ReturningVisitsDocumentation": "Đây là một tổng quan của các lượt truy cập quay lại.",
- "ReturnVisits": "%s Lượt truy cập quay lại",
"SubmenuFrequency": "Tần xuất",
"WidgetGraphReturning": "Các lượt truy cập quay lại theo thời gian",
"WidgetOverview": "Tần xuất tổng quan"
diff --git a/plugins/VisitFrequency/lang/zh-cn.json b/plugins/VisitFrequency/lang/zh-cn.json
index 82fdc19713..a284130d1e 100644
--- a/plugins/VisitFrequency/lang/zh-cn.json
+++ b/plugins/VisitFrequency/lang/zh-cn.json
@@ -10,13 +10,8 @@
"ColumnReturningVisits": "老访客的访问次数",
"ColumnSumVisitLengthReturning": "老访客总的停留时间 (秒)",
"ColumnUniqueReturningVisitors": "独立重访客数",
- "ReturnActions": "%s 个老访客的活动次数",
- "ReturnAverageVisitDuration": "%s 老访客的平均停留时间",
- "ReturnAvgActions": "%s 个老访客的平均活动次数",
- "ReturnBounceRate": "%s 老访客的跳出率 (浏览一个页面后就离开)",
"ReturningVisitDocumentation": "老访客 (相对于新访客) 指至少访问过这个网站一次的访客。",
"ReturningVisitsDocumentation": "这是老访客的总表。",
- "ReturnVisits": "%s 个老访客的访问次数",
"SubmenuFrequency": "频率",
"WidgetGraphReturning": "老访客趋势",
"WidgetOverview": "频率总表"
diff --git a/plugins/VisitFrequency/lang/zh-tw.json b/plugins/VisitFrequency/lang/zh-tw.json
index 6072a3a2b4..39cb4e6b91 100644
--- a/plugins/VisitFrequency/lang/zh-tw.json
+++ b/plugins/VisitFrequency/lang/zh-tw.json
@@ -5,11 +5,6 @@
"ColumnAvgActionsPerReturningVisit": "每個重返造訪的平均活動數",
"ColumnBounceRateForReturningVisits": "回訪客的跳出率",
"ColumnReturningVisits": "重返造訪",
- "ReturnActions": "%s 個活動數由重返造訪所產生",
- "ReturnAverageVisitDuration": "%s 重返造訪的平均訪問時間",
- "ReturnAvgActions": "%s 個活動數每個重返造訪",
- "ReturnBounceRate": "回訪客跳出率 %s(僅瀏覽一頁便離站)",
- "ReturnVisits": "%s 個重返造訪數",
"SubmenuFrequency": "造訪頻率",
"WidgetGraphReturning": "重返造訪圖表",
"WidgetOverview": "造訪頻率總覽"
diff --git a/plugins/VisitTime/lang/sq.json b/plugins/VisitTime/lang/sq.json
index cfe9e5b673..2ed8a9e918 100644
--- a/plugins/VisitTime/lang/sq.json
+++ b/plugins/VisitTime/lang/sq.json
@@ -10,7 +10,7 @@
"SubmenuTimes": "Kohë",
"VisitsByDayOfWeek": "Vizita sipas Ditëve të Javës",
"WidgetByDayOfWeekDocumentation": "Ky grafik shfaq numrin e vizitave që pati sajti juaj në çdo ditë të javës.",
- "WidgetLocalTime": "Vizita sipas kohës vendore",
+ "WidgetLocalTime": "Vizita sipas Kohës Vendore",
"WidgetLocalTimeDocumentation": "Ky grafik shfaq kohën sipas %1$s zonës kohore të vizitorit %2$s kur ka ndodhur një vizitë.",
"WidgetServerTime": "Vizita sipas Kohës së Shërbyesit",
"WidgetServerTimeDocumentation": "Ky grafik shfaq kohën sipas %1$s zonës kohore të shërbyesit %2$s kur ka ndodhur një vizitë."
diff --git a/plugins/VisitTime/lang/tr.json b/plugins/VisitTime/lang/tr.json
index b65d81deb5..d33329b705 100644
--- a/plugins/VisitTime/lang/tr.json
+++ b/plugins/VisitTime/lang/tr.json
@@ -5,12 +5,12 @@
"DayOfWeek": "Haftanın günü",
"LocalTime": "Yerel saat başına ziyaretler",
"NHour": "%sh",
- "PluginDescription": "Ziyaretçi siteyi veya uygulamayı görüntülediğinde yerel ve sunucu zamanını raporla.",
- "ServerTime": "yerel sunucu başına ziyaretler",
+ "PluginDescription": "Ziyaretçinin web sitesi ya da uygulamayı görüntülediği andaki yerel ve sunucu saatinin bildirilmesini sağlar.",
+ "ServerTime": "Sunucu saati başına ziyaretler",
"SubmenuTimes": "Zamanlar",
- "VisitsByDayOfWeek": "Haftanın günlerine göre Ziyaretler",
- "WidgetByDayOfWeekDocumentation": "Bu grafik sitenizin haftanın her günü için aldığı ziyaret sayılarını gösterir",
- "WidgetLocalTime": "Yerel saate göre Ziyaretler",
- "WidgetServerTime": "Sunucu saatine göre Ziyaretler"
+ "VisitsByDayOfWeek": "Haftanın Günlerine Göre Ziyaretler",
+ "WidgetByDayOfWeekDocumentation": "Bu çizelge sitenize haftanın günlerinde yapılan ziyaret sayılarını görüntüler.",
+ "WidgetLocalTime": "Yerel Saate Göre Ziyaretler",
+ "WidgetServerTime": "Sunucu Saatine Göre Ziyaretler"
}
} \ No newline at end of file
diff --git a/plugins/VisitorInterest/lang/sq.json b/plugins/VisitorInterest/lang/sq.json
index 0aa24bf686..0cdffc7cc0 100644
--- a/plugins/VisitorInterest/lang/sq.json
+++ b/plugins/VisitorInterest/lang/sq.json
@@ -15,10 +15,10 @@
"VisitsPerNbOfPages": "Vizita sipas numrit të faqeve",
"WidgetLengths": "Gjatësi Vizitash",
"WidgetLengthsDocumentation": "Në këtë raport, mund të shihni vizita sipas një kohëzgjatje të caktuar. Fillimisht, ky raport shfaqet si re etiketash, me zgjatjet më të shpeshta të treguara me shkronja më të mëdha.",
- "WidgetPages": "Faqe për vizitë",
+ "WidgetPages": "Faqe për Vizitë",
"WidgetPagesDocumentation": "Në këtë raport, mund të shihni sa vizitorë panë një numër të dhënë faqesh. Fillimisht, ky raport shfaqet si re etiketash, me numrat më të shpeshtë të faqeve të treguara me shkronja më të mëdha.",
"WidgetVisitsByDaysSinceLast": "Vizita sipas Ditës Që Nga Vizita e Fundit",
"WidgetVisitsByDaysSinceLastDocumentation": "Në këtë raport, mund të shihni se sa vizita kanë qenë prej vizitorësh vizita e fundit e të cilëve ka ndodhur një numër ditësh më parë.",
- "WidgetVisitsByNumDocumentation": "Në këtë raport, mund të shihni numrin e vizitave që kanë qenë vizita e N-të, d.m.th. vizitorët që e kanë vizituar sajtin tuaj të paktën N herë."
+ "WidgetVisitsByNumDocumentation": "Në këtë raport, mund të shihni numrin e vizitave që kanë qenë vizita e N-të, domethënë, vizitorët që e kanë vizituar sajtin tuaj të paktën N herë."
}
} \ No newline at end of file
diff --git a/plugins/VisitsSummary/VisitsSummary.php b/plugins/VisitsSummary/VisitsSummary.php
index 9bb86de374..b610b070c7 100644
--- a/plugins/VisitsSummary/VisitsSummary.php
+++ b/plugins/VisitsSummary/VisitsSummary.php
@@ -38,16 +38,16 @@ class VisitsSummary extends \Piwik\Plugin
public function enrichProcessedReportIfVisitsSummaryGet(&$response, $infos)
{
- if (empty($infos['parameters'][4]) || empty($response['reportData'])) {
+ if (empty($infos['parameters']['apiAction']) || empty($response['reportData'])) {
return;
}
$params = $infos['parameters'];
- $idSites = array($params[0]);
- $period = $params[1];
- $date = $params[2];
- $module = $params[3];
- $method = $params[4];
+ $idSites = array($params['idSite']);
+ $period = $params['period'];
+ $date = $params['date'];
+ $module = $params['apiModule'];
+ $method = $params['apiAction'];
if (!$this->isRequestingVisitsSummaryGet($module, $method)) {
return;
diff --git a/plugins/VisitsSummary/lang/am.json b/plugins/VisitsSummary/lang/am.json
index a9e2084e99..aaf34237a6 100644
--- a/plugins/VisitsSummary/lang/am.json
+++ b/plugins/VisitsSummary/lang/am.json
@@ -2,9 +2,6 @@
"VisitsSummary": {
"GenerateQueries": "%s ጥያቄዎች ተሰርተዋል",
"GenerateTime": "%s ሰከንዶች ገፁን ለማመንጨት",
- "MaxNbActions": "%s በአንድ ጉብኝት የተወሰዱ ከፍተኛ ርምጃዎች",
- "NbUniqueVisitors": "%s የተለዩ ጎብኚዎች",
- "NbVisitsBounced": "%s የተመለሱ ጉብኝቶች (ከአንድ ገፅ በኋላ ገፁን የተዉ)",
"WidgetLastVisits": "የመጨረሻው ጉብኝቶች ግራፍ",
"WidgetOverviewGraph": "አጠቃላይ እይታ ከግራፍ ጋር",
"WidgetVisits": "የጉብኝቶች አጠቃላይ እይታ"
diff --git a/plugins/VisitsSummary/lang/ar.json b/plugins/VisitsSummary/lang/ar.json
index 4abe5801f6..ff80d50f05 100644
--- a/plugins/VisitsSummary/lang/ar.json
+++ b/plugins/VisitsSummary/lang/ar.json
@@ -1,13 +1,8 @@
{
"VisitsSummary": {
- "AverageVisitDuration": "%s متوسط زمن الزيارة",
"GenerateQueries": "%s استعلام تم تنفيذهم",
"GenerateTime": "%s ثانية لإنشاء هذه الصفحة",
- "MaxNbActions": "%s أقصى عدد للسلوكيات في زيارة واحدة",
"NbActionsDescription": "%s سلوك (عدد مشاهدات الصفحة، التحميلات، والروابط الصادرة)",
- "NbActionsPerVisit": "%s سلوك لكل زيارة",
- "NbUniqueVisitors": "%s زيارة فريدة",
- "NbVisitsBounced": "%s زيارات مرتدة (غادر الموقع بعد مشاهدة أول صفحة)",
"VisitsSummary": "ملخص الزيارات",
"WidgetLastVisits": "الرسم البياني لآخر الزيارات",
"WidgetOverviewGraph": "نظرة عامة مع الرسم البياني",
diff --git a/plugins/VisitsSummary/lang/be.json b/plugins/VisitsSummary/lang/be.json
index 6fdaeb15e9..fa46a51961 100644
--- a/plugins/VisitsSummary/lang/be.json
+++ b/plugins/VisitsSummary/lang/be.json
@@ -1,13 +1,8 @@
{
"VisitsSummary": {
- "AverageVisitDuration": "%s сярэдняя працягласць наведвання",
"GenerateQueries": "%s запытаў выканана",
"GenerateTime": "Старонка згенеравана за %s секунд",
- "MaxNbActions": "%s макс. дзеянняў за адно наведванне",
"NbActionsDescription": "%s дзеянні (прагляды старонак, запампоўка і знешнія спасылкі)",
- "NbActionsPerVisit": "%s дзеянняў за наведванне",
- "NbUniqueVisitors": "%s унікальных наведвальнікаў",
- "NbVisitsBounced": "%s наведвальнікаў сышло пасля наведвання адной старонкі",
"VisitsSummary": "Наведванні сумарна",
"VisitsSummaryDocumentation": "Гэта агляд зменаў наведванняў.",
"WidgetLastVisits": "Графік апошніх наведванняў",
diff --git a/plugins/VisitsSummary/lang/bg.json b/plugins/VisitsSummary/lang/bg.json
index c791e07295..012f09c9ce 100644
--- a/plugins/VisitsSummary/lang/bg.json
+++ b/plugins/VisitsSummary/lang/bg.json
@@ -1,22 +1,8 @@
{
"VisitsSummary": {
- "AverageGenerationTime": "%s средно времетраене за обработка на заявката",
- "AverageVisitDuration": "%s средно времетраене на посещението",
"GenerateQueries": "%s заявки са изпълнени",
"GenerateTime": "%s секунди за генериране на страницата",
- "MaxNbActions": "%s макс. действия при едно посещение",
"NbActionsDescription": "%s действия (показвания, изтегляния и outlinks)",
- "NbActionsPerVisit": "%s действия на посещение",
- "NbDownloadsDescription": "%s изтегляния",
- "NbKeywordsDescription": "%s уникални ключови думи",
- "NbOutlinksDescription": "%s външни връзки",
- "NbPageviewsDescription": "%s преглеждания на страница",
- "NbSearchesDescription": "%s общо търсения в вашият сайт",
- "NbUniqueDownloadsDescription": "%s уникални изтегляния",
- "NbUniqueOutlinksDescription": "%s уникални външни връзки",
- "NbUniquePageviewsDescription": "%s уникални преглеждания на страница",
- "NbUniqueVisitors": "%s уникални посетителя",
- "NbVisitsBounced": "%s посещения са отскочили (напуснали още след първата разгледана страница)",
"VisitsSummary": "Резюме на посещенията",
"VisitsSummaryDocumentation": "Това е преглед на еволюцията на посещенията.",
"WidgetLastVisits": "Последни посетители",
diff --git a/plugins/VisitsSummary/lang/ca.json b/plugins/VisitsSummary/lang/ca.json
index 852d5046a7..85e9b87482 100644
--- a/plugins/VisitsSummary/lang/ca.json
+++ b/plugins/VisitsSummary/lang/ca.json
@@ -1,21 +1,8 @@
{
"VisitsSummary": {
- "AverageVisitDuration": "%s duració mitja de la visita",
"GenerateQueries": "S'ha executat un total de %s consultes",
"GenerateTime": "S'han trigat %s segons en generar la pàgina",
- "MaxNbActions": "Hi ha %s accions màximes en una visita",
"NbActionsDescription": "%s accions",
- "NbActionsPerVisit": "%s accions (visualitzacions de pàgina, descàrregues i enllaços exteriors) per visita",
- "NbDownloadsDescription": "%s descàrregues",
- "NbKeywordsDescription": "%s paraules clau úniques",
- "NbOutlinksDescription": "%s enllaços externs",
- "NbPageviewsDescription": "%s visualitzacions de pàgina",
- "NbSearchesDescription": "%s cerques totals al lloc web",
- "NbUniqueDownloadsDescription": "%s descàrregues úniques",
- "NbUniqueOutlinksDescription": "%s enllaços externs únics",
- "NbUniquePageviewsDescription": "%s visualitzacions de pàgina úniques",
- "NbUniqueVisitors": "%s visitants únics",
- "NbVisitsBounced": "%s visites han rebotat (abandonat el lloc després de veure una pàgina)",
"VisitsSummary": "Resum de les visites",
"VisitsSummaryDocumentation": "Aquesta és una visió general de l'evolució visita.",
"WidgetLastVisits": "Gràfic de les darreres visites",
diff --git a/plugins/VisitsSummary/lang/cs.json b/plugins/VisitsSummary/lang/cs.json
index 004245c9e4..9b9ea7decd 100644
--- a/plugins/VisitsSummary/lang/cs.json
+++ b/plugins/VisitsSummary/lang/cs.json
@@ -1,23 +1,25 @@
{
"VisitsSummary": {
- "AverageGenerationTime": "%s průměrný čas generování",
- "AverageVisitDuration": "%s průměrná doba návštěvy",
+ "AverageGenerationTime": "průměrný čas generování",
+ "AverageVisitDuration": "průměrný čas návštěvy",
"GenerateQueries": "%s provedeno dotazů",
"GenerateTime": "%s sekund k vygenerování stránky",
- "MaxNbActions": "%s maximální počet akcí na návštěvu",
+ "MaxNbActions": "maximální počet akcí na návštěvu",
"NbActionsDescription": "%s akcí (zobrazení stránek, stažení a odchodů)",
- "NbActionsPerVisit": "%s akcí (zobrazení stránek, stažení, odkazů a vyhledávání) na návštěvu",
- "NbDownloadsDescription": "%s stažení",
- "NbKeywordsDescription": "%s unikátní klíčová slova",
- "NbOutlinksDescription": "%s externích odkazů",
- "NbPageviewsDescription": "%s zobrazení",
- "NbSearchesDescription": "Celkem %s vyhledávání na vašich stránkách",
- "NbUniqueDownloadsDescription": "%s unikátních stažení",
- "NbUniqueOutlinksDescription": "%s unikátních externích odkazů",
- "NbUniquePageviewsDescription": "%s unikátních zobrazení",
- "NbUniqueVisitors": "%s unikátních návštěvníků",
- "NbVisitsBounced": "%s návštěvníků odešlo (opustilo web po jedné stránce)",
- "PluginDescription": "Hlásí základní analytická měření: počet návštěv a unikátních návštěvníků, počet akcí, frekvenci odrazu atd.",
+ "NbActionsPerVisit": "akcí (zobrazení stránek, stažení, odkazy a interní vyhledávání) za návštěvu",
+ "NbDownloadsDescription": "stažení",
+ "NbKeywordsDescription": "jedinečná klíčová slova",
+ "NbOutlinksDescription": "externí odkazy",
+ "NbPageviewsDescription": "zobrazení stránek",
+ "NbSearchesDescription": "celkem vyhledávání na webových stránkách",
+ "NbUniqueDownloadsDescription": "jedinečných stažení",
+ "NbUniqueOutlinksDescription": "jedinečných externích odkazů",
+ "NbUniquePageviewsDescription": "jedinečných zobrazení",
+ "NbUniqueVisitors": "jedineční návštěvníci",
+ "NbUsersDescription": "uživatelů",
+ "NbVisitsDescription": "návštěv",
+ "NbVisitsBounced": "návštěvníků odešlo (opustilo web po jedné stránce)",
+ "PluginDescription": "Hlásí základní analytická měření: počet návštěv a jedinečných návštěvníků, počet akcí, frekvenci odrazu atd.",
"VisitsSummary": "Shrnutí návštěv",
"VisitsSummaryDocumentation": "Toto je přehled vývoje návštěv.",
"WidgetLastVisits": "Graf posledních návštěv",
diff --git a/plugins/VisitsSummary/lang/da.json b/plugins/VisitsSummary/lang/da.json
index 4b1e207328..dc44507ab9 100644
--- a/plugins/VisitsSummary/lang/da.json
+++ b/plugins/VisitsSummary/lang/da.json
@@ -1,22 +1,8 @@
{
"VisitsSummary": {
- "AverageGenerationTime": "%s gennemsnitlige genereringstid",
- "AverageVisitDuration": "%s gns. besøgsvarighed",
"GenerateQueries": "%s forespørgsler kørt",
"GenerateTime": "Siden genereret på %s sek.",
- "MaxNbActions": "%s maks. handlinger i ét enkelt besøg",
"NbActionsDescription": "%s handlinger (sidevisninger, filhentninger og udgående links)",
- "NbActionsPerVisit": "%s handlinger pr. besøg",
- "NbDownloadsDescription": "%s fil-hentninger",
- "NbKeywordsDescription": "%s unikke søgeord",
- "NbOutlinksDescription": "%s udgående links",
- "NbPageviewsDescription": "%s sidevisninger",
- "NbSearchesDescription": "%s søgninger på hjemmesiden",
- "NbUniqueDownloadsDescription": "%s unikke fil-hentninger",
- "NbUniqueOutlinksDescription": "%s unikke udgående links",
- "NbUniquePageviewsDescription": "%s unikke sidevisninger",
- "NbUniqueVisitors": "%s unikke besøgende",
- "NbVisitsBounced": "%s har forladt hjemmesiden efter én sidevisning",
"PluginDescription": "Rapporter generelle analyse målinger: besøg, unikke besøgende, antal handlinger, afvisningsrate, osv",
"VisitsSummary": "Besøg resumé",
"VisitsSummaryDocumentation": "Oversigt over besøgsudviklingen.",
diff --git a/plugins/VisitsSummary/lang/de.json b/plugins/VisitsSummary/lang/de.json
index 530438c0ea..29dbe5f148 100644
--- a/plugins/VisitsSummary/lang/de.json
+++ b/plugins/VisitsSummary/lang/de.json
@@ -1,22 +1,24 @@
{
"VisitsSummary": {
- "AverageGenerationTime": "%s durchschnittliche Generierungszeit",
- "AverageVisitDuration": "%s durchschnittliche Aufenthaltsdauer",
+ "AverageGenerationTime": "durchschnittliche Generierungszeit",
+ "AverageVisitDuration": "durchschnittliche Aufenthaltsdauer",
"GenerateQueries": "%s Abfragen durchgeführt",
"GenerateTime": "%s Sekunden, um die Seite zu generieren",
- "MaxNbActions": "%s max. Aktionen pro Besuch",
+ "MaxNbActions": "max. Aktionen pro Besuch",
"NbActionsDescription": "%s Aktionen",
- "NbActionsPerVisit": "%s Aktionen (Seitenansichten, Downloads, ausgehende Verweise und interne Suchen) pro Besuch",
- "NbDownloadsDescription": "%s Downloads",
- "NbKeywordsDescription": "%s eindeutige Suchbegriffe",
- "NbOutlinksDescription": "%s ausgehende Verweise",
- "NbPageviewsDescription": "%s Seitenansichten",
- "NbSearchesDescription": "%s interne Suchen",
- "NbUniqueDownloadsDescription": "%s eindeutige Downloads",
- "NbUniqueOutlinksDescription": "%s eindeutige ausgehende Verweise",
- "NbUniquePageviewsDescription": "%s eindeutige Seitenaufrufe",
- "NbUniqueVisitors": "%s eindeutige Besucher",
- "NbVisitsBounced": "%s Besucher sind abgesprungen (haben die Website nach einer Seite verlassen)",
+ "NbActionsPerVisit": "Aktionen pro Besuch (Seitenansichten, Downloads, ausgehende Verweise und interne Suchen)",
+ "NbDownloadsDescription": "Downloads",
+ "NbKeywordsDescription": "einmalige Suchbegriffe",
+ "NbOutlinksDescription": "Ausgehende Verweise",
+ "NbPageviewsDescription": "Seitenansichten",
+ "NbSearchesDescription": "interne Suchen",
+ "NbUniqueDownloadsDescription": "Einmalige Downloads",
+ "NbUniqueOutlinksDescription": "Einmalige ausgehende Verweise",
+ "NbUniquePageviewsDescription": "Einmalige Seitenansichten",
+ "NbUniqueVisitors": "Eindeutige Besucher",
+ "NbUsersDescription": "Benutzer",
+ "NbVisitsDescription": "Besuche",
+ "NbVisitsBounced": "abgesprungene Besucher (Verlassen der Webseite nach einer Seite)",
"PluginDescription": "Berichte mit generellen analytischen Metriken: Besuche, eindeutige Besucher, Anzahl Aktionen, Absprungsrate, usw.",
"VisitsSummary": "Besucherüberblick",
"VisitsSummaryDocumentation": "Dies ist eine Übersicht über die Entwicklung der Besuche.",
diff --git a/plugins/VisitsSummary/lang/el.json b/plugins/VisitsSummary/lang/el.json
index 2b89d35c99..0bfce39a10 100644
--- a/plugins/VisitsSummary/lang/el.json
+++ b/plugins/VisitsSummary/lang/el.json
@@ -1,22 +1,24 @@
{
"VisitsSummary": {
- "AverageGenerationTime": "%s μέσος χρόνος δημιουργίας",
- "AverageVisitDuration": "%s μέση διάρκεια επισκέψεων",
+ "AverageGenerationTime": "μέσος χρόνος δημιουργίας",
+ "AverageVisitDuration": "μέση διάρκεια επισκέψεων",
"GenerateQueries": "%s ερωτήματα εκτελέστηκαν",
"GenerateTime": "%s δευτερόλεπτα για τη δημιουργία της σελίδας",
- "MaxNbActions": "%s είναι ο μέγιστος αριθμός δραστηριοτήτων σε μία επίσκεψη",
+ "MaxNbActions": "μέγιστος αριθμός δραστηριοτήτων σε μία επίσκεψη",
"NbActionsDescription": "%s δραστηριότητες",
- "NbActionsPerVisit": "%s δραστηριότητες ανά επίσκεψη",
- "NbDownloadsDescription": "%s λήψεις",
- "NbKeywordsDescription": "%s μοναδικές λέξεις κλειδιά",
- "NbOutlinksDescription": "%s σύνδεσμοι προς εξωτερικό",
- "NbPageviewsDescription": "%s προβολές σελίδων",
- "NbSearchesDescription": "%s συνολικές αναζητήσεις στον ιστοτόπο σας",
- "NbUniqueDownloadsDescription": "%s μοναδικές λήψεις",
- "NbUniqueOutlinksDescription": "%s μοναδικοί σύνδεσμοι προς εξωτερικό",
- "NbUniquePageviewsDescription": "%s μοναδικές προβολές σελίδων",
- "NbUniqueVisitors": "%s μοναδικοί επισκέπτες",
- "NbVisitsBounced": "%s των επισκεπτών απομακρύνθηκαν (έφυγαν από την πρώτη σελίδα)",
+ "NbActionsPerVisit": "δραστηριότητες (επισκέψεις σελίδων, λήψεις, εξωτερικοί σύνδεσμοι και αναζητήσεις εσωτερικά στον ιστοτόπο) ανά επίσκεψη",
+ "NbDownloadsDescription": "λήψεις",
+ "NbKeywordsDescription": "μοναδικές λέξεις κλειδιά",
+ "NbOutlinksDescription": "εξωτερικοί σύνδεσμοι",
+ "NbPageviewsDescription": "προβολές σελίδων",
+ "NbSearchesDescription": "συνολικές αναζητήσεις στον ιστοτόπο σας",
+ "NbUniqueDownloadsDescription": "μοναδικές λήψεις",
+ "NbUniqueOutlinksDescription": "μοναδικοί σύνδεσμοι προς εξωτερικό",
+ "NbUniquePageviewsDescription": "μοναδικές προβολές σελίδων",
+ "NbUniqueVisitors": "μοναδικοί επισκέπτες",
+ "NbUsersDescription": "χρήστες",
+ "NbVisitsDescription": "επισκέψεις",
+ "NbVisitsBounced": "επισκέψεις από τις οποίες έγινε απομάκρυνση (έφυγαν από τον ιστοτόπο από την πρώτη σελίδα)",
"PluginDescription": "Αναφέρει γενικές μετρικές αναλυτικών: επισκέψεις, μοναδικοί επισκέπτες, αριθμός ενεργειών, ρυθμός αναπήδησης, κτλ.",
"VisitsSummary": "Περίληψη επισκέψεων",
"VisitsSummaryDocumentation": "Αυτή είναι μια επισκόπηση της εξέλιξης των επισκέψεων.",
diff --git a/plugins/VisitsSummary/lang/es.json b/plugins/VisitsSummary/lang/es.json
index 3560150527..af73fcb0a9 100644
--- a/plugins/VisitsSummary/lang/es.json
+++ b/plugins/VisitsSummary/lang/es.json
@@ -1,22 +1,24 @@
{
"VisitsSummary": {
- "AverageGenerationTime": "%s tiempo promedio de generación",
- "AverageVisitDuration": "%s duración promedio de la visita",
+ "AverageGenerationTime": "tiempo promedio de generación",
+ "AverageVisitDuration": "duración promedio de visita",
"GenerateQueries": "%s consultas ejecutadas",
"GenerateTime": "%s segundos para generar la página",
- "MaxNbActions": "%s acciones máximas en una visita",
+ "MaxNbActions": "Cantidad máxima de acciones en una visita",
"NbActionsDescription": "%s acciones",
- "NbActionsPerVisit": "%s acciones del visitante (páginas vistas, descargas, enlaces a otras páginas de otros sitios y búsquedas internas del sitio)",
- "NbDownloadsDescription": "%s descargas",
- "NbKeywordsDescription": "%s palabras claves únicas",
- "NbOutlinksDescription": "%s enlaces salientes",
- "NbPageviewsDescription": "%s vista de páginas",
- "NbSearchesDescription": "%s búsquedas totales en su sitio de internet",
- "NbUniqueDownloadsDescription": "%s descargas únicas",
- "NbUniqueOutlinksDescription": "%s enlaces salientes únicos",
- "NbUniquePageviewsDescription": "%s vista de páginas únicas",
- "NbUniqueVisitors": "%s visitantes únicos",
- "NbVisitsBounced": "%s de visitas que han vuelto (abandonaron el sitio después de una página)",
+ "NbActionsPerVisit": "acciones del visitante (vistas de páginas, descargas, enlaces salientes y búsquedas internas dentro del sitio)",
+ "NbDownloadsDescription": "descargas",
+ "NbKeywordsDescription": "sólo palabras claves",
+ "NbOutlinksDescription": "enlace de salida",
+ "NbPageviewsDescription": "visitas de páginas",
+ "NbSearchesDescription": "búsquedas totales en su sitio de internet",
+ "NbUniqueDownloadsDescription": "solo descargas",
+ "NbUniqueOutlinksDescription": "solo enlaces salientes",
+ "NbUniquePageviewsDescription": "Solo páginas vistas",
+ "NbUniqueVisitors": "solo visitantes",
+ "NbUsersDescription": "usuarios",
+ "NbVisitsDescription": "visitas",
+ "NbVisitsBounced": "visitas que rebotaron (vieron una sola página y salieron del sitio)",
"PluginDescription": "Informes generales de análisis de la métricas: visitas, visitantes únicos, número de acciones, tasa de rebote, etc.",
"VisitsSummary": "Resumen de visitas",
"VisitsSummaryDocumentation": "Esta es una visión holística de la evolución de las visitas.",
diff --git a/plugins/VisitsSummary/lang/et.json b/plugins/VisitsSummary/lang/et.json
index 049c5274be..b4242ea2a7 100644
--- a/plugins/VisitsSummary/lang/et.json
+++ b/plugins/VisitsSummary/lang/et.json
@@ -1,22 +1,8 @@
{
"VisitsSummary": {
- "AverageGenerationTime": "%s keskmine lehe genereerimise aeg",
- "AverageVisitDuration": "%s keskmine külastuse kestvus",
"GenerateQueries": "%s katkestatud päringut",
"GenerateTime": "Lehe genereerimiseks kulus %s sekundit",
- "MaxNbActions": "%s tegevust maksimaalselt ühel külastusel",
"NbActionsDescription": "%s tegevust",
- "NbActionsPerVisit": "%s tegevust (lehe vaatamist, allalaadimist, väljuvat linki ja lehesisest otsingut) külastuse jooksul",
- "NbDownloadsDescription": "%s allalaadimist",
- "NbKeywordsDescription": "%s unikaalset võtmesõna",
- "NbOutlinksDescription": "%s väljuvat linki",
- "NbPageviewsDescription": "%s lehevaatamist",
- "NbSearchesDescription": "%s otsingut kokku antud veebilehel",
- "NbUniqueDownloadsDescription": "%s unikaalset allalaadimist",
- "NbUniqueOutlinksDescription": "%s unikaalset väljuvat linki",
- "NbUniquePageviewsDescription": "%s unikaalset lehevaatamist",
- "NbUniqueVisitors": "%s unikaalset külastajat",
- "NbVisitsBounced": "%s külastajaid põrkas (lahkus peale ühe lehe kuvamist)",
"VisitsSummary": "Külastuste kokkuvõte",
"VisitsSummaryDocumentation": "See on külastuste muutuse ajas ülevaade.",
"WidgetLastVisits": "Viimaste külastuste graafik",
diff --git a/plugins/VisitsSummary/lang/eu.json b/plugins/VisitsSummary/lang/eu.json
index 3003d94073..98a529776f 100644
--- a/plugins/VisitsSummary/lang/eu.json
+++ b/plugins/VisitsSummary/lang/eu.json
@@ -2,9 +2,6 @@
"VisitsSummary": {
"GenerateQueries": "%s galdera exekutatuta",
"GenerateTime": "%s segundo orria sortzeko",
- "MaxNbActions": "%s ekintza gehienez bisita batean",
- "NbUniqueVisitors": "%s bisitari desberdin",
- "NbVisitsBounced": "%s bisita errebotatu dira (webgunea utzi dute orri bat ikusi ondoren)",
"VisitsSummary": "Bisiten laburpena",
"WidgetLastVisits": "Azken bisiten grafikoa",
"WidgetOverviewGraph": "Ikuspegi orokorra grafikoarekin",
diff --git a/plugins/VisitsSummary/lang/fa.json b/plugins/VisitsSummary/lang/fa.json
index 566e5d47ec..9fd8f85b07 100644
--- a/plugins/VisitsSummary/lang/fa.json
+++ b/plugins/VisitsSummary/lang/fa.json
@@ -1,22 +1,8 @@
{
"VisitsSummary": {
- "AverageGenerationTime": "میانگین زمان ساخته شدن %s",
- "AverageVisitDuration": "%s میانگین مدت بازدید",
"GenerateQueries": "%s پرس و جو های اجرا شده",
"GenerateTime": "%s ثانیه برای تولید صفحه",
- "MaxNbActions": "%s بیشترین عملیات در یک بازدید",
"NbActionsDescription": "فعالیت ها %s",
- "NbActionsPerVisit": "%s فعالیت(بازدیدصفحه ،دانلود ،جستجوی داخلی وبسایت) بر بازدید",
- "NbDownloadsDescription": "دانلود ها %s",
- "NbKeywordsDescription": "%s کلمه کلیدی یکتا",
- "NbOutlinksDescription": "لینک های خروجی %s",
- "NbPageviewsDescription": "نمایش صفحات %s",
- "NbSearchesDescription": "%sهمه جستجوها روی وبسایت شما",
- "NbUniqueDownloadsDescription": "دانلودهای منفرد %s",
- "NbUniqueOutlinksDescription": "لینک های خروجی منفرد%s",
- "NbUniquePageviewsDescription": "نمایش صفحات منفرد %s",
- "NbUniqueVisitors": "%s بازدیدکنندگان منحصربفرد",
- "NbVisitsBounced": "%sبازدید پس زده شده (بعدازبازدید یک صفحه از وبسایت خارج شده است)",
"VisitsSummary": "خلاصه بازدیدها",
"VisitsSummaryDocumentation": "این مروری بر تکامل بازدید است.",
"WidgetLastVisits": "نمودار آخرین بازدید ها",
diff --git a/plugins/VisitsSummary/lang/fi.json b/plugins/VisitsSummary/lang/fi.json
index 0bc92bcf03..5a1ddc7147 100644
--- a/plugins/VisitsSummary/lang/fi.json
+++ b/plugins/VisitsSummary/lang/fi.json
@@ -1,22 +1,8 @@
{
"VisitsSummary": {
- "AverageGenerationTime": "%s keskimääräinen generointiaika",
- "AverageVisitDuration": "%s keskimääräinen käynnin kesto",
"GenerateQueries": "%s kyselyä ajettu",
"GenerateTime": "%s sekuntia sivun luomiseen",
- "MaxNbActions": "%s toimintoa maksimissaan yhdellä käynnillä",
"NbActionsDescription": "%s toimintoa (sivua, latausta ja lähtevää linkkiä)",
- "NbActionsPerVisit": "%s toimintoa \/ käynti",
- "NbDownloadsDescription": "%s tiedoston latausta",
- "NbKeywordsDescription": "%s uniikkia hakusanaa",
- "NbOutlinksDescription": "%s lähtevää linkki",
- "NbPageviewsDescription": "%s sivunavausta",
- "NbSearchesDescription": "%s hakua verkkosivullasi",
- "NbUniqueDownloadsDescription": "%s yksilöllistä latausta",
- "NbUniqueOutlinksDescription": "%s yksilöllistä lähtevää linkkiä",
- "NbUniquePageviewsDescription": "%s yksilöllistä sivunavausta",
- "NbUniqueVisitors": "%s uniikia kävijää",
- "NbVisitsBounced": "%s lyhyttä käyntiä (vain yksi ladattu sivu)",
"PluginDescription": "Raportoi yleiset analytiikkametriikat: käynnit, uniikit kävijät, toimintojen määrän jne.",
"VisitsSummary": "Yhteenveto käynneistä",
"VisitsSummaryDocumentation": "Tämä on käyntien muutoksen yleiskatsaus",
diff --git a/plugins/VisitsSummary/lang/fr.json b/plugins/VisitsSummary/lang/fr.json
index 8c0a6eef6c..5bfcfb623d 100644
--- a/plugins/VisitsSummary/lang/fr.json
+++ b/plugins/VisitsSummary/lang/fr.json
@@ -1,22 +1,24 @@
{
"VisitsSummary": {
- "AverageGenerationTime": "%s délais de génération moyen",
- "AverageVisitDuration": "%s durée moyenne de la visite",
+ "AverageGenerationTime": "temps de génération moyen",
+ "AverageVisitDuration": "durée moyenne d'une visite",
"GenerateQueries": "%s requêtes exécutées",
"GenerateTime": "%s secondes pour générer la page",
- "MaxNbActions": "%s actions maximums en une visite",
+ "MaxNbActions": "actions max en une visite",
"NbActionsDescription": "%s actions (pages vues, téléchargements et liens de sortie)",
- "NbActionsPerVisit": "%s actions par visite",
- "NbDownloadsDescription": "%s téléchargements",
- "NbKeywordsDescription": "%s mots clés unique",
- "NbOutlinksDescription": "%s liens sortant",
- "NbPageviewsDescription": "%s pages vues",
- "NbSearchesDescription": "%s au total recherches sur votre site web",
- "NbUniqueDownloadsDescription": "%s téléchargements unique",
- "NbUniqueOutlinksDescription": "%s liens sortant unique",
- "NbUniquePageviewsDescription": "%s pages vues uniques",
- "NbUniqueVisitors": "%s visiteurs uniques",
- "NbVisitsBounced": "%s visiteurs ont survolé (quitté le site après une page)",
+ "NbActionsPerVisit": "actions (pages vues, téléchargements, liens sortants et recherches internes) par visite",
+ "NbDownloadsDescription": "téléchargements",
+ "NbKeywordsDescription": "mots clés uniques",
+ "NbOutlinksDescription": "liens sortants",
+ "NbPageviewsDescription": "pages vues",
+ "NbSearchesDescription": "recherches totales sur votre site",
+ "NbUniqueDownloadsDescription": "téléchargements uniques",
+ "NbUniqueOutlinksDescription": "liens externes uniques",
+ "NbUniquePageviewsDescription": "pages vues uniques",
+ "NbUniqueVisitors": "visiteurs uniques",
+ "NbUsersDescription": "utilisateurs",
+ "NbVisitsDescription": "visites",
+ "NbVisitsBounced": "visiteurs ayant survolé (quitté le site après une page)",
"PluginDescription": "Fournit des métriques d'analyse générales : visites, visiteurs uniques, nombre d'actions, taux de rebond, etc.",
"VisitsSummary": "Récapitulatif des visites",
"VisitsSummaryDocumentation": "Ceci est un aperçu de l'évolution de la visite.",
diff --git a/plugins/VisitsSummary/lang/gl.json b/plugins/VisitsSummary/lang/gl.json
index 7e185de858..27a3b1915d 100644
--- a/plugins/VisitsSummary/lang/gl.json
+++ b/plugins/VisitsSummary/lang/gl.json
@@ -2,8 +2,6 @@
"VisitsSummary": {
"GenerateQueries": "%s consultas executadas",
"GenerateTime": "%s segundos para xerar a páxina",
- "MaxNbActions": "%s accións máximas nunha visita",
- "NbUniqueVisitors": "%s visitas únicas",
"WidgetLastVisits": "Gráfico das últimas visitas",
"WidgetOverviewGraph": "Visión xeral con gráfico",
"WidgetVisits": "Visión xeral de visitas"
diff --git a/plugins/VisitsSummary/lang/he.json b/plugins/VisitsSummary/lang/he.json
index 24ab52db93..f425c5b382 100644
--- a/plugins/VisitsSummary/lang/he.json
+++ b/plugins/VisitsSummary/lang/he.json
@@ -1,22 +1,8 @@
{
"VisitsSummary": {
- "AverageGenerationTime": "%s זמן עלייה ממוצע",
- "AverageVisitDuration": "%s זמן ביקור ממוצע",
"GenerateQueries": "%s שאילתות בוצעו",
"GenerateTime": "%s שניות בכדי לחולל את העמוד",
- "MaxNbActions": "%s מספר פעולות מקסימלי בביקור אחד",
"NbActionsDescription": "%s פעולות (צפייה בעמודים, הורדות וקישורים יוצאים)",
- "NbActionsPerVisit": "%s פעולות בביקור",
- "NbDownloadsDescription": "%s הורדות",
- "NbKeywordsDescription": "%s מילות מפתח ייחודיות",
- "NbOutlinksDescription": "%s קישורים יוצאים",
- "NbPageviewsDescription": "%s צפיות בעמודים",
- "NbSearchesDescription": "%s חיפושים באתר סה״כ",
- "NbUniqueDownloadsDescription": "%s הורדות ייחודיות",
- "NbUniqueOutlinksDescription": "%s קישורים יוצאים ייחודיים",
- "NbUniquePageviewsDescription": "%s ביקורי עמודים ייחודיים",
- "NbUniqueVisitors": "%s מבקרים יחודיים",
- "NbVisitsBounced": "%s ביקורים ננטשו (עזבו את האתר אחרי עמוד אחד)",
"VisitsSummary": "תקציר ביקורים",
"VisitsSummaryDocumentation": "זו סקירה של התפתחות הביקור.",
"WidgetLastVisits": "גרף ביקורים אחרונים",
diff --git a/plugins/VisitsSummary/lang/hi.json b/plugins/VisitsSummary/lang/hi.json
index 5b57186069..fb2e81a14c 100644
--- a/plugins/VisitsSummary/lang/hi.json
+++ b/plugins/VisitsSummary/lang/hi.json
@@ -1,16 +1,8 @@
{
"VisitsSummary": {
- "AverageVisitDuration": "%s औसत यात्रा की अवधि",
"GenerateQueries": "%s के प्रश्नों को मार डाला",
"GenerateTime": "%s सेकेंडों पेज उत्पन्न करने के लिए",
- "MaxNbActions": "एक यात्रा में %s अधिकतम कार्यों",
"NbActionsDescription": "%s कार्रवाई",
- "NbDownloadsDescription": "%s डाउनलोड",
- "NbOutlinksDescription": "%s आउटलिंक",
- "NbPageviewsDescription": "%s पृष्ठ दृश्यों",
- "NbUniqueOutlinksDescription": "%s अद्वितीय आउटलिंक",
- "NbUniquePageviewsDescription": "%s अद्वितीय पृष्ठदृश्य",
- "NbUniqueVisitors": "%s अद्वितीय आगंतुकों",
"PluginDescription": "रिपोर्ट सामान्य विश्लेषिकी मेट्रिक्स: यात्राओं, अद्वितीय आगंतुकों, कार्यों की संख्या, उछाल दर, आदि",
"VisitsSummary": "दौरा सारांश"
}
diff --git a/plugins/VisitsSummary/lang/hu.json b/plugins/VisitsSummary/lang/hu.json
index 8c4f411275..6c8e69a6ee 100644
--- a/plugins/VisitsSummary/lang/hu.json
+++ b/plugins/VisitsSummary/lang/hu.json
@@ -1,13 +1,8 @@
{
"VisitsSummary": {
- "AverageVisitDuration": "%s az átlagos látogatás időtartama",
"GenerateQueries": "%s kérés végrehajtva",
"GenerateTime": "%s másodperc kellett a lap legenerálásához",
- "MaxNbActions": "%s akció egy látogatás során maximum",
"NbActionsDescription": "%s akció (weblap megnyitása, letöltések és kimenő linkek)",
- "NbActionsPerVisit": "%s akció látogatásonként",
- "NbUniqueVisitors": "%s egyedi látogatás",
- "NbVisitsBounced": "%s látogatás csak egy weblap megtekintésével",
"VisitsSummary": "Látogatások összesítése",
"VisitsSummaryDocumentation": "Ez egy összefoglaló nézet a látogatások folyamatáról.",
"WidgetLastVisits": "Utolsó látogatások grafikonja",
diff --git a/plugins/VisitsSummary/lang/id.json b/plugins/VisitsSummary/lang/id.json
index b53f98aad6..5946669d44 100644
--- a/plugins/VisitsSummary/lang/id.json
+++ b/plugins/VisitsSummary/lang/id.json
@@ -1,22 +1,8 @@
{
"VisitsSummary": {
- "AverageGenerationTime": "%s rerata waktu pembangkitan",
- "AverageVisitDuration": "%s rerata waktu kunjungan",
"GenerateQueries": "%s kueri dijalankan",
"GenerateTime": "%s detik untuk menghasilkan halaman",
- "MaxNbActions": "%s tindakan maksimum dalam satu kunjungan",
"NbActionsDescription": "%s tindakan (menampilkan halaman, mengunduh, dan tautan keluar)",
- "NbActionsPerVisit": "%s tindakan tiap kunjungan",
- "NbDownloadsDescription": "%s unduhan",
- "NbKeywordsDescription": "%s kata kunci unik",
- "NbOutlinksDescription": "%s tautan keluar",
- "NbPageviewsDescription": "%s tampilan halaman",
- "NbSearchesDescription": "%s jumlah pencarian dalam situs Anda",
- "NbUniqueDownloadsDescription": "%s unduhan unik",
- "NbUniqueOutlinksDescription": "%s tautan keluar unik",
- "NbUniquePageviewsDescription": "%s tampilan halaman unik",
- "NbUniqueVisitors": "%s pengunjung unik",
- "NbVisitsBounced": "%s kunjungan dengan pentalan (meninggalkan situs setelah mengunjungi satu halaman)",
"VisitsSummary": "Rangkuman Kunjungan",
"VisitsSummaryDocumentation": "Ini merupakan iktisar perkembangan kunjungan.",
"WidgetLastVisits": "Grafik kunjungan terakhir",
diff --git a/plugins/VisitsSummary/lang/is.json b/plugins/VisitsSummary/lang/is.json
index f0067a90aa..20f3d94c43 100644
--- a/plugins/VisitsSummary/lang/is.json
+++ b/plugins/VisitsSummary/lang/is.json
@@ -1,13 +1,8 @@
{
"VisitsSummary": {
- "AverageVisitDuration": "%s meðallengd heimsóknar",
"GenerateQueries": "%s fyrirspurnir framkvæmdar",
"GenerateTime": "%s sekúndur að gera þessa síðu",
- "MaxNbActions": "%s hámark aðgerða í einni heimsókn",
"NbActionsDescription": "%s aðgerðir (síðuflettingar, niðurhal og linkar frá vefnum)",
- "NbActionsPerVisit": "%s aðgerðir á heimsókn",
- "NbUniqueVisitors": "%s einstakir gestir",
- "NbVisitsBounced": "%s heimsóknir hafa skoppað (yfirgefið vefinn eftir eina síðu)",
"VisitsSummary": "Samantekt heimsókna",
"WidgetLastVisits": "Línurit yfir síðustu heimsóknir",
"WidgetOverviewGraph": "Yfirlit með línuriti",
diff --git a/plugins/VisitsSummary/lang/it.json b/plugins/VisitsSummary/lang/it.json
index 40161c3af5..7eca9dcdff 100644
--- a/plugins/VisitsSummary/lang/it.json
+++ b/plugins/VisitsSummary/lang/it.json
@@ -1,22 +1,24 @@
{
"VisitsSummary": {
- "AverageGenerationTime": "%s tempo medio di generazione",
- "AverageVisitDuration": "%s durata media della visita",
+ "AverageGenerationTime": "tempo medio di generazione",
+ "AverageVisitDuration": "durata media di una visita",
"GenerateQueries": "%s queries eseguite",
"GenerateTime": "%s secondi per generare la pagina",
- "MaxNbActions": "%s numero massimo di azioni in 1 visita",
+ "MaxNbActions": "numero massimo di azioni in una visita",
"NbActionsDescription": "%s azioni",
- "NbActionsPerVisit": "%s azioni (pagine viste, download, link esterni e ricerche interne al sito) per visita",
- "NbDownloadsDescription": "%s downloads",
- "NbKeywordsDescription": "%s keywords uniche",
- "NbOutlinksDescription": "%s links in uscita",
- "NbPageviewsDescription": "%s visualizzazioni pagina",
- "NbSearchesDescription": "%s totale delle ricerche sul tuo sito",
- "NbUniqueDownloadsDescription": "%s downloads unici",
- "NbUniqueOutlinksDescription": "%s links in uscita unici",
- "NbUniquePageviewsDescription": "%s visualizzazioni pagina uniche",
- "NbUniqueVisitors": "%s visitatori unici",
- "NbVisitsBounced": "Il %s dei visitatori hanno visto 1 sola pagina",
+ "NbActionsPerVisit": "azioni per visita (pagine viste, download, outlinks e ricerche interne al sito)",
+ "NbDownloadsDescription": "downloads",
+ "NbKeywordsDescription": "keyword uniche",
+ "NbOutlinksDescription": "outlinks",
+ "NbPageviewsDescription": "pagine viste",
+ "NbSearchesDescription": "totale ricerche sul tuo sito",
+ "NbUniqueDownloadsDescription": "download unici",
+ "NbUniqueOutlinksDescription": "outlinks unici",
+ "NbUniquePageviewsDescription": "pagine viste uniche",
+ "NbUniqueVisitors": "visitatori unici",
+ "NbUsersDescription": "utenti",
+ "NbVisitsDescription": "visite",
+ "NbVisitsBounced": "visite rimbalzate (che hanno lasciato il sito dopo una pagina)",
"PluginDescription": "Riporta le comuni metriche delle statistiche: visite, visitatori unici, numero di azioni, percentuale rimbalzi, ecc.",
"VisitsSummary": "Sommario delle visite",
"VisitsSummaryDocumentation": "Questa è una panoramica dell'evoluzione delle visite.",
diff --git a/plugins/VisitsSummary/lang/ja.json b/plugins/VisitsSummary/lang/ja.json
index 981de0b69a..44a8c10861 100644
--- a/plugins/VisitsSummary/lang/ja.json
+++ b/plugins/VisitsSummary/lang/ja.json
@@ -1,22 +1,8 @@
{
"VisitsSummary": {
- "AverageGenerationTime": "%s 平均発生時間",
- "AverageVisitDuration": "%s ビジットの平均持続時間",
"GenerateQueries": "実行されたクエリ %s",
"GenerateTime": "ページ生成時間 %s 秒",
- "MaxNbActions": "%s 1訪問あたりの最大アクション数",
"NbActionsDescription": "%s アクション(ページビュー、ダウンロード、外部リンク)",
- "NbActionsPerVisit": "%s ビジット単位のアクション数",
- "NbDownloadsDescription": "%s ダウンロード数",
- "NbKeywordsDescription": "%s ユニークキーワード",
- "NbOutlinksDescription": "%s 外部リンク数",
- "NbPageviewsDescription": "%s ページビュー数",
- "NbSearchesDescription": "%s ウェブサイトでの総検索数",
- "NbUniqueDownloadsDescription": "%s ユニークダウンロード数",
- "NbUniqueOutlinksDescription": "%s ユニーク外部リンク数",
- "NbUniquePageviewsDescription": "%s ユニークページビュー数",
- "NbUniqueVisitors": "%s ユニークビジター数",
- "NbVisitsBounced": "%s 直帰率(1ページを表示後にウェブサイトを離れた)",
"PluginDescription": "一般的な分析メトリックのレポート:ビジット、ユニークなビジター、アクション数、直帰率等。",
"VisitsSummary": "ビジットの概要",
"VisitsSummaryDocumentation": "ビジット推移の概観です",
diff --git a/plugins/VisitsSummary/lang/ka.json b/plugins/VisitsSummary/lang/ka.json
index 2052d8c760..5ddb1f1f15 100644
--- a/plugins/VisitsSummary/lang/ka.json
+++ b/plugins/VisitsSummary/lang/ka.json
@@ -1,13 +1,8 @@
{
"VisitsSummary": {
- "AverageVisitDuration": "%s ვიზიტის საშუალო ხანგრძლივობა",
"GenerateQueries": "%s მოთხოვნა შესრულდა",
"GenerateTime": "%s წამი გვერდის გენერირებისთვის",
- "MaxNbActions": "%s ერთ ვიზიტზე მაქსიმალური ქმედებები",
"NbActionsDescription": "%s ქმედება (გვერდის დათვალიერება, ჩამოტვირთვები და გარე ბმულები)",
- "NbActionsPerVisit": "%s ქმედება ვიზიტზე",
- "NbUniqueVisitors": "%s უნიკალური ვიზიტორი",
- "NbVisitsBounced": "%s უსარგებლო ვიზიტი (დატოვა ვებ საიტი ერთ გვერდის ნახვის შემდეგ)",
"VisitsSummary": "ვიზიტების მოკლე ანგარიში",
"WidgetLastVisits": "ბოლო ვიზიტების გრაფიკი",
"WidgetOverviewGraph": "მიმოხილვა გრაფიკით",
diff --git a/plugins/VisitsSummary/lang/ko.json b/plugins/VisitsSummary/lang/ko.json
index ec21c7d19e..e394475d0f 100644
--- a/plugins/VisitsSummary/lang/ko.json
+++ b/plugins/VisitsSummary/lang/ko.json
@@ -1,22 +1,8 @@
{
"VisitsSummary": {
- "AverageGenerationTime": "%s 평균 페이지 생성 시간",
- "AverageVisitDuration": "%s 방문의 평균 지속 시간",
"GenerateQueries": "%s 쿼리 실행됨",
"GenerateTime": "페이지 생성에 %s 초 걸림",
- "MaxNbActions": "%s 방문당 최대 활동",
"NbActionsDescription": "%s 활동",
- "NbActionsPerVisit": "%s 방문당 활동",
- "NbDownloadsDescription": "%s 다운로드",
- "NbKeywordsDescription": "%s 고유 검색어",
- "NbOutlinksDescription": "%s 외부링크",
- "NbPageviewsDescription": "%s 페이지뷰",
- "NbSearchesDescription": "%s 사이트내 검색",
- "NbUniqueDownloadsDescription": "%s 고유 다운로드",
- "NbUniqueOutlinksDescription": "%s 고유 외부링크",
- "NbUniquePageviewsDescription": "%s 고유 페이지뷰",
- "NbUniqueVisitors": "%s 고유 방문자",
- "NbVisitsBounced": "%s 반송률 (첫 페이지에서 이탈)",
"PluginDescription": "보고서 기본 분석 측정 기준: 방문횟수, 고유 방문자, 활동 횟수, 반송률 등",
"VisitsSummary": "방문 개요",
"VisitsSummaryDocumentation": "방문 추이 개요입니다.",
diff --git a/plugins/VisitsSummary/lang/lt.json b/plugins/VisitsSummary/lang/lt.json
index 15460e9e0c..7b05077efd 100644
--- a/plugins/VisitsSummary/lang/lt.json
+++ b/plugins/VisitsSummary/lang/lt.json
@@ -1,13 +1,8 @@
{
"VisitsSummary": {
- "AverageVisitDuration": "%s vidutinio apsilankymo trukmė",
"GenerateQueries": "%s aktyvuotos užklausos",
"GenerateTime": "%s sekundės puslapiui sugeneruoti",
- "MaxNbActions": "%s daugiausia veiksmų per apsilankymą",
"NbActionsDescription": "%s veiksmai (puslapio peržiūros, atsisiuntimai ir išorinės nuorodos)",
- "NbActionsPerVisit": "%s veiksmų per apsilankymą",
- "NbUniqueVisitors": "%s unikalūs lankytojai",
- "NbVisitsBounced": "%s atsitiktiniai apsilankymai (paliko svetainę po pirmojo puslapio)",
"VisitsSummary": "Apsilankymų suvestinė",
"WidgetLastVisits": "Paskutinių apsilankymų diagrama",
"WidgetOverviewGraph": "Peržiūra su diagrama",
diff --git a/plugins/VisitsSummary/lang/lv.json b/plugins/VisitsSummary/lang/lv.json
index 18c99c847a..c281d0e38e 100644
--- a/plugins/VisitsSummary/lang/lv.json
+++ b/plugins/VisitsSummary/lang/lv.json
@@ -1,16 +1,6 @@
{
"VisitsSummary": {
- "AverageVisitDuration": "%s vidējais apmekējuma garums",
- "MaxNbActions": "%s maks. darbības vienā apmeklējumā",
"NbActionsDescription": "%s darbības",
- "NbActionsPerVisit": "%s darbības (lapu skatījumi, lejupielādes un ārējas saites) apmeklējumā",
- "NbDownloadsDescription": "%s lejupielādes",
- "NbOutlinksDescription": "%s ārējas saites",
- "NbPageviewsDescription": "%s lapu skatījumi",
- "NbUniqueDownloadsDescription": "%s unikālas lejupielādes",
- "NbUniqueOutlinksDescription": "%s unikālas ārējas saites",
- "NbUniquePageviewsDescription": "%s unikāli lapu skatījumi",
- "NbUniqueVisitors": "%s unikāli apmeklētāji",
"WidgetLastVisits": "Pēdējo apmeklējumu grafiks",
"WidgetVisits": "Apmeklējumu pārskats"
}
diff --git a/plugins/VisitsSummary/lang/nb.json b/plugins/VisitsSummary/lang/nb.json
index e304e11936..c32be9087e 100644
--- a/plugins/VisitsSummary/lang/nb.json
+++ b/plugins/VisitsSummary/lang/nb.json
@@ -1,22 +1,8 @@
{
"VisitsSummary": {
- "AverageGenerationTime": "%s gjennomsnittlig genereringstid",
- "AverageVisitDuration": "%s gjennomsnittlig besøksvarighet",
"GenerateQueries": "%s spørringer kjørt",
"GenerateTime": "%s sekunder for å generere denne siden",
- "MaxNbActions": "%s maks handlinger i ett besøk",
"NbActionsDescription": "%s handlinger",
- "NbActionsPerVisit": "%s handlinger (sidevisninger, nedlastinger, utlenker og interne nettstedssøk) per besøk",
- "NbDownloadsDescription": "%s nedlastinger",
- "NbKeywordsDescription": "%s unike nøkkelord",
- "NbOutlinksDescription": "%s utlenker",
- "NbPageviewsDescription": "%s sidevisninger",
- "NbSearchesDescription": "%s søk totalt på ditt nettsted",
- "NbUniqueDownloadsDescription": "%s unike nedlastinger",
- "NbUniqueOutlinksDescription": "%s unike utlenker",
- "NbUniquePageviewsDescription": "%s unike sidevisninger",
- "NbUniqueVisitors": "%s unike besøkende",
- "NbVisitsBounced": "%s besøk har sprettet (forlatt nettstedet etter en side)",
"PluginDescription": "Rapporterer generelle analysetall: besøk, unike besøkere, antall handlinger, sprettfrekvens, etc.",
"VisitsSummary": "Besøksammendrag",
"VisitsSummaryDocumentation": "Dette er en oversikt over besøksutvikling.",
diff --git a/plugins/VisitsSummary/lang/nl.json b/plugins/VisitsSummary/lang/nl.json
index d57a3f6d7f..5db9db5189 100644
--- a/plugins/VisitsSummary/lang/nl.json
+++ b/plugins/VisitsSummary/lang/nl.json
@@ -1,22 +1,8 @@
{
"VisitsSummary": {
- "AverageGenerationTime": "%s gemiddelde laadtijd",
- "AverageVisitDuration": "%s gemiddelde duur bezoek",
"GenerateQueries": "%s queries uitgevoerd",
"GenerateTime": "%s seconden om deze pagina te genereren",
- "MaxNbActions": "%s hoogste aantal acties per bezoek",
"NbActionsDescription": "%s acties",
- "NbActionsPerVisit": "%s acties per bezoek.",
- "NbDownloadsDescription": "%s downloads",
- "NbKeywordsDescription": "%s unieke sleutelwoorden",
- "NbOutlinksDescription": "%s outlinks",
- "NbPageviewsDescription": "%s paginaweergaves",
- "NbSearchesDescription": "%s totale zoekopdrachten",
- "NbUniqueDownloadsDescription": "%s unieke downloads",
- "NbUniqueOutlinksDescription": "%s unieke outlinks",
- "NbUniquePageviewsDescription": "%s unieke paginaweergaves",
- "NbUniqueVisitors": "%s unieke bezoekers",
- "NbVisitsBounced": "%s bezoekers hebben de website verlaten na één pagina",
"PluginDescription": "Rapporteert algemene analyse metrics: bezoeken, unieke bezoeken, aantal acties, bounce ration, enz.",
"VisitsSummary": "Bezoekers samenvatting",
"VisitsSummaryDocumentation": "Dit is een trendlijn die de ontwikkeling weergeeft.",
diff --git a/plugins/VisitsSummary/lang/nn.json b/plugins/VisitsSummary/lang/nn.json
index dc7a1d659e..4d854324be 100644
--- a/plugins/VisitsSummary/lang/nn.json
+++ b/plugins/VisitsSummary/lang/nn.json
@@ -2,9 +2,6 @@
"VisitsSummary": {
"GenerateQueries": "%s spørjingar køyrd",
"GenerateTime": "%s sekundar å generera denne siden",
- "MaxNbActions": "%s maks mengd handlingar på ein vitjing",
- "NbUniqueVisitors": "%s unike vitjarar",
- "NbVisitsBounced": "%s vitjarar hev hoppa (forsvunne etter ein sidevising)",
"WidgetLastVisits": "Siste vitjingar",
"WidgetOverviewGraph": "Oversikt med graf",
"WidgetVisits": "Vitjingsoversikt"
diff --git a/plugins/VisitsSummary/lang/pl.json b/plugins/VisitsSummary/lang/pl.json
index f28c75dd39..394950bb34 100644
--- a/plugins/VisitsSummary/lang/pl.json
+++ b/plugins/VisitsSummary/lang/pl.json
@@ -1,22 +1,8 @@
{
"VisitsSummary": {
- "AverageGenerationTime": "%s średni czas generacji",
- "AverageVisitDuration": "%s średniego czasu trwania odwiedzin",
"GenerateQueries": "%s wykonanych zapytań",
"GenerateTime": "%s sekund do wygenerowania strony",
- "MaxNbActions": "%s działań maksymalnie przypadających na jedną wizytę",
"NbActionsDescription": "%s działań (przeglądania stron, pobrań i linków kolejnych)",
- "NbActionsPerVisit": "%s działań na wizytę",
- "NbDownloadsDescription": "%s pobrań",
- "NbKeywordsDescription": "%s unikalne słowa kluczowe",
- "NbOutlinksDescription": "%s outlinków",
- "NbPageviewsDescription": "%s wejść",
- "NbSearchesDescription": "%s wszystkich wyszukań na twojej strony",
- "NbUniqueDownloadsDescription": "%s unikalnych pobrań",
- "NbUniqueOutlinksDescription": "%s unikalne outlinki",
- "NbUniquePageviewsDescription": "%s unikalnych wejść",
- "NbUniqueVisitors": "%s jednorazowych gości",
- "NbVisitsBounced": "%s odwiedzin powróciło (opuszczając serwis po jednej stronie)",
"VisitsSummary": "Podsumowanie odwiedzin",
"WidgetLastVisits": "Wykres z ostatnich odwiedzin",
"WidgetOverviewGraph": "Podgląd z wykresem",
diff --git a/plugins/VisitsSummary/lang/pt-br.json b/plugins/VisitsSummary/lang/pt-br.json
index 670c7ea640..39d63de8db 100644
--- a/plugins/VisitsSummary/lang/pt-br.json
+++ b/plugins/VisitsSummary/lang/pt-br.json
@@ -1,22 +1,23 @@
{
"VisitsSummary": {
- "AverageGenerationTime": "%s tempo médio de geração",
- "AverageVisitDuration": "duração média da visita %s",
+ "AverageGenerationTime": "tempo médio de geração",
+ "AverageVisitDuration": "duração média da visita",
"GenerateQueries": "%s consultas executadas",
"GenerateTime": "%s segundos para gerar a página",
- "MaxNbActions": "%s ações máximas em uma visita",
+ "MaxNbActions": "ações máximas em uma visita",
"NbActionsDescription": "%s ações (visualizações de páginas, downloads e links externos)",
- "NbActionsPerVisit": "%s ações (exibições de página, downloads, outlinks e pesquisas internas no site) por visita",
- "NbDownloadsDescription": "%s downloads",
- "NbKeywordsDescription": "%s palavras-chave únicas",
- "NbOutlinksDescription": "%s outlinks",
- "NbPageviewsDescription": "%s exibições de página",
- "NbSearchesDescription": "%s pesquisas totais no seu website",
- "NbUniqueDownloadsDescription": "%s downloads únicos",
- "NbUniqueOutlinksDescription": "%s outlinks únicos",
- "NbUniquePageviewsDescription": "%s exibições de página únicas",
- "NbUniqueVisitors": "%s visitantes únicos",
- "NbVisitsBounced": "%s visitantes rejeitaram (deixaram o website após uma página)",
+ "NbActionsPerVisit": "ações (exibições de página, downloads, links externos e pesquisas internas no website) por visita",
+ "NbDownloadsDescription": "downloads",
+ "NbKeywordsDescription": "palavras-chaves unicas",
+ "NbOutlinksDescription": "links externos",
+ "NbPageviewsDescription": "exibições de páginas",
+ "NbSearchesDescription": "buscas totais no seu website",
+ "NbUniqueDownloadsDescription": "downloads únicos",
+ "NbUniqueOutlinksDescription": "links externos únicos",
+ "NbUniquePageviewsDescription": "exibições de páginas únicas",
+ "NbUniqueVisitors": "visitantes únicos",
+ "NbUsersDescription": "usuários",
+ "NbVisitsDescription": "visitas",
"PluginDescription": "Informa métricas analíticas gerais: visitas, visitantes únicos, número de ações, taxa de rejeição, etc.",
"VisitsSummary": "Resumo dos Visitantes",
"VisitsSummaryDocumentation": "Esta é uma visão geral da evolução da visita.",
diff --git a/plugins/VisitsSummary/lang/pt.json b/plugins/VisitsSummary/lang/pt.json
index 07cba81f59..5d9cfd5ccb 100644
--- a/plugins/VisitsSummary/lang/pt.json
+++ b/plugins/VisitsSummary/lang/pt.json
@@ -1,19 +1,8 @@
{
"VisitsSummary": {
- "AverageVisitDuration": "%s duração média de visitas",
"GenerateQueries": "%s consultas executadas",
"GenerateTime": "%s segundos para gerar a página",
- "MaxNbActions": "%s máximo de acções numa visita",
"NbActionsDescription": "%s acções (páginas vistas, transferências e links de saída)",
- "NbActionsPerVisit": "%s acções por visita",
- "NbDownloadsDescription": "%s downloads",
- "NbOutlinksDescription": "%s links de saída",
- "NbPageviewsDescription": "%s visualização de páginas",
- "NbUniqueDownloadsDescription": "%s downloads únicos",
- "NbUniqueOutlinksDescription": "%s links de saída únicos",
- "NbUniquePageviewsDescription": "%s visualização única de páginas",
- "NbUniqueVisitors": "%s visitantes únicos",
- "NbVisitsBounced": "%s visitas ressaltaram (saíram do website depois de uma página)",
"VisitsSummary": "Resumo das Visitas",
"VisitsSummaryDocumentation": "Isto é uma visualização global da evolução das visitas.",
"WidgetLastVisits": "Gráfico das últimas visitas",
diff --git a/plugins/VisitsSummary/lang/ro.json b/plugins/VisitsSummary/lang/ro.json
index 88fab63849..c5c742a3ef 100644
--- a/plugins/VisitsSummary/lang/ro.json
+++ b/plugins/VisitsSummary/lang/ro.json
@@ -1,22 +1,8 @@
{
"VisitsSummary": {
- "AverageGenerationTime": "%s timpul mediu de generare",
- "AverageVisitDuration": "%s durata medie a vizitei",
"GenerateQueries": "%s interogari executate",
"GenerateTime": "%s secunde pentru generarea pagini",
- "MaxNbActions": "%s actiuni maxime pe vizita",
"NbActionsDescription": "%s acţiuni",
- "NbActionsPerVisit": "%s acţiuni (vizionări de pagini, descîrcîri, linkuri externe şi căutări pe site) pentru o vizită",
- "NbDownloadsDescription": "%s descărcări",
- "NbKeywordsDescription": "%s cuvinte-cheie unice",
- "NbOutlinksDescription": "%s outlinks",
- "NbPageviewsDescription": "%s vizionări de pagine",
- "NbSearchesDescription": "total %s căutări pe site-ul tău",
- "NbUniqueDownloadsDescription": "%s descărcări unice",
- "NbUniqueOutlinksDescription": "%s outlinks unice",
- "NbUniquePageviewsDescription": "%s vizualizări unice de pagină",
- "NbUniqueVisitors": "%s vizitatori unici",
- "NbVisitsBounced": "%s vizite care au sarit(a părăsit site-ul după o singură pagină)",
"VisitsSummary": "Rezumatul vizitelor",
"VisitsSummaryDocumentation": "Acesta este un rezumat a evoluţiei vizitelor.",
"WidgetLastVisits": "Grafic ultima vizita",
diff --git a/plugins/VisitsSummary/lang/ru.json b/plugins/VisitsSummary/lang/ru.json
index b9b98ac842..21dbb4c42b 100644
--- a/plugins/VisitsSummary/lang/ru.json
+++ b/plugins/VisitsSummary/lang/ru.json
@@ -1,22 +1,16 @@
{
"VisitsSummary": {
- "AverageGenerationTime": "%s среднее время генерации страницы",
- "AverageVisitDuration": "%s средняя продолжительность посещения",
+ "AverageGenerationTime": "среднее время генерации страницы",
+ "AverageVisitDuration": "средняя продолжительность посещения",
"GenerateQueries": "%s запросов выполнено",
"GenerateTime": "Страница сгенерирована за %s секунд",
- "MaxNbActions": "%s макс. действий за одно посещение",
+ "MaxNbActions": "Максимум действий за одно посещение",
"NbActionsDescription": "%s действий (просмотры страниц, загрузки, внешние переходы)",
- "NbActionsPerVisit": "%s действий за одно посещение",
- "NbDownloadsDescription": "%s скачиваний",
- "NbKeywordsDescription": "%s уникальных ключевых слов",
- "NbOutlinksDescription": "%s исходящих ссылок",
- "NbPageviewsDescription": "%s просмотров страниц",
- "NbSearchesDescription": "%s всего поисков на вашем сайте",
- "NbUniqueDownloadsDescription": "%s уникальных скачиваний",
- "NbUniqueOutlinksDescription": "%s уникальных исходящих ссылок",
- "NbUniquePageviewsDescription": "%s уникальных просмотров страниц",
- "NbUniqueVisitors": "%s уникальных посетителей",
- "NbVisitsBounced": "%s отказов (ушли после посещения одной страницы)",
+ "NbActionsPerVisit": "действий (просмотров, загрузок, уходов с сайта, внутренних поисков по сайту) за одно посещение",
+ "NbDownloadsDescription": "загрузки",
+ "NbKeywordsDescription": "уникальные ключевые слова",
+ "NbOutlinksDescription": "исходящие ссылки",
+ "NbPageviewsDescription": "просмотры страниц",
"VisitsSummary": "Посещения",
"VisitsSummaryDocumentation": "Это обзор динамики посещений.",
"WidgetLastVisits": "График последних посещений",
diff --git a/plugins/VisitsSummary/lang/sk.json b/plugins/VisitsSummary/lang/sk.json
index 4dbc5fb324..a497b6d976 100644
--- a/plugins/VisitsSummary/lang/sk.json
+++ b/plugins/VisitsSummary/lang/sk.json
@@ -1,22 +1,8 @@
{
"VisitsSummary": {
- "AverageGenerationTime": "%s priemerný čas generovania",
- "AverageVisitDuration": "%s priemerná dĺžka návštevy",
"GenerateQueries": "spustené požiadavky: %s",
"GenerateTime": "%s sekúnd na vygenerovanie strany",
- "MaxNbActions": "Max. akcií na jednu návštevu: %s",
"NbActionsDescription": "%s akcie (zobrazenie stránok, sťahovanie a odkazujúce odkazy)",
- "NbActionsPerVisit": "%s akcia za návštevu",
- "NbDownloadsDescription": "%s stiahnutí",
- "NbKeywordsDescription": "%s unikátnych kľúčových slôv",
- "NbOutlinksDescription": "%s vonkajších odkazov",
- "NbPageviewsDescription": "%s zobrazení stránok",
- "NbSearchesDescription": "%s celkovo vyhľádavaní na vašej stránke",
- "NbUniqueDownloadsDescription": "%s unikátnych stiahnutí",
- "NbUniqueOutlinksDescription": "%s unikátnych vonkajších odkazov",
- "NbUniquePageviewsDescription": "%s unikátnych zobrazení stránok",
- "NbUniqueVisitors": "Počet unikátnych návštevníkov: %s",
- "NbVisitsBounced": "%s návštev odskočilo (odišli po zobrazení jednej stránky)",
"VisitsSummary": "Všetky návštevy",
"WidgetLastVisits": "Graf posledných návštev",
"WidgetOverviewGraph": "Prehľad s grafom",
diff --git a/plugins/VisitsSummary/lang/sl.json b/plugins/VisitsSummary/lang/sl.json
index 3e80b38b7b..cb459b0bea 100644
--- a/plugins/VisitsSummary/lang/sl.json
+++ b/plugins/VisitsSummary/lang/sl.json
@@ -1,22 +1,8 @@
{
"VisitsSummary": {
- "AverageGenerationTime": "%s povprečni čas generiranja",
- "AverageVisitDuration": "%s povprečno trajanje obiska",
"GenerateQueries": "%s izvršenih povpraševanj",
"GenerateTime": "%s sekund za prikaz strani",
- "MaxNbActions": "%s največje število akcij v enem obisku",
"NbActionsDescription": "%s akcij",
- "NbActionsPerVisit": "%s akcij (ogledov, prenosov, izhodnih povezav) na obisk",
- "NbDownloadsDescription": "%s prenosov",
- "NbKeywordsDescription": "%s unikatnih ključnih besed",
- "NbOutlinksDescription": "%s izhodnih povezav",
- "NbPageviewsDescription": "%s ogledov",
- "NbSearchesDescription": "%s vseh iskanj na vaši spletni strani",
- "NbUniqueDownloadsDescription": "%s unikatnih prenosov",
- "NbUniqueOutlinksDescription": "%s unikatnih izhodnih povezav",
- "NbUniquePageviewsDescription": "%s unikatnih ogledov",
- "NbUniqueVisitors": "%s unikatnih obiskovalcev",
- "NbVisitsBounced": "%s ogledov je bilo odbojev (so zapustili stran po ogledu ene strani)",
"PluginDescription": "Prikaže splošne anlitične metrike: obiski, unikatni obiskovalci, število akcij, stopnja odbojev, ipd.",
"VisitsSummary": "Povzetek obiskov",
"VisitsSummaryDocumentation": "Pregled obiskov v zadnjem času.",
diff --git a/plugins/VisitsSummary/lang/sq.json b/plugins/VisitsSummary/lang/sq.json
index c03725df66..0f3309d600 100644
--- a/plugins/VisitsSummary/lang/sq.json
+++ b/plugins/VisitsSummary/lang/sq.json
@@ -1,22 +1,24 @@
{
"VisitsSummary": {
- "AverageGenerationTime": "%s mesatare kohe prodhimi",
- "AverageVisitDuration": "%s mesatare zgjatje vizitash",
+ "AverageGenerationTime": "kohë mesatare krijimi",
+ "AverageVisitDuration": "mesatare kohëzgjatje vizitash",
"GenerateQueries": "%s kërkesa të kryera",
"GenerateTime": "%s sekonda për prodhimin e faqes",
- "MaxNbActions": "maksimumi %s veprime në një vizitë",
+ "MaxNbActions": "maksimum veprimesh në një vizitë",
"NbActionsDescription": "%s veprime",
- "NbActionsPerVisit": "%s veprime (parje faqesh, shkarkime, lidhje për jashtë sajtit dhe kërkime brenda sajtit) për vizitë",
- "NbDownloadsDescription": "%s shkarkime",
- "NbKeywordsDescription": "%s fjalëkyçe unikë",
- "NbOutlinksDescription": "%s lidhje për jashtë",
- "NbPageviewsDescription": "%s parje faqesh",
- "NbSearchesDescription": "%s kërkime gjithsej në sajtin tuaj",
- "NbUniqueDownloadsDescription": "%s shkarkime unike",
- "NbUniqueOutlinksDescription": "%s lidhje unike për jashtë",
- "NbUniquePageviewsDescription": "%s parje unike faqesh",
- "NbUniqueVisitors": "%s vizitorë unikë",
- "NbVisitsBounced": "%s vizita të kthyera mbrapsht (e lanë sajtin pas një faqeje)",
+ "NbActionsPerVisit": "veprime (parje faqesh, shkarkime, lidhje për jashtë dhe kërkime brenda sajtit) për vizitë",
+ "NbDownloadsDescription": "shkarkime",
+ "NbKeywordsDescription": "fjalëkyçe unikë",
+ "NbOutlinksDescription": "lidhje për jashtë",
+ "NbPageviewsDescription": "parje faqesh",
+ "NbSearchesDescription": "kërkime gjithsej në sajtin tuaj",
+ "NbUniqueDownloadsDescription": "shkarkime unike",
+ "NbUniqueOutlinksDescription": "lidhje për jashtë unike",
+ "NbUniquePageviewsDescription": "parje unike faqesh",
+ "NbUniqueVisitors": "vizitorë unikë",
+ "NbUsersDescription": "përdorues",
+ "NbVisitsDescription": "vizita",
+ "NbVisitsBounced": "vizita të kthyera mbrapsht (e lanë sajtin pas një faqeje)",
"PluginDescription": "Raporton vlera të përgjithshme analitike: vizita, vizitorë unikë, numër veprimesh, shkallë kthimesh, etj.",
"VisitsSummary": "Përmbledhje Vizitash",
"VisitsSummaryDocumentation": "Kjo është një përmbledhje e evolucionit të vizitave.",
diff --git a/plugins/VisitsSummary/lang/sr.json b/plugins/VisitsSummary/lang/sr.json
index ed90e2059a..98604d7ef2 100644
--- a/plugins/VisitsSummary/lang/sr.json
+++ b/plugins/VisitsSummary/lang/sr.json
@@ -1,22 +1,24 @@
{
"VisitsSummary": {
- "AverageGenerationTime": "%s prosečno vreme generisanja",
- "AverageVisitDuration": "Prosečno trajanje posete: %s",
+ "AverageGenerationTime": "prosečno vreme generisanja",
+ "AverageVisitDuration": "prosečno trajanje posete",
"GenerateQueries": "Izvršeno upita: %s",
"GenerateTime": "Vreme generisanja izveštaja u sekundama: %s",
- "MaxNbActions": "Maksimum akcija u jednoj poseti: %s",
+ "MaxNbActions": "maksimum akcija u jednoj poseti",
"NbActionsDescription": "Broj akcija (prikaza stranica, preuzimanja i odlazaka): %s",
- "NbActionsPerVisit": "Akcija po poseti: %s",
- "NbDownloadsDescription": "%s preuzimanja",
- "NbKeywordsDescription": "Jedinstvenih ključnih reči: %s",
- "NbOutlinksDescription": "%s izlaznih linkova",
- "NbPageviewsDescription": "%s prikaza stranica",
- "NbSearchesDescription": "Ukupno pretraživanja vašeg sajta: %s",
- "NbUniqueDownloadsDescription": "%s jedinstvenih preuzimanja",
- "NbUniqueOutlinksDescription": "%s jedinstvenih izlaznih linkova",
- "NbUniquePageviewsDescription": "%s jedinstvenih prikaza stranica",
- "NbUniqueVisitors": "Broj jedinstvenih posetilaca: %s",
- "NbVisitsBounced": "%s posetilaca je otišlo posle samo jedne stranice",
+ "NbActionsPerVisit": "akcije (prikaz stranica, pruzimanja, izlazni linkovi i pretrage) po poseti",
+ "NbDownloadsDescription": "preuzimanja",
+ "NbKeywordsDescription": "jedinstvene ključne reči",
+ "NbOutlinksDescription": "izlazni linkovi",
+ "NbPageviewsDescription": "prikazane stranice",
+ "NbSearchesDescription": "ukupno pretraživanja vašeg sajta",
+ "NbUniqueDownloadsDescription": "jedinstvena preuzimanja",
+ "NbUniqueOutlinksDescription": "jedinstveni izlazni linkovi",
+ "NbUniquePageviewsDescription": "jedinstveni prikazi stranica",
+ "NbUniqueVisitors": "jedinstveni posetioci",
+ "NbUsersDescription": "korisnici",
+ "NbVisitsDescription": "posete",
+ "NbVisitsBounced": "posetioci koji su otišli posle samo jedne stranice",
"PluginDescription": "Prikaz osnovnih metrika: posete, jedinstveni posetioci, broj akcija, stepen odbijanja (bounce) itd.",
"VisitsSummary": "Sumarno",
"VisitsSummaryDocumentation": "Ovo je pregled razvoja poseta",
diff --git a/plugins/VisitsSummary/lang/sv.json b/plugins/VisitsSummary/lang/sv.json
index e5cef028dc..e4d98e464c 100644
--- a/plugins/VisitsSummary/lang/sv.json
+++ b/plugins/VisitsSummary/lang/sv.json
@@ -1,22 +1,8 @@
{
"VisitsSummary": {
- "AverageGenerationTime": "%s genomsnittlig genereringstid",
- "AverageVisitDuration": "%s genomsnittlig besökstid",
"GenerateQueries": "%s frågor exekverade",
"GenerateTime": "Det tog %s sekunder att generera denna sida.",
- "MaxNbActions": "%s händelser som mest i ett besök",
"NbActionsDescription": "%s händelser (sidvisningar, nedladdningar och outlinks)",
- "NbActionsPerVisit": "%s händelser per besök",
- "NbDownloadsDescription": "%s nerladdningar",
- "NbKeywordsDescription": "%s unika sökord",
- "NbOutlinksDescription": "%s utlänkar",
- "NbPageviewsDescription": "%s sidvisningar",
- "NbSearchesDescription": "%s sökningar",
- "NbUniqueDownloadsDescription": "%s unika nerladdningar",
- "NbUniqueOutlinksDescription": "%s unika utlänkar",
- "NbUniquePageviewsDescription": "%s unika sidvisningar",
- "NbUniqueVisitors": "%s unika besökare",
- "NbVisitsBounced": "%s besökare som studsat (lämnat efter en sidvisning)",
"PluginDescription": "Rapporter för allmän analytics-statistik: besök, unika besökare, antal slutförda mål, avvisningsfrekvens , etc.",
"VisitsSummary": "Besökssummering",
"VisitsSummaryDocumentation": "Detta är en översikt av besöksutvecklingen.",
diff --git a/plugins/VisitsSummary/lang/te.json b/plugins/VisitsSummary/lang/te.json
index 7d8f7f85e8..7847f48489 100644
--- a/plugins/VisitsSummary/lang/te.json
+++ b/plugins/VisitsSummary/lang/te.json
@@ -1,8 +1,6 @@
{
"VisitsSummary": {
"NbActionsDescription": "%s చర్యలు",
- "NbDownloadsDescription": "%s దింపుకోళ్ళు",
- "NbOutlinksDescription": "%s బయటిలంకెలు",
"VisitsSummary": "సందర్శనల సంగ్రహం"
}
} \ No newline at end of file
diff --git a/plugins/VisitsSummary/lang/th.json b/plugins/VisitsSummary/lang/th.json
index 9c423dd601..a41b9db15e 100644
--- a/plugins/VisitsSummary/lang/th.json
+++ b/plugins/VisitsSummary/lang/th.json
@@ -1,22 +1,8 @@
{
"VisitsSummary": {
- "AverageGenerationTime": "%s เวลาเฉลี่ยในการผลิต",
- "AverageVisitDuration": "เฉลี่ยระยะเวลาการเข้าชม %s",
"GenerateQueries": "%s การค้นหา",
"GenerateTime": "%s วินาทีที่ใช้",
- "MaxNbActions": "%s หน้าสูงสุดในหนึ่งผู้เข้าชม",
"NbActionsDescription": "%s ดำเนินการ(เข้าชม ดาวน์โหลดและลิงค์ออก)",
- "NbActionsPerVisit": "%s ดำเนินต่อเข้าชม",
- "NbDownloadsDescription": "%s ดาวน์โหลด",
- "NbKeywordsDescription": "%s คีย์เวิร์ดที่ไม่ซ้ำกัน",
- "NbOutlinksDescription": "%s ลิงค์ที่ออก",
- "NbPageviewsDescription": "%s จำนวนหน้าที่มีการเปิด",
- "NbSearchesDescription": "รวมผลการค้นหาทั้งหมด %s รายการ ในเว็บไซต์ของคุณ",
- "NbUniqueDownloadsDescription": "%s จำนวนดาวน์โหลดที่ไม่ซ้ำกันน",
- "NbUniqueOutlinksDescription": "%s จำนวนลิงค์ที่ออกโดยไม่ซ้ำกัน",
- "NbUniquePageviewsDescription": "%s จำนวนหน้าที่มีการเปิดที่ไม่ซ้ำกัน",
- "NbUniqueVisitors": "%s ผู้เข้าชมที่ไม่ซ้ำ",
- "NbVisitsBounced": "%s ของผู้เข้าชมที่เด้ง (คือการออกจากเว็บไซต์หลังจากเปิดเพียงหน้าเดียว)",
"VisitsSummary": "สรุปการเข้าชม",
"VisitsSummaryDocumentation": "ภาพรวมของผู้เข้าชม",
"WidgetLastVisits": "กราฟของผู้เข้าชมล่าสุด",
diff --git a/plugins/VisitsSummary/lang/tl.json b/plugins/VisitsSummary/lang/tl.json
index ea4925b0d9..21d9d5eb9d 100644
--- a/plugins/VisitsSummary/lang/tl.json
+++ b/plugins/VisitsSummary/lang/tl.json
@@ -1,22 +1,8 @@
{
"VisitsSummary": {
- "AverageGenerationTime": "%s average na henerasyon ng panahon",
- "AverageVisitDuration": "average na tagal ng pagbisita %s",
"GenerateQueries": "mga query sa %s isagawa",
"GenerateTime": "segundo %s upang makabuo ng pahina.",
- "MaxNbActions": "max na mga aksyon %s ng isang pagbisita",
"NbActionsDescription": "%s mga aksyon",
- "NbActionsPerVisit": "Mga aksyon %s (mga page view downloads outlinks at panloob na paghahanap sa site) sa bawat pagbisita",
- "NbDownloadsDescription": "%s downloads",
- "NbKeywordsDescription": "mga natatanging mga keyword %s",
- "NbOutlinksDescription": "%s outlinks",
- "NbPageviewsDescription": "mga pageview %s",
- "NbSearchesDescription": "Kabuuan ng mga paghahanap %s sa iyong website.",
- "NbUniqueDownloadsDescription": "natatanging pag-download %s",
- "NbUniqueOutlinksDescription": "natatanging outlinks %s",
- "NbUniquePageviewsDescription": "%s natatanging mga pageview",
- "NbUniqueVisitors": "mga natatanging bisita %s",
- "NbVisitsBounced": "%s na pagbisita ay bumalik (umalis sa website pagkatapos ng isang pahina)",
"VisitsSummary": "Buod ng mga Pagbisita",
"VisitsSummaryDocumentation": "Ito ay isang pangkalahatang-ideya sa ebolusyon ng pagbisita",
"WidgetLastVisits": "Mga pagbisita sa paglipas ng panahon",
diff --git a/plugins/VisitsSummary/lang/tr.json b/plugins/VisitsSummary/lang/tr.json
index 6917add789..30c59cfadb 100644
--- a/plugins/VisitsSummary/lang/tr.json
+++ b/plugins/VisitsSummary/lang/tr.json
@@ -2,11 +2,7 @@
"VisitsSummary": {
"GenerateQueries": "%s sorgu çalıştırılmıştır.",
"GenerateTime": "sayfa %s saniyede oluşturulmuştur.",
- "MaxNbActions": "Bir ziyarette yapılan max etkinlik %s",
"NbActionsDescription": "Etkinlik sayısı %s (sayfa gösterimi, dosya indirme, dış linkler)",
- "NbKeywordsDescription": "%s tekil anahtar kelimeler",
- "NbUniqueVisitors": "%s tekil ziyaretçiler",
- "NbVisitsBounced": "%s ziyaret sıçrama yaşadı (ziyaretçi 1 sayfaya baktıktan sonra siteyi terketti )",
"VisitsSummary": "Özeri gör",
"VisitsSummaryDocumentation": "Ziyaretler için genel bakış niteliğindedir.",
"WidgetLastVisits": "Son ziyaret grafiği",
diff --git a/plugins/VisitsSummary/lang/uk.json b/plugins/VisitsSummary/lang/uk.json
index 2a394222c2..2a6d5e1377 100644
--- a/plugins/VisitsSummary/lang/uk.json
+++ b/plugins/VisitsSummary/lang/uk.json
@@ -1,22 +1,8 @@
{
"VisitsSummary": {
- "AverageGenerationTime": "%s середній час генерації сторінки",
- "AverageVisitDuration": "%s середня тривалість відвідування",
"GenerateQueries": "%s запитів виконано",
"GenerateTime": "сторінка згенерована за %s секунд",
- "MaxNbActions": "%s макс. дій за одне відвідування",
"NbActionsDescription": "%s дій (перегляди сторінок, завантаження, зовнішні переходи)",
- "NbActionsPerVisit": "%s дій за одне відвідування",
- "NbDownloadsDescription": "%s завантажень",
- "NbKeywordsDescription": "%s унікальних ключових слів",
- "NbOutlinksDescription": "%s вихідних посилань",
- "NbPageviewsDescription": "%s переглядів сторінок",
- "NbSearchesDescription": "%s всього пошуків на вашому сайті",
- "NbUniqueDownloadsDescription": "%s унікальних завантажень",
- "NbUniqueOutlinksDescription": "%s унікальних зовнішніх посилань",
- "NbUniquePageviewsDescription": "%s унікальних переглядів сторінок",
- "NbUniqueVisitors": "%s унікальних відвідувачів",
- "NbVisitsBounced": "%s відмов (пішли після перегляду однієї сторінки)",
"PluginDescription": "Звіти загальних аналітичних показників: відвідування, кількість унікальних відвідувачів, кількість користувачів, показник відмов і т.д..",
"VisitsSummary": "Відвідувань",
"VisitsSummaryDocumentation": "Це огляд динаміки відвідувань.",
diff --git a/plugins/VisitsSummary/lang/vi.json b/plugins/VisitsSummary/lang/vi.json
index f78ae7409d..a9b6113b17 100644
--- a/plugins/VisitsSummary/lang/vi.json
+++ b/plugins/VisitsSummary/lang/vi.json
@@ -1,22 +1,8 @@
{
"VisitsSummary": {
- "AverageGenerationTime": "Thời gian phát sinh trung bình %s",
- "AverageVisitDuration": "Thời gian truy cập trung bình %s",
"GenerateQueries": "Thực thi truy vấn %s",
"GenerateTime": "%s giây để tạo trang",
- "MaxNbActions": "Các hoạt động tối đa %s trong một lần truy cập",
"NbActionsDescription": "Hành động %s",
- "NbActionsPerVisit": "Hành động %s ( xem trang, tải xuống, outlink và trang tìm kiếm nội bộ) mỗi lượt truy cập",
- "NbDownloadsDescription": "%s tải xuống",
- "NbKeywordsDescription": "%s từ khóa duy nhất(unique)",
- "NbOutlinksDescription": "%s outlink",
- "NbPageviewsDescription": "%s lượt xem trang",
- "NbSearchesDescription": "%s Tổng số lượt tìm kiếm trên trang web của bạn",
- "NbUniqueDownloadsDescription": "%s lượt tải duy nhất",
- "NbUniqueOutlinksDescription": "%s outlink duy nhất",
- "NbUniquePageviewsDescription": "%s lượt xem trang duy nhất",
- "NbUniqueVisitors": "%s khách truy cập duy nhất",
- "NbVisitsBounced": "%s lượt truy cập đã bị thải hồi (rời khỏi trang web sau mỗi lượt truy cập trang)",
"VisitsSummary": "Lịch sử các lượt truy cập",
"VisitsSummaryDocumentation": "Đây là một tổng quan của sự mở rộng truy cập.",
"WidgetLastVisits": "Các lượt truy cập theo thời gian",
diff --git a/plugins/VisitsSummary/lang/zh-cn.json b/plugins/VisitsSummary/lang/zh-cn.json
index ddc41833d2..c79b828cbf 100644
--- a/plugins/VisitsSummary/lang/zh-cn.json
+++ b/plugins/VisitsSummary/lang/zh-cn.json
@@ -1,22 +1,8 @@
{
"VisitsSummary": {
- "AverageGenerationTime": "%s 平均生成时间",
- "AverageVisitDuration": "%s 平均停留时间",
"GenerateQueries": "%s 查询已执行",
"GenerateTime": "%s 秒来生成这个页面",
- "MaxNbActions": "%s 单次访问的最大活动量",
"NbActionsDescription": "%s 次活动",
- "NbActionsPerVisit": "%s 次活动 (查看页面、下载、离站链接和内部搜索)",
- "NbDownloadsDescription": "%s 次下载",
- "NbKeywordsDescription": "%s 个关键词",
- "NbOutlinksDescription": "%s 次离站链接",
- "NbPageviewsDescription": "%s 次浏览",
- "NbSearchesDescription": "%s 次站内搜索",
- "NbUniqueDownloadsDescription": "%s 次唯一下载",
- "NbUniqueOutlinksDescription": "%s 个唯一离站链接",
- "NbUniquePageviewsDescription": "%s 次唯一浏览",
- "NbUniqueVisitors": "%s 个独立访客数",
- "NbVisitsBounced": "%s 的跳出率 (查看一个页面后就离开)",
"PluginDescription": "报告一般分析指标:参观,独立访问者,动作次数,跳出率等。",
"VisitsSummary": "访客总表",
"VisitsSummaryDocumentation": "这是访客趋势总表。",
diff --git a/plugins/VisitsSummary/lang/zh-tw.json b/plugins/VisitsSummary/lang/zh-tw.json
index 3d772fb0ac..bd098deff2 100644
--- a/plugins/VisitsSummary/lang/zh-tw.json
+++ b/plugins/VisitsSummary/lang/zh-tw.json
@@ -1,13 +1,8 @@
{
"VisitsSummary": {
- "AverageVisitDuration": "平均訪問時間 %s",
"GenerateQueries": "%s 個查詢已執行",
"GenerateTime": "頁面生成時間: %s 秒",
- "MaxNbActions": "%s 由單一次造訪所產生的最大活動數",
"NbActionsDescription": "%s 個活動(檢視網頁、下載和離開連結)",
- "NbActionsPerVisit": "%s 每個訪客的活動數",
- "NbUniqueVisitors": "不重複訪客 %s 位",
- "NbVisitsBounced": "跳出率 %s(僅瀏覽一頁便離站)",
"VisitsSummary": "訪客總覽",
"WidgetLastVisits": "最近造訪圖表",
"WidgetOverviewGraph": "圖表總覽",
diff --git a/plugins/WebsiteMeasurable/lang/ru.json b/plugins/WebsiteMeasurable/lang/ru.json
index a0536412cd..b936fa87c3 100644
--- a/plugins/WebsiteMeasurable/lang/ru.json
+++ b/plugins/WebsiteMeasurable/lang/ru.json
@@ -1,5 +1,7 @@
{
"WebsiteMeasurable": {
- "Website": "Веб-сайт"
+ "Website": "Веб-сайт",
+ "Websites": "Веб-сайты",
+ "WebsiteDescription": "Сайт состоит из веб-страниц и как правило, открывается с одного веб-домена."
}
} \ No newline at end of file
diff --git a/plugins/Widgetize/lang/sq.json b/plugins/Widgetize/lang/sq.json
index 56dbe3cf9c..e17d29b5b4 100644
--- a/plugins/Widgetize/lang/sq.json
+++ b/plugins/Widgetize/lang/sq.json
@@ -1,5 +1,7 @@
{
"Widgetize": {
- "OpenInNewWindow": "Hape në dritare të re"
+ "OpenInNewWindow": "Hape në dritare të re",
+ "PluginDescription": "Shfaqni çfarëdo raporti Piwik në sajtin apo aplikacionin tuaj, përmes një etikete të thjeshtë Embed HTML.",
+ "TopLinkTooltip": "Eksportoni Raporte Piwik si Widget-e dhe bëjeni Pultin pjesë të aplikacionit tuaj si një iframe."
}
} \ No newline at end of file
diff --git a/tests/PHPUnit/Fixtures/TwoVisitsWithCustomEvents.php b/tests/PHPUnit/Fixtures/ThreeVisitsWithCustomEvents.php
index fc3f12d979..3471c3b3e7 100644
--- a/tests/PHPUnit/Fixtures/TwoVisitsWithCustomEvents.php
+++ b/tests/PHPUnit/Fixtures/ThreeVisitsWithCustomEvents.php
@@ -15,7 +15,7 @@ use PiwikTracker;
/**
* Tracks custom events
*/
-class TwoVisitsWithCustomEvents extends Fixture
+class ThreeVisitsWithCustomEvents extends Fixture
{
public $dateTime = '2010-01-03 11:22:33';
public $idSite = 1;
@@ -68,6 +68,15 @@ class TwoVisitsWithCustomEvents extends Fixture
$this->trackMusicRatings($vis2);
$this->trackMovieWatchingIncludingInterval($vis2);
+ $this->dateTime = Date::factory($this->dateTime)->addDay(1);
+ $vis3 = self::getTracker($this->idSite, $this->dateTime, $useDefault = true, $uselocal);
+ $vis3->setIp('111.1.1.2');
+ $vis3->setPlugins($flash = false, $java = false, $director = true);
+
+ $this->trackMusicPlaying($vis3);
+ $this->trackMusicRatings($vis3);
+ $this->trackMovieWatchingIncludingInterval($vis3);
+
}
private function moveTimeForward(PiwikTracker $vis, $minutes)
diff --git a/tests/PHPUnit/Integration/EmailValidatorTest.php b/tests/PHPUnit/Integration/EmailValidatorTest.php
index a9adff114a..8cb0c198c0 100644
--- a/tests/PHPUnit/Integration/EmailValidatorTest.php
+++ b/tests/PHPUnit/Integration/EmailValidatorTest.php
@@ -24,7 +24,7 @@ class EmailValidatorTest extends \PHPUnit_Framework_TestCase
private function getAllTlds()
{
/** @var array $response */
- $response = \Piwik\Http::sendHttpRequest("http://data.iana.org/TLD/tlds-alpha-by-domain.txt", 30, null, null, null, null, null, true);
+ $response = \Piwik\Http::sendHttpRequest("http://data.iana.org/TLD/tlds-alpha-by-domain.txt", 60, null, null, null, null, null, true);
$this->assertEquals("200", $response['status']);
diff --git a/tests/PHPUnit/Integration/HttpTest.php b/tests/PHPUnit/Integration/HttpTest.php
index 417a98599d..272c36c0e1 100644
--- a/tests/PHPUnit/Integration/HttpTest.php
+++ b/tests/PHPUnit/Integration/HttpTest.php
@@ -235,7 +235,7 @@ class HttpTest extends \PHPUnit_Framework_TestCase
*/
public function testCurlHttpsFailsWithInvalidCertificate()
{
- Http::sendHttpRequestBy('curl', 'https://divezone.net', 10);
+ Http::sendHttpRequestBy('curl', 'https://www.virtual-drums.com', 10);
}
/**
@@ -244,7 +244,7 @@ class HttpTest extends \PHPUnit_Framework_TestCase
*/
public function testFopenHttpsFailsWithInvalidCertificate()
{
- Http::sendHttpRequestBy('fopen', 'https://divezone.net', 10);
+ Http::sendHttpRequestBy('fopen', 'https://www.virtual-drums.com', 10);
}
/**
diff --git a/tests/PHPUnit/System/BackwardsCompatibility1XTest.php b/tests/PHPUnit/System/BackwardsCompatibility1XTest.php
index 677272593d..68de1b1e3c 100644
--- a/tests/PHPUnit/System/BackwardsCompatibility1XTest.php
+++ b/tests/PHPUnit/System/BackwardsCompatibility1XTest.php
@@ -135,6 +135,10 @@ class BackwardsCompatibility1XTest extends SystemTestCase
'Actions.get',
'Actions.getOutlink',
'Actions.getOutlinks',
+
+ // system settings such as enable_plugin_update_communication are enabled by default in newest version,
+ // but ugpraded Piwik are not
+ 'CorePluginsAdmin.getSystemSettings'
);
$apiNotToCall = array_merge($apiNotToCall, $reportsToCompareSeparately);
diff --git a/tests/PHPUnit/System/CustomEventsTest.php b/tests/PHPUnit/System/CustomEventsTest.php
index f0eef83354..bb2ba6bca7 100644
--- a/tests/PHPUnit/System/CustomEventsTest.php
+++ b/tests/PHPUnit/System/CustomEventsTest.php
@@ -8,7 +8,7 @@
namespace Piwik\Tests\System;
use Piwik\Tests\Framework\TestCase\SystemTestCase;
-use Piwik\Tests\Fixtures\TwoVisitsWithCustomEvents;
+use Piwik\Tests\Fixtures\ThreeVisitsWithCustomEvents;
/**
* Testing Custom Events
@@ -19,7 +19,7 @@ use Piwik\Tests\Fixtures\TwoVisitsWithCustomEvents;
class CustomEventsTest extends SystemTestCase
{
/**
- * @var TwoVisitsWithCustomEvents
+ * @var ThreeVisitsWithCustomEvents
*/
public static $fixture = null; // initialized below class definition
@@ -91,7 +91,7 @@ class CustomEventsTest extends SystemTestCase
'idSite' => $idSite1,
'date' => $dateTime,
'periods' => $dayPeriod,
- 'idGoal' => TwoVisitsWithCustomEvents::$idGoalTriggeredOnEventCategory,
+ 'idGoal' => ThreeVisitsWithCustomEvents::$idGoalTriggeredOnEventCategory,
'setDateLastN' => false)
)
@@ -151,4 +151,4 @@ class CustomEventsTest extends SystemTestCase
}
}
-CustomEventsTest::$fixture = new TwoVisitsWithCustomEvents();
+CustomEventsTest::$fixture = new ThreeVisitsWithCustomEvents();
diff --git a/tests/PHPUnit/System/expected/test_CustomEvents_Events.getAction_flat__API.getProcessedReport_day.xml b/tests/PHPUnit/System/expected/test_CustomEvents_Events.getAction_flat__API.getProcessedReport_day.xml
index 193c7e3ebb..3cfabafb6c 100644
--- a/tests/PHPUnit/System/expected/test_CustomEvents_Events.getAction_flat__API.getProcessedReport_day.xml
+++ b/tests/PHPUnit/System/expected/test_CustomEvents_Events.getAction_flat__API.getProcessedReport_day.xml
@@ -224,7 +224,179 @@
<avg_event_value>0</avg_event_value>
</row>
</result>
- <result prettyDate="Monday, January 4, 2010" />
+ <result prettyDate="Monday, January 4, 2010">
+ <row>
+ <label>clickBuyNow - Spirited Away (千と千尋の神隠し)</label>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <avg_event_value>0</avg_event_value>
+ </row>
+ <row>
+ <label>event action Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long ---&gt; SHOULD APPEAR IN TEST OUTPUT NOT TRUNCATED &lt;--- - event name Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long ---&gt; SHOULD APPEAR IN TEST OUTPUT NOT TRUNCATED &lt;---</label>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>1</nb_events_with_value>
+ <sum_event_value>9.66</sum_event_value>
+ <min_event_value>9.66</min_event_value>
+ <max_event_value>9.66</max_event_value>
+ <avg_event_value>9.66</avg_event_value>
+ </row>
+ <row>
+ <label>play - La fiancée de l'eau</label>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <avg_event_value>0</avg_event_value>
+ </row>
+ <row>
+ <label>play25% - La fiancée de l'eau</label>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <avg_event_value>0</avg_event_value>
+ </row>
+ <row>
+ <label>play25% - Spirited Away (千と千尋の神隠し)</label>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <avg_event_value>0</avg_event_value>
+ </row>
+ <row>
+ <label>play50% - La fiancée de l'eau</label>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <avg_event_value>0</avg_event_value>
+ </row>
+ <row>
+ <label>play50% - Spirited Away (千と千尋の神隠し)</label>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <avg_event_value>0</avg_event_value>
+ </row>
+ <row>
+ <label>play75% - La fiancée de l'eau</label>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <avg_event_value>0</avg_event_value>
+ </row>
+ <row>
+ <label>play75% - Spirited Away (千と千尋の神隠し)</label>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <avg_event_value>0</avg_event_value>
+ </row>
+ <row>
+ <label>playEnd - La fiancée de l'eau</label>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <avg_event_value>0</avg_event_value>
+ </row>
+ <row>
+ <label>playEnd - Spirited Away (千と千尋の神隠し)</label>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <avg_event_value>0</avg_event_value>
+ </row>
+ <row>
+ <label>playStart - Spirited Away (千と千尋の神隠し)</label>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <avg_event_value>0</avg_event_value>
+ </row>
+ <row>
+ <label>playTrailer - Ponyo (崖の上のポニョ)</label>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <avg_event_value>0</avg_event_value>
+ </row>
+ <row>
+ <label>playTrailer - Princess Mononoke (もののけ姫)</label>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <avg_event_value>0</avg_event_value>
+ </row>
+ <row>
+ <label>playTrailer - Spirited Away (千と千尋の神隠し)</label>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <avg_event_value>0</avg_event_value>
+ </row>
+ <row>
+ <label>Purchase</label>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <avg_event_value>0</avg_event_value>
+ </row>
+ <row>
+ <label>rating - La fiancée de l'eau</label>
+ <nb_events>2</nb_events>
+ <nb_events_with_value>2</nb_events_with_value>
+ <sum_event_value>19</sum_event_value>
+ <min_event_value>9</min_event_value>
+ <max_event_value>10</max_event_value>
+ <avg_event_value>9.5</avg_event_value>
+ </row>
+ <row>
+ <label>rating - Spirited Away (千と千尋の神隠し)</label>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>1</nb_events_with_value>
+ <sum_event_value>9.66</sum_event_value>
+ <min_event_value>9.66</min_event_value>
+ <max_event_value>9.66</max_event_value>
+ <avg_event_value>9.66</avg_event_value>
+ </row>
+ <row>
+ <label>Search - Search query here</label>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <avg_event_value>0</avg_event_value>
+ </row>
+ </result>
<result prettyDate="Tuesday, January 5, 2010" />
<result prettyDate="Wednesday, January 6, 2010" />
<result prettyDate="Thursday, January 7, 2010" />
@@ -241,7 +413,7 @@
<result prettyDate="Saturday, January 9, 2010" />
</reportMetadata>
<reportTotal>
- <nb_visits>43</nb_visits>
- <nb_uniq_visitors>41</nb_uniq_visitors>
+ <nb_visits>64</nb_visits>
+ <nb_uniq_visitors>61</nb_uniq_visitors>
</reportTotal>
</result> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_CustomEvents_Events.getAction_lastN__API.getProcessedReport_day.xml b/tests/PHPUnit/System/expected/test_CustomEvents_Events.getAction_lastN__API.getProcessedReport_day.xml
index 60b79ec22c..a852445667 100644
--- a/tests/PHPUnit/System/expected/test_CustomEvents_Events.getAction_lastN__API.getProcessedReport_day.xml
+++ b/tests/PHPUnit/System/expected/test_CustomEvents_Events.getAction_lastN__API.getProcessedReport_day.xml
@@ -161,7 +161,116 @@
<avg_event_value>0</avg_event_value>
</row>
</result>
- <result prettyDate="Monday, January 4, 2010" />
+ <result prettyDate="Monday, January 4, 2010">
+ <row>
+ <label>playTrailer</label>
+ <nb_events>3</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <avg_event_value>0</avg_event_value>
+ </row>
+ <row>
+ <label>Search</label>
+ <nb_events>3</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <avg_event_value>0</avg_event_value>
+ </row>
+ <row>
+ <label>play25%</label>
+ <nb_events>2</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <avg_event_value>0</avg_event_value>
+ </row>
+ <row>
+ <label>play50%</label>
+ <nb_events>2</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <avg_event_value>0</avg_event_value>
+ </row>
+ <row>
+ <label>play75%</label>
+ <nb_events>2</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <avg_event_value>0</avg_event_value>
+ </row>
+ <row>
+ <label>playEnd</label>
+ <nb_events>2</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <avg_event_value>0</avg_event_value>
+ </row>
+ <row>
+ <label>rating</label>
+ <nb_events>3</nb_events>
+ <nb_events_with_value>3</nb_events_with_value>
+ <sum_event_value>28.66</sum_event_value>
+ <min_event_value>9</min_event_value>
+ <max_event_value>10</max_event_value>
+ <avg_event_value>9.55</avg_event_value>
+ </row>
+ <row>
+ <label>clickBuyNow</label>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <avg_event_value>0</avg_event_value>
+ </row>
+ <row>
+ <label>event action Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long ---&gt; SHOULD APPEAR IN TEST OUTPUT NOT TRUNCATED &lt;---</label>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>1</nb_events_with_value>
+ <sum_event_value>9.66</sum_event_value>
+ <min_event_value>9.66</min_event_value>
+ <max_event_value>9.66</max_event_value>
+ <avg_event_value>9.66</avg_event_value>
+ </row>
+ <row>
+ <label>play</label>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <avg_event_value>0</avg_event_value>
+ </row>
+ <row>
+ <label>playStart</label>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <avg_event_value>0</avg_event_value>
+ </row>
+ <row>
+ <label>Purchase</label>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <avg_event_value>0</avg_event_value>
+ </row>
+ </result>
<result prettyDate="Tuesday, January 5, 2010" />
<result prettyDate="Wednesday, January 6, 2010" />
<result prettyDate="Thursday, January 7, 2010" />
@@ -173,57 +282,57 @@
<row>
<segment>eventAction==playTrailer</segment>
- <idsubdatatable>856</idsubdatatable>
+ <idsubdatatable>1548</idsubdatatable>
</row>
<row>
<segment>eventAction==Search</segment>
- <idsubdatatable>849</idsubdatatable>
+ <idsubdatatable>1541</idsubdatatable>
</row>
<row>
<segment>eventAction==play25%25</segment>
- <idsubdatatable>851</idsubdatatable>
+ <idsubdatatable>1543</idsubdatatable>
</row>
<row>
<segment>eventAction==play50%25</segment>
- <idsubdatatable>852</idsubdatatable>
+ <idsubdatatable>1544</idsubdatatable>
</row>
<row>
<segment>eventAction==play75%25</segment>
- <idsubdatatable>853</idsubdatatable>
+ <idsubdatatable>1545</idsubdatatable>
</row>
<row>
<segment>eventAction==playEnd</segment>
- <idsubdatatable>854</idsubdatatable>
+ <idsubdatatable>1546</idsubdatatable>
</row>
<row>
<segment>eventAction==rating</segment>
- <idsubdatatable>855</idsubdatatable>
+ <idsubdatatable>1547</idsubdatatable>
</row>
<row>
<segment>eventAction==clickBuyNow</segment>
- <idsubdatatable>857</idsubdatatable>
+ <idsubdatatable>1549</idsubdatatable>
</row>
<row>
<segment>eventAction==event+action+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+---%26gt%3B+SHOULD+APPEAR+IN+TEST+OUTPUT+NOT+TRUNCATED+%26lt%3B---</segment>
- <idsubdatatable>859</idsubdatatable>
+ <idsubdatatable>1551</idsubdatatable>
</row>
<row>
<segment>eventAction==play</segment>
- <idsubdatatable>850</idsubdatatable>
+ <idsubdatatable>1542</idsubdatatable>
</row>
<row>
<segment>eventAction==playStart</segment>
- <idsubdatatable>858</idsubdatatable>
+ <idsubdatatable>1550</idsubdatatable>
</row>
<row>
<segment>eventAction==Purchase</segment>
@@ -232,7 +341,66 @@
<segment>eventAction==This+is+an+event+without+a+URL</segment>
</row>
</result>
- <result prettyDate="Monday, January 4, 2010" />
+ <result prettyDate="Monday, January 4, 2010">
+ <row>
+
+ <segment>eventAction==playTrailer</segment>
+ <idsubdatatable>1560</idsubdatatable>
+ </row>
+ <row>
+
+ <segment>eventAction==Search</segment>
+ <idsubdatatable>1553</idsubdatatable>
+ </row>
+ <row>
+
+ <segment>eventAction==play25%25</segment>
+ <idsubdatatable>1555</idsubdatatable>
+ </row>
+ <row>
+
+ <segment>eventAction==play50%25</segment>
+ <idsubdatatable>1556</idsubdatatable>
+ </row>
+ <row>
+
+ <segment>eventAction==play75%25</segment>
+ <idsubdatatable>1557</idsubdatatable>
+ </row>
+ <row>
+
+ <segment>eventAction==playEnd</segment>
+ <idsubdatatable>1558</idsubdatatable>
+ </row>
+ <row>
+
+ <segment>eventAction==rating</segment>
+ <idsubdatatable>1559</idsubdatatable>
+ </row>
+ <row>
+
+ <segment>eventAction==clickBuyNow</segment>
+ <idsubdatatable>1561</idsubdatatable>
+ </row>
+ <row>
+
+ <segment>eventAction==event+action+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+---%26gt%3B+SHOULD+APPEAR+IN+TEST+OUTPUT+NOT+TRUNCATED+%26lt%3B---</segment>
+ <idsubdatatable>1563</idsubdatatable>
+ </row>
+ <row>
+
+ <segment>eventAction==play</segment>
+ <idsubdatatable>1554</idsubdatatable>
+ </row>
+ <row>
+
+ <segment>eventAction==playStart</segment>
+ <idsubdatatable>1562</idsubdatatable>
+ </row>
+ <row>
+ <segment>eventAction==Purchase</segment>
+ </row>
+ </result>
<result prettyDate="Tuesday, January 5, 2010" />
<result prettyDate="Wednesday, January 6, 2010" />
<result prettyDate="Thursday, January 7, 2010" />
@@ -240,7 +408,7 @@
<result prettyDate="Saturday, January 9, 2010" />
</reportMetadata>
<reportTotal>
- <nb_visits>43</nb_visits>
- <nb_uniq_visitors>41</nb_uniq_visitors>
+ <nb_visits>64</nb_visits>
+ <nb_uniq_visitors>61</nb_uniq_visitors>
</reportTotal>
</result> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_CustomEvents_Events.getCategory_flat__API.getProcessedReport_day.xml b/tests/PHPUnit/System/expected/test_CustomEvents_Events.getCategory_flat__API.getProcessedReport_day.xml
index 40bd94b451..889fbf772e 100644
--- a/tests/PHPUnit/System/expected/test_CustomEvents_Events.getCategory_flat__API.getProcessedReport_day.xml
+++ b/tests/PHPUnit/System/expected/test_CustomEvents_Events.getCategory_flat__API.getProcessedReport_day.xml
@@ -206,7 +206,161 @@
<avg_event_value>0</avg_event_value>
</row>
</result>
- <result prettyDate="Monday, January 4, 2010" />
+ <result prettyDate="Monday, January 4, 2010">
+ <row>
+ <label>Movie - playTrailer</label>
+ <nb_events>3</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <avg_event_value>0</avg_event_value>
+ </row>
+ <row>
+ <label>Movie - Search</label>
+ <nb_events>3</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <avg_event_value>0</avg_event_value>
+ </row>
+ <row>
+ <label>event category Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long ---&gt; SHOULD APPEAR IN TEST OUTPUT NOT TRUNCATED &lt;--- - event action Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long ---&gt; SHOULD APPEAR IN TEST OUTPUT NOT TRUNCATED &lt;---</label>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>1</nb_events_with_value>
+ <sum_event_value>9.66</sum_event_value>
+ <min_event_value>9.66</min_event_value>
+ <max_event_value>9.66</max_event_value>
+ <avg_event_value>9.66</avg_event_value>
+ </row>
+ <row>
+ <label>Movie - clickBuyNow</label>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <avg_event_value>0</avg_event_value>
+ </row>
+ <row>
+ <label>Movie - play25%</label>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <avg_event_value>0</avg_event_value>
+ </row>
+ <row>
+ <label>Movie - play50%</label>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <avg_event_value>0</avg_event_value>
+ </row>
+ <row>
+ <label>Movie - play75%</label>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <avg_event_value>0</avg_event_value>
+ </row>
+ <row>
+ <label>Movie - playEnd</label>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <avg_event_value>0</avg_event_value>
+ </row>
+ <row>
+ <label>Movie - playStart</label>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <avg_event_value>0</avg_event_value>
+ </row>
+ <row>
+ <label>Movie - Purchase</label>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <avg_event_value>0</avg_event_value>
+ </row>
+ <row>
+ <label>Movie - rating</label>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>1</nb_events_with_value>
+ <sum_event_value>9.66</sum_event_value>
+ <min_event_value>9.66</min_event_value>
+ <max_event_value>9.66</max_event_value>
+ <avg_event_value>9.66</avg_event_value>
+ </row>
+ <row>
+ <label>Music - play</label>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <avg_event_value>0</avg_event_value>
+ </row>
+ <row>
+ <label>Music - play25%</label>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <avg_event_value>0</avg_event_value>
+ </row>
+ <row>
+ <label>Music - play50%</label>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <avg_event_value>0</avg_event_value>
+ </row>
+ <row>
+ <label>Music - play75%</label>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <avg_event_value>0</avg_event_value>
+ </row>
+ <row>
+ <label>Music - playEnd</label>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <avg_event_value>0</avg_event_value>
+ </row>
+ <row>
+ <label>Music - rating</label>
+ <nb_events>2</nb_events>
+ <nb_events_with_value>2</nb_events_with_value>
+ <sum_event_value>19</sum_event_value>
+ <min_event_value>9</min_event_value>
+ <max_event_value>10</max_event_value>
+ <avg_event_value>9.5</avg_event_value>
+ </row>
+ </result>
<result prettyDate="Tuesday, January 5, 2010" />
<result prettyDate="Wednesday, January 6, 2010" />
<result prettyDate="Thursday, January 7, 2010" />
@@ -223,7 +377,7 @@
<result prettyDate="Saturday, January 9, 2010" />
</reportMetadata>
<reportTotal>
- <nb_visits>43</nb_visits>
- <nb_uniq_visitors>41</nb_uniq_visitors>
+ <nb_visits>64</nb_visits>
+ <nb_uniq_visitors>61</nb_uniq_visitors>
</reportTotal>
</result> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_CustomEvents_Events.getCategory_lastN__API.getProcessedReport_day.xml b/tests/PHPUnit/System/expected/test_CustomEvents_Events.getCategory_lastN__API.getProcessedReport_day.xml
index 5b430036c5..69faeb032f 100644
--- a/tests/PHPUnit/System/expected/test_CustomEvents_Events.getCategory_lastN__API.getProcessedReport_day.xml
+++ b/tests/PHPUnit/System/expected/test_CustomEvents_Events.getCategory_lastN__API.getProcessedReport_day.xml
@@ -80,7 +80,35 @@
<avg_event_value>0</avg_event_value>
</row>
</result>
- <result prettyDate="Monday, January 4, 2010" />
+ <result prettyDate="Monday, January 4, 2010">
+ <row>
+ <label>Movie</label>
+ <nb_events>14</nb_events>
+ <nb_events_with_value>1</nb_events_with_value>
+ <sum_event_value>9.66</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>9.66</max_event_value>
+ <avg_event_value>9.66</avg_event_value>
+ </row>
+ <row>
+ <label>Music</label>
+ <nb_events>7</nb_events>
+ <nb_events_with_value>2</nb_events_with_value>
+ <sum_event_value>19</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>10</max_event_value>
+ <avg_event_value>9.5</avg_event_value>
+ </row>
+ <row>
+ <label>event category Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long ---&gt; SHOULD APPEAR IN TEST OUTPUT NOT TRUNCATED &lt;---</label>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>1</nb_events_with_value>
+ <sum_event_value>9.66</sum_event_value>
+ <min_event_value>9.66</min_event_value>
+ <max_event_value>9.66</max_event_value>
+ <avg_event_value>9.66</avg_event_value>
+ </row>
+ </result>
<result prettyDate="Tuesday, January 5, 2010" />
<result prettyDate="Wednesday, January 6, 2010" />
<result prettyDate="Thursday, January 7, 2010" />
@@ -92,25 +120,41 @@
<row>
<segment>eventCategory==Movie</segment>
- <idsubdatatable>792</idsubdatatable>
+ <idsubdatatable>1478</idsubdatatable>
</row>
<row>
<segment>eventCategory==Music</segment>
- <idsubdatatable>793</idsubdatatable>
+ <idsubdatatable>1479</idsubdatatable>
</row>
<row>
<segment>eventCategory==event+category+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+---%26gt%3B+SHOULD+APPEAR+IN+TEST+OUTPUT+NOT+TRUNCATED+%26lt%3B---</segment>
- <idsubdatatable>794</idsubdatatable>
+ <idsubdatatable>1480</idsubdatatable>
</row>
<row>
<segment>eventCategory==CategoryTriggersGoal+here</segment>
- <idsubdatatable>795</idsubdatatable>
+ <idsubdatatable>1481</idsubdatatable>
+ </row>
+ </result>
+ <result prettyDate="Monday, January 4, 2010">
+ <row>
+
+ <segment>eventCategory==Movie</segment>
+ <idsubdatatable>1483</idsubdatatable>
+ </row>
+ <row>
+
+ <segment>eventCategory==Music</segment>
+ <idsubdatatable>1484</idsubdatatable>
+ </row>
+ <row>
+
+ <segment>eventCategory==event+category+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+---%26gt%3B+SHOULD+APPEAR+IN+TEST+OUTPUT+NOT+TRUNCATED+%26lt%3B---</segment>
+ <idsubdatatable>1485</idsubdatatable>
</row>
</result>
- <result prettyDate="Monday, January 4, 2010" />
<result prettyDate="Tuesday, January 5, 2010" />
<result prettyDate="Wednesday, January 6, 2010" />
<result prettyDate="Thursday, January 7, 2010" />
@@ -118,7 +162,7 @@
<result prettyDate="Saturday, January 9, 2010" />
</reportMetadata>
<reportTotal>
- <nb_visits>43</nb_visits>
- <nb_uniq_visitors>41</nb_uniq_visitors>
+ <nb_visits>64</nb_visits>
+ <nb_uniq_visitors>61</nb_uniq_visitors>
</reportTotal>
</result> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_CustomEvents_Events.getName_flat__API.getProcessedReport_day.xml b/tests/PHPUnit/System/expected/test_CustomEvents_Events.getName_flat__API.getProcessedReport_day.xml
index dcaf39aabb..d09405ea90 100644
--- a/tests/PHPUnit/System/expected/test_CustomEvents_Events.getName_flat__API.getProcessedReport_day.xml
+++ b/tests/PHPUnit/System/expected/test_CustomEvents_Events.getName_flat__API.getProcessedReport_day.xml
@@ -233,7 +233,188 @@
<avg_event_value>0</avg_event_value>
</row>
</result>
- <result prettyDate="Monday, January 4, 2010" />
+ <result prettyDate="Monday, January 4, 2010">
+ <row>
+ <label>Event Name not defined - Search</label>
+ <nb_events>2</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <avg_event_value>0</avg_event_value>
+ </row>
+ <row>
+ <label>event name Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long ---&gt; SHOULD APPEAR IN TEST OUTPUT NOT TRUNCATED &lt;--- - event action Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long ---&gt; SHOULD APPEAR IN TEST OUTPUT NOT TRUNCATED &lt;---</label>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>1</nb_events_with_value>
+ <sum_event_value>9.66</sum_event_value>
+ <min_event_value>9.66</min_event_value>
+ <max_event_value>9.66</max_event_value>
+ <avg_event_value>9.66</avg_event_value>
+ </row>
+ <row>
+ <label>Event Name not defined - Purchase</label>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <avg_event_value>0</avg_event_value>
+ </row>
+ <row>
+ <label>La fiancée de l'eau - play</label>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <avg_event_value>0</avg_event_value>
+ </row>
+ <row>
+ <label>La fiancée de l'eau - play25%</label>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <avg_event_value>0</avg_event_value>
+ </row>
+ <row>
+ <label>La fiancée de l'eau - play50%</label>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <avg_event_value>0</avg_event_value>
+ </row>
+ <row>
+ <label>La fiancée de l'eau - play75%</label>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <avg_event_value>0</avg_event_value>
+ </row>
+ <row>
+ <label>La fiancée de l'eau - playEnd</label>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <avg_event_value>0</avg_event_value>
+ </row>
+ <row>
+ <label>La fiancée de l'eau - rating</label>
+ <nb_events>2</nb_events>
+ <nb_events_with_value>2</nb_events_with_value>
+ <sum_event_value>19</sum_event_value>
+ <min_event_value>9</min_event_value>
+ <max_event_value>10</max_event_value>
+ <avg_event_value>9.5</avg_event_value>
+ </row>
+ <row>
+ <label>Ponyo (崖の上のポニョ) - playTrailer</label>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <avg_event_value>0</avg_event_value>
+ </row>
+ <row>
+ <label>Princess Mononoke (もののけ姫) - playTrailer</label>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <avg_event_value>0</avg_event_value>
+ </row>
+ <row>
+ <label>Search query here - Search</label>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <avg_event_value>0</avg_event_value>
+ </row>
+ <row>
+ <label>Spirited Away (千と千尋の神隠し) - clickBuyNow</label>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <avg_event_value>0</avg_event_value>
+ </row>
+ <row>
+ <label>Spirited Away (千と千尋の神隠し) - play25%</label>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <avg_event_value>0</avg_event_value>
+ </row>
+ <row>
+ <label>Spirited Away (千と千尋の神隠し) - play50%</label>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <avg_event_value>0</avg_event_value>
+ </row>
+ <row>
+ <label>Spirited Away (千と千尋の神隠し) - play75%</label>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <avg_event_value>0</avg_event_value>
+ </row>
+ <row>
+ <label>Spirited Away (千と千尋の神隠し) - playEnd</label>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <avg_event_value>0</avg_event_value>
+ </row>
+ <row>
+ <label>Spirited Away (千と千尋の神隠し) - playStart</label>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <avg_event_value>0</avg_event_value>
+ </row>
+ <row>
+ <label>Spirited Away (千と千尋の神隠し) - playTrailer</label>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <avg_event_value>0</avg_event_value>
+ </row>
+ <row>
+ <label>Spirited Away (千と千尋の神隠し) - rating</label>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>1</nb_events_with_value>
+ <sum_event_value>9.66</sum_event_value>
+ <min_event_value>9.66</min_event_value>
+ <max_event_value>9.66</max_event_value>
+ <avg_event_value>9.66</avg_event_value>
+ </row>
+ </result>
<result prettyDate="Tuesday, January 5, 2010" />
<result prettyDate="Wednesday, January 6, 2010" />
<result prettyDate="Thursday, January 7, 2010" />
@@ -250,7 +431,7 @@
<result prettyDate="Saturday, January 9, 2010" />
</reportMetadata>
<reportTotal>
- <nb_visits>43</nb_visits>
- <nb_uniq_visitors>41</nb_uniq_visitors>
+ <nb_visits>64</nb_visits>
+ <nb_uniq_visitors>61</nb_uniq_visitors>
</reportTotal>
</result> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_CustomEvents_Events.getName_lastN__API.getProcessedReport_day.xml b/tests/PHPUnit/System/expected/test_CustomEvents_Events.getName_lastN__API.getProcessedReport_day.xml
index 0dbe31d0ef..5f043780cf 100644
--- a/tests/PHPUnit/System/expected/test_CustomEvents_Events.getName_lastN__API.getProcessedReport_day.xml
+++ b/tests/PHPUnit/System/expected/test_CustomEvents_Events.getName_lastN__API.getProcessedReport_day.xml
@@ -107,7 +107,71 @@
<avg_event_value>0</avg_event_value>
</row>
</result>
- <result prettyDate="Monday, January 4, 2010" />
+ <result prettyDate="Monday, January 4, 2010">
+ <row>
+ <label>Spirited Away (千と千尋の神隠し)</label>
+ <nb_events>8</nb_events>
+ <nb_events_with_value>1</nb_events_with_value>
+ <sum_event_value>9.66</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>9.66</max_event_value>
+ <avg_event_value>9.66</avg_event_value>
+ </row>
+ <row>
+ <label>La fiancée de l'eau</label>
+ <nb_events>7</nb_events>
+ <nb_events_with_value>2</nb_events_with_value>
+ <sum_event_value>19</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>10</max_event_value>
+ <avg_event_value>9.5</avg_event_value>
+ </row>
+ <row>
+ <label>Event Name not defined</label>
+ <nb_events>3</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <avg_event_value>0</avg_event_value>
+ </row>
+ <row>
+ <label>event name Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long ---&gt; SHOULD APPEAR IN TEST OUTPUT NOT TRUNCATED &lt;---</label>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>1</nb_events_with_value>
+ <sum_event_value>9.66</sum_event_value>
+ <min_event_value>9.66</min_event_value>
+ <max_event_value>9.66</max_event_value>
+ <avg_event_value>9.66</avg_event_value>
+ </row>
+ <row>
+ <label>Ponyo (崖の上のポニョ)</label>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <avg_event_value>0</avg_event_value>
+ </row>
+ <row>
+ <label>Princess Mononoke (もののけ姫)</label>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <avg_event_value>0</avg_event_value>
+ </row>
+ <row>
+ <label>Search query here</label>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <avg_event_value>0</avg_event_value>
+ </row>
+ </result>
<result prettyDate="Tuesday, January 5, 2010" />
<result prettyDate="Wednesday, January 6, 2010" />
<result prettyDate="Thursday, January 7, 2010" />
@@ -119,39 +183,74 @@
<row>
<segment>eventName==Spirited+Away+%28%E5%8D%83%E3%81%A8%E5%8D%83%E5%B0%8B%E3%81%AE%E7%A5%9E%E9%9A%A0%E3%81%97%29</segment>
- <idsubdatatable>922</idsubdatatable>
+ <idsubdatatable>1636</idsubdatatable>
+ </row>
+ <row>
+
+ <segment>eventName==La+fianc%C3%A9e+de+l%26%23039%3Beau</segment>
+ <idsubdatatable>1635</idsubdatatable>
+ </row>
+ <row>
+
+ <idsubdatatable>1634</idsubdatatable>
+ </row>
+ <row>
+
+ <segment>eventName==event+name+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+---%26gt%3B+SHOULD+APPEAR+IN+TEST+OUTPUT+NOT+TRUNCATED+%26lt%3B---</segment>
+ <idsubdatatable>1640</idsubdatatable>
+ </row>
+ <row>
+
+ <segment>eventName==Ponyo+%28%E5%B4%96%E3%81%AE%E4%B8%8A%E3%81%AE%E3%83%9D%E3%83%8B%E3%83%A7%29</segment>
+ <idsubdatatable>1638</idsubdatatable>
+ </row>
+ <row>
+
+ <segment>eventName==Princess+Mononoke+%28%E3%82%82%E3%81%AE%E3%81%AE%E3%81%91%E5%A7%AB%29</segment>
+ <idsubdatatable>1637</idsubdatatable>
+ </row>
+ <row>
+
+ <segment>eventName==Search+query+here</segment>
+ <idsubdatatable>1639</idsubdatatable>
+ </row>
+ </result>
+ <result prettyDate="Monday, January 4, 2010">
+ <row>
+
+ <segment>eventName==Spirited+Away+%28%E5%8D%83%E3%81%A8%E5%8D%83%E5%B0%8B%E3%81%AE%E7%A5%9E%E9%9A%A0%E3%81%97%29</segment>
+ <idsubdatatable>1644</idsubdatatable>
</row>
<row>
<segment>eventName==La+fianc%C3%A9e+de+l%26%23039%3Beau</segment>
- <idsubdatatable>921</idsubdatatable>
+ <idsubdatatable>1643</idsubdatatable>
</row>
<row>
- <idsubdatatable>920</idsubdatatable>
+ <idsubdatatable>1642</idsubdatatable>
</row>
<row>
<segment>eventName==event+name+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+---%26gt%3B+SHOULD+APPEAR+IN+TEST+OUTPUT+NOT+TRUNCATED+%26lt%3B---</segment>
- <idsubdatatable>926</idsubdatatable>
+ <idsubdatatable>1648</idsubdatatable>
</row>
<row>
<segment>eventName==Ponyo+%28%E5%B4%96%E3%81%AE%E4%B8%8A%E3%81%AE%E3%83%9D%E3%83%8B%E3%83%A7%29</segment>
- <idsubdatatable>924</idsubdatatable>
+ <idsubdatatable>1646</idsubdatatable>
</row>
<row>
<segment>eventName==Princess+Mononoke+%28%E3%82%82%E3%81%AE%E3%81%AE%E3%81%91%E5%A7%AB%29</segment>
- <idsubdatatable>923</idsubdatatable>
+ <idsubdatatable>1645</idsubdatatable>
</row>
<row>
<segment>eventName==Search+query+here</segment>
- <idsubdatatable>925</idsubdatatable>
+ <idsubdatatable>1647</idsubdatatable>
</row>
</result>
- <result prettyDate="Monday, January 4, 2010" />
<result prettyDate="Tuesday, January 5, 2010" />
<result prettyDate="Wednesday, January 6, 2010" />
<result prettyDate="Thursday, January 7, 2010" />
@@ -159,7 +258,7 @@
<result prettyDate="Saturday, January 9, 2010" />
</reportMetadata>
<reportTotal>
- <nb_visits>43</nb_visits>
- <nb_uniq_visitors>41</nb_uniq_visitors>
+ <nb_visits>64</nb_visits>
+ <nb_uniq_visitors>61</nb_uniq_visitors>
</reportTotal>
</result> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_CustomEvents__Actions.getPageUrls_month.xml b/tests/PHPUnit/System/expected/test_CustomEvents__Actions.getPageUrls_month.xml
index 79b9cb81e5..842dff57a1 100644
--- a/tests/PHPUnit/System/expected/test_CustomEvents__Actions.getPageUrls_month.xml
+++ b/tests/PHPUnit/System/expected/test_CustomEvents__Actions.getPageUrls_month.xml
@@ -2,20 +2,20 @@
<result>
<row>
<label>/movies</label>
- <nb_visits>2</nb_visits>
- <nb_hits>2</nb_hits>
+ <nb_visits>3</nb_visits>
+ <nb_hits>3</nb_hits>
<sum_time_spent>0</sum_time_spent>
- <nb_hits_with_time_generation>2</nb_hits_with_time_generation>
+ <nb_hits_with_time_generation>3</nb_hits_with_time_generation>
<min_time_generation>0.666</min_time_generation>
<max_time_generation>0.666</max_time_generation>
- <entry_nb_visits>1</entry_nb_visits>
- <entry_nb_actions>14</entry_nb_actions>
- <entry_sum_visit_length>3541</entry_sum_visit_length>
+ <entry_nb_visits>2</entry_nb_visits>
+ <entry_nb_actions>28</entry_nb_actions>
+ <entry_sum_visit_length>7082</entry_sum_visit_length>
<entry_bounce_count>0</entry_bounce_count>
- <exit_nb_visits>2</exit_nb_visits>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
- <sum_daily_entry_nb_uniq_visitors>1</sum_daily_entry_nb_uniq_visitors>
- <sum_daily_exit_nb_uniq_visitors>2</sum_daily_exit_nb_uniq_visitors>
+ <exit_nb_visits>3</exit_nb_visits>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
+ <sum_daily_entry_nb_uniq_visitors>2</sum_daily_entry_nb_uniq_visitors>
+ <sum_daily_exit_nb_uniq_visitors>3</sum_daily_exit_nb_uniq_visitors>
<avg_time_on_page>0</avg_time_on_page>
<bounce_rate>0%</bounce_rate>
<exit_rate>100%</exit_rate>
diff --git a/tests/PHPUnit/System/expected/test_CustomEvents__Actions.get_month.xml b/tests/PHPUnit/System/expected/test_CustomEvents__Actions.get_month.xml
index f7a5fb831c..5e22f5f565 100644
--- a/tests/PHPUnit/System/expected/test_CustomEvents__Actions.get_month.xml
+++ b/tests/PHPUnit/System/expected/test_CustomEvents__Actions.get_month.xml
@@ -1,12 +1,12 @@
<?xml version="1.0" encoding="utf-8" ?>
<result>
- <nb_pageviews>3</nb_pageviews>
- <nb_uniq_pageviews>3</nb_uniq_pageviews>
+ <nb_pageviews>4</nb_pageviews>
+ <nb_uniq_pageviews>4</nb_uniq_pageviews>
<nb_downloads>0</nb_downloads>
<nb_uniq_downloads>0</nb_uniq_downloads>
<nb_outlinks>0</nb_outlinks>
<nb_uniq_outlinks>0</nb_uniq_outlinks>
<nb_searches>0</nb_searches>
<nb_keywords>0</nb_keywords>
- <avg_time_generation>0.557</avg_time_generation>
+ <avg_time_generation>0.585</avg_time_generation>
</result> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_CustomEvents__Events.getAction_month.xml b/tests/PHPUnit/System/expected/test_CustomEvents__Events.getAction_month.xml
index f60a44a673..07715b1b6f 100644
--- a/tests/PHPUnit/System/expected/test_CustomEvents__Events.getAction_month.xml
+++ b/tests/PHPUnit/System/expected/test_CustomEvents__Events.getAction_month.xml
@@ -2,365 +2,365 @@
<result>
<row>
<label>playTrailer</label>
- <nb_visits>6</nb_visits>
- <nb_events>6</nb_events>
+ <nb_visits>9</nb_visits>
+ <nb_events>9</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>6</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>9</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
<segment>eventAction==playTrailer</segment>
<subtable>
<row>
<label>Ponyo (崖の上のポニョ)</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
<row>
<label>Princess Mononoke (もののけ姫)</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
<row>
<label>Spirited Away (千と千尋の神隠し)</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
</subtable>
</row>
<row>
<label>Search</label>
- <nb_visits>6</nb_visits>
- <nb_events>6</nb_events>
+ <nb_visits>9</nb_visits>
+ <nb_events>9</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>4</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>6</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
<segment>eventAction==Search</segment>
<subtable>
<row>
<label>Search query here</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
</subtable>
</row>
<row>
<label>play25%</label>
- <nb_visits>4</nb_visits>
- <nb_events>4</nb_events>
+ <nb_visits>6</nb_visits>
+ <nb_events>6</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>4</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>6</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
<segment>eventAction==play25%25</segment>
<subtable>
<row>
<label>La fiancée de l'eau</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
<row>
<label>Spirited Away (千と千尋の神隠し)</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
</subtable>
</row>
<row>
<label>play50%</label>
- <nb_visits>4</nb_visits>
- <nb_events>4</nb_events>
+ <nb_visits>6</nb_visits>
+ <nb_events>6</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>4</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>6</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
<segment>eventAction==play50%25</segment>
<subtable>
<row>
<label>La fiancée de l'eau</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
<row>
<label>Spirited Away (千と千尋の神隠し)</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
</subtable>
</row>
<row>
<label>play75%</label>
- <nb_visits>4</nb_visits>
- <nb_events>4</nb_events>
+ <nb_visits>6</nb_visits>
+ <nb_events>6</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>4</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>6</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
<segment>eventAction==play75%25</segment>
<subtable>
<row>
<label>La fiancée de l'eau</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
<row>
<label>Spirited Away (千と千尋の神隠し)</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
</subtable>
</row>
<row>
<label>playEnd</label>
- <nb_visits>4</nb_visits>
- <nb_events>4</nb_events>
+ <nb_visits>6</nb_visits>
+ <nb_events>6</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>4</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>6</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
<segment>eventAction==playEnd</segment>
<subtable>
<row>
<label>La fiancée de l'eau</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
<row>
<label>Spirited Away (千と千尋の神隠し)</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
</subtable>
</row>
<row>
<label>rating</label>
- <nb_visits>4</nb_visits>
- <nb_events>6</nb_events>
- <nb_events_with_value>6</nb_events_with_value>
- <sum_event_value>57.32</sum_event_value>
+ <nb_visits>6</nb_visits>
+ <nb_events>9</nb_events>
+ <nb_events_with_value>9</nb_events_with_value>
+ <sum_event_value>85.98</sum_event_value>
<min_event_value>9</min_event_value>
<max_event_value>10</max_event_value>
- <sum_daily_nb_uniq_visitors>4</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>6</sum_daily_nb_uniq_visitors>
<avg_event_value>9.55</avg_event_value>
<segment>eventAction==rating</segment>
<subtable>
<row>
<label>La fiancée de l'eau</label>
- <nb_visits>2</nb_visits>
- <nb_events>4</nb_events>
- <nb_events_with_value>4</nb_events_with_value>
- <sum_event_value>38</sum_event_value>
+ <nb_visits>3</nb_visits>
+ <nb_events>6</nb_events>
+ <nb_events_with_value>6</nb_events_with_value>
+ <sum_event_value>57</sum_event_value>
<min_event_value>9</min_event_value>
<max_event_value>10</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>9.5</avg_event_value>
</row>
<row>
<label>Spirited Away (千と千尋の神隠し)</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
- <nb_events_with_value>2</nb_events_with_value>
- <sum_event_value>19.32</sum_event_value>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
+ <nb_events_with_value>3</nb_events_with_value>
+ <sum_event_value>28.98</sum_event_value>
<min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>9.66</avg_event_value>
</row>
</subtable>
</row>
<row>
<label>clickBuyNow</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
<segment>eventAction==clickBuyNow</segment>
<subtable>
<row>
<label>Spirited Away (千と千尋の神隠し)</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
</subtable>
</row>
<row>
<label>event action Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long ---&gt; SHOULD APPEAR IN TEST OUTPUT NOT TRUNCATED &lt;---</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
- <nb_events_with_value>2</nb_events_with_value>
- <sum_event_value>19.32</sum_event_value>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
+ <nb_events_with_value>3</nb_events_with_value>
+ <sum_event_value>28.98</sum_event_value>
<min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>9.66</avg_event_value>
<segment>eventAction==event+action+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+---%26gt%3B+SHOULD+APPEAR+IN+TEST+OUTPUT+NOT+TRUNCATED+%26lt%3B---</segment>
<subtable>
<row>
<label>event name Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long ---&gt; SHOULD APPEAR IN TEST OUTPUT NOT TRUNCATED &lt;---</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
- <nb_events_with_value>2</nb_events_with_value>
- <sum_event_value>19.32</sum_event_value>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
+ <nb_events_with_value>3</nb_events_with_value>
+ <sum_event_value>28.98</sum_event_value>
<min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>9.66</avg_event_value>
</row>
</subtable>
</row>
<row>
<label>play</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
<segment>eventAction==play</segment>
<subtable>
<row>
<label>La fiancée de l'eau</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
</subtable>
</row>
<row>
<label>playStart</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
<segment>eventAction==playStart</segment>
<subtable>
<row>
<label>Spirited Away (千と千尋の神隠し)</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
</subtable>
</row>
<row>
<label>Purchase</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
<segment>eventAction==Purchase</segment>
</row>
diff --git a/tests/PHPUnit/System/expected/test_CustomEvents__Events.getCategory_month.xml b/tests/PHPUnit/System/expected/test_CustomEvents__Events.getCategory_month.xml
index ced40076d2..26def0abf9 100644
--- a/tests/PHPUnit/System/expected/test_CustomEvents__Events.getCategory_month.xml
+++ b/tests/PHPUnit/System/expected/test_CustomEvents__Events.getCategory_month.xml
@@ -2,229 +2,229 @@
<result>
<row>
<label>Movie</label>
- <nb_visits>28</nb_visits>
- <nb_events>28</nb_events>
- <nb_events_with_value>2</nb_events_with_value>
- <sum_event_value>19.32</sum_event_value>
+ <nb_visits>42</nb_visits>
+ <nb_events>42</nb_events>
+ <nb_events_with_value>3</nb_events_with_value>
+ <sum_event_value>28.98</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>9.66</max_event_value>
- <sum_daily_nb_uniq_visitors>26</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>39</sum_daily_nb_uniq_visitors>
<avg_event_value>9.66</avg_event_value>
<segment>eventCategory==Movie</segment>
<subtable>
<row>
<label>playTrailer</label>
- <nb_visits>6</nb_visits>
- <nb_events>6</nb_events>
+ <nb_visits>9</nb_visits>
+ <nb_events>9</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>6</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>9</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
<row>
<label>Search</label>
- <nb_visits>6</nb_visits>
- <nb_events>6</nb_events>
+ <nb_visits>9</nb_visits>
+ <nb_events>9</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>4</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>6</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
<row>
<label>clickBuyNow</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
<row>
<label>play25%</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
<row>
<label>play50%</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
<row>
<label>play75%</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
<row>
<label>playEnd</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
<row>
<label>playStart</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
<row>
<label>Purchase</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
<row>
<label>rating</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
- <nb_events_with_value>2</nb_events_with_value>
- <sum_event_value>19.32</sum_event_value>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
+ <nb_events_with_value>3</nb_events_with_value>
+ <sum_event_value>28.98</sum_event_value>
<min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>9.66</avg_event_value>
</row>
</subtable>
</row>
<row>
<label>Music</label>
- <nb_visits>12</nb_visits>
- <nb_events>14</nb_events>
- <nb_events_with_value>4</nb_events_with_value>
- <sum_event_value>38</sum_event_value>
+ <nb_visits>18</nb_visits>
+ <nb_events>21</nb_events>
+ <nb_events_with_value>6</nb_events_with_value>
+ <sum_event_value>57</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>10</max_event_value>
- <sum_daily_nb_uniq_visitors>12</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>18</sum_daily_nb_uniq_visitors>
<avg_event_value>9.5</avg_event_value>
<segment>eventCategory==Music</segment>
<subtable>
<row>
<label>play</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
<row>
<label>play25%</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
<row>
<label>play50%</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
<row>
<label>play75%</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
<row>
<label>playEnd</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
<row>
<label>rating</label>
- <nb_visits>2</nb_visits>
- <nb_events>4</nb_events>
- <nb_events_with_value>4</nb_events_with_value>
- <sum_event_value>38</sum_event_value>
+ <nb_visits>3</nb_visits>
+ <nb_events>6</nb_events>
+ <nb_events_with_value>6</nb_events_with_value>
+ <sum_event_value>57</sum_event_value>
<min_event_value>9</min_event_value>
<max_event_value>10</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>9.5</avg_event_value>
</row>
</subtable>
</row>
<row>
<label>event category Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long ---&gt; SHOULD APPEAR IN TEST OUTPUT NOT TRUNCATED &lt;---</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
- <nb_events_with_value>2</nb_events_with_value>
- <sum_event_value>19.32</sum_event_value>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
+ <nb_events_with_value>3</nb_events_with_value>
+ <sum_event_value>28.98</sum_event_value>
<min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>9.66</avg_event_value>
<segment>eventCategory==event+category+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+---%26gt%3B+SHOULD+APPEAR+IN+TEST+OUTPUT+NOT+TRUNCATED+%26lt%3B---</segment>
<subtable>
<row>
<label>event action Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long ---&gt; SHOULD APPEAR IN TEST OUTPUT NOT TRUNCATED &lt;---</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
- <nb_events_with_value>2</nb_events_with_value>
- <sum_event_value>19.32</sum_event_value>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
+ <nb_events_with_value>3</nb_events_with_value>
+ <sum_event_value>28.98</sum_event_value>
<min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>9.66</avg_event_value>
</row>
</subtable>
diff --git a/tests/PHPUnit/System/expected/test_CustomEvents__Events.getName_month.xml b/tests/PHPUnit/System/expected/test_CustomEvents__Events.getName_month.xml
index d0560a0023..a87c852b65 100644
--- a/tests/PHPUnit/System/expected/test_CustomEvents__Events.getName_month.xml
+++ b/tests/PHPUnit/System/expected/test_CustomEvents__Events.getName_month.xml
@@ -2,217 +2,217 @@
<result>
<row>
<label>Spirited Away (千と千尋の神隠し)</label>
- <nb_visits>16</nb_visits>
- <nb_events>16</nb_events>
- <nb_events_with_value>2</nb_events_with_value>
- <sum_event_value>19.32</sum_event_value>
+ <nb_visits>24</nb_visits>
+ <nb_events>24</nb_events>
+ <nb_events_with_value>3</nb_events_with_value>
+ <sum_event_value>28.98</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>9.66</max_event_value>
- <sum_daily_nb_uniq_visitors>16</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>24</sum_daily_nb_uniq_visitors>
<avg_event_value>9.66</avg_event_value>
<segment>eventName==Spirited+Away+%28%E5%8D%83%E3%81%A8%E5%8D%83%E5%B0%8B%E3%81%AE%E7%A5%9E%E9%9A%A0%E3%81%97%29</segment>
<subtable>
<row>
<label>clickBuyNow</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
<row>
<label>play25%</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
<row>
<label>play50%</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
<row>
<label>play75%</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
<row>
<label>playEnd</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
<row>
<label>playStart</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
<row>
<label>playTrailer</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
<row>
<label>rating</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
- <nb_events_with_value>2</nb_events_with_value>
- <sum_event_value>19.32</sum_event_value>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
+ <nb_events_with_value>3</nb_events_with_value>
+ <sum_event_value>28.98</sum_event_value>
<min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>9.66</avg_event_value>
</row>
</subtable>
</row>
<row>
<label>La fiancée de l'eau</label>
- <nb_visits>12</nb_visits>
- <nb_events>14</nb_events>
- <nb_events_with_value>4</nb_events_with_value>
- <sum_event_value>38</sum_event_value>
+ <nb_visits>18</nb_visits>
+ <nb_events>21</nb_events>
+ <nb_events_with_value>6</nb_events_with_value>
+ <sum_event_value>57</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>10</max_event_value>
- <sum_daily_nb_uniq_visitors>12</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>18</sum_daily_nb_uniq_visitors>
<avg_event_value>9.5</avg_event_value>
<segment>eventName==La+fianc%C3%A9e+de+l%26%23039%3Beau</segment>
<subtable>
<row>
<label>play</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
<row>
<label>play25%</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
<row>
<label>play50%</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
<row>
<label>play75%</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
<row>
<label>playEnd</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
<row>
<label>rating</label>
- <nb_visits>2</nb_visits>
- <nb_events>4</nb_events>
- <nb_events_with_value>4</nb_events_with_value>
- <sum_event_value>38</sum_event_value>
+ <nb_visits>3</nb_visits>
+ <nb_events>6</nb_events>
+ <nb_events_with_value>6</nb_events_with_value>
+ <sum_event_value>57</sum_event_value>
<min_event_value>9</min_event_value>
<max_event_value>10</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>9.5</avg_event_value>
</row>
</subtable>
</row>
<row>
<label>Event Name not defined</label>
- <nb_visits>7</nb_visits>
- <nb_events>7</nb_events>
+ <nb_visits>10</nb_visits>
+ <nb_events>10</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>5</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>7</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
<subtable>
<row>
<label>Search</label>
- <nb_visits>4</nb_visits>
- <nb_events>4</nb_events>
+ <nb_visits>6</nb_visits>
+ <nb_events>6</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
<row>
<label>Purchase</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
<row>
@@ -230,100 +230,100 @@
</row>
<row>
<label>event name Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long ---&gt; SHOULD APPEAR IN TEST OUTPUT NOT TRUNCATED &lt;---</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
- <nb_events_with_value>2</nb_events_with_value>
- <sum_event_value>19.32</sum_event_value>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
+ <nb_events_with_value>3</nb_events_with_value>
+ <sum_event_value>28.98</sum_event_value>
<min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>9.66</avg_event_value>
<segment>eventName==event+name+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+---%26gt%3B+SHOULD+APPEAR+IN+TEST+OUTPUT+NOT+TRUNCATED+%26lt%3B---</segment>
<subtable>
<row>
<label>event action Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long ---&gt; SHOULD APPEAR IN TEST OUTPUT NOT TRUNCATED &lt;---</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
- <nb_events_with_value>2</nb_events_with_value>
- <sum_event_value>19.32</sum_event_value>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
+ <nb_events_with_value>3</nb_events_with_value>
+ <sum_event_value>28.98</sum_event_value>
<min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>9.66</avg_event_value>
</row>
</subtable>
</row>
<row>
<label>Ponyo (崖の上のポニョ)</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
<segment>eventName==Ponyo+%28%E5%B4%96%E3%81%AE%E4%B8%8A%E3%81%AE%E3%83%9D%E3%83%8B%E3%83%A7%29</segment>
<subtable>
<row>
<label>playTrailer</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
</subtable>
</row>
<row>
<label>Princess Mononoke (もののけ姫)</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
<segment>eventName==Princess+Mononoke+%28%E3%82%82%E3%81%AE%E3%81%AE%E3%81%91%E5%A7%AB%29</segment>
<subtable>
<row>
<label>playTrailer</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
</subtable>
</row>
<row>
<label>Search query here</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
<segment>eventName==Search+query+here</segment>
<subtable>
<row>
<label>Search</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
</subtable>
diff --git a/tests/PHPUnit/System/expected/test_CustomEvents__Live.getLastVisitsDetails_month.xml b/tests/PHPUnit/System/expected/test_CustomEvents__Live.getLastVisitsDetails_month.xml
index 3c677f06fd..6c7b19157a 100644
--- a/tests/PHPUnit/System/expected/test_CustomEvents__Live.getLastVisitsDetails_month.xml
+++ b/tests/PHPUnit/System/expected/test_CustomEvents__Live.getLastVisitsDetails_month.xml
@@ -2,8 +2,8 @@
<result>
<row>
<idSite>1</idSite>
- <idVisit>5</idVisit>
- <visitIp>156.5.3.2</visitIp>
+ <idVisit>15</idVisit>
+ <visitIp>111.1.1.2</visitIp>
<actionDetails>
<row>
@@ -11,7 +11,7 @@
<url>http://example.org/movies</url>
<pageIdAction>16</pageIdAction>
- <pageId>22</pageId>
+ <pageId>68</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>Purchase</eventAction>
<icon>plugins/Morpheus/images/event.png</icon>
@@ -88,15 +88,11 @@
</row>
</customVariables>
<resolution>1024x768</resolution>
- <plugins>flash, java</plugins>
+ <plugins>director</plugins>
<pluginsIcons>
<row>
- <pluginIcon>plugins/DevicePlugins/images/plugins/flash.gif</pluginIcon>
- <pluginName>flash</pluginName>
- </row>
- <row>
- <pluginIcon>plugins/DevicePlugins/images/plugins/java.gif</pluginIcon>
- <pluginName>java</pluginName>
+ <pluginIcon>plugins/DevicePlugins/images/plugins/director.gif</pluginIcon>
+ <pluginName>director</pluginName>
</row>
</pluginsIcons>
@@ -107,8 +103,8 @@
</row>
<row>
<idSite>1</idSite>
- <idVisit>4</idVisit>
- <visitIp>156.5.3.2</visitIp>
+ <idVisit>14</idVisit>
+ <visitIp>111.1.1.2</visitIp>
<actionDetails>
<row>
@@ -116,7 +112,7 @@
<url>http://example.org/movies</url>
<pageIdAction>16</pageIdAction>
- <pageId>21</pageId>
+ <pageId>67</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>Search</eventAction>
<icon>plugins/Morpheus/images/event.png</icon>
@@ -193,15 +189,11 @@
</row>
</customVariables>
<resolution>1024x768</resolution>
- <plugins>flash, java</plugins>
+ <plugins>director</plugins>
<pluginsIcons>
<row>
- <pluginIcon>plugins/DevicePlugins/images/plugins/flash.gif</pluginIcon>
- <pluginName>flash</pluginName>
- </row>
- <row>
- <pluginIcon>plugins/DevicePlugins/images/plugins/java.gif</pluginIcon>
- <pluginName>java</pluginName>
+ <pluginIcon>plugins/DevicePlugins/images/plugins/director.gif</pluginIcon>
+ <pluginName>director</pluginName>
</row>
</pluginsIcons>
@@ -212,8 +204,8 @@
</row>
<row>
<idSite>1</idSite>
- <idVisit>2</idVisit>
- <visitIp>156.5.3.2</visitIp>
+ <idVisit>12</idVisit>
+ <visitIp>111.1.1.2</visitIp>
<actionDetails>
<row>
@@ -221,7 +213,7 @@
<url>http://example.org/movies</url>
<pageIdAction>16</pageIdAction>
- <pageId>17</pageId>
+ <pageId>63</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>play50%</eventAction>
<eventName>Spirited Away (千と千尋の神隠し)</eventName>
@@ -235,7 +227,7 @@
<url>http://example.org/movies</url>
<pageIdAction>16</pageIdAction>
- <pageId>18</pageId>
+ <pageId>64</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>play75%</eventAction>
<eventName>Spirited Away (千と千尋の神隠し)</eventName>
@@ -249,7 +241,7 @@
<url>http://example.org/movies</url>
<pageIdAction>16</pageIdAction>
- <pageId>20</pageId>
+ <pageId>66</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>Search</eventAction>
<eventName>Search query here</eventName>
@@ -263,7 +255,7 @@
<url>http://example.org/movies</url>
<pageIdAction>16</pageIdAction>
- <pageId>23</pageId>
+ <pageId>69</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>playEnd</eventAction>
<eventName>Spirited Away (千と千尋の神隠し)</eventName>
@@ -277,7 +269,7 @@
<url />
<pageIdAction />
- <pageId>24</pageId>
+ <pageId>70</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>rating</eventAction>
<eventName>Spirited Away (千と千尋の神隠し)</eventName>
@@ -292,7 +284,7 @@
<url>http://example.org/finishedMovie</url>
<pageIdAction>27</pageIdAction>
- <pageId>25</pageId>
+ <pageId>71</pageId>
<eventCategory>event category Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long ---&gt; SHOULD APPEAR IN TEST OUTPUT NOT TRUNCATED &lt;---</eventCategory>
<eventAction>event action Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long ---&gt; SHOULD APPEAR IN TEST OUTPUT NOT TRUNCATED &lt;---</eventAction>
<eventName>event name Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long ---&gt; SHOULD APPEAR IN TEST OUTPUT NOT TRUNCATED &lt;---</eventName>
@@ -371,15 +363,11 @@
</row>
</customVariables>
<resolution>1024x768</resolution>
- <plugins>flash, java</plugins>
+ <plugins>director</plugins>
<pluginsIcons>
<row>
- <pluginIcon>plugins/DevicePlugins/images/plugins/flash.gif</pluginIcon>
- <pluginName>flash</pluginName>
- </row>
- <row>
- <pluginIcon>plugins/DevicePlugins/images/plugins/java.gif</pluginIcon>
- <pluginName>java</pluginName>
+ <pluginIcon>plugins/DevicePlugins/images/plugins/director.gif</pluginIcon>
+ <pluginName>director</pluginName>
</row>
</pluginsIcons>
@@ -390,8 +378,8 @@
</row>
<row>
<idSite>1</idSite>
- <idVisit>3</idVisit>
- <visitIp>156.5.3.2</visitIp>
+ <idVisit>13</idVisit>
+ <visitIp>111.1.1.2</visitIp>
<actionDetails>
<row>
@@ -399,7 +387,7 @@
<url>http://example.org/movies</url>
<pageIdAction>16</pageIdAction>
- <pageId>19</pageId>
+ <pageId>65</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>Search</eventAction>
<icon>plugins/Morpheus/images/event.png</icon>
@@ -476,15 +464,11 @@
</row>
</customVariables>
<resolution>1024x768</resolution>
- <plugins>flash, java</plugins>
+ <plugins>director</plugins>
<pluginsIcons>
<row>
- <pluginIcon>plugins/DevicePlugins/images/plugins/flash.gif</pluginIcon>
- <pluginName>flash</pluginName>
- </row>
- <row>
- <pluginIcon>plugins/DevicePlugins/images/plugins/java.gif</pluginIcon>
- <pluginName>java</pluginName>
+ <pluginIcon>plugins/DevicePlugins/images/plugins/director.gif</pluginIcon>
+ <pluginName>director</pluginName>
</row>
</pluginsIcons>
@@ -495,40 +479,16 @@
</row>
<row>
<idSite>1</idSite>
- <idVisit>1</idVisit>
- <visitIp>156.5.3.2</visitIp>
+ <idVisit>11</idVisit>
+ <visitIp>111.1.1.2</visitIp>
<actionDetails>
<row>
- <type>goal</type>
- <goalName>triggered js</goalName>
- <goalId>1</goalId>
- <revenue>0</revenue>
- <goalPageId>1</goalPageId>
-
- <url>http://example.org/webradio</url>
- <icon>plugins/Morpheus/images/goal.png</icon>
-
- </row>
- <row>
- <type>action</type>
- <url>http://example.org/webradio</url>
- <pageTitle>Welcome!</pageTitle>
- <pageIdAction>2</pageIdAction>
-
- <pageId>1</pageId>
- <generationTime>0.33s</generationTime>
- <timeSpent>60</timeSpent>
- <timeSpentPretty>1 min 0s</timeSpentPretty>
- <icon />
-
- </row>
- <row>
<type>event</type>
- <url>http://example.org/webradio</url>
- <pageIdAction>3</pageIdAction>
+ <url>http://example.com/piwik/</url>
+ <pageIdAction>31</pageIdAction>
- <pageId>2</pageId>
+ <pageId>49</pageId>
<eventCategory>Music</eventCategory>
<eventAction>play</eventAction>
<customVariables>
@@ -545,10 +505,10 @@
</row>
<row>
<type>event</type>
- <url>http://example.org/webradio</url>
- <pageIdAction>3</pageIdAction>
+ <url>http://example.com/piwik/</url>
+ <pageIdAction>31</pageIdAction>
- <pageId>3</pageId>
+ <pageId>50</pageId>
<eventCategory>Music</eventCategory>
<eventAction>play25%</eventAction>
<customVariables>
@@ -565,10 +525,10 @@
</row>
<row>
<type>event</type>
- <url>http://example.org/webradio</url>
- <pageIdAction>3</pageIdAction>
+ <url>http://example.com/piwik/</url>
+ <pageIdAction>31</pageIdAction>
- <pageId>4</pageId>
+ <pageId>51</pageId>
<eventCategory>Music</eventCategory>
<eventAction>play50%</eventAction>
<customVariables>
@@ -585,10 +545,10 @@
</row>
<row>
<type>event</type>
- <url>http://example.org/webradio</url>
- <pageIdAction>3</pageIdAction>
+ <url>http://example.com/piwik/</url>
+ <pageIdAction>31</pageIdAction>
- <pageId>5</pageId>
+ <pageId>52</pageId>
<eventCategory>Music</eventCategory>
<eventAction>play75%</eventAction>
<customVariables>
@@ -605,10 +565,10 @@
</row>
<row>
<type>event</type>
- <url>http://example.org/webradio</url>
- <pageIdAction>3</pageIdAction>
+ <url>http://example.com/piwik/</url>
+ <pageIdAction>31</pageIdAction>
- <pageId>6</pageId>
+ <pageId>53</pageId>
<eventCategory>Music</eventCategory>
<eventAction>playEnd</eventAction>
<customVariables>
@@ -625,10 +585,10 @@
</row>
<row>
<type>event</type>
- <url>http://example.org/webradio</url>
- <pageIdAction>3</pageIdAction>
+ <url>http://example.com/piwik/</url>
+ <pageIdAction>31</pageIdAction>
- <pageId>7</pageId>
+ <pageId>54</pageId>
<eventCategory>Music</eventCategory>
<eventAction>rating</eventAction>
<customVariables>
@@ -646,10 +606,10 @@
</row>
<row>
<type>event</type>
- <url>http://example.org/webradio</url>
- <pageIdAction>3</pageIdAction>
+ <url>http://example.com/piwik/</url>
+ <pageIdAction>31</pageIdAction>
- <pageId>8</pageId>
+ <pageId>55</pageId>
<eventCategory>Music</eventCategory>
<eventAction>rating</eventAction>
<customVariables>
@@ -660,30 +620,6 @@
</customVariables>
<eventName>La fiancée de l'eau</eventName>
<eventValue>10</eventValue>
- <timeSpent>0</timeSpent>
- <timeSpentPretty>0s</timeSpentPretty>
- <icon>plugins/Morpheus/images/event.png</icon>
-
- </row>
- <row>
- <type>goal</type>
- <goalName>event matching</goalName>
- <goalId>3</goalId>
- <revenue>0</revenue>
- <goalPageId>9</goalPageId>
-
- <url />
- <icon>plugins/Morpheus/images/goal.png</icon>
-
- </row>
- <row>
- <type>event</type>
- <url />
- <pageIdAction />
-
- <pageId>9</pageId>
- <eventCategory>CategoryTriggersGoal here</eventCategory>
- <eventAction>This is an event without a URL</eventAction>
<timeSpent>1499</timeSpent>
<timeSpentPretty>24 min 59s</timeSpentPretty>
<icon>plugins/Morpheus/images/event.png</icon>
@@ -695,7 +631,7 @@
<pageTitle>Movie Theater</pageTitle>
<pageIdAction>15</pageIdAction>
- <pageId>10</pageId>
+ <pageId>56</pageId>
<generationTime>0.67s</generationTime>
<timeSpent>60</timeSpent>
<timeSpentPretty>1 min 0s</timeSpentPretty>
@@ -707,7 +643,7 @@
<url>http://example.org/movies</url>
<pageIdAction>16</pageIdAction>
- <pageId>11</pageId>
+ <pageId>57</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>playTrailer</eventAction>
<eventName>Princess Mononoke (もののけ姫)</eventName>
@@ -721,7 +657,7 @@
<url>http://example.org/movies</url>
<pageIdAction>16</pageIdAction>
- <pageId>12</pageId>
+ <pageId>58</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>playTrailer</eventAction>
<eventName>Ponyo (崖の上のポニョ)</eventName>
@@ -735,7 +671,7 @@
<url>http://example.org/movies</url>
<pageIdAction>16</pageIdAction>
- <pageId>13</pageId>
+ <pageId>59</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>playTrailer</eventAction>
<eventName>Spirited Away (千と千尋の神隠し)</eventName>
@@ -749,7 +685,7 @@
<url>http://example.org/movies</url>
<pageIdAction>16</pageIdAction>
- <pageId>14</pageId>
+ <pageId>60</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>clickBuyNow</eventAction>
<eventName>Spirited Away (千と千尋の神隠し)</eventName>
@@ -763,7 +699,7 @@
<url>http://example.org/movies</url>
<pageIdAction>16</pageIdAction>
- <pageId>15</pageId>
+ <pageId>61</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>playStart</eventAction>
<eventName>Spirited Away (千と千尋の神隠し)</eventName>
@@ -777,7 +713,7 @@
<url>http://example.org/movies</url>
<pageIdAction>16</pageIdAction>
- <pageId>16</pageId>
+ <pageId>62</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>play25%</eventAction>
<eventName>Spirited Away (千と千尋の神隠し)</eventName>
@@ -785,7 +721,7 @@
</row>
</actionDetails>
- <goalConversions>2</goalConversions>
+ <goalConversions>0</goalConversions>
<siteCurrency>USD</siteCurrency>
<siteCurrencySymbol>$</siteCurrencySymbol>
@@ -795,18 +731,18 @@
<userId />
<visitorType>new</visitorType>
<visitorTypeIcon />
- <visitConverted>1</visitConverted>
- <visitConvertedIcon>plugins/Morpheus/images/goal.png</visitConvertedIcon>
+ <visitConverted>0</visitConverted>
+ <visitConvertedIcon />
<visitCount>1</visitCount>
<visitEcommerceStatus>none</visitEcommerceStatus>
<visitEcommerceStatusIcon />
<daysSinceFirstVisit>0</daysSinceFirstVisit>
<daysSinceLastEcommerceOrder>0</daysSinceLastEcommerceOrder>
- <visitDuration>3601</visitDuration>
- <visitDurationPretty>1 hours 0 min</visitDurationPretty>
+ <visitDuration>3541</visitDuration>
+ <visitDurationPretty>59 min 1s</visitDurationPretty>
<searches>0</searches>
- <actions>16</actions>
+ <actions>14</actions>
<referrerType>direct</referrerType>
<referrerTypeName>Direct Entry</referrerTypeName>
<referrerName />
@@ -833,7 +769,7 @@
<browserIcon>plugins/DevicesDetection/images/browsers/FF.gif</browserIcon>
<browserCode>FF</browserCode>
<browserVersion>3.6</browserVersion>
- <events>14</events>
+ <events>13</events>
<continent>Europe</continent>
<continentCode>eur</continentCode>
<country>France</country>
@@ -855,15 +791,11 @@
</row>
</customVariables>
<resolution>1024x768</resolution>
- <plugins>flash, java</plugins>
+ <plugins>director</plugins>
<pluginsIcons>
<row>
- <pluginIcon>plugins/DevicePlugins/images/plugins/flash.gif</pluginIcon>
- <pluginName>flash</pluginName>
- </row>
- <row>
- <pluginIcon>plugins/DevicePlugins/images/plugins/java.gif</pluginIcon>
- <pluginName>java</pluginName>
+ <pluginIcon>plugins/DevicePlugins/images/plugins/director.gif</pluginIcon>
+ <pluginName>director</pluginName>
</row>
</pluginsIcons>
@@ -874,8 +806,8 @@
</row>
<row>
<idSite>1</idSite>
- <idVisit>10</idVisit>
- <visitIp>111.1.1.1</visitIp>
+ <idVisit>5</idVisit>
+ <visitIp>156.5.3.2</visitIp>
<actionDetails>
<row>
@@ -883,7 +815,7 @@
<url>http://example.org/movies</url>
<pageIdAction>16</pageIdAction>
- <pageId>45</pageId>
+ <pageId>22</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>Purchase</eventAction>
<icon>plugins/Morpheus/images/event.png</icon>
@@ -960,11 +892,15 @@
</row>
</customVariables>
<resolution>1024x768</resolution>
- <plugins>director</plugins>
+ <plugins>flash, java</plugins>
<pluginsIcons>
<row>
- <pluginIcon>plugins/DevicePlugins/images/plugins/director.gif</pluginIcon>
- <pluginName>director</pluginName>
+ <pluginIcon>plugins/DevicePlugins/images/plugins/flash.gif</pluginIcon>
+ <pluginName>flash</pluginName>
+ </row>
+ <row>
+ <pluginIcon>plugins/DevicePlugins/images/plugins/java.gif</pluginIcon>
+ <pluginName>java</pluginName>
</row>
</pluginsIcons>
@@ -975,8 +911,8 @@
</row>
<row>
<idSite>1</idSite>
- <idVisit>9</idVisit>
- <visitIp>111.1.1.1</visitIp>
+ <idVisit>4</idVisit>
+ <visitIp>156.5.3.2</visitIp>
<actionDetails>
<row>
@@ -984,7 +920,7 @@
<url>http://example.org/movies</url>
<pageIdAction>16</pageIdAction>
- <pageId>44</pageId>
+ <pageId>21</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>Search</eventAction>
<icon>plugins/Morpheus/images/event.png</icon>
@@ -1061,11 +997,15 @@
</row>
</customVariables>
<resolution>1024x768</resolution>
- <plugins>director</plugins>
+ <plugins>flash, java</plugins>
<pluginsIcons>
<row>
- <pluginIcon>plugins/DevicePlugins/images/plugins/director.gif</pluginIcon>
- <pluginName>director</pluginName>
+ <pluginIcon>plugins/DevicePlugins/images/plugins/flash.gif</pluginIcon>
+ <pluginName>flash</pluginName>
+ </row>
+ <row>
+ <pluginIcon>plugins/DevicePlugins/images/plugins/java.gif</pluginIcon>
+ <pluginName>java</pluginName>
</row>
</pluginsIcons>
@@ -1076,8 +1016,8 @@
</row>
<row>
<idSite>1</idSite>
- <idVisit>7</idVisit>
- <visitIp>111.1.1.1</visitIp>
+ <idVisit>2</idVisit>
+ <visitIp>156.5.3.2</visitIp>
<actionDetails>
<row>
@@ -1085,7 +1025,7 @@
<url>http://example.org/movies</url>
<pageIdAction>16</pageIdAction>
- <pageId>40</pageId>
+ <pageId>17</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>play50%</eventAction>
<eventName>Spirited Away (千と千尋の神隠し)</eventName>
@@ -1099,7 +1039,7 @@
<url>http://example.org/movies</url>
<pageIdAction>16</pageIdAction>
- <pageId>41</pageId>
+ <pageId>18</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>play75%</eventAction>
<eventName>Spirited Away (千と千尋の神隠し)</eventName>
@@ -1113,7 +1053,7 @@
<url>http://example.org/movies</url>
<pageIdAction>16</pageIdAction>
- <pageId>43</pageId>
+ <pageId>20</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>Search</eventAction>
<eventName>Search query here</eventName>
@@ -1127,7 +1067,7 @@
<url>http://example.org/movies</url>
<pageIdAction>16</pageIdAction>
- <pageId>46</pageId>
+ <pageId>23</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>playEnd</eventAction>
<eventName>Spirited Away (千と千尋の神隠し)</eventName>
@@ -1141,7 +1081,7 @@
<url />
<pageIdAction />
- <pageId>47</pageId>
+ <pageId>24</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>rating</eventAction>
<eventName>Spirited Away (千と千尋の神隠し)</eventName>
@@ -1156,7 +1096,7 @@
<url>http://example.org/finishedMovie</url>
<pageIdAction>27</pageIdAction>
- <pageId>48</pageId>
+ <pageId>25</pageId>
<eventCategory>event category Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long ---&gt; SHOULD APPEAR IN TEST OUTPUT NOT TRUNCATED &lt;---</eventCategory>
<eventAction>event action Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long ---&gt; SHOULD APPEAR IN TEST OUTPUT NOT TRUNCATED &lt;---</eventAction>
<eventName>event name Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long ---&gt; SHOULD APPEAR IN TEST OUTPUT NOT TRUNCATED &lt;---</eventName>
@@ -1235,11 +1175,15 @@
</row>
</customVariables>
<resolution>1024x768</resolution>
- <plugins>director</plugins>
+ <plugins>flash, java</plugins>
<pluginsIcons>
<row>
- <pluginIcon>plugins/DevicePlugins/images/plugins/director.gif</pluginIcon>
- <pluginName>director</pluginName>
+ <pluginIcon>plugins/DevicePlugins/images/plugins/flash.gif</pluginIcon>
+ <pluginName>flash</pluginName>
+ </row>
+ <row>
+ <pluginIcon>plugins/DevicePlugins/images/plugins/java.gif</pluginIcon>
+ <pluginName>java</pluginName>
</row>
</pluginsIcons>
@@ -1250,8 +1194,8 @@
</row>
<row>
<idSite>1</idSite>
- <idVisit>8</idVisit>
- <visitIp>111.1.1.1</visitIp>
+ <idVisit>3</idVisit>
+ <visitIp>156.5.3.2</visitIp>
<actionDetails>
<row>
@@ -1259,7 +1203,7 @@
<url>http://example.org/movies</url>
<pageIdAction>16</pageIdAction>
- <pageId>42</pageId>
+ <pageId>19</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>Search</eventAction>
<icon>plugins/Morpheus/images/event.png</icon>
@@ -1336,11 +1280,15 @@
</row>
</customVariables>
<resolution>1024x768</resolution>
- <plugins>director</plugins>
+ <plugins>flash, java</plugins>
<pluginsIcons>
<row>
- <pluginIcon>plugins/DevicePlugins/images/plugins/director.gif</pluginIcon>
- <pluginName>director</pluginName>
+ <pluginIcon>plugins/DevicePlugins/images/plugins/flash.gif</pluginIcon>
+ <pluginName>flash</pluginName>
+ </row>
+ <row>
+ <pluginIcon>plugins/DevicePlugins/images/plugins/java.gif</pluginIcon>
+ <pluginName>java</pluginName>
</row>
</pluginsIcons>
@@ -1351,16 +1299,40 @@
</row>
<row>
<idSite>1</idSite>
- <idVisit>6</idVisit>
- <visitIp>111.1.1.1</visitIp>
+ <idVisit>1</idVisit>
+ <visitIp>156.5.3.2</visitIp>
<actionDetails>
<row>
+ <type>goal</type>
+ <goalName>triggered js</goalName>
+ <goalId>1</goalId>
+ <revenue>0</revenue>
+ <goalPageId>1</goalPageId>
+
+ <url>http://example.org/webradio</url>
+ <icon>plugins/Morpheus/images/goal.png</icon>
+
+ </row>
+ <row>
+ <type>action</type>
+ <url>http://example.org/webradio</url>
+ <pageTitle>Welcome!</pageTitle>
+ <pageIdAction>2</pageIdAction>
+
+ <pageId>1</pageId>
+ <generationTime>0.33s</generationTime>
+ <timeSpent>60</timeSpent>
+ <timeSpentPretty>1 min 0s</timeSpentPretty>
+ <icon />
+
+ </row>
+ <row>
<type>event</type>
- <url>http://example.com/piwik/</url>
- <pageIdAction>31</pageIdAction>
+ <url>http://example.org/webradio</url>
+ <pageIdAction>3</pageIdAction>
- <pageId>26</pageId>
+ <pageId>2</pageId>
<eventCategory>Music</eventCategory>
<eventAction>play</eventAction>
<customVariables>
@@ -1377,10 +1349,10 @@
</row>
<row>
<type>event</type>
- <url>http://example.com/piwik/</url>
- <pageIdAction>31</pageIdAction>
+ <url>http://example.org/webradio</url>
+ <pageIdAction>3</pageIdAction>
- <pageId>27</pageId>
+ <pageId>3</pageId>
<eventCategory>Music</eventCategory>
<eventAction>play25%</eventAction>
<customVariables>
@@ -1397,10 +1369,10 @@
</row>
<row>
<type>event</type>
- <url>http://example.com/piwik/</url>
- <pageIdAction>31</pageIdAction>
+ <url>http://example.org/webradio</url>
+ <pageIdAction>3</pageIdAction>
- <pageId>28</pageId>
+ <pageId>4</pageId>
<eventCategory>Music</eventCategory>
<eventAction>play50%</eventAction>
<customVariables>
@@ -1417,10 +1389,10 @@
</row>
<row>
<type>event</type>
- <url>http://example.com/piwik/</url>
- <pageIdAction>31</pageIdAction>
+ <url>http://example.org/webradio</url>
+ <pageIdAction>3</pageIdAction>
- <pageId>29</pageId>
+ <pageId>5</pageId>
<eventCategory>Music</eventCategory>
<eventAction>play75%</eventAction>
<customVariables>
@@ -1437,10 +1409,10 @@
</row>
<row>
<type>event</type>
- <url>http://example.com/piwik/</url>
- <pageIdAction>31</pageIdAction>
+ <url>http://example.org/webradio</url>
+ <pageIdAction>3</pageIdAction>
- <pageId>30</pageId>
+ <pageId>6</pageId>
<eventCategory>Music</eventCategory>
<eventAction>playEnd</eventAction>
<customVariables>
@@ -1457,10 +1429,10 @@
</row>
<row>
<type>event</type>
- <url>http://example.com/piwik/</url>
- <pageIdAction>31</pageIdAction>
+ <url>http://example.org/webradio</url>
+ <pageIdAction>3</pageIdAction>
- <pageId>31</pageId>
+ <pageId>7</pageId>
<eventCategory>Music</eventCategory>
<eventAction>rating</eventAction>
<customVariables>
@@ -1478,10 +1450,10 @@
</row>
<row>
<type>event</type>
- <url>http://example.com/piwik/</url>
- <pageIdAction>31</pageIdAction>
+ <url>http://example.org/webradio</url>
+ <pageIdAction>3</pageIdAction>
- <pageId>32</pageId>
+ <pageId>8</pageId>
<eventCategory>Music</eventCategory>
<eventAction>rating</eventAction>
<customVariables>
@@ -1492,6 +1464,30 @@
</customVariables>
<eventName>La fiancée de l'eau</eventName>
<eventValue>10</eventValue>
+ <timeSpent>0</timeSpent>
+ <timeSpentPretty>0s</timeSpentPretty>
+ <icon>plugins/Morpheus/images/event.png</icon>
+
+ </row>
+ <row>
+ <type>goal</type>
+ <goalName>event matching</goalName>
+ <goalId>3</goalId>
+ <revenue>0</revenue>
+ <goalPageId>9</goalPageId>
+
+ <url />
+ <icon>plugins/Morpheus/images/goal.png</icon>
+
+ </row>
+ <row>
+ <type>event</type>
+ <url />
+ <pageIdAction />
+
+ <pageId>9</pageId>
+ <eventCategory>CategoryTriggersGoal here</eventCategory>
+ <eventAction>This is an event without a URL</eventAction>
<timeSpent>1499</timeSpent>
<timeSpentPretty>24 min 59s</timeSpentPretty>
<icon>plugins/Morpheus/images/event.png</icon>
@@ -1503,7 +1499,7 @@
<pageTitle>Movie Theater</pageTitle>
<pageIdAction>15</pageIdAction>
- <pageId>33</pageId>
+ <pageId>10</pageId>
<generationTime>0.67s</generationTime>
<timeSpent>60</timeSpent>
<timeSpentPretty>1 min 0s</timeSpentPretty>
@@ -1515,7 +1511,7 @@
<url>http://example.org/movies</url>
<pageIdAction>16</pageIdAction>
- <pageId>34</pageId>
+ <pageId>11</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>playTrailer</eventAction>
<eventName>Princess Mononoke (もののけ姫)</eventName>
@@ -1529,7 +1525,7 @@
<url>http://example.org/movies</url>
<pageIdAction>16</pageIdAction>
- <pageId>35</pageId>
+ <pageId>12</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>playTrailer</eventAction>
<eventName>Ponyo (崖の上のポニョ)</eventName>
@@ -1543,7 +1539,7 @@
<url>http://example.org/movies</url>
<pageIdAction>16</pageIdAction>
- <pageId>36</pageId>
+ <pageId>13</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>playTrailer</eventAction>
<eventName>Spirited Away (千と千尋の神隠し)</eventName>
@@ -1557,7 +1553,7 @@
<url>http://example.org/movies</url>
<pageIdAction>16</pageIdAction>
- <pageId>37</pageId>
+ <pageId>14</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>clickBuyNow</eventAction>
<eventName>Spirited Away (千と千尋の神隠し)</eventName>
@@ -1571,7 +1567,7 @@
<url>http://example.org/movies</url>
<pageIdAction>16</pageIdAction>
- <pageId>38</pageId>
+ <pageId>15</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>playStart</eventAction>
<eventName>Spirited Away (千と千尋の神隠し)</eventName>
@@ -1585,7 +1581,7 @@
<url>http://example.org/movies</url>
<pageIdAction>16</pageIdAction>
- <pageId>39</pageId>
+ <pageId>16</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>play25%</eventAction>
<eventName>Spirited Away (千と千尋の神隠し)</eventName>
@@ -1593,7 +1589,7 @@
</row>
</actionDetails>
- <goalConversions>0</goalConversions>
+ <goalConversions>2</goalConversions>
<siteCurrency>USD</siteCurrency>
<siteCurrencySymbol>$</siteCurrencySymbol>
@@ -1603,18 +1599,18 @@
<userId />
<visitorType>new</visitorType>
<visitorTypeIcon />
- <visitConverted>0</visitConverted>
- <visitConvertedIcon />
+ <visitConverted>1</visitConverted>
+ <visitConvertedIcon>plugins/Morpheus/images/goal.png</visitConvertedIcon>
<visitCount>1</visitCount>
<visitEcommerceStatus>none</visitEcommerceStatus>
<visitEcommerceStatusIcon />
<daysSinceFirstVisit>0</daysSinceFirstVisit>
<daysSinceLastEcommerceOrder>0</daysSinceLastEcommerceOrder>
- <visitDuration>3541</visitDuration>
- <visitDurationPretty>59 min 1s</visitDurationPretty>
+ <visitDuration>3601</visitDuration>
+ <visitDurationPretty>1 hours 0 min</visitDurationPretty>
<searches>0</searches>
- <actions>14</actions>
+ <actions>16</actions>
<referrerType>direct</referrerType>
<referrerTypeName>Direct Entry</referrerTypeName>
<referrerName />
@@ -1641,7 +1637,7 @@
<browserIcon>plugins/DevicesDetection/images/browsers/FF.gif</browserIcon>
<browserCode>FF</browserCode>
<browserVersion>3.6</browserVersion>
- <events>13</events>
+ <events>14</events>
<continent>Europe</continent>
<continentCode>eur</continentCode>
<country>France</country>
@@ -1663,11 +1659,15 @@
</row>
</customVariables>
<resolution>1024x768</resolution>
- <plugins>director</plugins>
+ <plugins>flash, java</plugins>
<pluginsIcons>
<row>
- <pluginIcon>plugins/DevicePlugins/images/plugins/director.gif</pluginIcon>
- <pluginName>director</pluginName>
+ <pluginIcon>plugins/DevicePlugins/images/plugins/flash.gif</pluginIcon>
+ <pluginName>flash</pluginName>
+ </row>
+ <row>
+ <pluginIcon>plugins/DevicePlugins/images/plugins/java.gif</pluginIcon>
+ <pluginName>java</pluginName>
</row>
</pluginsIcons>
diff --git a/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventAction__Events.getCategory_month.xml b/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventAction__Events.getCategory_month.xml
index ced40076d2..26def0abf9 100644
--- a/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventAction__Events.getCategory_month.xml
+++ b/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventAction__Events.getCategory_month.xml
@@ -2,229 +2,229 @@
<result>
<row>
<label>Movie</label>
- <nb_visits>28</nb_visits>
- <nb_events>28</nb_events>
- <nb_events_with_value>2</nb_events_with_value>
- <sum_event_value>19.32</sum_event_value>
+ <nb_visits>42</nb_visits>
+ <nb_events>42</nb_events>
+ <nb_events_with_value>3</nb_events_with_value>
+ <sum_event_value>28.98</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>9.66</max_event_value>
- <sum_daily_nb_uniq_visitors>26</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>39</sum_daily_nb_uniq_visitors>
<avg_event_value>9.66</avg_event_value>
<segment>eventCategory==Movie</segment>
<subtable>
<row>
<label>playTrailer</label>
- <nb_visits>6</nb_visits>
- <nb_events>6</nb_events>
+ <nb_visits>9</nb_visits>
+ <nb_events>9</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>6</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>9</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
<row>
<label>Search</label>
- <nb_visits>6</nb_visits>
- <nb_events>6</nb_events>
+ <nb_visits>9</nb_visits>
+ <nb_events>9</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>4</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>6</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
<row>
<label>clickBuyNow</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
<row>
<label>play25%</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
<row>
<label>play50%</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
<row>
<label>play75%</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
<row>
<label>playEnd</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
<row>
<label>playStart</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
<row>
<label>Purchase</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
<row>
<label>rating</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
- <nb_events_with_value>2</nb_events_with_value>
- <sum_event_value>19.32</sum_event_value>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
+ <nb_events_with_value>3</nb_events_with_value>
+ <sum_event_value>28.98</sum_event_value>
<min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>9.66</avg_event_value>
</row>
</subtable>
</row>
<row>
<label>Music</label>
- <nb_visits>12</nb_visits>
- <nb_events>14</nb_events>
- <nb_events_with_value>4</nb_events_with_value>
- <sum_event_value>38</sum_event_value>
+ <nb_visits>18</nb_visits>
+ <nb_events>21</nb_events>
+ <nb_events_with_value>6</nb_events_with_value>
+ <sum_event_value>57</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>10</max_event_value>
- <sum_daily_nb_uniq_visitors>12</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>18</sum_daily_nb_uniq_visitors>
<avg_event_value>9.5</avg_event_value>
<segment>eventCategory==Music</segment>
<subtable>
<row>
<label>play</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
<row>
<label>play25%</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
<row>
<label>play50%</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
<row>
<label>play75%</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
<row>
<label>playEnd</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
<row>
<label>rating</label>
- <nb_visits>2</nb_visits>
- <nb_events>4</nb_events>
- <nb_events_with_value>4</nb_events_with_value>
- <sum_event_value>38</sum_event_value>
+ <nb_visits>3</nb_visits>
+ <nb_events>6</nb_events>
+ <nb_events_with_value>6</nb_events_with_value>
+ <sum_event_value>57</sum_event_value>
<min_event_value>9</min_event_value>
<max_event_value>10</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>9.5</avg_event_value>
</row>
</subtable>
</row>
<row>
<label>event category Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long ---&gt; SHOULD APPEAR IN TEST OUTPUT NOT TRUNCATED &lt;---</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
- <nb_events_with_value>2</nb_events_with_value>
- <sum_event_value>19.32</sum_event_value>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
+ <nb_events_with_value>3</nb_events_with_value>
+ <sum_event_value>28.98</sum_event_value>
<min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>9.66</avg_event_value>
<segment>eventCategory==event+category+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+---%26gt%3B+SHOULD+APPEAR+IN+TEST+OUTPUT+NOT+TRUNCATED+%26lt%3B---</segment>
<subtable>
<row>
<label>event action Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long ---&gt; SHOULD APPEAR IN TEST OUTPUT NOT TRUNCATED &lt;---</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
- <nb_events_with_value>2</nb_events_with_value>
- <sum_event_value>19.32</sum_event_value>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
+ <nb_events_with_value>3</nb_events_with_value>
+ <sum_event_value>28.98</sum_event_value>
<min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>9.66</avg_event_value>
</row>
</subtable>
diff --git a/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventAction__Events.getName_month.xml b/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventAction__Events.getName_month.xml
index d0560a0023..a87c852b65 100644
--- a/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventAction__Events.getName_month.xml
+++ b/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventAction__Events.getName_month.xml
@@ -2,217 +2,217 @@
<result>
<row>
<label>Spirited Away (千と千尋の神隠し)</label>
- <nb_visits>16</nb_visits>
- <nb_events>16</nb_events>
- <nb_events_with_value>2</nb_events_with_value>
- <sum_event_value>19.32</sum_event_value>
+ <nb_visits>24</nb_visits>
+ <nb_events>24</nb_events>
+ <nb_events_with_value>3</nb_events_with_value>
+ <sum_event_value>28.98</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>9.66</max_event_value>
- <sum_daily_nb_uniq_visitors>16</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>24</sum_daily_nb_uniq_visitors>
<avg_event_value>9.66</avg_event_value>
<segment>eventName==Spirited+Away+%28%E5%8D%83%E3%81%A8%E5%8D%83%E5%B0%8B%E3%81%AE%E7%A5%9E%E9%9A%A0%E3%81%97%29</segment>
<subtable>
<row>
<label>clickBuyNow</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
<row>
<label>play25%</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
<row>
<label>play50%</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
<row>
<label>play75%</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
<row>
<label>playEnd</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
<row>
<label>playStart</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
<row>
<label>playTrailer</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
<row>
<label>rating</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
- <nb_events_with_value>2</nb_events_with_value>
- <sum_event_value>19.32</sum_event_value>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
+ <nb_events_with_value>3</nb_events_with_value>
+ <sum_event_value>28.98</sum_event_value>
<min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>9.66</avg_event_value>
</row>
</subtable>
</row>
<row>
<label>La fiancée de l'eau</label>
- <nb_visits>12</nb_visits>
- <nb_events>14</nb_events>
- <nb_events_with_value>4</nb_events_with_value>
- <sum_event_value>38</sum_event_value>
+ <nb_visits>18</nb_visits>
+ <nb_events>21</nb_events>
+ <nb_events_with_value>6</nb_events_with_value>
+ <sum_event_value>57</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>10</max_event_value>
- <sum_daily_nb_uniq_visitors>12</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>18</sum_daily_nb_uniq_visitors>
<avg_event_value>9.5</avg_event_value>
<segment>eventName==La+fianc%C3%A9e+de+l%26%23039%3Beau</segment>
<subtable>
<row>
<label>play</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
<row>
<label>play25%</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
<row>
<label>play50%</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
<row>
<label>play75%</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
<row>
<label>playEnd</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
<row>
<label>rating</label>
- <nb_visits>2</nb_visits>
- <nb_events>4</nb_events>
- <nb_events_with_value>4</nb_events_with_value>
- <sum_event_value>38</sum_event_value>
+ <nb_visits>3</nb_visits>
+ <nb_events>6</nb_events>
+ <nb_events_with_value>6</nb_events_with_value>
+ <sum_event_value>57</sum_event_value>
<min_event_value>9</min_event_value>
<max_event_value>10</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>9.5</avg_event_value>
</row>
</subtable>
</row>
<row>
<label>Event Name not defined</label>
- <nb_visits>7</nb_visits>
- <nb_events>7</nb_events>
+ <nb_visits>10</nb_visits>
+ <nb_events>10</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>5</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>7</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
<subtable>
<row>
<label>Search</label>
- <nb_visits>4</nb_visits>
- <nb_events>4</nb_events>
+ <nb_visits>6</nb_visits>
+ <nb_events>6</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
<row>
<label>Purchase</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
<row>
@@ -230,100 +230,100 @@
</row>
<row>
<label>event name Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long ---&gt; SHOULD APPEAR IN TEST OUTPUT NOT TRUNCATED &lt;---</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
- <nb_events_with_value>2</nb_events_with_value>
- <sum_event_value>19.32</sum_event_value>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
+ <nb_events_with_value>3</nb_events_with_value>
+ <sum_event_value>28.98</sum_event_value>
<min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>9.66</avg_event_value>
<segment>eventName==event+name+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+---%26gt%3B+SHOULD+APPEAR+IN+TEST+OUTPUT+NOT+TRUNCATED+%26lt%3B---</segment>
<subtable>
<row>
<label>event action Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long ---&gt; SHOULD APPEAR IN TEST OUTPUT NOT TRUNCATED &lt;---</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
- <nb_events_with_value>2</nb_events_with_value>
- <sum_event_value>19.32</sum_event_value>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
+ <nb_events_with_value>3</nb_events_with_value>
+ <sum_event_value>28.98</sum_event_value>
<min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>9.66</avg_event_value>
</row>
</subtable>
</row>
<row>
<label>Ponyo (崖の上のポニョ)</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
<segment>eventName==Ponyo+%28%E5%B4%96%E3%81%AE%E4%B8%8A%E3%81%AE%E3%83%9D%E3%83%8B%E3%83%A7%29</segment>
<subtable>
<row>
<label>playTrailer</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
</subtable>
</row>
<row>
<label>Princess Mononoke (もののけ姫)</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
<segment>eventName==Princess+Mononoke+%28%E3%82%82%E3%81%AE%E3%81%AE%E3%81%91%E5%A7%AB%29</segment>
<subtable>
<row>
<label>playTrailer</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
</subtable>
</row>
<row>
<label>Search query here</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
<segment>eventName==Search+query+here</segment>
<subtable>
<row>
<label>Search</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
</subtable>
diff --git a/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventCategory__Events.getAction_month.xml b/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventCategory__Events.getAction_month.xml
index 8503a4dc17..65c0b2aa9e 100644
--- a/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventCategory__Events.getAction_month.xml
+++ b/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventCategory__Events.getAction_month.xml
@@ -2,355 +2,355 @@
<result>
<row>
<label>playTrailer</label>
- <nb_visits>6</nb_visits>
- <nb_events>6</nb_events>
+ <nb_visits>9</nb_visits>
+ <nb_events>9</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>6</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>9</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
<segment>eventAction==playTrailer</segment>
<subtable>
<row>
<label>Movie</label>
- <nb_visits>6</nb_visits>
- <nb_events>6</nb_events>
+ <nb_visits>9</nb_visits>
+ <nb_events>9</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>6</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>9</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
</subtable>
</row>
<row>
<label>Search</label>
- <nb_visits>6</nb_visits>
- <nb_events>6</nb_events>
+ <nb_visits>9</nb_visits>
+ <nb_events>9</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>4</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>6</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
<segment>eventAction==Search</segment>
<subtable>
<row>
<label>Movie</label>
- <nb_visits>6</nb_visits>
- <nb_events>6</nb_events>
+ <nb_visits>9</nb_visits>
+ <nb_events>9</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>4</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>6</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
</subtable>
</row>
<row>
<label>play25%</label>
- <nb_visits>4</nb_visits>
- <nb_events>4</nb_events>
+ <nb_visits>6</nb_visits>
+ <nb_events>6</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>4</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>6</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
<segment>eventAction==play25%25</segment>
<subtable>
<row>
<label>Movie</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
<row>
<label>Music</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
</subtable>
</row>
<row>
<label>play50%</label>
- <nb_visits>4</nb_visits>
- <nb_events>4</nb_events>
+ <nb_visits>6</nb_visits>
+ <nb_events>6</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>4</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>6</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
<segment>eventAction==play50%25</segment>
<subtable>
<row>
<label>Movie</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
<row>
<label>Music</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
</subtable>
</row>
<row>
<label>play75%</label>
- <nb_visits>4</nb_visits>
- <nb_events>4</nb_events>
+ <nb_visits>6</nb_visits>
+ <nb_events>6</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>4</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>6</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
<segment>eventAction==play75%25</segment>
<subtable>
<row>
<label>Movie</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
<row>
<label>Music</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
</subtable>
</row>
<row>
<label>playEnd</label>
- <nb_visits>4</nb_visits>
- <nb_events>4</nb_events>
+ <nb_visits>6</nb_visits>
+ <nb_events>6</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>4</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>6</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
<segment>eventAction==playEnd</segment>
<subtable>
<row>
<label>Movie</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
<row>
<label>Music</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
</subtable>
</row>
<row>
<label>rating</label>
- <nb_visits>4</nb_visits>
- <nb_events>6</nb_events>
- <nb_events_with_value>6</nb_events_with_value>
- <sum_event_value>57.32</sum_event_value>
+ <nb_visits>6</nb_visits>
+ <nb_events>9</nb_events>
+ <nb_events_with_value>9</nb_events_with_value>
+ <sum_event_value>85.98</sum_event_value>
<min_event_value>9</min_event_value>
<max_event_value>10</max_event_value>
- <sum_daily_nb_uniq_visitors>4</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>6</sum_daily_nb_uniq_visitors>
<avg_event_value>9.55</avg_event_value>
<segment>eventAction==rating</segment>
<subtable>
<row>
<label>Movie</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
- <nb_events_with_value>2</nb_events_with_value>
- <sum_event_value>19.32</sum_event_value>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
+ <nb_events_with_value>3</nb_events_with_value>
+ <sum_event_value>28.98</sum_event_value>
<min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>9.66</avg_event_value>
</row>
<row>
<label>Music</label>
- <nb_visits>2</nb_visits>
- <nb_events>4</nb_events>
- <nb_events_with_value>4</nb_events_with_value>
- <sum_event_value>38</sum_event_value>
+ <nb_visits>3</nb_visits>
+ <nb_events>6</nb_events>
+ <nb_events_with_value>6</nb_events_with_value>
+ <sum_event_value>57</sum_event_value>
<min_event_value>9</min_event_value>
<max_event_value>10</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>9.5</avg_event_value>
</row>
</subtable>
</row>
<row>
<label>clickBuyNow</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
<segment>eventAction==clickBuyNow</segment>
<subtable>
<row>
<label>Movie</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
</subtable>
</row>
<row>
<label>event action Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long ---&gt; SHOULD APPEAR IN TEST OUTPUT NOT TRUNCATED &lt;---</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
- <nb_events_with_value>2</nb_events_with_value>
- <sum_event_value>19.32</sum_event_value>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
+ <nb_events_with_value>3</nb_events_with_value>
+ <sum_event_value>28.98</sum_event_value>
<min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>9.66</avg_event_value>
<segment>eventAction==event+action+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+---%26gt%3B+SHOULD+APPEAR+IN+TEST+OUTPUT+NOT+TRUNCATED+%26lt%3B---</segment>
<subtable>
<row>
<label>event category Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long ---&gt; SHOULD APPEAR IN TEST OUTPUT NOT TRUNCATED &lt;---</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
- <nb_events_with_value>2</nb_events_with_value>
- <sum_event_value>19.32</sum_event_value>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
+ <nb_events_with_value>3</nb_events_with_value>
+ <sum_event_value>28.98</sum_event_value>
<min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>9.66</avg_event_value>
</row>
</subtable>
</row>
<row>
<label>play</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
<segment>eventAction==play</segment>
<subtable>
<row>
<label>Music</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
</subtable>
</row>
<row>
<label>playStart</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
<segment>eventAction==playStart</segment>
<subtable>
<row>
<label>Movie</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
</subtable>
</row>
<row>
<label>Purchase</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
<segment>eventAction==Purchase</segment>
<subtable>
<row>
<label>Movie</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
</subtable>
diff --git a/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventCategory__Events.getName_month.xml b/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventCategory__Events.getName_month.xml
index ceeee487c1..bc59d36fd8 100644
--- a/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventCategory__Events.getName_month.xml
+++ b/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventCategory__Events.getName_month.xml
@@ -2,74 +2,74 @@
<result>
<row>
<label>Spirited Away (千と千尋の神隠し)</label>
- <nb_visits>16</nb_visits>
- <nb_events>16</nb_events>
- <nb_events_with_value>2</nb_events_with_value>
- <sum_event_value>19.32</sum_event_value>
+ <nb_visits>24</nb_visits>
+ <nb_events>24</nb_events>
+ <nb_events_with_value>3</nb_events_with_value>
+ <sum_event_value>28.98</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>9.66</max_event_value>
- <sum_daily_nb_uniq_visitors>16</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>24</sum_daily_nb_uniq_visitors>
<avg_event_value>9.66</avg_event_value>
<segment>eventName==Spirited+Away+%28%E5%8D%83%E3%81%A8%E5%8D%83%E5%B0%8B%E3%81%AE%E7%A5%9E%E9%9A%A0%E3%81%97%29</segment>
<subtable>
<row>
<label>Movie</label>
- <nb_visits>16</nb_visits>
- <nb_events>16</nb_events>
- <nb_events_with_value>2</nb_events_with_value>
- <sum_event_value>19.32</sum_event_value>
+ <nb_visits>24</nb_visits>
+ <nb_events>24</nb_events>
+ <nb_events_with_value>3</nb_events_with_value>
+ <sum_event_value>28.98</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>9.66</max_event_value>
- <sum_daily_nb_uniq_visitors>16</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>24</sum_daily_nb_uniq_visitors>
<avg_event_value>9.66</avg_event_value>
</row>
</subtable>
</row>
<row>
<label>La fiancée de l'eau</label>
- <nb_visits>12</nb_visits>
- <nb_events>14</nb_events>
- <nb_events_with_value>4</nb_events_with_value>
- <sum_event_value>38</sum_event_value>
+ <nb_visits>18</nb_visits>
+ <nb_events>21</nb_events>
+ <nb_events_with_value>6</nb_events_with_value>
+ <sum_event_value>57</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>10</max_event_value>
- <sum_daily_nb_uniq_visitors>12</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>18</sum_daily_nb_uniq_visitors>
<avg_event_value>9.5</avg_event_value>
<segment>eventName==La+fianc%C3%A9e+de+l%26%23039%3Beau</segment>
<subtable>
<row>
<label>Music</label>
- <nb_visits>12</nb_visits>
- <nb_events>14</nb_events>
- <nb_events_with_value>4</nb_events_with_value>
- <sum_event_value>38</sum_event_value>
+ <nb_visits>18</nb_visits>
+ <nb_events>21</nb_events>
+ <nb_events_with_value>6</nb_events_with_value>
+ <sum_event_value>57</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>10</max_event_value>
- <sum_daily_nb_uniq_visitors>12</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>18</sum_daily_nb_uniq_visitors>
<avg_event_value>9.5</avg_event_value>
</row>
</subtable>
</row>
<row>
<label>Event Name not defined</label>
- <nb_visits>7</nb_visits>
- <nb_events>7</nb_events>
+ <nb_visits>10</nb_visits>
+ <nb_events>10</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>5</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>7</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
<subtable>
<row>
<label>Movie</label>
- <nb_visits>6</nb_visits>
- <nb_events>6</nb_events>
+ <nb_visits>9</nb_visits>
+ <nb_events>9</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>4</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>6</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
<row>
@@ -87,100 +87,100 @@
</row>
<row>
<label>event name Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long ---&gt; SHOULD APPEAR IN TEST OUTPUT NOT TRUNCATED &lt;---</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
- <nb_events_with_value>2</nb_events_with_value>
- <sum_event_value>19.32</sum_event_value>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
+ <nb_events_with_value>3</nb_events_with_value>
+ <sum_event_value>28.98</sum_event_value>
<min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>9.66</avg_event_value>
<segment>eventName==event+name+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+---%26gt%3B+SHOULD+APPEAR+IN+TEST+OUTPUT+NOT+TRUNCATED+%26lt%3B---</segment>
<subtable>
<row>
<label>event category Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long ---&gt; SHOULD APPEAR IN TEST OUTPUT NOT TRUNCATED &lt;---</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
- <nb_events_with_value>2</nb_events_with_value>
- <sum_event_value>19.32</sum_event_value>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
+ <nb_events_with_value>3</nb_events_with_value>
+ <sum_event_value>28.98</sum_event_value>
<min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>9.66</avg_event_value>
</row>
</subtable>
</row>
<row>
<label>Ponyo (崖の上のポニョ)</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
<segment>eventName==Ponyo+%28%E5%B4%96%E3%81%AE%E4%B8%8A%E3%81%AE%E3%83%9D%E3%83%8B%E3%83%A7%29</segment>
<subtable>
<row>
<label>Movie</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
</subtable>
</row>
<row>
<label>Princess Mononoke (もののけ姫)</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
<segment>eventName==Princess+Mononoke+%28%E3%82%82%E3%81%AE%E3%81%AE%E3%81%91%E5%A7%AB%29</segment>
<subtable>
<row>
<label>Movie</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
</subtable>
</row>
<row>
<label>Search query here</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
<segment>eventName==Search+query+here</segment>
<subtable>
<row>
<label>Movie</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
</subtable>
diff --git a/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventName__Events.getAction_month.xml b/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventName__Events.getAction_month.xml
index f60a44a673..07715b1b6f 100644
--- a/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventName__Events.getAction_month.xml
+++ b/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventName__Events.getAction_month.xml
@@ -2,365 +2,365 @@
<result>
<row>
<label>playTrailer</label>
- <nb_visits>6</nb_visits>
- <nb_events>6</nb_events>
+ <nb_visits>9</nb_visits>
+ <nb_events>9</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>6</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>9</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
<segment>eventAction==playTrailer</segment>
<subtable>
<row>
<label>Ponyo (崖の上のポニョ)</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
<row>
<label>Princess Mononoke (もののけ姫)</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
<row>
<label>Spirited Away (千と千尋の神隠し)</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
</subtable>
</row>
<row>
<label>Search</label>
- <nb_visits>6</nb_visits>
- <nb_events>6</nb_events>
+ <nb_visits>9</nb_visits>
+ <nb_events>9</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>4</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>6</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
<segment>eventAction==Search</segment>
<subtable>
<row>
<label>Search query here</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
</subtable>
</row>
<row>
<label>play25%</label>
- <nb_visits>4</nb_visits>
- <nb_events>4</nb_events>
+ <nb_visits>6</nb_visits>
+ <nb_events>6</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>4</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>6</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
<segment>eventAction==play25%25</segment>
<subtable>
<row>
<label>La fiancée de l'eau</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
<row>
<label>Spirited Away (千と千尋の神隠し)</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
</subtable>
</row>
<row>
<label>play50%</label>
- <nb_visits>4</nb_visits>
- <nb_events>4</nb_events>
+ <nb_visits>6</nb_visits>
+ <nb_events>6</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>4</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>6</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
<segment>eventAction==play50%25</segment>
<subtable>
<row>
<label>La fiancée de l'eau</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
<row>
<label>Spirited Away (千と千尋の神隠し)</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
</subtable>
</row>
<row>
<label>play75%</label>
- <nb_visits>4</nb_visits>
- <nb_events>4</nb_events>
+ <nb_visits>6</nb_visits>
+ <nb_events>6</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>4</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>6</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
<segment>eventAction==play75%25</segment>
<subtable>
<row>
<label>La fiancée de l'eau</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
<row>
<label>Spirited Away (千と千尋の神隠し)</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
</subtable>
</row>
<row>
<label>playEnd</label>
- <nb_visits>4</nb_visits>
- <nb_events>4</nb_events>
+ <nb_visits>6</nb_visits>
+ <nb_events>6</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>4</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>6</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
<segment>eventAction==playEnd</segment>
<subtable>
<row>
<label>La fiancée de l'eau</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
<row>
<label>Spirited Away (千と千尋の神隠し)</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
</subtable>
</row>
<row>
<label>rating</label>
- <nb_visits>4</nb_visits>
- <nb_events>6</nb_events>
- <nb_events_with_value>6</nb_events_with_value>
- <sum_event_value>57.32</sum_event_value>
+ <nb_visits>6</nb_visits>
+ <nb_events>9</nb_events>
+ <nb_events_with_value>9</nb_events_with_value>
+ <sum_event_value>85.98</sum_event_value>
<min_event_value>9</min_event_value>
<max_event_value>10</max_event_value>
- <sum_daily_nb_uniq_visitors>4</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>6</sum_daily_nb_uniq_visitors>
<avg_event_value>9.55</avg_event_value>
<segment>eventAction==rating</segment>
<subtable>
<row>
<label>La fiancée de l'eau</label>
- <nb_visits>2</nb_visits>
- <nb_events>4</nb_events>
- <nb_events_with_value>4</nb_events_with_value>
- <sum_event_value>38</sum_event_value>
+ <nb_visits>3</nb_visits>
+ <nb_events>6</nb_events>
+ <nb_events_with_value>6</nb_events_with_value>
+ <sum_event_value>57</sum_event_value>
<min_event_value>9</min_event_value>
<max_event_value>10</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>9.5</avg_event_value>
</row>
<row>
<label>Spirited Away (千と千尋の神隠し)</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
- <nb_events_with_value>2</nb_events_with_value>
- <sum_event_value>19.32</sum_event_value>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
+ <nb_events_with_value>3</nb_events_with_value>
+ <sum_event_value>28.98</sum_event_value>
<min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>9.66</avg_event_value>
</row>
</subtable>
</row>
<row>
<label>clickBuyNow</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
<segment>eventAction==clickBuyNow</segment>
<subtable>
<row>
<label>Spirited Away (千と千尋の神隠し)</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
</subtable>
</row>
<row>
<label>event action Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long ---&gt; SHOULD APPEAR IN TEST OUTPUT NOT TRUNCATED &lt;---</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
- <nb_events_with_value>2</nb_events_with_value>
- <sum_event_value>19.32</sum_event_value>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
+ <nb_events_with_value>3</nb_events_with_value>
+ <sum_event_value>28.98</sum_event_value>
<min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>9.66</avg_event_value>
<segment>eventAction==event+action+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+---%26gt%3B+SHOULD+APPEAR+IN+TEST+OUTPUT+NOT+TRUNCATED+%26lt%3B---</segment>
<subtable>
<row>
<label>event name Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long ---&gt; SHOULD APPEAR IN TEST OUTPUT NOT TRUNCATED &lt;---</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
- <nb_events_with_value>2</nb_events_with_value>
- <sum_event_value>19.32</sum_event_value>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
+ <nb_events_with_value>3</nb_events_with_value>
+ <sum_event_value>28.98</sum_event_value>
<min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>9.66</avg_event_value>
</row>
</subtable>
</row>
<row>
<label>play</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
<segment>eventAction==play</segment>
<subtable>
<row>
<label>La fiancée de l'eau</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
</subtable>
</row>
<row>
<label>playStart</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
<segment>eventAction==playStart</segment>
<subtable>
<row>
<label>Spirited Away (千と千尋の神隠し)</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
</subtable>
</row>
<row>
<label>Purchase</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
<segment>eventAction==Purchase</segment>
</row>
diff --git a/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventName__Events.getCategory_month.xml b/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventName__Events.getCategory_month.xml
index 5f3a8a5f0c..e74fe076fd 100644
--- a/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventName__Events.getCategory_month.xml
+++ b/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventName__Events.getCategory_month.xml
@@ -2,108 +2,108 @@
<result>
<row>
<label>Movie</label>
- <nb_visits>28</nb_visits>
- <nb_events>28</nb_events>
- <nb_events_with_value>2</nb_events_with_value>
- <sum_event_value>19.32</sum_event_value>
+ <nb_visits>42</nb_visits>
+ <nb_events>42</nb_events>
+ <nb_events_with_value>3</nb_events_with_value>
+ <sum_event_value>28.98</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>9.66</max_event_value>
- <sum_daily_nb_uniq_visitors>26</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>39</sum_daily_nb_uniq_visitors>
<avg_event_value>9.66</avg_event_value>
<segment>eventCategory==Movie</segment>
<subtable>
<row>
<label>Spirited Away (千と千尋の神隠し)</label>
- <nb_visits>16</nb_visits>
- <nb_events>16</nb_events>
- <nb_events_with_value>2</nb_events_with_value>
- <sum_event_value>19.32</sum_event_value>
+ <nb_visits>24</nb_visits>
+ <nb_events>24</nb_events>
+ <nb_events_with_value>3</nb_events_with_value>
+ <sum_event_value>28.98</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>9.66</max_event_value>
- <sum_daily_nb_uniq_visitors>16</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>24</sum_daily_nb_uniq_visitors>
<avg_event_value>9.66</avg_event_value>
</row>
<row>
<label>Ponyo (崖の上のポニョ)</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
<row>
<label>Princess Mononoke (もののけ姫)</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
<row>
<label>Search query here</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
</subtable>
</row>
<row>
<label>Music</label>
- <nb_visits>12</nb_visits>
- <nb_events>14</nb_events>
- <nb_events_with_value>4</nb_events_with_value>
- <sum_event_value>38</sum_event_value>
+ <nb_visits>18</nb_visits>
+ <nb_events>21</nb_events>
+ <nb_events_with_value>6</nb_events_with_value>
+ <sum_event_value>57</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>10</max_event_value>
- <sum_daily_nb_uniq_visitors>12</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>18</sum_daily_nb_uniq_visitors>
<avg_event_value>9.5</avg_event_value>
<segment>eventCategory==Music</segment>
<subtable>
<row>
<label>La fiancée de l'eau</label>
- <nb_visits>12</nb_visits>
- <nb_events>14</nb_events>
- <nb_events_with_value>4</nb_events_with_value>
- <sum_event_value>38</sum_event_value>
+ <nb_visits>18</nb_visits>
+ <nb_events>21</nb_events>
+ <nb_events_with_value>6</nb_events_with_value>
+ <sum_event_value>57</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>10</max_event_value>
- <sum_daily_nb_uniq_visitors>12</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>18</sum_daily_nb_uniq_visitors>
<avg_event_value>9.5</avg_event_value>
</row>
</subtable>
</row>
<row>
<label>event category Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long ---&gt; SHOULD APPEAR IN TEST OUTPUT NOT TRUNCATED &lt;---</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
- <nb_events_with_value>2</nb_events_with_value>
- <sum_event_value>19.32</sum_event_value>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
+ <nb_events_with_value>3</nb_events_with_value>
+ <sum_event_value>28.98</sum_event_value>
<min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>9.66</avg_event_value>
<segment>eventCategory==event+category+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+---%26gt%3B+SHOULD+APPEAR+IN+TEST+OUTPUT+NOT+TRUNCATED+%26lt%3B---</segment>
<subtable>
<row>
<label>event name Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long ---&gt; SHOULD APPEAR IN TEST OUTPUT NOT TRUNCATED &lt;---</label>
- <nb_visits>2</nb_visits>
- <nb_events>2</nb_events>
- <nb_events_with_value>2</nb_events_with_value>
- <sum_event_value>19.32</sum_event_value>
+ <nb_visits>3</nb_visits>
+ <nb_events>3</nb_events>
+ <nb_events_with_value>3</nb_events_with_value>
+ <sum_event_value>28.98</sum_event_value>
<min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
<avg_event_value>9.66</avg_event_value>
</row>
</subtable>
diff --git a/tests/PHPUnit/System/expected/test_ImportLogs__CorePluginsAdmin.getSystemSettings.xml b/tests/PHPUnit/System/expected/test_ImportLogs__CorePluginsAdmin.getSystemSettings.xml
index b4d4316097..7f6c3671eb 100644
--- a/tests/PHPUnit/System/expected/test_ImportLogs__CorePluginsAdmin.getSystemSettings.xml
+++ b/tests/PHPUnit/System/expected/test_ImportLogs__CorePluginsAdmin.getSystemSettings.xml
@@ -27,8 +27,8 @@
<row>
<name>enable_plugin_update_communication</name>
<title />
- <value>0</value>
- <defaultValue>0</defaultValue>
+ <value>1</value>
+ <defaultValue>1</defaultValue>
<type>boolean</type>
<uiControl>radio</uiControl>
<uiControlAttributes>
diff --git a/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits__CorePluginsAdmin.getSystemSettings.xml b/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits__CorePluginsAdmin.getSystemSettings.xml
index b4d4316097..7f6c3671eb 100644
--- a/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits__CorePluginsAdmin.getSystemSettings.xml
+++ b/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits__CorePluginsAdmin.getSystemSettings.xml
@@ -27,8 +27,8 @@
<row>
<name>enable_plugin_update_communication</name>
<title />
- <value>0</value>
- <defaultValue>0</defaultValue>
+ <value>1</value>
+ <defaultValue>1</defaultValue>
<type>boolean</type>
<uiControl>radio</uiControl>
<uiControlAttributes>
diff --git a/tests/PHPUnit/System/expected/test_apiGetReportMetadata__API.getReportPagesMetadata.xml b/tests/PHPUnit/System/expected/test_apiGetReportMetadata__API.getReportPagesMetadata.xml
index 61fc256ebc..2cbc2807d4 100644
--- a/tests/PHPUnit/System/expected/test_apiGetReportMetadata__API.getReportPagesMetadata.xml
+++ b/tests/PHPUnit/System/expected/test_apiGetReportMetadata__API.getReportPagesMetadata.xml
@@ -24,6 +24,7 @@
<action>getDownloads</action>
</parameters>
<uniqueId>widgetActionsgetDownloads</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -53,6 +54,7 @@
<action>getEntryPageUrls</action>
</parameters>
<uniqueId>widgetActionsgetEntryPageUrls</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -66,6 +68,7 @@
<action>getEntryPageTitles</action>
</parameters>
<uniqueId>widgetActionsgetEntryPageTitles</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -95,6 +98,7 @@
<action>getExitPageUrls</action>
</parameters>
<uniqueId>widgetActionsgetExitPageUrls</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -108,6 +112,7 @@
<action>getExitPageTitles</action>
</parameters>
<uniqueId>widgetActionsgetExitPageTitles</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -137,6 +142,7 @@
<action>getOutlinks</action>
</parameters>
<uniqueId>widgetActionsgetOutlinks</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -166,6 +172,7 @@
<action>getPageUrls</action>
</parameters>
<uniqueId>widgetActionsgetPageUrls</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -195,6 +202,7 @@
<action>getPageTitles</action>
</parameters>
<uniqueId>widgetActionsgetPageTitles</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -224,6 +232,7 @@
<action>getSiteSearchKeywords</action>
</parameters>
<uniqueId>widgetActionsgetSiteSearchKeywords</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -237,6 +246,7 @@
<action>getPageUrlsFollowingSiteSearch</action>
</parameters>
<uniqueId>widgetActionsgetPageUrlsFollowingSiteSearch</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -250,6 +260,7 @@
<action>getSiteSearchNoResultKeywords</action>
</parameters>
<uniqueId>widgetActionsgetSiteSearchNoResultKeywords</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -263,6 +274,7 @@
<action>getPageTitlesFollowingSiteSearch</action>
</parameters>
<uniqueId>widgetActionsgetPageTitlesFollowingSiteSearch</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -276,6 +288,7 @@
<action>getSiteSearchCategories</action>
</parameters>
<uniqueId>widgetActionsgetSiteSearchCategories</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -306,6 +319,7 @@
<containerId>Events</containerId>
</parameters>
<uniqueId>widgetEvents</uniqueId>
+ <isWide>0</isWide>
<layout>ByDimension</layout>
<isContainer>1</isContainer>
<widgets>
@@ -331,6 +345,7 @@
<secondaryDimension>eventAction</secondaryDimension>
</parameters>
<uniqueId>widgetEventsgetCategorysecondaryDimensioneventAction</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -356,6 +371,7 @@
<secondaryDimension>eventName</secondaryDimension>
</parameters>
<uniqueId>widgetEventsgetActionsecondaryDimensioneventName</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -381,6 +397,7 @@
<secondaryDimension>eventAction</secondaryDimension>
</parameters>
<uniqueId>widgetEventsgetNamesecondaryDimensioneventAction</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -413,6 +430,7 @@
<containerId>Contents</containerId>
</parameters>
<uniqueId>widgetContents</uniqueId>
+ <isWide>0</isWide>
<layout>ByDimension</layout>
<isContainer>1</isContainer>
<widgets>
@@ -437,6 +455,7 @@
<action>getContentNames</action>
</parameters>
<uniqueId>widgetContentsgetContentNames</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -461,6 +480,7 @@
<action>getContentPieces</action>
</parameters>
<uniqueId>widgetContentsgetContentPieces</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -492,6 +512,7 @@
<action>getType</action>
</parameters>
<uniqueId>widgetDevicesDetectiongetType</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -505,6 +526,7 @@
<action>getModel</action>
</parameters>
<uniqueId>widgetDevicesDetectiongetModel</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -518,6 +540,7 @@
<action>getBrand</action>
</parameters>
<uniqueId>widgetDevicesDetectiongetBrand</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -531,6 +554,7 @@
<action>getResolution</action>
</parameters>
<uniqueId>widgetResolutiongetResolution</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -560,6 +584,7 @@
<action>getNumberOfVisitsPerVisitDuration</action>
</parameters>
<uniqueId>widgetVisitorInterestgetNumberOfVisitsPerVisitDuration</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>cloud</viewDataTable>
<isReport>1</isReport>
</row>
@@ -573,6 +598,7 @@
<action>getNumberOfVisitsPerPage</action>
</parameters>
<uniqueId>widgetVisitorInterestgetNumberOfVisitsPerPage</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>cloud</viewDataTable>
<isReport>1</isReport>
</row>
@@ -586,6 +612,7 @@
<action>getNumberOfVisitsByVisitCount</action>
</parameters>
<uniqueId>widgetVisitorInterestgetNumberOfVisitsByVisitCount</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -599,6 +626,7 @@
<action>getNumberOfVisitsByDaysSinceLast</action>
</parameters>
<uniqueId>widgetVisitorInterestgetNumberOfVisitsByDaysSinceLast</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -614,6 +642,7 @@
<action>getEvolutionGraph</action>
</parameters>
<uniqueId>widgetVisitFrequencygetEvolutionGraphforceView1viewDataTablegraphEvolution</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>graphEvolution</viewDataTable>
<isReport>1</isReport>
</row>
@@ -629,6 +658,7 @@
<action>get</action>
</parameters>
<uniqueId>widgetVisitFrequencygetforceView1viewDataTablesparklines</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>sparklines</viewDataTable>
<isReport>1</isReport>
</row>
@@ -658,6 +688,7 @@
<action>getOsVersions</action>
</parameters>
<uniqueId>widgetDevicesDetectiongetOsVersions</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -671,6 +702,7 @@
<action>getBrowsers</action>
</parameters>
<uniqueId>widgetDevicesDetectiongetBrowsers</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -684,6 +716,7 @@
<action>getBrowserVersions</action>
</parameters>
<uniqueId>widgetDevicesDetectiongetBrowserVersions</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -697,6 +730,7 @@
<action>getConfiguration</action>
</parameters>
<uniqueId>widgetResolutiongetConfiguration</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -710,6 +744,7 @@
<action>getOsFamilies</action>
</parameters>
<uniqueId>widgetDevicesDetectiongetOsFamilies</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -723,6 +758,7 @@
<action>getBrowserEngines</action>
</parameters>
<uniqueId>widgetDevicesDetectiongetBrowserEngines</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>graphPie</viewDataTable>
<isReport>1</isReport>
</row>
@@ -736,6 +772,7 @@
<action>getPlugin</action>
</parameters>
<uniqueId>widgetDevicePluginsgetPlugin</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -767,6 +804,7 @@
<action>getEvolutionGraph</action>
</parameters>
<uniqueId>widgetVisitsSummarygetEvolutionGraphforceView1viewDataTablegraphEvolution</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>graphEvolution</viewDataTable>
<isReport>1</isReport>
</row>
@@ -782,6 +820,7 @@
<action>get</action>
</parameters>
<uniqueId>widgetVisitsSummarygetforceView1viewDataTablesparklines</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>sparklines</viewDataTable>
<isReport>1</isReport>
</row>
@@ -811,6 +850,7 @@
<action>visitorMap</action>
</parameters>
<uniqueId>widgetUserCountryMapvisitorMap</uniqueId>
+ <isWide>0</isWide>
</row>
<row>
<name>Country</name>
@@ -822,6 +862,7 @@
<action>getCountry</action>
</parameters>
<uniqueId>widgetUserCountrygetCountry</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -836,6 +877,7 @@
<containerId>Continent</containerId>
</parameters>
<uniqueId>widgetContinent</uniqueId>
+ <isWide>0</isWide>
<layout />
<isContainer>1</isContainer>
<widgets>
@@ -860,6 +902,7 @@
<action>getContinent</action>
</parameters>
<uniqueId>widgetUserCountrygetContinent</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -884,6 +927,7 @@
<action>getDistinctCountries</action>
</parameters>
<uniqueId>widgetUserCountrygetDistinctCountries</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -899,6 +943,7 @@
<action>getRegion</action>
</parameters>
<uniqueId>widgetUserCountrygetRegion</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -912,6 +957,7 @@
<action>getLanguage</action>
</parameters>
<uniqueId>widgetUserLanguagegetLanguage</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -925,6 +971,7 @@
<action>getCity</action>
</parameters>
<uniqueId>widgetUserCountrygetCity</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -938,6 +985,7 @@
<action>getLanguageCode</action>
</parameters>
<uniqueId>widgetUserLanguagegetLanguageCode</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -967,6 +1015,7 @@
<action>getVisitInformationPerLocalTime</action>
</parameters>
<uniqueId>widgetVisitTimegetVisitInformationPerLocalTime</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>graphVerticalBar</viewDataTable>
<isReport>1</isReport>
</row>
@@ -980,6 +1029,7 @@
<action>getVisitInformationPerServerTime</action>
</parameters>
<uniqueId>widgetVisitTimegetVisitInformationPerServerTime</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>graphVerticalBar</viewDataTable>
<isReport>1</isReport>
</row>
@@ -993,6 +1043,7 @@
<action>getByDayOfWeek</action>
</parameters>
<uniqueId>widgetVisitTimegetByDayOfWeek</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>graphVerticalBar</viewDataTable>
<isReport>1</isReport>
</row>
@@ -1022,6 +1073,7 @@
<action>realtimeMap</action>
</parameters>
<uniqueId>widgetUserCountryMaprealtimeMap</uniqueId>
+ <isWide>0</isWide>
</row>
</widgets>
</row>
@@ -1052,6 +1104,7 @@
<small>1</small>
</parameters>
<uniqueId>widgetLivegetLastVisitsDetailsforceView1viewDataTableVisitorLogsmall1</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>VisitorLog</viewDataTable>
<isReport>1</isReport>
</row>
@@ -1081,6 +1134,7 @@
<action>getCustomVariables</action>
</parameters>
<uniqueId>widgetCustomVariablesgetCustomVariables</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -1110,6 +1164,7 @@
<action>getUsers</action>
</parameters>
<uniqueId>widgetUserIdgetUsers</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -1140,6 +1195,7 @@
<idDashboard>1</idDashboard>
</parameters>
<uniqueId>widgetDashboardembeddedIndexidDashboard1</uniqueId>
+ <isWide>0</isWide>
</row>
</widgets>
</row>
@@ -1167,6 +1223,7 @@
<action>getReferrerType</action>
</parameters>
<uniqueId>widgetReferrersgetReferrerType</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>tableAllColumns</viewDataTable>
<isReport>1</isReport>
</row>
@@ -1180,6 +1237,7 @@
<action>getAll</action>
</parameters>
<uniqueId>widgetReferrersgetAll</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>tableAllColumns</viewDataTable>
<isReport>1</isReport>
</row>
@@ -1209,6 +1267,7 @@
<action>getCampaigns</action>
</parameters>
<uniqueId>widgetReferrersgetCampaigns</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -1232,7 +1291,7 @@
<name>Evolution over the period</name>
<module>Referrers</module>
<action>getEvolutionGraph</action>
- <order>101</order>
+ <order>9</order>
<parameters>
<forceView>1</forceView>
<viewDataTable>graphEvolution</viewDataTable>
@@ -1243,6 +1302,7 @@
</columns>
</parameters>
<uniqueId>widgetReferrersgetEvolutionGraphforceView1viewDataTablegraphEvolutioncolumnsArray</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>graphEvolution</viewDataTable>
<isReport>1</isReport>
</row>
@@ -1258,6 +1318,7 @@
<action>getSparklines</action>
</parameters>
<uniqueId>widgetReferrersgetSparklinesforceView1viewDataTablesparklines</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>sparklines</viewDataTable>
<isReport>1</isReport>
</row>
@@ -1287,6 +1348,7 @@
<action>getKeywords</action>
</parameters>
<uniqueId>widgetReferrersgetKeywords</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -1300,6 +1362,7 @@
<action>getSearchEngines</action>
</parameters>
<uniqueId>widgetReferrersgetSearchEngines</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -1329,6 +1392,7 @@
<action>getWebsites</action>
</parameters>
<uniqueId>widgetReferrersgetWebsites</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -1342,6 +1406,7 @@
<action>getSocials</action>
</parameters>
<uniqueId>widgetReferrersgetSocials</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>graphPie</viewDataTable>
<isReport>1</isReport>
</row>
@@ -1372,6 +1437,7 @@
<containerId>Goal_1</containerId>
</parameters>
<uniqueId>widgetGoal_1</uniqueId>
+ <isWide>0</isWide>
<layout />
<isContainer>1</isContainer>
<widgets>
@@ -1399,6 +1465,7 @@
<idGoal>1</idGoal>
</parameters>
<uniqueId>widgetGoalsgetEvolutionGraphforceView1viewDataTablegraphEvolutionidGoal1</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>graphEvolution</viewDataTable>
<isReport>1</isReport>
</row>
@@ -1427,6 +1494,7 @@
<allow_multiple>1</allow_multiple>
</parameters>
<uniqueId>widgetGoalsgetforceView1viewDataTablesparklinesidGoal1allow_multiple1</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>sparklines</viewDataTable>
<isReport>1</isReport>
</row>
@@ -1452,6 +1520,7 @@
<idGoal>1</idGoal>
</parameters>
<uniqueId>widgetGoalsgoalConversionsOverviewidGoal1</uniqueId>
+ <isWide>0</isWide>
<middlewareParameters>
<module>Goals</module>
<action>hasConversions</action>
@@ -1473,6 +1542,7 @@
<containerId>Goals1</containerId>
</parameters>
<uniqueId>widgetGoals1</uniqueId>
+ <isWide>0</isWide>
<middlewareParameters>
<module>Goals</module>
<action>hasConversions</action>
@@ -1506,6 +1576,7 @@
<idGoal>1</idGoal>
</parameters>
<uniqueId>widgetCustomVariablesgetCustomVariablesforceView1viewDataTabletableGoalsdocumentationForGoalsPage1idGoal1</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>tableGoals</viewDataTable>
<isReport>1</isReport>
</row>
@@ -1534,6 +1605,7 @@
<idGoal>1</idGoal>
</parameters>
<uniqueId>widgetVisitTimegetVisitInformationPerServerTimeforceView1viewDataTabletableGoalsdocumentationForGoalsPage1idGoal1</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>tableGoals</viewDataTable>
<isReport>1</isReport>
</row>
@@ -1562,6 +1634,7 @@
<idGoal>1</idGoal>
</parameters>
<uniqueId>widgetDevicesDetectiongetTypeforceView1viewDataTabletableGoalsdocumentationForGoalsPage1idGoal1</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>tableGoals</viewDataTable>
<isReport>1</isReport>
</row>
@@ -1590,6 +1663,7 @@
<idGoal>1</idGoal>
</parameters>
<uniqueId>widgetDevicesDetectiongetModelforceView1viewDataTabletableGoalsdocumentationForGoalsPage1idGoal1</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>tableGoals</viewDataTable>
<isReport>1</isReport>
</row>
@@ -1618,6 +1692,7 @@
<idGoal>1</idGoal>
</parameters>
<uniqueId>widgetDevicesDetectiongetBrandforceView1viewDataTabletableGoalsdocumentationForGoalsPage1idGoal1</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>tableGoals</viewDataTable>
<isReport>1</isReport>
</row>
@@ -1646,6 +1721,7 @@
<idGoal>1</idGoal>
</parameters>
<uniqueId>widgetUserCountrygetCountryforceView1viewDataTabletableGoalsdocumentationForGoalsPage1idGoal1</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>tableGoals</viewDataTable>
<isReport>1</isReport>
</row>
@@ -1674,6 +1750,7 @@
<idGoal>1</idGoal>
</parameters>
<uniqueId>widgetUserCountrygetContinentforceView1viewDataTabletableGoalsdocumentationForGoalsPage1idGoal1</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>tableGoals</viewDataTable>
<isReport>1</isReport>
</row>
@@ -1702,6 +1779,7 @@
<idGoal>1</idGoal>
</parameters>
<uniqueId>widgetUserCountrygetRegionforceView1viewDataTabletableGoalsdocumentationForGoalsPage1idGoal1</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>tableGoals</viewDataTable>
<isReport>1</isReport>
</row>
@@ -1730,6 +1808,7 @@
<idGoal>1</idGoal>
</parameters>
<uniqueId>widgetUserCountrygetCityforceView1viewDataTabletableGoalsdocumentationForGoalsPage1idGoal1</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>tableGoals</viewDataTable>
<isReport>1</isReport>
</row>
@@ -1758,6 +1837,7 @@
<idGoal>1</idGoal>
</parameters>
<uniqueId>widgetReferrersgetReferrerTypeforceView1viewDataTabletableGoalsdocumentationForGoalsPage1idGoal1</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>tableGoals</viewDataTable>
<isReport>1</isReport>
</row>
@@ -1786,6 +1866,7 @@
<idGoal>1</idGoal>
</parameters>
<uniqueId>widgetReferrersgetKeywordsforceView1viewDataTabletableGoalsdocumentationForGoalsPage1idGoal1</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>tableGoals</viewDataTable>
<isReport>1</isReport>
</row>
@@ -1814,6 +1895,7 @@
<idGoal>1</idGoal>
</parameters>
<uniqueId>widgetReferrersgetSearchEnginesforceView1viewDataTabletableGoalsdocumentationForGoalsPage1idGoal1</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>tableGoals</viewDataTable>
<isReport>1</isReport>
</row>
@@ -1842,6 +1924,7 @@
<idGoal>1</idGoal>
</parameters>
<uniqueId>widgetReferrersgetWebsitesforceView1viewDataTabletableGoalsdocumentationForGoalsPage1idGoal1</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>tableGoals</viewDataTable>
<isReport>1</isReport>
</row>
@@ -1870,6 +1953,7 @@
<idGoal>1</idGoal>
</parameters>
<uniqueId>widgetReferrersgetCampaignsforceView1viewDataTabletableGoalsdocumentationForGoalsPage1idGoal1</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>tableGoals</viewDataTable>
<isReport>1</isReport>
</row>
@@ -1898,6 +1982,7 @@
<idGoal>1</idGoal>
</parameters>
<uniqueId>widgetGoalsgetVisitsUntilConversionforceView1viewDataTabletabledocumentationForGoalsPage1idGoal1</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -1926,6 +2011,7 @@
<idGoal>1</idGoal>
</parameters>
<uniqueId>widgetGoalsgetDaysToConversionforceView1viewDataTabletabledocumentationForGoalsPage1idGoal1</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -1958,6 +2044,7 @@
<containerId>Goal_2</containerId>
</parameters>
<uniqueId>widgetGoal_2</uniqueId>
+ <isWide>0</isWide>
<layout />
<isContainer>1</isContainer>
<widgets>
@@ -1985,6 +2072,7 @@
<idGoal>2</idGoal>
</parameters>
<uniqueId>widgetGoalsgetEvolutionGraphforceView1viewDataTablegraphEvolutionidGoal2</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>graphEvolution</viewDataTable>
<isReport>1</isReport>
</row>
@@ -2013,6 +2101,7 @@
<allow_multiple>0</allow_multiple>
</parameters>
<uniqueId>widgetGoalsgetforceView1viewDataTablesparklinesidGoal2allow_multiple0</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>sparklines</viewDataTable>
<isReport>1</isReport>
</row>
@@ -2038,6 +2127,7 @@
<idGoal>2</idGoal>
</parameters>
<uniqueId>widgetGoalsgoalConversionsOverviewidGoal2</uniqueId>
+ <isWide>0</isWide>
<middlewareParameters>
<module>Goals</module>
<action>hasConversions</action>
@@ -2059,6 +2149,7 @@
<containerId>Goals2</containerId>
</parameters>
<uniqueId>widgetGoals2</uniqueId>
+ <isWide>0</isWide>
<middlewareParameters>
<module>Goals</module>
<action>hasConversions</action>
@@ -2092,6 +2183,7 @@
<idGoal>2</idGoal>
</parameters>
<uniqueId>widgetCustomVariablesgetCustomVariablesforceView1viewDataTabletableGoalsdocumentationForGoalsPage1idGoal2</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>tableGoals</viewDataTable>
<isReport>1</isReport>
</row>
@@ -2120,6 +2212,7 @@
<idGoal>2</idGoal>
</parameters>
<uniqueId>widgetVisitTimegetVisitInformationPerServerTimeforceView1viewDataTabletableGoalsdocumentationForGoalsPage1idGoal2</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>tableGoals</viewDataTable>
<isReport>1</isReport>
</row>
@@ -2148,6 +2241,7 @@
<idGoal>2</idGoal>
</parameters>
<uniqueId>widgetDevicesDetectiongetTypeforceView1viewDataTabletableGoalsdocumentationForGoalsPage1idGoal2</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>tableGoals</viewDataTable>
<isReport>1</isReport>
</row>
@@ -2176,6 +2270,7 @@
<idGoal>2</idGoal>
</parameters>
<uniqueId>widgetDevicesDetectiongetModelforceView1viewDataTabletableGoalsdocumentationForGoalsPage1idGoal2</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>tableGoals</viewDataTable>
<isReport>1</isReport>
</row>
@@ -2204,6 +2299,7 @@
<idGoal>2</idGoal>
</parameters>
<uniqueId>widgetDevicesDetectiongetBrandforceView1viewDataTabletableGoalsdocumentationForGoalsPage1idGoal2</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>tableGoals</viewDataTable>
<isReport>1</isReport>
</row>
@@ -2232,6 +2328,7 @@
<idGoal>2</idGoal>
</parameters>
<uniqueId>widgetUserCountrygetCountryforceView1viewDataTabletableGoalsdocumentationForGoalsPage1idGoal2</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>tableGoals</viewDataTable>
<isReport>1</isReport>
</row>
@@ -2260,6 +2357,7 @@
<idGoal>2</idGoal>
</parameters>
<uniqueId>widgetUserCountrygetContinentforceView1viewDataTabletableGoalsdocumentationForGoalsPage1idGoal2</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>tableGoals</viewDataTable>
<isReport>1</isReport>
</row>
@@ -2288,6 +2386,7 @@
<idGoal>2</idGoal>
</parameters>
<uniqueId>widgetUserCountrygetRegionforceView1viewDataTabletableGoalsdocumentationForGoalsPage1idGoal2</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>tableGoals</viewDataTable>
<isReport>1</isReport>
</row>
@@ -2316,6 +2415,7 @@
<idGoal>2</idGoal>
</parameters>
<uniqueId>widgetUserCountrygetCityforceView1viewDataTabletableGoalsdocumentationForGoalsPage1idGoal2</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>tableGoals</viewDataTable>
<isReport>1</isReport>
</row>
@@ -2344,6 +2444,7 @@
<idGoal>2</idGoal>
</parameters>
<uniqueId>widgetReferrersgetReferrerTypeforceView1viewDataTabletableGoalsdocumentationForGoalsPage1idGoal2</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>tableGoals</viewDataTable>
<isReport>1</isReport>
</row>
@@ -2372,6 +2473,7 @@
<idGoal>2</idGoal>
</parameters>
<uniqueId>widgetReferrersgetKeywordsforceView1viewDataTabletableGoalsdocumentationForGoalsPage1idGoal2</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>tableGoals</viewDataTable>
<isReport>1</isReport>
</row>
@@ -2400,6 +2502,7 @@
<idGoal>2</idGoal>
</parameters>
<uniqueId>widgetReferrersgetSearchEnginesforceView1viewDataTabletableGoalsdocumentationForGoalsPage1idGoal2</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>tableGoals</viewDataTable>
<isReport>1</isReport>
</row>
@@ -2428,6 +2531,7 @@
<idGoal>2</idGoal>
</parameters>
<uniqueId>widgetReferrersgetWebsitesforceView1viewDataTabletableGoalsdocumentationForGoalsPage1idGoal2</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>tableGoals</viewDataTable>
<isReport>1</isReport>
</row>
@@ -2456,6 +2560,7 @@
<idGoal>2</idGoal>
</parameters>
<uniqueId>widgetReferrersgetCampaignsforceView1viewDataTabletableGoalsdocumentationForGoalsPage1idGoal2</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>tableGoals</viewDataTable>
<isReport>1</isReport>
</row>
@@ -2484,6 +2589,7 @@
<idGoal>2</idGoal>
</parameters>
<uniqueId>widgetGoalsgetVisitsUntilConversionforceView1viewDataTabletabledocumentationForGoalsPage1idGoal2</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -2512,6 +2618,7 @@
<idGoal>2</idGoal>
</parameters>
<uniqueId>widgetGoalsgetDaysToConversionforceView1viewDataTabletabledocumentationForGoalsPage1idGoal2</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -2544,6 +2651,7 @@
<containerId>Goal_3</containerId>
</parameters>
<uniqueId>widgetGoal_3</uniqueId>
+ <isWide>0</isWide>
<layout />
<isContainer>1</isContainer>
<widgets>
@@ -2571,6 +2679,7 @@
<idGoal>3</idGoal>
</parameters>
<uniqueId>widgetGoalsgetEvolutionGraphforceView1viewDataTablegraphEvolutionidGoal3</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>graphEvolution</viewDataTable>
<isReport>1</isReport>
</row>
@@ -2599,6 +2708,7 @@
<allow_multiple>0</allow_multiple>
</parameters>
<uniqueId>widgetGoalsgetforceView1viewDataTablesparklinesidGoal3allow_multiple0</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>sparklines</viewDataTable>
<isReport>1</isReport>
</row>
@@ -2624,6 +2734,7 @@
<idGoal>3</idGoal>
</parameters>
<uniqueId>widgetGoalsgoalConversionsOverviewidGoal3</uniqueId>
+ <isWide>0</isWide>
<middlewareParameters>
<module>Goals</module>
<action>hasConversions</action>
@@ -2645,6 +2756,7 @@
<containerId>Goals3</containerId>
</parameters>
<uniqueId>widgetGoals3</uniqueId>
+ <isWide>0</isWide>
<middlewareParameters>
<module>Goals</module>
<action>hasConversions</action>
@@ -2678,6 +2790,7 @@
<idGoal>3</idGoal>
</parameters>
<uniqueId>widgetCustomVariablesgetCustomVariablesforceView1viewDataTabletableGoalsdocumentationForGoalsPage1idGoal3</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>tableGoals</viewDataTable>
<isReport>1</isReport>
</row>
@@ -2706,6 +2819,7 @@
<idGoal>3</idGoal>
</parameters>
<uniqueId>widgetVisitTimegetVisitInformationPerServerTimeforceView1viewDataTabletableGoalsdocumentationForGoalsPage1idGoal3</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>tableGoals</viewDataTable>
<isReport>1</isReport>
</row>
@@ -2734,6 +2848,7 @@
<idGoal>3</idGoal>
</parameters>
<uniqueId>widgetDevicesDetectiongetTypeforceView1viewDataTabletableGoalsdocumentationForGoalsPage1idGoal3</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>tableGoals</viewDataTable>
<isReport>1</isReport>
</row>
@@ -2762,6 +2877,7 @@
<idGoal>3</idGoal>
</parameters>
<uniqueId>widgetDevicesDetectiongetModelforceView1viewDataTabletableGoalsdocumentationForGoalsPage1idGoal3</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>tableGoals</viewDataTable>
<isReport>1</isReport>
</row>
@@ -2790,6 +2906,7 @@
<idGoal>3</idGoal>
</parameters>
<uniqueId>widgetDevicesDetectiongetBrandforceView1viewDataTabletableGoalsdocumentationForGoalsPage1idGoal3</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>tableGoals</viewDataTable>
<isReport>1</isReport>
</row>
@@ -2818,6 +2935,7 @@
<idGoal>3</idGoal>
</parameters>
<uniqueId>widgetUserCountrygetCountryforceView1viewDataTabletableGoalsdocumentationForGoalsPage1idGoal3</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>tableGoals</viewDataTable>
<isReport>1</isReport>
</row>
@@ -2846,6 +2964,7 @@
<idGoal>3</idGoal>
</parameters>
<uniqueId>widgetUserCountrygetContinentforceView1viewDataTabletableGoalsdocumentationForGoalsPage1idGoal3</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>tableGoals</viewDataTable>
<isReport>1</isReport>
</row>
@@ -2874,6 +2993,7 @@
<idGoal>3</idGoal>
</parameters>
<uniqueId>widgetUserCountrygetRegionforceView1viewDataTabletableGoalsdocumentationForGoalsPage1idGoal3</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>tableGoals</viewDataTable>
<isReport>1</isReport>
</row>
@@ -2902,6 +3022,7 @@
<idGoal>3</idGoal>
</parameters>
<uniqueId>widgetUserCountrygetCityforceView1viewDataTabletableGoalsdocumentationForGoalsPage1idGoal3</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>tableGoals</viewDataTable>
<isReport>1</isReport>
</row>
@@ -2930,6 +3051,7 @@
<idGoal>3</idGoal>
</parameters>
<uniqueId>widgetReferrersgetReferrerTypeforceView1viewDataTabletableGoalsdocumentationForGoalsPage1idGoal3</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>tableGoals</viewDataTable>
<isReport>1</isReport>
</row>
@@ -2958,6 +3080,7 @@
<idGoal>3</idGoal>
</parameters>
<uniqueId>widgetReferrersgetKeywordsforceView1viewDataTabletableGoalsdocumentationForGoalsPage1idGoal3</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>tableGoals</viewDataTable>
<isReport>1</isReport>
</row>
@@ -2986,6 +3109,7 @@
<idGoal>3</idGoal>
</parameters>
<uniqueId>widgetReferrersgetSearchEnginesforceView1viewDataTabletableGoalsdocumentationForGoalsPage1idGoal3</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>tableGoals</viewDataTable>
<isReport>1</isReport>
</row>
@@ -3014,6 +3138,7 @@
<idGoal>3</idGoal>
</parameters>
<uniqueId>widgetReferrersgetWebsitesforceView1viewDataTabletableGoalsdocumentationForGoalsPage1idGoal3</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>tableGoals</viewDataTable>
<isReport>1</isReport>
</row>
@@ -3042,6 +3167,7 @@
<idGoal>3</idGoal>
</parameters>
<uniqueId>widgetReferrersgetCampaignsforceView1viewDataTabletableGoalsdocumentationForGoalsPage1idGoal3</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>tableGoals</viewDataTable>
<isReport>1</isReport>
</row>
@@ -3070,6 +3196,7 @@
<idGoal>3</idGoal>
</parameters>
<uniqueId>widgetGoalsgetVisitsUntilConversionforceView1viewDataTabletabledocumentationForGoalsPage1idGoal3</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -3098,6 +3225,7 @@
<idGoal>3</idGoal>
</parameters>
<uniqueId>widgetGoalsgetDaysToConversionforceView1viewDataTabletabledocumentationForGoalsPage1idGoal3</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -3130,6 +3258,7 @@
<containerId>GoalsOverview</containerId>
</parameters>
<uniqueId>widgetGoalsOverview</uniqueId>
+ <isWide>0</isWide>
<layout />
<isContainer>1</isContainer>
<widgets>
@@ -3156,6 +3285,7 @@
<action>getEvolutionGraph</action>
</parameters>
<uniqueId>widgetGoalsgetEvolutionGraphforceView1viewDataTablegraphEvolution</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>graphEvolution</viewDataTable>
<isReport>1</isReport>
</row>
@@ -3182,6 +3312,7 @@
<action>get</action>
</parameters>
<uniqueId>widgetGoalsgetforceView1viewDataTablesparklines</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>sparklines</viewDataTable>
<isReport>1</isReport>
</row>
@@ -3211,6 +3342,7 @@
<only_summary>1</only_summary>
</parameters>
<uniqueId>widgetGoalsgetforceView1viewDataTablesparklinesidGoal1allow_multiple1only_summary1</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>sparklines</viewDataTable>
<isReport>1</isReport>
</row>
@@ -3240,6 +3372,7 @@
<only_summary>1</only_summary>
</parameters>
<uniqueId>widgetGoalsgetforceView1viewDataTablesparklinesidGoal2allow_multiple0only_summary1</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>sparklines</viewDataTable>
<isReport>1</isReport>
</row>
@@ -3269,6 +3402,7 @@
<only_summary>1</only_summary>
</parameters>
<uniqueId>widgetGoalsgetforceView1viewDataTablesparklinesidGoal3allow_multiple0only_summary1</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>sparklines</viewDataTable>
<isReport>1</isReport>
</row>
@@ -3285,6 +3419,7 @@
<containerId>Goals</containerId>
</parameters>
<uniqueId>widgetGoals</uniqueId>
+ <isWide>0</isWide>
<middlewareParameters>
<module>Goals</module>
<action>hasConversions</action>
@@ -3317,6 +3452,7 @@
<idGoal>0</idGoal>
</parameters>
<uniqueId>widgetCustomVariablesgetCustomVariablesforceView1viewDataTabletableGoalsdocumentationForGoalsPage1idGoal0</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>tableGoals</viewDataTable>
<isReport>1</isReport>
</row>
@@ -3345,6 +3481,7 @@
<idGoal>0</idGoal>
</parameters>
<uniqueId>widgetVisitTimegetVisitInformationPerServerTimeforceView1viewDataTabletableGoalsdocumentationForGoalsPage1idGoal0</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>tableGoals</viewDataTable>
<isReport>1</isReport>
</row>
@@ -3373,6 +3510,7 @@
<idGoal>0</idGoal>
</parameters>
<uniqueId>widgetDevicesDetectiongetTypeforceView1viewDataTabletableGoalsdocumentationForGoalsPage1idGoal0</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>tableGoals</viewDataTable>
<isReport>1</isReport>
</row>
@@ -3401,6 +3539,7 @@
<idGoal>0</idGoal>
</parameters>
<uniqueId>widgetDevicesDetectiongetModelforceView1viewDataTabletableGoalsdocumentationForGoalsPage1idGoal0</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>tableGoals</viewDataTable>
<isReport>1</isReport>
</row>
@@ -3429,6 +3568,7 @@
<idGoal>0</idGoal>
</parameters>
<uniqueId>widgetDevicesDetectiongetBrandforceView1viewDataTabletableGoalsdocumentationForGoalsPage1idGoal0</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>tableGoals</viewDataTable>
<isReport>1</isReport>
</row>
@@ -3457,6 +3597,7 @@
<idGoal>0</idGoal>
</parameters>
<uniqueId>widgetUserCountrygetCountryforceView1viewDataTabletableGoalsdocumentationForGoalsPage1idGoal0</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>tableGoals</viewDataTable>
<isReport>1</isReport>
</row>
@@ -3485,6 +3626,7 @@
<idGoal>0</idGoal>
</parameters>
<uniqueId>widgetUserCountrygetContinentforceView1viewDataTabletableGoalsdocumentationForGoalsPage1idGoal0</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>tableGoals</viewDataTable>
<isReport>1</isReport>
</row>
@@ -3513,6 +3655,7 @@
<idGoal>0</idGoal>
</parameters>
<uniqueId>widgetUserCountrygetRegionforceView1viewDataTabletableGoalsdocumentationForGoalsPage1idGoal0</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>tableGoals</viewDataTable>
<isReport>1</isReport>
</row>
@@ -3541,6 +3684,7 @@
<idGoal>0</idGoal>
</parameters>
<uniqueId>widgetUserCountrygetCityforceView1viewDataTabletableGoalsdocumentationForGoalsPage1idGoal0</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>tableGoals</viewDataTable>
<isReport>1</isReport>
</row>
@@ -3569,6 +3713,7 @@
<idGoal>0</idGoal>
</parameters>
<uniqueId>widgetReferrersgetReferrerTypeforceView1viewDataTabletableGoalsdocumentationForGoalsPage1idGoal0</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>tableGoals</viewDataTable>
<isReport>1</isReport>
</row>
@@ -3597,6 +3742,7 @@
<idGoal>0</idGoal>
</parameters>
<uniqueId>widgetReferrersgetKeywordsforceView1viewDataTabletableGoalsdocumentationForGoalsPage1idGoal0</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>tableGoals</viewDataTable>
<isReport>1</isReport>
</row>
@@ -3625,6 +3771,7 @@
<idGoal>0</idGoal>
</parameters>
<uniqueId>widgetReferrersgetSearchEnginesforceView1viewDataTabletableGoalsdocumentationForGoalsPage1idGoal0</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>tableGoals</viewDataTable>
<isReport>1</isReport>
</row>
@@ -3653,6 +3800,7 @@
<idGoal>0</idGoal>
</parameters>
<uniqueId>widgetReferrersgetWebsitesforceView1viewDataTabletableGoalsdocumentationForGoalsPage1idGoal0</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>tableGoals</viewDataTable>
<isReport>1</isReport>
</row>
@@ -3681,6 +3829,7 @@
<idGoal>0</idGoal>
</parameters>
<uniqueId>widgetReferrersgetCampaignsforceView1viewDataTabletableGoalsdocumentationForGoalsPage1idGoal0</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>tableGoals</viewDataTable>
<isReport>1</isReport>
</row>
@@ -3709,6 +3858,7 @@
<idGoal>0</idGoal>
</parameters>
<uniqueId>widgetGoalsgetVisitsUntilConversionforceView1viewDataTabletabledocumentationForGoalsPage1idGoal0</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -3737,6 +3887,7 @@
<idGoal>0</idGoal>
</parameters>
<uniqueId>widgetGoalsgetDaysToConversionforceView1viewDataTabletabledocumentationForGoalsPage1idGoal0</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -3768,6 +3919,7 @@
<action>editGoals</action>
</parameters>
<uniqueId>widgetGoalseditGoals</uniqueId>
+ <isWide>0</isWide>
</row>
</widgets>
</row>
@@ -3795,6 +3947,7 @@
<action>getEcommerceLog</action>
</parameters>
<uniqueId>widgetEcommercegetEcommerceLog</uniqueId>
+ <isWide>0</isWide>
</row>
</widgets>
</row>
@@ -3823,6 +3976,7 @@
<containerId>EcommerceOverview</containerId>
</parameters>
<uniqueId>widgetEcommerceOverview</uniqueId>
+ <isWide>0</isWide>
<layout />
<isContainer>1</isContainer>
<widgets>
@@ -3850,6 +4004,7 @@
<idGoal>ecommerceOrder</idGoal>
</parameters>
<uniqueId>widgetGoalsgetEvolutionGraphforceView1viewDataTablegraphEvolutionidGoalecommerceOrder</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>graphEvolution</viewDataTable>
<isReport>1</isReport>
</row>
@@ -3877,6 +4032,7 @@
<idGoal>ecommerceOrder</idGoal>
</parameters>
<uniqueId>widgetEcommercegetSparklinesforceView1viewDataTablesparklinesidGoalecommerceOrder</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>sparklines</viewDataTable>
<isReport>1</isReport>
</row>
@@ -3902,6 +4058,7 @@
<idGoal>ecommerceOrder</idGoal>
</parameters>
<uniqueId>widgetEcommercegetConversionsOverviewidGoalecommerceOrder</uniqueId>
+ <isWide>0</isWide>
<middlewareParameters>
<module>Goals</module>
<action>hasConversions</action>
@@ -3939,6 +4096,7 @@
<containerId>Products</containerId>
</parameters>
<uniqueId>widgetProducts</uniqueId>
+ <isWide>0</isWide>
<layout>ByDimension</layout>
<isContainer>1</isContainer>
<widgets>
@@ -3963,6 +4121,7 @@
<action>getItemsSku</action>
</parameters>
<uniqueId>widgetGoalsgetItemsSku</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -3987,6 +4146,7 @@
<action>getItemsName</action>
</parameters>
<uniqueId>widgetGoalsgetItemsName</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -4011,6 +4171,7 @@
<action>getItemsCategory</action>
</parameters>
<uniqueId>widgetGoalsgetItemsCategory</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -4044,6 +4205,7 @@
<containerId>GoalsOrder</containerId>
</parameters>
<uniqueId>widgetGoalsOrderidGoalecommerceOrder</uniqueId>
+ <isWide>0</isWide>
<layout>ByDimension</layout>
<isContainer>1</isContainer>
<widgets>
@@ -4072,6 +4234,7 @@
<idGoal>ecommerceOrder</idGoal>
</parameters>
<uniqueId>widgetCustomVariablesgetCustomVariablesforceView1viewDataTabletableGoalsdocumentationForGoalsPage1idGoalecommerceOrder</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>tableGoals</viewDataTable>
<isReport>1</isReport>
</row>
@@ -4100,6 +4263,7 @@
<idGoal>ecommerceOrder</idGoal>
</parameters>
<uniqueId>widgetVisitTimegetVisitInformationPerServerTimeforceView1viewDataTabletableGoalsdocumentationForGoalsPage1idGoalecommerceOrder</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>tableGoals</viewDataTable>
<isReport>1</isReport>
</row>
@@ -4128,6 +4292,7 @@
<idGoal>ecommerceOrder</idGoal>
</parameters>
<uniqueId>widgetDevicesDetectiongetTypeforceView1viewDataTabletableGoalsdocumentationForGoalsPage1idGoalecommerceOrder</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>tableGoals</viewDataTable>
<isReport>1</isReport>
</row>
@@ -4156,6 +4321,7 @@
<idGoal>ecommerceOrder</idGoal>
</parameters>
<uniqueId>widgetDevicesDetectiongetModelforceView1viewDataTabletableGoalsdocumentationForGoalsPage1idGoalecommerceOrder</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>tableGoals</viewDataTable>
<isReport>1</isReport>
</row>
@@ -4184,6 +4350,7 @@
<idGoal>ecommerceOrder</idGoal>
</parameters>
<uniqueId>widgetDevicesDetectiongetBrandforceView1viewDataTabletableGoalsdocumentationForGoalsPage1idGoalecommerceOrder</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>tableGoals</viewDataTable>
<isReport>1</isReport>
</row>
@@ -4212,6 +4379,7 @@
<idGoal>ecommerceOrder</idGoal>
</parameters>
<uniqueId>widgetUserCountrygetCountryforceView1viewDataTabletableGoalsdocumentationForGoalsPage1idGoalecommerceOrder</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>tableGoals</viewDataTable>
<isReport>1</isReport>
</row>
@@ -4240,6 +4408,7 @@
<idGoal>ecommerceOrder</idGoal>
</parameters>
<uniqueId>widgetUserCountrygetContinentforceView1viewDataTabletableGoalsdocumentationForGoalsPage1idGoalecommerceOrder</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>tableGoals</viewDataTable>
<isReport>1</isReport>
</row>
@@ -4268,6 +4437,7 @@
<idGoal>ecommerceOrder</idGoal>
</parameters>
<uniqueId>widgetUserCountrygetRegionforceView1viewDataTabletableGoalsdocumentationForGoalsPage1idGoalecommerceOrder</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>tableGoals</viewDataTable>
<isReport>1</isReport>
</row>
@@ -4296,6 +4466,7 @@
<idGoal>ecommerceOrder</idGoal>
</parameters>
<uniqueId>widgetUserCountrygetCityforceView1viewDataTabletableGoalsdocumentationForGoalsPage1idGoalecommerceOrder</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>tableGoals</viewDataTable>
<isReport>1</isReport>
</row>
@@ -4324,6 +4495,7 @@
<idGoal>ecommerceOrder</idGoal>
</parameters>
<uniqueId>widgetReferrersgetReferrerTypeforceView1viewDataTabletableGoalsdocumentationForGoalsPage1idGoalecommerceOrder</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>tableGoals</viewDataTable>
<isReport>1</isReport>
</row>
@@ -4352,6 +4524,7 @@
<idGoal>ecommerceOrder</idGoal>
</parameters>
<uniqueId>widgetReferrersgetKeywordsforceView1viewDataTabletableGoalsdocumentationForGoalsPage1idGoalecommerceOrder</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>tableGoals</viewDataTable>
<isReport>1</isReport>
</row>
@@ -4380,6 +4553,7 @@
<idGoal>ecommerceOrder</idGoal>
</parameters>
<uniqueId>widgetReferrersgetSearchEnginesforceView1viewDataTabletableGoalsdocumentationForGoalsPage1idGoalecommerceOrder</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>tableGoals</viewDataTable>
<isReport>1</isReport>
</row>
@@ -4408,6 +4582,7 @@
<idGoal>ecommerceOrder</idGoal>
</parameters>
<uniqueId>widgetReferrersgetWebsitesforceView1viewDataTabletableGoalsdocumentationForGoalsPage1idGoalecommerceOrder</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>tableGoals</viewDataTable>
<isReport>1</isReport>
</row>
@@ -4436,6 +4611,7 @@
<idGoal>ecommerceOrder</idGoal>
</parameters>
<uniqueId>widgetReferrersgetCampaignsforceView1viewDataTabletableGoalsdocumentationForGoalsPage1idGoalecommerceOrder</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>tableGoals</viewDataTable>
<isReport>1</isReport>
</row>
@@ -4464,6 +4640,7 @@
<idGoal>ecommerceOrder</idGoal>
</parameters>
<uniqueId>widgetGoalsgetVisitsUntilConversionforceView1viewDataTabletabledocumentationForGoalsPage1idGoalecommerceOrder</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -4492,6 +4669,7 @@
<idGoal>ecommerceOrder</idGoal>
</parameters>
<uniqueId>widgetGoalsgetDaysToConversionforceView1viewDataTabletabledocumentationForGoalsPage1idGoalecommerceOrder</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -4523,6 +4701,7 @@
<action>getTemperatures</action>
</parameters>
<uniqueId>widgetExampleUIgetTemperatures</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -4554,6 +4733,7 @@
<action>getTemperatures</action>
</parameters>
<uniqueId>widgetExampleUIgetTemperaturesforceView1viewDataTablegraphVerticalBar</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>graphVerticalBar</viewDataTable>
<isReport>1</isReport>
</row>
@@ -4585,6 +4765,7 @@
<action>getTemperatures</action>
</parameters>
<uniqueId>widgetExampleUIgetTemperaturesforceView1viewDataTableinfoviz-treemap</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>infoviz-treemap</viewDataTable>
<isReport>1</isReport>
</row>
@@ -4616,6 +4797,7 @@
<action>getTemperaturesEvolution</action>
</parameters>
<uniqueId>widgetExampleUIgetTemperaturesEvolutionforceView1viewDataTablesparklines</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>sparklines</viewDataTable>
<isReport>1</isReport>
</row>
@@ -4651,6 +4833,7 @@
</columns>
</parameters>
<uniqueId>widgetExampleUIgetTemperaturesEvolutionforceView1viewDataTablegraphEvolutioncolumnsArray</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>graphEvolution</viewDataTable>
<isReport>1</isReport>
</row>
@@ -4680,6 +4863,7 @@
<action>getPlanetRatios</action>
</parameters>
<uniqueId>widgetExampleUIgetPlanetRatios</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>graphPie</viewDataTable>
<isReport>1</isReport>
</row>
@@ -4711,6 +4895,7 @@
<action>getPlanetRatios</action>
</parameters>
<uniqueId>widgetExampleUIgetPlanetRatiosforceView1viewDataTablecloud</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>cloud</viewDataTable>
<isReport>1</isReport>
</row>
@@ -4724,6 +4909,7 @@
<action>getPlanetRatiosWithLogos</action>
</parameters>
<uniqueId>widgetExampleUIgetPlanetRatiosWithLogos</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>cloud</viewDataTable>
<isReport>1</isReport>
</row>
diff --git a/tests/PHPUnit/System/expected/test_apiGetReportMetadata__API.getWidgetMetadata.xml b/tests/PHPUnit/System/expected/test_apiGetReportMetadata__API.getWidgetMetadata.xml
index 69e163bc02..447ef39261 100644
--- a/tests/PHPUnit/System/expected/test_apiGetReportMetadata__API.getWidgetMetadata.xml
+++ b/tests/PHPUnit/System/expected/test_apiGetReportMetadata__API.getWidgetMetadata.xml
@@ -17,6 +17,7 @@
<action>widget</action>
</parameters>
<uniqueId>widgetLivewidget</uniqueId>
+ <isWide>0</isWide>
</row>
<row>
<name>Real Time Visitor Count</name>
@@ -35,6 +36,7 @@
<action>getSimpleLastVisitCount</action>
</parameters>
<uniqueId>widgetLivegetSimpleLastVisitCount</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -61,6 +63,7 @@
<action>get</action>
</parameters>
<uniqueId>widgetVisitsSummarygetforceView1viewDataTablesparklines</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>sparklines</viewDataTable>
<isReport>1</isReport>
</row>
@@ -87,6 +90,7 @@
<action>getEvolutionGraph</action>
</parameters>
<uniqueId>widgetVisitsSummarygetEvolutionGraphforceView1viewDataTablegraphEvolution</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>graphEvolution</viewDataTable>
<isReport>1</isReport>
</row>
@@ -114,6 +118,7 @@
<small>1</small>
</parameters>
<uniqueId>widgetLivegetLastVisitsDetailsforceView1viewDataTableVisitorLogsmall1</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>VisitorLog</viewDataTable>
<isReport>1</isReport>
</row>
@@ -138,6 +143,7 @@
<action>getUsers</action>
</parameters>
<uniqueId>widgetUserIdgetUsers</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -162,6 +168,7 @@
<action>getCustomVariables</action>
</parameters>
<uniqueId>widgetCustomVariablesgetCustomVariables</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -186,6 +193,7 @@
<action>getModel</action>
</parameters>
<uniqueId>widgetDevicesDetectiongetModel</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -210,6 +218,7 @@
<action>getType</action>
</parameters>
<uniqueId>widgetDevicesDetectiongetType</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -234,6 +243,7 @@
<action>getBrand</action>
</parameters>
<uniqueId>widgetDevicesDetectiongetBrand</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -258,6 +268,7 @@
<action>getResolution</action>
</parameters>
<uniqueId>widgetResolutiongetResolution</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -282,6 +293,7 @@
<action>getConfiguration</action>
</parameters>
<uniqueId>widgetResolutiongetConfiguration</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -306,6 +318,7 @@
<action>getPlugin</action>
</parameters>
<uniqueId>widgetDevicePluginsgetPlugin</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -327,6 +340,7 @@
<containerId>VisitOverviewWithGraph</containerId>
</parameters>
<uniqueId>widgetVisitOverviewWithGraph</uniqueId>
+ <isWide>0</isWide>
<layout />
<isContainer>1</isContainer>
<widgets>
@@ -353,6 +367,7 @@
<action>getEvolutionGraph</action>
</parameters>
<uniqueId>widgetVisitsSummarygetEvolutionGraphforceView1viewDataTablegraphEvolution</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>graphEvolution</viewDataTable>
<isReport>1</isReport>
</row>
@@ -379,6 +394,7 @@
<action>get</action>
</parameters>
<uniqueId>widgetVisitsSummarygetforceView1viewDataTablesparklines</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>sparklines</viewDataTable>
<isReport>1</isReport>
</row>
@@ -405,6 +421,7 @@
<action>getBrowserEngines</action>
</parameters>
<uniqueId>widgetDevicesDetectiongetBrowserEngines</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>graphPie</viewDataTable>
<isReport>1</isReport>
</row>
@@ -429,6 +446,7 @@
<action>getBrowsers</action>
</parameters>
<uniqueId>widgetDevicesDetectiongetBrowsers</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -453,6 +471,7 @@
<action>getOsVersions</action>
</parameters>
<uniqueId>widgetDevicesDetectiongetOsVersions</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -477,6 +496,7 @@
<action>getBrowserVersions</action>
</parameters>
<uniqueId>widgetDevicesDetectiongetBrowserVersions</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -501,6 +521,7 @@
<action>getOsFamilies</action>
</parameters>
<uniqueId>widgetDevicesDetectiongetOsFamilies</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -525,6 +546,7 @@
<action>getLanguage</action>
</parameters>
<uniqueId>widgetUserLanguagegetLanguage</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -549,6 +571,7 @@
<action>getCity</action>
</parameters>
<uniqueId>widgetUserCountrygetCity</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -573,6 +596,7 @@
<action>getRegion</action>
</parameters>
<uniqueId>widgetUserCountrygetRegion</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -597,6 +621,7 @@
<action>visitorMap</action>
</parameters>
<uniqueId>widgetUserCountryMapvisitorMap</uniqueId>
+ <isWide>0</isWide>
</row>
<row>
<name>Continent</name>
@@ -619,6 +644,7 @@
<action>getContinent</action>
</parameters>
<uniqueId>widgetUserCountrygetContinent</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -643,6 +669,7 @@
<action>getCountry</action>
</parameters>
<uniqueId>widgetUserCountrygetCountry</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -667,6 +694,7 @@
<action>getLanguageCode</action>
</parameters>
<uniqueId>widgetUserLanguagegetLanguageCode</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -693,6 +721,7 @@
<action>get</action>
</parameters>
<uniqueId>widgetVisitFrequencygetforceView1viewDataTablesparklines</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>sparklines</viewDataTable>
<isReport>1</isReport>
</row>
@@ -719,6 +748,7 @@
<action>getEvolutionGraph</action>
</parameters>
<uniqueId>widgetVisitFrequencygetEvolutionGraphforceView1viewDataTablegraphEvolution</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>graphEvolution</viewDataTable>
<isReport>1</isReport>
</row>
@@ -743,6 +773,7 @@
<action>getNumberOfVisitsByDaysSinceLast</action>
</parameters>
<uniqueId>widgetVisitorInterestgetNumberOfVisitsByDaysSinceLast</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -767,6 +798,7 @@
<action>getNumberOfVisitsPerVisitDuration</action>
</parameters>
<uniqueId>widgetVisitorInterestgetNumberOfVisitsPerVisitDuration</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>cloud</viewDataTable>
<isReport>1</isReport>
</row>
@@ -787,6 +819,7 @@
<action>getVisitorProfilePopup</action>
</parameters>
<uniqueId>widgetLivegetVisitorProfilePopup</uniqueId>
+ <isWide>0</isWide>
</row>
<row>
<name>Visits by Visit Number</name>
@@ -809,6 +842,7 @@
<action>getNumberOfVisitsByVisitCount</action>
</parameters>
<uniqueId>widgetVisitorInterestgetNumberOfVisitsByVisitCount</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -833,6 +867,7 @@
<action>getNumberOfVisitsPerPage</action>
</parameters>
<uniqueId>widgetVisitorInterestgetNumberOfVisitsPerPage</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>cloud</viewDataTable>
<isReport>1</isReport>
</row>
@@ -857,6 +892,7 @@
<action>getVisitInformationPerServerTime</action>
</parameters>
<uniqueId>widgetVisitTimegetVisitInformationPerServerTime</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>graphVerticalBar</viewDataTable>
<isReport>1</isReport>
</row>
@@ -881,6 +917,7 @@
<action>getVisitInformationPerLocalTime</action>
</parameters>
<uniqueId>widgetVisitTimegetVisitInformationPerLocalTime</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>graphVerticalBar</viewDataTable>
<isReport>1</isReport>
</row>
@@ -905,6 +942,7 @@
<action>getByDayOfWeek</action>
</parameters>
<uniqueId>widgetVisitTimegetByDayOfWeek</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>graphVerticalBar</viewDataTable>
<isReport>1</isReport>
</row>
@@ -929,6 +967,7 @@
<action>realtimeMap</action>
</parameters>
<uniqueId>widgetUserCountryMaprealtimeMap</uniqueId>
+ <isWide>0</isWide>
</row>
<row>
<name>Pages</name>
@@ -951,6 +990,7 @@
<action>getPageUrls</action>
</parameters>
<uniqueId>widgetActionsgetPageUrls</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -975,6 +1015,7 @@
<action>getEntryPageTitles</action>
</parameters>
<uniqueId>widgetActionsgetEntryPageTitles</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -999,6 +1040,7 @@
<action>getEntryPageUrls</action>
</parameters>
<uniqueId>widgetActionsgetEntryPageUrls</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -1023,6 +1065,7 @@
<action>getExitPageUrls</action>
</parameters>
<uniqueId>widgetActionsgetExitPageUrls</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -1047,6 +1090,7 @@
<action>getExitPageTitles</action>
</parameters>
<uniqueId>widgetActionsgetExitPageTitles</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -1071,6 +1115,7 @@
<action>getPageTitles</action>
</parameters>
<uniqueId>widgetActionsgetPageTitles</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -1095,6 +1140,7 @@
<action>getSiteSearchNoResultKeywords</action>
</parameters>
<uniqueId>widgetActionsgetSiteSearchNoResultKeywords</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -1119,6 +1165,7 @@
<action>getPageUrlsFollowingSiteSearch</action>
</parameters>
<uniqueId>widgetActionsgetPageUrlsFollowingSiteSearch</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -1143,6 +1190,7 @@
<action>getSiteSearchKeywords</action>
</parameters>
<uniqueId>widgetActionsgetSiteSearchKeywords</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -1167,6 +1215,7 @@
<action>getPageTitlesFollowingSiteSearch</action>
</parameters>
<uniqueId>widgetActionsgetPageTitlesFollowingSiteSearch</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -1191,6 +1240,7 @@
<action>getSiteSearchCategories</action>
</parameters>
<uniqueId>widgetActionsgetSiteSearchCategories</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -1215,6 +1265,7 @@
<action>getOutlinks</action>
</parameters>
<uniqueId>widgetActionsgetOutlinks</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -1239,6 +1290,7 @@
<action>getDownloads</action>
</parameters>
<uniqueId>widgetActionsgetDownloads</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -1264,6 +1316,7 @@
<secondaryDimension>eventName</secondaryDimension>
</parameters>
<uniqueId>widgetEventsgetActionsecondaryDimensioneventName</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -1289,6 +1342,7 @@
<secondaryDimension>eventAction</secondaryDimension>
</parameters>
<uniqueId>widgetEventsgetNamesecondaryDimensioneventAction</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -1314,6 +1368,7 @@
<secondaryDimension>eventAction</secondaryDimension>
</parameters>
<uniqueId>widgetEventsgetCategorysecondaryDimensioneventAction</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -1339,6 +1394,7 @@
<secondaryDimension>eventName</secondaryDimension>
</parameters>
<uniqueId>widgetEventsgetActionsecondaryDimensioneventName</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -1364,6 +1420,7 @@
<secondaryDimension>eventAction</secondaryDimension>
</parameters>
<uniqueId>widgetEventsgetCategorysecondaryDimensioneventAction</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -1389,6 +1446,7 @@
<secondaryDimension>eventAction</secondaryDimension>
</parameters>
<uniqueId>widgetEventsgetNamesecondaryDimensioneventAction</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -1413,6 +1471,7 @@
<action>getContentPieces</action>
</parameters>
<uniqueId>widgetContentsgetContentPieces</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -1437,6 +1496,7 @@
<action>getContentPieces</action>
</parameters>
<uniqueId>widgetContentsgetContentPieces</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -1461,6 +1521,7 @@
<action>getContentNames</action>
</parameters>
<uniqueId>widgetContentsgetContentNames</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -1485,6 +1546,7 @@
<action>getContentNames</action>
</parameters>
<uniqueId>widgetContentsgetContentNames</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -1509,6 +1571,7 @@
<action>getAll</action>
</parameters>
<uniqueId>widgetReferrersgetAll</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>tableAllColumns</viewDataTable>
<isReport>1</isReport>
</row>
@@ -1533,6 +1596,7 @@
<action>getReferrerType</action>
</parameters>
<uniqueId>widgetReferrersgetReferrerType</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>tableAllColumns</viewDataTable>
<isReport>1</isReport>
</row>
@@ -1557,6 +1621,7 @@
<action>getSearchEngines</action>
</parameters>
<uniqueId>widgetReferrersgetSearchEngines</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -1581,6 +1646,7 @@
<action>getKeywords</action>
</parameters>
<uniqueId>widgetReferrersgetKeywords</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -1605,6 +1671,7 @@
<action>getWebsites</action>
</parameters>
<uniqueId>widgetReferrersgetWebsites</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -1629,6 +1696,7 @@
<action>getSocials</action>
</parameters>
<uniqueId>widgetReferrersgetSocials</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>graphPie</viewDataTable>
<isReport>1</isReport>
</row>
@@ -1653,6 +1721,7 @@
<action>getCampaigns</action>
</parameters>
<uniqueId>widgetReferrersgetCampaigns</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -1678,6 +1747,7 @@
<containerId>EcommerceOverview</containerId>
</parameters>
<uniqueId>widgetEcommerceOverview</uniqueId>
+ <isWide>0</isWide>
<layout />
<isContainer>1</isContainer>
<widgets>
@@ -1705,6 +1775,7 @@
<idGoal>ecommerceOrder</idGoal>
</parameters>
<uniqueId>widgetGoalsgetEvolutionGraphforceView1viewDataTablegraphEvolutionidGoalecommerceOrder</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>graphEvolution</viewDataTable>
<isReport>1</isReport>
</row>
@@ -1732,6 +1803,7 @@
<idGoal>ecommerceOrder</idGoal>
</parameters>
<uniqueId>widgetEcommercegetSparklinesforceView1viewDataTablesparklinesidGoalecommerceOrder</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>sparklines</viewDataTable>
<isReport>1</isReport>
</row>
@@ -1757,6 +1829,7 @@
<idGoal>ecommerceOrder</idGoal>
</parameters>
<uniqueId>widgetEcommercegetConversionsOverviewidGoalecommerceOrder</uniqueId>
+ <isWide>0</isWide>
<middlewareParameters>
<module>Goals</module>
<action>hasConversions</action>
@@ -1788,6 +1861,7 @@
<action>getEcommerceLog</action>
</parameters>
<uniqueId>widgetEcommercegetEcommerceLog</uniqueId>
+ <isWide>0</isWide>
</row>
<row>
<name>Product SKU</name>
@@ -1810,6 +1884,7 @@
<action>getItemsSku</action>
</parameters>
<uniqueId>widgetGoalsgetItemsSku</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -1834,6 +1909,7 @@
<action>getItemsCategory</action>
</parameters>
<uniqueId>widgetGoalsgetItemsCategory</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -1858,6 +1934,7 @@
<action>getItemsSku</action>
</parameters>
<uniqueId>widgetGoalsgetItemsSku</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -1882,6 +1959,7 @@
<action>getItemsName</action>
</parameters>
<uniqueId>widgetGoalsgetItemsName</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -1906,6 +1984,7 @@
<action>getItemsName</action>
</parameters>
<uniqueId>widgetGoalsgetItemsName</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -1930,6 +2009,7 @@
<action>getItemsCategory</action>
</parameters>
<uniqueId>widgetGoalsgetItemsCategory</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -1955,6 +2035,7 @@
<containerId>GoalsOverview</containerId>
</parameters>
<uniqueId>widgetGoalsOverview</uniqueId>
+ <isWide>0</isWide>
<layout />
<isContainer>1</isContainer>
<widgets>
@@ -1981,6 +2062,7 @@
<action>getEvolutionGraph</action>
</parameters>
<uniqueId>widgetGoalsgetEvolutionGraphforceView1viewDataTablegraphEvolution</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>graphEvolution</viewDataTable>
<isReport>1</isReport>
</row>
@@ -2007,6 +2089,7 @@
<action>get</action>
</parameters>
<uniqueId>widgetGoalsgetforceView1viewDataTablesparklines</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>sparklines</viewDataTable>
<isReport>1</isReport>
</row>
@@ -2036,6 +2119,7 @@
<only_summary>1</only_summary>
</parameters>
<uniqueId>widgetGoalsgetforceView1viewDataTablesparklinesidGoal1allow_multiple1only_summary1</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>sparklines</viewDataTable>
<isReport>1</isReport>
</row>
@@ -2065,6 +2149,7 @@
<only_summary>1</only_summary>
</parameters>
<uniqueId>widgetGoalsgetforceView1viewDataTablesparklinesidGoal2allow_multiple0only_summary1</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>sparklines</viewDataTable>
<isReport>1</isReport>
</row>
@@ -2094,6 +2179,7 @@
<only_summary>1</only_summary>
</parameters>
<uniqueId>widgetGoalsgetforceView1viewDataTablesparklinesidGoal3allow_multiple0only_summary1</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>sparklines</viewDataTable>
<isReport>1</isReport>
</row>
@@ -2121,6 +2207,7 @@
<containerId>Goal_1</containerId>
</parameters>
<uniqueId>widgetGoal_1</uniqueId>
+ <isWide>0</isWide>
<layout />
<isContainer>1</isContainer>
<widgets>
@@ -2148,6 +2235,7 @@
<idGoal>1</idGoal>
</parameters>
<uniqueId>widgetGoalsgetEvolutionGraphforceView1viewDataTablegraphEvolutionidGoal1</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>graphEvolution</viewDataTable>
<isReport>1</isReport>
</row>
@@ -2176,6 +2264,7 @@
<allow_multiple>1</allow_multiple>
</parameters>
<uniqueId>widgetGoalsgetforceView1viewDataTablesparklinesidGoal1allow_multiple1</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>sparklines</viewDataTable>
<isReport>1</isReport>
</row>
@@ -2201,6 +2290,7 @@
<idGoal>1</idGoal>
</parameters>
<uniqueId>widgetGoalsgoalConversionsOverviewidGoal1</uniqueId>
+ <isWide>0</isWide>
<middlewareParameters>
<module>Goals</module>
<action>hasConversions</action>
@@ -2233,6 +2323,7 @@
<containerId>Goal_2</containerId>
</parameters>
<uniqueId>widgetGoal_2</uniqueId>
+ <isWide>0</isWide>
<layout />
<isContainer>1</isContainer>
<widgets>
@@ -2260,6 +2351,7 @@
<idGoal>2</idGoal>
</parameters>
<uniqueId>widgetGoalsgetEvolutionGraphforceView1viewDataTablegraphEvolutionidGoal2</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>graphEvolution</viewDataTable>
<isReport>1</isReport>
</row>
@@ -2288,6 +2380,7 @@
<allow_multiple>0</allow_multiple>
</parameters>
<uniqueId>widgetGoalsgetforceView1viewDataTablesparklinesidGoal2allow_multiple0</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>sparklines</viewDataTable>
<isReport>1</isReport>
</row>
@@ -2313,6 +2406,7 @@
<idGoal>2</idGoal>
</parameters>
<uniqueId>widgetGoalsgoalConversionsOverviewidGoal2</uniqueId>
+ <isWide>0</isWide>
<middlewareParameters>
<module>Goals</module>
<action>hasConversions</action>
@@ -2345,6 +2439,7 @@
<containerId>Goal_3</containerId>
</parameters>
<uniqueId>widgetGoal_3</uniqueId>
+ <isWide>0</isWide>
<layout />
<isContainer>1</isContainer>
<widgets>
@@ -2372,6 +2467,7 @@
<idGoal>3</idGoal>
</parameters>
<uniqueId>widgetGoalsgetEvolutionGraphforceView1viewDataTablegraphEvolutionidGoal3</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>graphEvolution</viewDataTable>
<isReport>1</isReport>
</row>
@@ -2400,6 +2496,7 @@
<allow_multiple>0</allow_multiple>
</parameters>
<uniqueId>widgetGoalsgetforceView1viewDataTablesparklinesidGoal3allow_multiple0</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>sparklines</viewDataTable>
<isReport>1</isReport>
</row>
@@ -2425,6 +2522,7 @@
<idGoal>3</idGoal>
</parameters>
<uniqueId>widgetGoalsgoalConversionsOverviewidGoal3</uniqueId>
+ <isWide>0</isWide>
<middlewareParameters>
<module>Goals</module>
<action>hasConversions</action>
@@ -2456,6 +2554,7 @@
<action>getTemperatures</action>
</parameters>
<uniqueId>widgetExampleUIgetTemperatures</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -2480,6 +2579,7 @@
<action>getPlanetRatiosWithLogos</action>
</parameters>
<uniqueId>widgetExampleUIgetPlanetRatiosWithLogos</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>cloud</viewDataTable>
<isReport>1</isReport>
</row>
@@ -2506,6 +2606,7 @@
<action>getTemperatures</action>
</parameters>
<uniqueId>widgetExampleUIgetTemperaturesforceView1viewDataTablegraphVerticalBar</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>graphVerticalBar</viewDataTable>
<isReport>1</isReport>
</row>
@@ -2536,6 +2637,7 @@
</columns>
</parameters>
<uniqueId>widgetExampleUIgetTemperaturesEvolutionforceView1viewDataTablegraphEvolutioncolumnsArray</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>graphEvolution</viewDataTable>
<isReport>1</isReport>
</row>
@@ -2562,6 +2664,7 @@
<action>getTemperaturesEvolution</action>
</parameters>
<uniqueId>widgetExampleUIgetTemperaturesEvolutionforceView1viewDataTablesparklines</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>sparklines</viewDataTable>
<isReport>1</isReport>
</row>
@@ -2588,6 +2691,7 @@
<action>getTemperatures</action>
</parameters>
<uniqueId>widgetExampleUIgetTemperaturesforceView1viewDataTableinfoviz-treemap</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>infoviz-treemap</viewDataTable>
<isReport>1</isReport>
</row>
@@ -2612,6 +2716,7 @@
<action>getPlanetRatios</action>
</parameters>
<uniqueId>widgetExampleUIgetPlanetRatios</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>graphPie</viewDataTable>
<isReport>1</isReport>
</row>
@@ -2638,6 +2743,7 @@
<action>getPlanetRatios</action>
</parameters>
<uniqueId>widgetExampleUIgetPlanetRatiosforceView1viewDataTablecloud</uniqueId>
+ <isWide>0</isWide>
<viewDataTable>cloud</viewDataTable>
<isReport>1</isReport>
</row>
@@ -2658,6 +2764,7 @@
<action>rssChangelog</action>
</parameters>
<uniqueId>widgetRssWidgetrssChangelog</uniqueId>
+ <isWide>0</isWide>
</row>
<row>
<name>System Summary</name>
@@ -2676,6 +2783,7 @@
<action>getSystemSummary</action>
</parameters>
<uniqueId>widgetCoreHomegetSystemSummary</uniqueId>
+ <isWide>0</isWide>
</row>
<row>
<name>Top Keywords for Page URL</name>
@@ -2694,6 +2802,7 @@
<action>getKeywordsForPage</action>
</parameters>
<uniqueId>widgetReferrersgetKeywordsForPage</uniqueId>
+ <isWide>0</isWide>
</row>
<row>
<name>Piwik.org Blog</name>
@@ -2712,9 +2821,10 @@
<action>rssPiwik</action>
</parameters>
<uniqueId>widgetRssWidgetrssPiwik</uniqueId>
+ <isWide>0</isWide>
</row>
<row>
- <name>Latest Piwik Plugin Updates</name>
+ <name>Latest Marketplace Updates</name>
<category>
<id>About Piwik</id>
<name>About Piwik</name>
@@ -2730,6 +2840,7 @@
<action>getNewPlugins</action>
</parameters>
<uniqueId>widgetCorePluginsAdmingetNewPlugins</uniqueId>
+ <isWide>0</isWide>
</row>
<row>
<name>SEO Rankings</name>
@@ -2748,6 +2859,7 @@
<action>getRank</action>
</parameters>
<uniqueId>widgetSEOgetRank</uniqueId>
+ <isWide>0</isWide>
</row>
<row>
<name>Professional Services for Piwik</name>
@@ -2766,6 +2878,7 @@
<action>promoServices</action>
</parameters>
<uniqueId>widgetProfessionalServicespromoServices</uniqueId>
+ <isWide>0</isWide>
</row>
<row>
<name>Welcome!</name>
@@ -2784,6 +2897,7 @@
<action>getPromoVideo</action>
</parameters>
<uniqueId>widgetCoreHomegetPromoVideo</uniqueId>
+ <isWide>0</isWide>
</row>
<row>
<name>Movers and Shakers</name>
@@ -2802,6 +2916,7 @@
<action>getOverallMoversAndShakers</action>
</parameters>
<uniqueId>widgetInsightsgetOverallMoversAndShakers</uniqueId>
+ <isWide>0</isWide>
</row>
<row>
<name>System Check</name>
@@ -2820,6 +2935,7 @@
<action>getSystemCheck</action>
</parameters>
<uniqueId>widgetInstallationgetSystemCheck</uniqueId>
+ <isWide>0</isWide>
</row>
<row>
<name>Example Widget Name</name>
@@ -2838,6 +2954,7 @@
<action>myExampleWidget</action>
</parameters>
<uniqueId>widgetExamplePluginmyExampleWidget</uniqueId>
+ <isWide>0</isWide>
</row>
<row>
<name>Support Piwik!</name>
@@ -2856,6 +2973,7 @@
<action>getDonateForm</action>
</parameters>
<uniqueId>widgetCoreHomegetDonateForm</uniqueId>
+ <isWide>0</isWide>
</row>
<row>
<name>Insights Overview</name>
@@ -2874,5 +2992,6 @@
<action>getInsightsOverview</action>
</parameters>
<uniqueId>widgetInsightsgetInsightsOverview</uniqueId>
+ <isWide>0</isWide>
</row>
</result> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_noVisit_PeriodIsLast__CorePluginsAdmin.getSystemSettings.xml b/tests/PHPUnit/System/expected/test_noVisit_PeriodIsLast__CorePluginsAdmin.getSystemSettings.xml
index b4d4316097..7f6c3671eb 100644
--- a/tests/PHPUnit/System/expected/test_noVisit_PeriodIsLast__CorePluginsAdmin.getSystemSettings.xml
+++ b/tests/PHPUnit/System/expected/test_noVisit_PeriodIsLast__CorePluginsAdmin.getSystemSettings.xml
@@ -27,8 +27,8 @@
<row>
<name>enable_plugin_update_communication</name>
<title />
- <value>0</value>
- <defaultValue>0</defaultValue>
+ <value>1</value>
+ <defaultValue>1</defaultValue>
<type>boolean</type>
<uiControl>radio</uiControl>
<uiControlAttributes>
diff --git a/tests/PHPUnit/System/expected/test_noVisit__CorePluginsAdmin.getSystemSettings.xml b/tests/PHPUnit/System/expected/test_noVisit__CorePluginsAdmin.getSystemSettings.xml
index b4d4316097..7f6c3671eb 100644
--- a/tests/PHPUnit/System/expected/test_noVisit__CorePluginsAdmin.getSystemSettings.xml
+++ b/tests/PHPUnit/System/expected/test_noVisit__CorePluginsAdmin.getSystemSettings.xml
@@ -27,8 +27,8 @@
<row>
<name>enable_plugin_update_communication</name>
<title />
- <value>0</value>
- <defaultValue>0</defaultValue>
+ <value>1</value>
+ <defaultValue>1</defaultValue>
<type>boolean</type>
<uiControl>radio</uiControl>
<uiControlAttributes>
diff --git a/tests/PHPUnit/Unit/Widget/WidgetConfigTest.php b/tests/PHPUnit/Unit/Widget/WidgetConfigTest.php
index de6917ef0e..6b0b070804 100644
--- a/tests/PHPUnit/Unit/Widget/WidgetConfigTest.php
+++ b/tests/PHPUnit/Unit/Widget/WidgetConfigTest.php
@@ -52,6 +52,17 @@ class WidgetConfigTest extends \PHPUnit_Framework_TestCase
$this->assertSame('', $this->config->getCategoryId());
}
+ public function test_isWide_shouldBeFalseByDefault()
+ {
+ $this->assertFalse($this->config->isWide());
+ }
+
+ public function test_setisWide()
+ {
+ $this->config->setIsWide();
+ $this->assertTrue($this->config->isWide());
+ }
+
public function test_subcategoryId_set_get()
{
$this->config->setSubcategoryId('testsubcat');
diff --git a/tests/PHPUnit/phpunit.xml.dist b/tests/PHPUnit/phpunit.xml.dist
index 81bfcc00ff..a0b0793a91 100644
--- a/tests/PHPUnit/phpunit.xml.dist
+++ b/tests/PHPUnit/phpunit.xml.dist
@@ -23,7 +23,7 @@
<directory>./System</directory>
<directory>../../plugins/*/tests</directory><!-- There should be actually a tests/System but this way we make sure to execute all tests even if some are not moved to correct subdirectory. We will execute Unit and Integration tests twice :( ... -->
<directory>../../plugins/*/Test</directory>
- <exclude>../../plugins/*/tests/Integration</exclude><!-- * in exclude is currently not supported by PHPUnit, so it won't work yet. See https://github.com/sebastianbergmann/php-file-iterator/pull/23 -->
+ <exclude>../../plugins/*/tests/Integration</exclude>
<exclude>../../plugins/*/Test/Integration</exclude>
<exclude>../../plugins/*/tests/Unit</exclude>
<exclude>../../plugins/*/Test/Unit</exclude>
diff --git a/tests/UI/config.dist.js b/tests/UI/config.dist.js
index b1cf6a5747..3f8c6d73a2 100644
--- a/tests/UI/config.dist.js
+++ b/tests/UI/config.dist.js
@@ -30,7 +30,7 @@ exports.php = 'php';
/**
* The folder in tests/lib that holds mocha.
*/
-exports.mocha = 'mocha-2.2.5';
+exports.mocha = 'mocha-3.1.0';
/**
* The folder in tests/lib that holds chai.
diff --git a/tests/UI/expected-screenshots/DashboardManager_removed.png b/tests/UI/expected-screenshots/DashboardManager_removed.png
index d6c16ee23a..a81ebb0843 100644
--- a/tests/UI/expected-screenshots/DashboardManager_removed.png
+++ b/tests/UI/expected-screenshots/DashboardManager_removed.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:630588762289e8b19c4b12513cb15101b307fcc9ee4451c101ab0b5de4f05071
-size 363414
+oid sha256:9da81ba47ddf0bb23ce76646949deb31747e4316ea52e96f53bcb9f1262f1d3f
+size 363418
diff --git a/tests/UI/expected-screenshots/Dashboard_removed.png b/tests/UI/expected-screenshots/Dashboard_removed.png
index 5c315385fd..910132f829 100644
--- a/tests/UI/expected-screenshots/Dashboard_removed.png
+++ b/tests/UI/expected-screenshots/Dashboard_removed.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:bf9771838bff890d74ae7685be4fb4ed8c53936950b25e8efb606dc5f7f11659
-size 525801
+oid sha256:4a7c021f55715a814f5dcabce2e536d3c89d118d0a6e924ec3659bc3160c113b
+size 525620
diff --git a/tests/UI/expected-screenshots/Morpheus_load.png b/tests/UI/expected-screenshots/Morpheus_load.png
index c327b6847a..2e31ebc0ea 100644
--- a/tests/UI/expected-screenshots/Morpheus_load.png
+++ b/tests/UI/expected-screenshots/Morpheus_load.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:70bec92502c2d4cf76867e91649c4bf05fb93cbd11cae2b05c020d60eff9f824
-size 1160797
+oid sha256:41b139f785409fec9eebbd081dcda14c1b49eb8a3a1cbe57975adc251aaafa7c
+size 1167374
diff --git a/tests/UI/expected-screenshots/Theme_demo.png b/tests/UI/expected-screenshots/Theme_demo.png
index 78ec5d1bea..887877d65c 100644
--- a/tests/UI/expected-screenshots/Theme_demo.png
+++ b/tests/UI/expected-screenshots/Theme_demo.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:7bc9732d5865447b2a0dfa5dfb2f8b165bc53e123d1b96ffcddf96a9203da9c9
-size 1141107
+oid sha256:f13100802f3aee94ca13d8cea94ecb82e8dcef3df008300132fd0ac1a40987b5
+size 1148967
diff --git a/tests/UI/expected-screenshots/Theme_home.png b/tests/UI/expected-screenshots/Theme_home.png
index ab42a85dfc..85e43639f3 100644
--- a/tests/UI/expected-screenshots/Theme_home.png
+++ b/tests/UI/expected-screenshots/Theme_home.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:5c4e0793589b3d8e3f49341f4ee542585627db1dd291ef0a463d6988aec819bc
-size 532355
+oid sha256:177e161a842bc0d41319a23aed5dd9e64215a2ba71bd5bb7424ce6ed18a9ce94
+size 531773
diff --git a/tests/UI/expected-screenshots/UIIntegrationTest_admin_home.png b/tests/UI/expected-screenshots/UIIntegrationTest_admin_home.png
index 4e100c38ca..0ed3ec797f 100644
--- a/tests/UI/expected-screenshots/UIIntegrationTest_admin_home.png
+++ b/tests/UI/expected-screenshots/UIIntegrationTest_admin_home.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:0d440d8506a26ceaa4aec16250ac999a3e9fcf026fd699a961fb8355838f2ff5
-size 117213
+oid sha256:2be008d9b82d4f52bdc71e7806a259caabb03ea0e802287609291456e7524e00
+size 113489
diff --git a/tests/UI/expected-screenshots/UIIntegrationTest_admin_settings_general.png b/tests/UI/expected-screenshots/UIIntegrationTest_admin_settings_general.png
index 6c61138418..4995fec660 100644
--- a/tests/UI/expected-screenshots/UIIntegrationTest_admin_settings_general.png
+++ b/tests/UI/expected-screenshots/UIIntegrationTest_admin_settings_general.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:6071466d97c235246f0aa30bfc39eca493015bf88202a2888f5514b1d136dc10
-size 646336
+oid sha256:73ce5d8f801ad0c99d52b3a9585ae9f2fdc16c59897e4b3f98e348567212d505
+size 645576
diff --git a/tests/UI/expected-screenshots/UIIntegrationTest_api_listing.png b/tests/UI/expected-screenshots/UIIntegrationTest_api_listing.png
index e189b12ae7..8b786e87b3 100644
--- a/tests/UI/expected-screenshots/UIIntegrationTest_api_listing.png
+++ b/tests/UI/expected-screenshots/UIIntegrationTest_api_listing.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:5c8b45705e72df6643b633f93dc9ed0ae6d353a73936bbe10e5180e5e054b3f1
-size 4115929
+oid sha256:2864df20d6946a3755878c20f2294f4e6a6c733052e75e92f0ca60b2b1e811ed
+size 4109166
diff --git a/tests/UI/expected-screenshots/UIIntegrationTest_dashboard1.png b/tests/UI/expected-screenshots/UIIntegrationTest_dashboard1.png
index 5e8d634741..441c248a54 100644
--- a/tests/UI/expected-screenshots/UIIntegrationTest_dashboard1.png
+++ b/tests/UI/expected-screenshots/UIIntegrationTest_dashboard1.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:6ab41b108fa4d63c2237671aef7c9667c1120b5a4e67ddccdff9ce3cd27537a7
-size 479436
+oid sha256:bff4c8deda69e3c4bb2139050200e9b61909f1b69d0ba54b12c67e088f0ba001
+size 479553
diff --git a/tests/UI/expected-screenshots/UIIntegrationTest_dashboard2.png b/tests/UI/expected-screenshots/UIIntegrationTest_dashboard2.png
index f505ad79db..f0495e85bc 100644
--- a/tests/UI/expected-screenshots/UIIntegrationTest_dashboard2.png
+++ b/tests/UI/expected-screenshots/UIIntegrationTest_dashboard2.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:902f5b95d9722f593953f008d0513647345c390c79e24c3a0bf4e93637f208c7
-size 834058
+oid sha256:a140a97e21b4c77617eed57fb924605adabf6ca750563ee478bcdcf50a872eb7
+size 1457388
diff --git a/tests/UI/expected-screenshots/UIIntegrationTest_dashboard3.png b/tests/UI/expected-screenshots/UIIntegrationTest_dashboard3.png
index ab91405bed..c31803e482 100644
--- a/tests/UI/expected-screenshots/UIIntegrationTest_dashboard3.png
+++ b/tests/UI/expected-screenshots/UIIntegrationTest_dashboard3.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:c3234393a49b59ddeea97371351ec432dfa4b068937b253858b2d5b4419c5e85
-size 492266
+oid sha256:add381b4f3751dd6d07fab5268258308f3c708398e89897289c66d5b0bd4b5cd
+size 484850
diff --git a/tests/UI/expected-screenshots/UIIntegrationTest_email_reports.png b/tests/UI/expected-screenshots/UIIntegrationTest_email_reports.png
index 1384227595..0256fc3721 100644
--- a/tests/UI/expected-screenshots/UIIntegrationTest_email_reports.png
+++ b/tests/UI/expected-screenshots/UIIntegrationTest_email_reports.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:4690c7114fec502748f3686d009ba3abd1ea7a927df73f3e3b2cc24326b17ac5
-size 65758
+oid sha256:463367e003ecae3012be6e80949d3574599f3d0f8bae05b1fc3d8cb65638835a
+size 69873
diff --git a/tests/UI/expected-screenshots/UIIntegrationTest_email_reports_editor.png b/tests/UI/expected-screenshots/UIIntegrationTest_email_reports_editor.png
new file mode 100644
index 0000000000..ebefa22575
--- /dev/null
+++ b/tests/UI/expected-screenshots/UIIntegrationTest_email_reports_editor.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:69feb27829f904f27c35a0d7875ea3e771f2028cba89129017eedc98d10e072e
+size 391115
diff --git a/tests/UI/expected-screenshots/UIIntegrationTest_menu_apidisallowed.png b/tests/UI/expected-screenshots/UIIntegrationTest_menu_apidisallowed.png
index 20e536cf96..b1a556e964 100644
--- a/tests/UI/expected-screenshots/UIIntegrationTest_menu_apidisallowed.png
+++ b/tests/UI/expected-screenshots/UIIntegrationTest_menu_apidisallowed.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:4fc9d28fb55109dcb6f860aaaea7a86838c95ae4fdade73e188b267fae75cb2e
-size 485150
+oid sha256:6f978d684fdd9c82f549ce95c1489ed074d1d993365307cfd5791458ec914b44
+size 485362
diff --git a/tests/UI/expected-screenshots/UIIntegrationTest_visitor_profile_not_segmented.png b/tests/UI/expected-screenshots/UIIntegrationTest_visitor_profile_not_segmented.png
index 91125c7a9c..e039dfd1ff 100644
--- a/tests/UI/expected-screenshots/UIIntegrationTest_visitor_profile_not_segmented.png
+++ b/tests/UI/expected-screenshots/UIIntegrationTest_visitor_profile_not_segmented.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:0643bf59751bacd616d9939d172df5b3a962993ec72a93cc3547d56974b5a15d
-size 471571
+oid sha256:5f5d739ebb23695b9a205c9d965ee705ec9f6807c4d35973ee6ddb6de368edc3
+size 765265
diff --git a/tests/UI/expected-screenshots/UIIntegrationTest_visitors_realtime_map.png b/tests/UI/expected-screenshots/UIIntegrationTest_visitors_realtime_map.png
index b17ed92bfb..76fb13aa67 100644
--- a/tests/UI/expected-screenshots/UIIntegrationTest_visitors_realtime_map.png
+++ b/tests/UI/expected-screenshots/UIIntegrationTest_visitors_realtime_map.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:d91d70cafa5bc4a9b9bc617b78781d982f82e30fb6641afb6681717f0a27d998
-size 107246
+oid sha256:8559ad591604643472d900c6c32f0497b183a70a1ed2aaa56d4b487d6ec61fcc
+size 103279
diff --git a/tests/UI/expected-screenshots/ViewDataTableTest_4_exclude_low_population.png b/tests/UI/expected-screenshots/ViewDataTableTest_4_exclude_low_population.png
deleted file mode 100644
index 806b9059db..0000000000
--- a/tests/UI/expected-screenshots/ViewDataTableTest_4_exclude_low_population.png
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:ee2fab46cbe6195252b649a3a06a941b7066b00fb87a25158e03451bf38a9bea
-size 33456
diff --git a/tests/UI/expected-screenshots/ViewDataTableTest_5_goals.png b/tests/UI/expected-screenshots/ViewDataTableTest_5_goals.png
index 13ca7df82f..3e3272f1e6 100644
--- a/tests/UI/expected-screenshots/ViewDataTableTest_5_goals.png
+++ b/tests/UI/expected-screenshots/ViewDataTableTest_5_goals.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:766f4ac8f7af5cf4ed8ed65e07e449da6d1a20905e3da06b6ee2410d3c2a96eb
-size 41932
+oid sha256:8736f9d6b4986e0e886e4bc1a547c7796217f8dd5361fc0e38a9c1bee4fe4498
+size 41983
diff --git a/tests/UI/expected-screenshots/ViewDataTableTest_exclude_low_population.png b/tests/UI/expected-screenshots/ViewDataTableTest_exclude_low_population.png
new file mode 100644
index 0000000000..903fbb951a
--- /dev/null
+++ b/tests/UI/expected-screenshots/ViewDataTableTest_exclude_low_population.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6b342b1c2ba59d90b2b455ec69ac1dcaee307b0e97ec58f80d76bb8b81590412
+size 35658
diff --git a/tests/UI/specs/ActionsDataTable_spec.js b/tests/UI/specs/ActionsDataTable_spec.js
index a870b842b8..ec5e427b82 100644
--- a/tests/UI/specs/ActionsDataTable_spec.js
+++ b/tests/UI/specs/ActionsDataTable_spec.js
@@ -58,8 +58,10 @@ describe("ActionsDataTable", function () {
});
it("should display pageview percentages when hovering over pageviews column", function (done) {
+ this.retries(3);
expect.screenshot('pageview_percentages').to.be.capture(function (page) {
page.mouseMove('tr:contains("thankyou") td.column:eq(1)');
+ page.wait(1000);
}, done);
});
@@ -68,6 +70,7 @@ describe("ActionsDataTable", function () {
var row = 'tr:contains("thankyou") ';
page.mouseMove(row + 'td.column:first');
page.mouseMove(row + 'td.label .actionSegmentVisitorLog');
+ page.wait(1000);
}, done);
});
@@ -78,10 +81,12 @@ describe("ActionsDataTable", function () {
});
it("should display unique pageview percentages when hovering over unique pageviews column", function (done) {
+ this.retries(3);
expect.screenshot('unique_pageview_percentages').to.be.capture(function (page) {
page.click('.ui-widget .ui-dialog-titlebar-close');
page.mouseMove('tr:contains("thankyou") td.column:eq(2)');
+ page.wait(1000);
}, done);
});
diff --git a/tests/UI/specs/DashboardManager_spec.js b/tests/UI/specs/DashboardManager_spec.js
index a2bc2aaa94..dc0c7818fe 100644
--- a/tests/UI/specs/DashboardManager_spec.js
+++ b/tests/UI/specs/DashboardManager_spec.js
@@ -59,6 +59,8 @@ describe("DashboardManager", function () {
page.click('li[data-action=createDashboard]');
page.sendKeys('#createDashboardName', 'newdash2');
page.click('.modal.open .modal-footer a:contains(Ok)');
+
+ page.wait(2000);
}, done);
});
diff --git a/tests/UI/specs/MultiSites_spec.js b/tests/UI/specs/MultiSites_spec.js
index 6037a196ef..3dff0f5cc2 100644
--- a/tests/UI/specs/MultiSites_spec.js
+++ b/tests/UI/specs/MultiSites_spec.js
@@ -39,14 +39,20 @@ describe("MultiSitesTest", function () {
});
it('should load the all websites dashboard correctly', function (done) {
+ this.retries(3);
+
expect.screenshot('all_websites').to.be.captureSelector(selector, function (page) {
page.load("?" + generalParams + "&module=MultiSites&action=index");
+ page.wait(3000);
}, done);
});
it('should load next page correctly', function (done) {
+ this.retries(3);
+
expect.screenshot('all_websites_page_1').to.be.captureSelector(selector, function (page) {
page.click('.paging .next');
+ page.wait(1000);
}, done);
});
diff --git a/tests/UI/specs/Overlay_spec.js b/tests/UI/specs/Overlay_spec.js
index 79de66f8cc..53888b14ac 100644
--- a/tests/UI/specs/Overlay_spec.js
+++ b/tests/UI/specs/Overlay_spec.js
@@ -9,6 +9,8 @@
// TODO: should be stored in Overlay plugin
describe("Overlay", function () {
+ this.retries(3);
+
this.timeout(0);
var url = null;
diff --git a/tests/UI/specs/QuickAccess_spec.js b/tests/UI/specs/QuickAccess_spec.js
index 52a37e4c58..ff7493a704 100644
--- a/tests/UI/specs/QuickAccess_spec.js
+++ b/tests/UI/specs/QuickAccess_spec.js
@@ -8,6 +8,8 @@
*/
describe("QuickAccess", function () {
+ this.retries(3);
+
var selectorToCapture = ".quick-access,.quick-access .dropdown";
this.timeout(0);
diff --git a/tests/UI/specs/SegmentSelectorEditor_spec.js b/tests/UI/specs/SegmentSelectorEditor_spec.js
index dfd015efd7..5b22be9ad1 100644
--- a/tests/UI/specs/SegmentSelectorEditor_spec.js
+++ b/tests/UI/specs/SegmentSelectorEditor_spec.js
@@ -1,6 +1,6 @@
/*!
* Piwik - free/libre analytics platform
- *
+ *
* ViewDataTable screenshot tests.
*
* @link http://piwik.org
@@ -28,8 +28,12 @@ describe("SegmentSelectorEditorTest", function () {
});
it("should open segment editor when edit link clicked for existing segment", function (done) {
+
+ this.retries(3);
+
expect.screenshot("2_segment_editor_update").to.be.captureSelector(selectorsToCapture, function (page) {
page.click('.segmentList .editSegment:first');
+ page.wait(1000);
}, done);
});
diff --git a/tests/UI/specs/Theme_spec.js b/tests/UI/specs/Theme_spec.js
index a7fffd2f30..eb9b9dfff3 100644
--- a/tests/UI/specs/Theme_spec.js
+++ b/tests/UI/specs/Theme_spec.js
@@ -10,6 +10,8 @@
var fs = require('fs');
describe("Theme", function () {
+ this.retries(2);
+
this.timeout(0);
function clearAssets() {
diff --git a/tests/UI/specs/UIIntegration_spec.js b/tests/UI/specs/UIIntegration_spec.js
index 252f57f49d..9e7ed5dd12 100644
--- a/tests/UI/specs/UIIntegration_spec.js
+++ b/tests/UI/specs/UIIntegration_spec.js
@@ -253,6 +253,7 @@ describe("UIIntegrationTest", function () { // TODO: Rename to Piwik?
});
it('should load the referrers > search engines & keywords page correctly', function (done) {
+ this.retries(3);
expect.screenshot('referrers_search_engines_keywords').to.be.captureSelector('.pageWrap', function (page) {
page.load("?" + urlBase + "#?" + generalParams + "&category=Referrers_Referrers&subcategory=Referrers_SubmenuSearchEngines");
}, done);
@@ -372,6 +373,7 @@ describe("UIIntegrationTest", function () { // TODO: Rename to Piwik?
});
it('should load the widgetized all websites dashboard correctly', function (done) {
+ this.retries(3);
expect.screenshot('widgetize_allwebsites').to.be.capture(function (page) {
page.load("?" + widgetizeParams + "&" + generalParams + "&moduleToWidgetize=MultiSites&actionToWidgetize=standalone");
}, done);
@@ -470,7 +472,11 @@ describe("UIIntegrationTest", function () { // TODO: Rename to Piwik?
it('should load the Settings > General Settings admin page correctly', function (done) {
expect.screenshot('admin_settings_general').to.be.captureSelector('.pageWrap', function (page) {
page.load("?" + generalParams + "&module=CoreAdminHome&action=generalSettings");
- // angular might need a little to render after page has loaded
+ // angular might need a little to render after page has loaded
+ page.wait(1000);
+ page.evaluate(function () {
+ $('textarea:eq(0)').trigger('focus');
+ });
page.wait(1000);
}, done);
});
@@ -504,7 +510,7 @@ describe("UIIntegrationTest", function () { // TODO: Rename to Piwik?
page.load("?" + generalParams + "&module=CorePluginsAdmin&action=plugins");
}, done);
});
-
+
it('should load the config file page correctly', function (done) {
expect.screenshot('admin_diagnostics_configfile').to.be.captureSelector('.pageWrap', function (page) {
page.load("?" + generalParams + "&module=Diagnostics&action=configfile");
@@ -611,6 +617,12 @@ describe("UIIntegrationTest", function () { // TODO: Rename to Piwik?
}, done);
});
+ it('should load the scheduled reports when Edit button is clicked', function (done) {
+ expect.screenshot('email_reports_editor').to.be.captureSelector('.pageWrap', function (page) {
+ page.click('.entityTable tr:nth-child(4) button[title=Edit]');
+ }, done);
+ });
+
it('should load the feedback form when the feedback form link is clicked', function (done) {
expect.screenshot('feedback_form').to.be.captureSelector('.pageWrap', function (page) {
@@ -647,6 +659,8 @@ describe("UIIntegrationTest", function () { // TODO: Rename to Piwik?
// visitor profile popup
it('should load the visitor profile popup correctly', function (done) {
+ this.retries(3);
+
expect.screenshot('visitor_profile_popup').to.be.capture(function (page) {
page.load("?" + widgetizeParams + "&" + idSite2Params + "&moduleToWidgetize=Live&actionToWidgetize=getVisitorProfilePopup"
+ "&enableAnimation=0");
@@ -681,43 +695,48 @@ describe("UIIntegrationTest", function () { // TODO: Rename to Piwik?
page.mouseMove('table.dataTable tbody tr:first-child');
page.mouseMove('a.actionRowEvolution:visible'); // necessary to get popover to display
page.click('a.actionRowEvolution:visible');
+ page.wait(1000);
+
}, done);
});
it('should load the segmented visitor log correctly when a segment is selected', function (done) {
+ this.retries(3);
expect.screenshot("segmented_visitorlog").to.be.skippedOnAbort();
var url = "?module=CoreHome&action=index&idSite=1&period=year&date=2012-01-13#?category=General_Visitors&subcategory=CustomVariables_CustomVariables&idSite=1&period=year&date=2012-01-13";
expect.page(url).contains('.ui-dialog > .ui-dialog-content > div.dataTableVizVisitorLog:visible', 'segmented_visitorlog', function (page) {
+ page.wait(1000);
page.click('.segmentationTitle');
+ page.wait(500);
page.click('.segname:contains(From Europe)');
-
+ page.wait(500);
page.mouseMove('table.dataTable tbody tr:first-child');
+ page.wait(500);
page.mouseMove('a.actionSegmentVisitorLog:visible'); // necessary to get popover to display
+ page.wait(500);
page.click('a.actionSegmentVisitorLog:visible');
+ page.wait(1000);
+
}, done);
});
it('should not apply current segmented when opening visitor log', function (done) {
+ this.retries(3);
+
var url = "?" + widgetizeParams + "&" + generalParams + "&moduleToWidgetize=Live&actionToWidgetize=getVisitorLog&segment=visitCount==2&enableAnimation=0";
delete testEnvironment.queryParamOverride.visitorId;
testEnvironment.save();
- expect.screenshot("visitor_profile_not_segmented").to.be.capture(function (page) {
+ expect.screenshot("visitor_profile_not_segmented").to.be.similar(0.002).to.capture(function (page) {
page.load(url);
page.evaluate(function () {
$('.visitor-log-visitor-profile-link').first().click();
});
- page.evaluate(function () {
- $(document).ready(function () {
- $('.visitor-profile-show-map').click();
- });
- });
-
page.wait(1000);
}, done);
});
diff --git a/tests/UI/specs/ViewDataTable_spec.js b/tests/UI/specs/ViewDataTable_spec.js
index a7254b3ef6..b13944c412 100644
--- a/tests/UI/specs/ViewDataTable_spec.js
+++ b/tests/UI/specs/ViewDataTable_spec.js
@@ -39,13 +39,6 @@ describe("ViewDataTableTest", function () { // TODO: should remove Test suffix f
}, done);
});
- it("should exclude low population rows when low population clicked", function (done) {
- expect.screenshot("4_exclude_low_population").to.be.capture(function (page) {
- page.click('.dropdownConfigureIcon');
- page.click('.dataTableExcludeLowPopulation');
- }, done);
- });
-
it("should show all available visualizations for this report", function (done) {
expect.screenshot("5_visualizations").to.be.captureSelector('.dataTableFooterIcons', function (page) {
page.click('.activateVisualizationSelection');
@@ -157,4 +150,14 @@ describe("ViewDataTableTest", function () { // TODO: should remove Test suffix f
page.click('.datatableRelatedReports li>span:visible');
}, done);
});
+
+ it("should exclude low population rows when low population clicked", function (done) {
+ var newUrl = url.replace('moduleToWidgetize=Referrers', 'moduleToWidgetize=Actions').replace('actionToWidgetize=getKeywords', 'actionToWidgetize=getPageUrls');
+ expect.screenshot("exclude_low_population").to.be.capture(function (page) {
+ page.load(newUrl);
+ page.click('.dropdownConfigureIcon');
+ page.click('.dataTableExcludeLowPopulation');
+ }, done);
+ });
+
}); \ No newline at end of file
diff --git a/tests/UI/specs/VisitorMap_spec.js b/tests/UI/specs/VisitorMap_spec.js
index eb480c6010..c8685a3e7f 100644
--- a/tests/UI/specs/VisitorMap_spec.js
+++ b/tests/UI/specs/VisitorMap_spec.js
@@ -16,6 +16,8 @@ describe("VisitorMap", function () {
+ "actionToWidgetize=visitorMap&viewDataTable=table&filter_limit=5&isFooterExpandedInDashboard=1";
it("should display the bounce rate metric correctly", function (done) {
+ this.retries(3);
+
expect.screenshot('bounce_rate').to.be.similar(0.002).to.capture(function (page) {
page.load(url);
page.evaluate(function () {
diff --git a/tests/lib/mocha-2.2.5/README.md b/tests/lib/mocha-2.2.5/README.md
deleted file mode 100755
index 44692d3514..0000000000
--- a/tests/lib/mocha-2.2.5/README.md
+++ /dev/null
@@ -1,11 +0,0 @@
-[![Build Status](https://api.travis-ci.org/mochajs/mocha.svg?branch=master)](http://travis-ci.org/mochajs/mocha) [![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/mochajs/mocha?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
-
- [![Mocha test framework](http://f.cl.ly/items/3l1k0n2A1U3M1I1L210p/Screen%20Shot%202012-02-24%20at%202.21.43%20PM.png)](http://mochajs.org)
-
- Mocha is a simple, flexible, fun JavaScript test framework for node.js and the browser. For more information view the [documentation](http://mochajs.org).
-
-## Links
-
- - [Google Group](http://groups.google.com/group/mochajs)
- - [Wiki](https://github.com/mochajs/mocha/wiki)
- - Mocha [Extensions and reporters](https://github.com/mochajs/mocha/wiki)
diff --git a/tests/lib/mocha-2.2.5/bower.json b/tests/lib/mocha-2.2.5/bower.json
deleted file mode 100755
index f03b076d09..0000000000
--- a/tests/lib/mocha-2.2.5/bower.json
+++ /dev/null
@@ -1,47 +0,0 @@
-{
- "name": "mocha",
- "version": "2.2.5",
- "homepage": "http://mocha.github.io/mocha",
- "description": "simple, flexible, fun test framework",
- "authors": [
- "TJ Holowaychuk <tj@vision-media.ca>",
- "Joshua Appelman <joshua@jbna.nl>",
- "Oleg Gaidarenko <markelog@gmail.com>",
- "Christoffer Hallas <christoffer.hallas@gmail.com>",
- "Christopher Hiller <chiller@badwing.com>",
- "Travis Jeffery <tj@travisjeffery.com>",
- "Johnathan Ong <me@jongleberry.com>",
- "Guillermo Rauch <rauchg@gmail.com>"
- ],
- "repository": {
- "type": "git",
- "url": "git://github.com/mochajs/mocha.git"
- },
- "main": [
- "mocha.js",
- "mocha.css"
- ],
- "ignore": [
- "bin",
- "editors",
- "images",
- "lib",
- "support",
- "test",
- ".gitignore",
- ".npmignore",
- ".travis.yml",
- "component.json",
- "index.js",
- "Makefile",
- "package.json"
- ],
- "keywords": [
- "mocha",
- "test",
- "bdd",
- "tdd",
- "tap"
- ],
- "license": "MIT"
-} \ No newline at end of file
diff --git a/tests/lib/mocha-2.2.5/component.json b/tests/lib/mocha-2.2.5/component.json
deleted file mode 100755
index 5da3daa25e..0000000000
--- a/tests/lib/mocha-2.2.5/component.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
- "name": "mocha",
- "version": "2.2.5",
- "repo": "mochajs/mocha",
- "description": "simple, flexible, fun test framework",
- "keywords": [
- "mocha",
- "test",
- "bdd",
- "tdd",
- "tap"
- ],
- "main": "mocha.js",
- "scripts": [
- "mocha.js"
- ],
- "styles": [
- "mocha.css"
- ]
-} \ No newline at end of file
diff --git a/tests/lib/mocha-2.2.5/index.js b/tests/lib/mocha-2.2.5/index.js
deleted file mode 100755
index 169b271770..0000000000
--- a/tests/lib/mocha-2.2.5/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-module.exports = process.env.COV
- ? require('./lib-cov/mocha')
- : require('./lib/mocha');
diff --git a/tests/lib/mocha-2.2.5/lib/browser/debug.js b/tests/lib/mocha-2.2.5/lib/browser/debug.js
deleted file mode 100755
index 0d939e5c07..0000000000
--- a/tests/lib/mocha-2.2.5/lib/browser/debug.js
+++ /dev/null
@@ -1,4 +0,0 @@
-module.exports = function(type){
- return function(){
- }
-};
diff --git a/tests/lib/mocha-2.2.5/lib/browser/escape-string-regexp.js b/tests/lib/mocha-2.2.5/lib/browser/escape-string-regexp.js
deleted file mode 100755
index 21a95663ed..0000000000
--- a/tests/lib/mocha-2.2.5/lib/browser/escape-string-regexp.js
+++ /dev/null
@@ -1,11 +0,0 @@
-'use strict';
-
-var matchOperatorsRe = /[|\\{}()[\]^$+*?.]/g;
-
-module.exports = function (str) {
- if (typeof str !== 'string') {
- throw new TypeError('Expected a string');
- }
-
- return str.replace(matchOperatorsRe, '\\$&');
-};
diff --git a/tests/lib/mocha-2.2.5/lib/browser/fs.js b/tests/lib/mocha-2.2.5/lib/browser/fs.js
deleted file mode 100755
index e69de29bb2..0000000000
--- a/tests/lib/mocha-2.2.5/lib/browser/fs.js
+++ /dev/null
diff --git a/tests/lib/mocha-2.2.5/lib/browser/glob.js b/tests/lib/mocha-2.2.5/lib/browser/glob.js
deleted file mode 100755
index e69de29bb2..0000000000
--- a/tests/lib/mocha-2.2.5/lib/browser/glob.js
+++ /dev/null
diff --git a/tests/lib/mocha-2.2.5/lib/browser/path.js b/tests/lib/mocha-2.2.5/lib/browser/path.js
deleted file mode 100755
index e69de29bb2..0000000000
--- a/tests/lib/mocha-2.2.5/lib/browser/path.js
+++ /dev/null
diff --git a/tests/lib/mocha-2.2.5/lib/browser/progress.js b/tests/lib/mocha-2.2.5/lib/browser/progress.js
deleted file mode 100755
index b30e5179ea..0000000000
--- a/tests/lib/mocha-2.2.5/lib/browser/progress.js
+++ /dev/null
@@ -1,125 +0,0 @@
-/**
- * Expose `Progress`.
- */
-
-module.exports = Progress;
-
-/**
- * Initialize a new `Progress` indicator.
- */
-
-function Progress() {
- this.percent = 0;
- this.size(0);
- this.fontSize(11);
- this.font('helvetica, arial, sans-serif');
-}
-
-/**
- * Set progress size to `n`.
- *
- * @param {Number} n
- * @return {Progress} for chaining
- * @api public
- */
-
-Progress.prototype.size = function(n){
- this._size = n;
- return this;
-};
-
-/**
- * Set text to `str`.
- *
- * @param {String} str
- * @return {Progress} for chaining
- * @api public
- */
-
-Progress.prototype.text = function(str){
- this._text = str;
- return this;
-};
-
-/**
- * Set font size to `n`.
- *
- * @param {Number} n
- * @return {Progress} for chaining
- * @api public
- */
-
-Progress.prototype.fontSize = function(n){
- this._fontSize = n;
- return this;
-};
-
-/**
- * Set font `family`.
- *
- * @param {String} family
- * @return {Progress} for chaining
- */
-
-Progress.prototype.font = function(family){
- this._font = family;
- return this;
-};
-
-/**
- * Update percentage to `n`.
- *
- * @param {Number} n
- * @return {Progress} for chaining
- */
-
-Progress.prototype.update = function(n){
- this.percent = n;
- return this;
-};
-
-/**
- * Draw on `ctx`.
- *
- * @param {CanvasRenderingContext2d} ctx
- * @return {Progress} for chaining
- */
-
-Progress.prototype.draw = function(ctx){
- try {
- var percent = Math.min(this.percent, 100)
- , size = this._size
- , half = size / 2
- , x = half
- , y = half
- , rad = half - 1
- , fontSize = this._fontSize;
-
- ctx.font = fontSize + 'px ' + this._font;
-
- var angle = Math.PI * 2 * (percent / 100);
- ctx.clearRect(0, 0, size, size);
-
- // outer circle
- ctx.strokeStyle = '#9f9f9f';
- ctx.beginPath();
- ctx.arc(x, y, rad, 0, angle, false);
- ctx.stroke();
-
- // inner circle
- ctx.strokeStyle = '#eee';
- ctx.beginPath();
- ctx.arc(x, y, rad - 1, 0, angle, true);
- ctx.stroke();
-
- // text
- var text = this._text || (percent | 0) + '%'
- , w = ctx.measureText(text).width;
-
- ctx.fillText(
- text
- , x - w / 2 + 1
- , y + fontSize / 2 - 1);
- } catch (ex) {} //don't fail if we can't render progress
- return this;
-};
diff --git a/tests/lib/mocha-2.2.5/lib/browser/tty.js b/tests/lib/mocha-2.2.5/lib/browser/tty.js
deleted file mode 100755
index eab6388270..0000000000
--- a/tests/lib/mocha-2.2.5/lib/browser/tty.js
+++ /dev/null
@@ -1,12 +0,0 @@
-exports.isatty = function(){
- return true;
-};
-
-exports.getWindowSize = function(){
- if ('innerHeight' in global) {
- return [global.innerHeight, global.innerWidth];
- } else {
- // In a Web Worker, the DOM Window is not available.
- return [640, 480];
- }
-};
diff --git a/tests/lib/mocha-2.2.5/lib/context.js b/tests/lib/mocha-2.2.5/lib/context.js
deleted file mode 100755
index 3885218db9..0000000000
--- a/tests/lib/mocha-2.2.5/lib/context.js
+++ /dev/null
@@ -1,95 +0,0 @@
-/**
- * Expose `Context`.
- */
-
-module.exports = Context;
-
-/**
- * Initialize a new `Context`.
- *
- * @api private
- */
-
-function Context(){}
-
-/**
- * Set or get the context `Runnable` to `runnable`.
- *
- * @param {Runnable} runnable
- * @return {Context}
- * @api private
- */
-
-Context.prototype.runnable = function(runnable){
- if (0 == arguments.length) return this._runnable;
- this.test = this._runnable = runnable;
- return this;
-};
-
-/**
- * Set test timeout `ms`.
- *
- * @param {Number} ms
- * @return {Context} self
- * @api private
- */
-
-Context.prototype.timeout = function(ms){
- if (arguments.length === 0) return this.runnable().timeout();
- this.runnable().timeout(ms);
- return this;
-};
-
-/**
- * Set test timeout `enabled`.
- *
- * @param {Boolean} enabled
- * @return {Context} self
- * @api private
- */
-
-Context.prototype.enableTimeouts = function (enabled) {
- this.runnable().enableTimeouts(enabled);
- return this;
-};
-
-
-/**
- * Set test slowness threshold `ms`.
- *
- * @param {Number} ms
- * @return {Context} self
- * @api private
- */
-
-Context.prototype.slow = function(ms){
- this.runnable().slow(ms);
- return this;
-};
-
-/**
- * Mark a test as skipped.
- *
- * @return {Context} self
- * @api private
- */
-
-Context.prototype.skip = function(){
- this.runnable().skip();
- return this;
-};
-
-/**
- * Inspect the context void of `._runnable`.
- *
- * @return {String}
- * @api private
- */
-
-Context.prototype.inspect = function(){
- return JSON.stringify(this, function(key, val){
- if ('_runnable' == key) return;
- if ('test' == key) return;
- return val;
- }, 2);
-};
diff --git a/tests/lib/mocha-2.2.5/lib/interfaces/bdd.js b/tests/lib/mocha-2.2.5/lib/interfaces/bdd.js
deleted file mode 100755
index f9f08a3ed0..0000000000
--- a/tests/lib/mocha-2.2.5/lib/interfaces/bdd.js
+++ /dev/null
@@ -1,115 +0,0 @@
-/**
- * Module dependencies.
- */
-
-var Suite = require('../suite')
- , Test = require('../test')
- , utils = require('../utils')
- , escapeRe = require('escape-string-regexp');
-
-/**
- * BDD-style interface:
- *
- * describe('Array', function(){
- * describe('#indexOf()', function(){
- * it('should return -1 when not present', function(){
- *
- * });
- *
- * it('should return the index when present', function(){
- *
- * });
- * });
- * });
- *
- */
-
-module.exports = function(suite){
- var suites = [suite];
-
- suite.on('pre-require', function(context, file, mocha){
-
- var common = require('./common')(suites, context);
-
- context.before = common.before;
- context.after = common.after;
- context.beforeEach = common.beforeEach;
- context.afterEach = common.afterEach;
- context.run = mocha.options.delay && common.runWithSuite(suite);
- /**
- * Describe a "suite" with the given `title`
- * and callback `fn` containing nested suites
- * and/or tests.
- */
-
- context.describe = context.context = function(title, fn){
- var suite = Suite.create(suites[0], title);
- suite.file = file;
- suites.unshift(suite);
- fn.call(suite);
- suites.shift();
- return suite;
- };
-
- /**
- * Pending describe.
- */
-
- context.xdescribe =
- context.xcontext =
- context.describe.skip = function(title, fn){
- var suite = Suite.create(suites[0], title);
- suite.pending = true;
- suites.unshift(suite);
- fn.call(suite);
- suites.shift();
- };
-
- /**
- * Exclusive suite.
- */
-
- context.describe.only = function(title, fn){
- var suite = context.describe(title, fn);
- mocha.grep(suite.fullTitle());
- return suite;
- };
-
- /**
- * Describe a specification or test-case
- * with the given `title` and callback `fn`
- * acting as a thunk.
- */
-
- context.it = context.specify = function(title, fn){
- var suite = suites[0];
- if (suite.pending) fn = null;
- var test = new Test(title, fn);
- test.file = file;
- suite.addTest(test);
- return test;
- };
-
- /**
- * Exclusive test-case.
- */
-
- context.it.only = function(title, fn){
- var test = context.it(title, fn);
- var reString = '^' + escapeRe(test.fullTitle()) + '$';
- mocha.grep(new RegExp(reString));
- return test;
- };
-
- /**
- * Pending test case.
- */
-
- context.xit =
- context.xspecify =
- context.it.skip = function(title){
- context.it(title);
- };
-
- });
-};
diff --git a/tests/lib/mocha-2.2.5/lib/interfaces/common.js b/tests/lib/mocha-2.2.5/lib/interfaces/common.js
deleted file mode 100755
index 1ccd3390f7..0000000000
--- a/tests/lib/mocha-2.2.5/lib/interfaces/common.js
+++ /dev/null
@@ -1,58 +0,0 @@
-/**
- * Functions common to more than one interface
- * @module lib/interfaces/common
- */
-
-'use strict';
-
-module.exports = function (suites, context) {
-
- return {
- /**
- * This is only present if flag --delay is passed into Mocha. It triggers
- * root suite execution. Returns a function which runs the root suite.
- */
- runWithSuite: function runWithSuite(suite) {
- return function run() {
- suite.run();
- };
- },
-
- /**
- * Execute before running tests.
- */
- before: function (name, fn) {
- suites[0].beforeAll(name, fn);
- },
-
- /**
- * Execute after running tests.
- */
- after: function (name, fn) {
- suites[0].afterAll(name, fn);
- },
-
- /**
- * Execute before each test case.
- */
- beforeEach: function (name, fn) {
- suites[0].beforeEach(name, fn);
- },
-
- /**
- * Execute after each test case.
- */
- afterEach: function (name, fn) {
- suites[0].afterEach(name, fn);
- },
-
- test: {
- /**
- * Pending test case.
- */
- skip: function (title) {
- context.test(title);
- }
- }
- }
-};
diff --git a/tests/lib/mocha-2.2.5/lib/interfaces/tdd.js b/tests/lib/mocha-2.2.5/lib/interfaces/tdd.js
deleted file mode 100755
index 13bc2a33be..0000000000
--- a/tests/lib/mocha-2.2.5/lib/interfaces/tdd.js
+++ /dev/null
@@ -1,109 +0,0 @@
-/**
- * Module dependencies.
- */
-
-var Suite = require('../suite')
- , Test = require('../test')
- , escapeRe = require('escape-string-regexp')
- , utils = require('../utils');
-
-/**
- * TDD-style interface:
- *
- * suite('Array', function(){
- * suite('#indexOf()', function(){
- * suiteSetup(function(){
- *
- * });
- *
- * test('should return -1 when not present', function(){
- *
- * });
- *
- * test('should return the index when present', function(){
- *
- * });
- *
- * suiteTeardown(function(){
- *
- * });
- * });
- * });
- *
- */
-
-module.exports = function(suite){
- var suites = [suite];
-
- suite.on('pre-require', function(context, file, mocha){
-
- var common = require('./common')(suites, context);
-
- context.setup = common.beforeEach;
- context.teardown = common.afterEach;
- context.suiteSetup = common.before;
- context.suiteTeardown = common.after;
- context.run = mocha.options.delay && common.runWithSuite(suite);
- /**
- * Describe a "suite" with the given `title`
- * and callback `fn` containing nested suites
- * and/or tests.
- */
-
- context.suite = function(title, fn){
- var suite = Suite.create(suites[0], title);
- suite.file = file;
- suites.unshift(suite);
- fn.call(suite);
- suites.shift();
- return suite;
- };
-
- /**
- * Pending suite.
- */
- context.suite.skip = function(title, fn) {
- var suite = Suite.create(suites[0], title);
- suite.pending = true;
- suites.unshift(suite);
- fn.call(suite);
- suites.shift();
- };
-
- /**
- * Exclusive test-case.
- */
-
- context.suite.only = function(title, fn){
- var suite = context.suite(title, fn);
- mocha.grep(suite.fullTitle());
- };
-
- /**
- * Describe a specification or test-case
- * with the given `title` and callback `fn`
- * acting as a thunk.
- */
-
- context.test = function(title, fn){
- var suite = suites[0];
- if (suite.pending) fn = null;
- var test = new Test(title, fn);
- test.file = file;
- suite.addTest(test);
- return test;
- };
-
- /**
- * Exclusive test-case.
- */
-
- context.test.only = function(title, fn){
- var test = context.test(title, fn);
- var reString = '^' + escapeRe(test.fullTitle()) + '$';
- mocha.grep(new RegExp(reString));
- };
-
- context.test.skip = common.test.skip;
- });
-};
diff --git a/tests/lib/mocha-2.2.5/lib/reporters/dot.js b/tests/lib/mocha-2.2.5/lib/reporters/dot.js
deleted file mode 100755
index 42a45ee2b5..0000000000
--- a/tests/lib/mocha-2.2.5/lib/reporters/dot.js
+++ /dev/null
@@ -1,62 +0,0 @@
-/**
- * Module dependencies.
- */
-
-var Base = require('./base')
- , color = Base.color;
-
-/**
- * Expose `Dot`.
- */
-
-exports = module.exports = Dot;
-
-/**
- * Initialize a new `Dot` matrix test reporter.
- *
- * @param {Runner} runner
- * @api public
- */
-
-function Dot(runner) {
- Base.call(this, runner);
-
- var self = this
- , stats = this.stats
- , width = Base.window.width * .75 | 0
- , n = -1;
-
- runner.on('start', function(){
- process.stdout.write('\n');
- });
-
- runner.on('pending', function(test){
- if (++n % width == 0) process.stdout.write('\n ');
- process.stdout.write(color('pending', Base.symbols.dot));
- });
-
- runner.on('pass', function(test){
- if (++n % width == 0) process.stdout.write('\n ');
- if ('slow' == test.speed) {
- process.stdout.write(color('bright yellow', Base.symbols.dot));
- } else {
- process.stdout.write(color(test.speed, Base.symbols.dot));
- }
- });
-
- runner.on('fail', function(test, err){
- if (++n % width == 0) process.stdout.write('\n ');
- process.stdout.write(color('fail', Base.symbols.dot));
- });
-
- runner.on('end', function(){
- console.log();
- self.epilogue();
- });
-}
-
-/**
- * Inherit from `Base.prototype`.
- */
-
-Dot.prototype.__proto__ = Base.prototype;
diff --git a/tests/lib/mocha-2.2.5/lib/reporters/html-cov.js b/tests/lib/mocha-2.2.5/lib/reporters/html-cov.js
deleted file mode 100755
index 74b46adcd9..0000000000
--- a/tests/lib/mocha-2.2.5/lib/reporters/html-cov.js
+++ /dev/null
@@ -1,50 +0,0 @@
-/**
- * Module dependencies.
- */
-
-var JSONCov = require('./json-cov')
- , fs = require('fs');
-
-/**
- * Expose `HTMLCov`.
- */
-
-exports = module.exports = HTMLCov;
-
-/**
- * Initialize a new `JsCoverage` reporter.
- *
- * @param {Runner} runner
- * @api public
- */
-
-function HTMLCov(runner) {
- var jade = require('jade')
- , file = __dirname + '/templates/coverage.jade'
- , str = fs.readFileSync(file, 'utf8')
- , fn = jade.compile(str, { filename: file })
- , self = this;
-
- JSONCov.call(this, runner, false);
-
- runner.on('end', function(){
- process.stdout.write(fn({
- cov: self.cov
- , coverageClass: coverageClass
- }));
- });
-}
-
-/**
- * Return coverage class for `n`.
- *
- * @return {String}
- * @api private
- */
-
-function coverageClass(n) {
- if (n >= 75) return 'high';
- if (n >= 50) return 'medium';
- if (n >= 25) return 'low';
- return 'terrible';
-}
diff --git a/tests/lib/mocha-2.2.5/lib/reporters/html.js b/tests/lib/mocha-2.2.5/lib/reporters/html.js
deleted file mode 100755
index aec2af0d39..0000000000
--- a/tests/lib/mocha-2.2.5/lib/reporters/html.js
+++ /dev/null
@@ -1,287 +0,0 @@
-/**
- * Module dependencies.
- */
-
-var Base = require('./base')
- , utils = require('../utils')
- , Progress = require('../browser/progress')
- , escape = utils.escape;
-
-/**
- * Save timer references to avoid Sinon interfering (see GH-237).
- */
-
-var Date = global.Date
- , setTimeout = global.setTimeout
- , setInterval = global.setInterval
- , clearTimeout = global.clearTimeout
- , clearInterval = global.clearInterval;
-
-/**
- * Expose `HTML`.
- */
-
-exports = module.exports = HTML;
-
-/**
- * Stats template.
- */
-
-var statsTemplate = '<ul id="mocha-stats">'
- + '<li class="progress"><canvas width="40" height="40"></canvas></li>'
- + '<li class="passes"><a href="#">passes:</a> <em>0</em></li>'
- + '<li class="failures"><a href="#">failures:</a> <em>0</em></li>'
- + '<li class="duration">duration: <em>0</em>s</li>'
- + '</ul>';
-
-/**
- * Initialize a new `HTML` reporter.
- *
- * @param {Runner} runner
- * @api public
- */
-
-function HTML(runner) {
- Base.call(this, runner);
-
- var self = this
- , stats = this.stats
- , total = runner.total
- , stat = fragment(statsTemplate)
- , items = stat.getElementsByTagName('li')
- , passes = items[1].getElementsByTagName('em')[0]
- , passesLink = items[1].getElementsByTagName('a')[0]
- , failures = items[2].getElementsByTagName('em')[0]
- , failuresLink = items[2].getElementsByTagName('a')[0]
- , duration = items[3].getElementsByTagName('em')[0]
- , canvas = stat.getElementsByTagName('canvas')[0]
- , report = fragment('<ul id="mocha-report"></ul>')
- , stack = [report]
- , progress
- , ctx
- , root = document.getElementById('mocha');
-
- if (canvas.getContext) {
- var ratio = window.devicePixelRatio || 1;
- canvas.style.width = canvas.width;
- canvas.style.height = canvas.height;
- canvas.width *= ratio;
- canvas.height *= ratio;
- ctx = canvas.getContext('2d');
- ctx.scale(ratio, ratio);
- progress = new Progress;
- }
-
- if (!root) return error('#mocha div missing, add it to your document');
-
- // pass toggle
- on(passesLink, 'click', function(){
- unhide();
- var name = /pass/.test(report.className) ? '' : ' pass';
- report.className = report.className.replace(/fail|pass/g, '') + name;
- if (report.className.trim()) hideSuitesWithout('test pass');
- });
-
- // failure toggle
- on(failuresLink, 'click', function(){
- unhide();
- var name = /fail/.test(report.className) ? '' : ' fail';
- report.className = report.className.replace(/fail|pass/g, '') + name;
- if (report.className.trim()) hideSuitesWithout('test fail');
- });
-
- root.appendChild(stat);
- root.appendChild(report);
-
- if (progress) progress.size(40);
-
- runner.on('suite', function(suite){
- if (suite.root) return;
-
- // suite
- var url = self.suiteURL(suite);
- var el = fragment('<li class="suite"><h1><a href="%s">%s</a></h1></li>', url, escape(suite.title));
-
- // container
- stack[0].appendChild(el);
- stack.unshift(document.createElement('ul'));
- el.appendChild(stack[0]);
- });
-
- runner.on('suite end', function(suite){
- if (suite.root) return;
- stack.shift();
- });
-
- runner.on('fail', function(test, err){
- if ('hook' == test.type) runner.emit('test end', test);
- });
-
- runner.on('test end', function(test){
- // TODO: add to stats
- var percent = stats.tests / this.total * 100 | 0;
- if (progress) progress.update(percent).draw(ctx);
-
- // update stats
- var ms = new Date - stats.start;
- text(passes, stats.passes);
- text(failures, stats.failures);
- text(duration, (ms / 1000).toFixed(2));
-
- // test
- if ('passed' == test.state) {
- var url = self.testURL(test);
- var el = fragment('<li class="test pass %e"><h2>%e<span class="duration">%ems</span> <a href="%s" class="replay">‣</a></h2></li>', test.speed, test.title, test.duration, url);
- } else if (test.pending) {
- var el = fragment('<li class="test pass pending"><h2>%e</h2></li>', test.title);
- } else {
- var el = fragment('<li class="test fail"><h2>%e <a href="%e" class="replay">‣</a></h2></li>', test.title, self.testURL(test));
- var str = test.err.stack || test.err.toString();
-
- // FF / Opera do not add the message
- if (!~str.indexOf(test.err.message)) {
- str = test.err.message + '\n' + str;
- }
-
- // <=IE7 stringifies to [Object Error]. Since it can be overloaded, we
- // check for the result of the stringifying.
- if ('[object Error]' == str) str = test.err.message;
-
- // Safari doesn't give you a stack. Let's at least provide a source line.
- if (!test.err.stack && test.err.sourceURL && test.err.line !== undefined) {
- str += "\n(" + test.err.sourceURL + ":" + test.err.line + ")";
- }
-
- el.appendChild(fragment('<pre class="error">%e</pre>', str));
- }
-
- // toggle code
- // TODO: defer
- if (!test.pending) {
- var h2 = el.getElementsByTagName('h2')[0];
-
- on(h2, 'click', function(){
- pre.style.display = 'none' == pre.style.display
- ? 'block'
- : 'none';
- });
-
- var pre = fragment('<pre><code>%e</code></pre>', utils.clean(test.fn.toString()));
- el.appendChild(pre);
- pre.style.display = 'none';
- }
-
- // Don't call .appendChild if #mocha-report was already .shift()'ed off the stack.
- if (stack[0]) stack[0].appendChild(el);
- });
-}
-
-/**
- * Makes a URL, preserving querystring ("search") parameters.
- * @param {string} s
- * @returns {string} your new URL
- */
-var makeUrl = function makeUrl(s) {
- var search = window.location.search;
-
- // Remove previous grep query parameter if present
- if (search) {
- search = search.replace(/[?&]grep=[^&\s]*/g, '').replace(/^&/, '?');
- }
-
- return window.location.pathname + (search ? search + '&' : '?' ) + 'grep=' + encodeURIComponent(s);
-};
-
-/**
- * Provide suite URL
- *
- * @param {Object} [suite]
- */
-HTML.prototype.suiteURL = function(suite){
- return makeUrl(suite.fullTitle());
-};
-
-/**
- * Provide test URL
- *
- * @param {Object} [test]
- */
-
-HTML.prototype.testURL = function(test){
- return makeUrl(test.fullTitle());
-};
-
-/**
- * Display error `msg`.
- */
-
-function error(msg) {
- document.body.appendChild(fragment('<div id="mocha-error">%s</div>', msg));
-}
-
-/**
- * Return a DOM fragment from `html`.
- */
-
-function fragment(html) {
- var args = arguments
- , div = document.createElement('div')
- , i = 1;
-
- div.innerHTML = html.replace(/%([se])/g, function(_, type){
- switch (type) {
- case 's': return String(args[i++]);
- case 'e': return escape(args[i++]);
- }
- });
-
- return div.firstChild;
-}
-
-/**
- * Check for suites that do not have elements
- * with `classname`, and hide them.
- */
-
-function hideSuitesWithout(classname) {
- var suites = document.getElementsByClassName('suite');
- for (var i = 0; i < suites.length; i++) {
- var els = suites[i].getElementsByClassName(classname);
- if (0 == els.length) suites[i].className += ' hidden';
- }
-}
-
-/**
- * Unhide .hidden suites.
- */
-
-function unhide() {
- var els = document.getElementsByClassName('suite hidden');
- for (var i = 0; i < els.length; ++i) {
- els[i].className = els[i].className.replace('suite hidden', 'suite');
- }
-}
-
-/**
- * Set `el` text to `str`.
- */
-
-function text(el, str) {
- if (el.textContent) {
- el.textContent = str;
- } else {
- el.innerText = str;
- }
-}
-
-/**
- * Listen on `event` with callback `fn`.
- */
-
-function on(el, event, fn) {
- if (el.addEventListener) {
- el.addEventListener(event, fn, false);
- } else {
- el.attachEvent('on' + event, fn);
- }
-}
diff --git a/tests/lib/mocha-2.2.5/lib/reporters/index.js b/tests/lib/mocha-2.2.5/lib/reporters/index.js
deleted file mode 100755
index 87b76d904f..0000000000
--- a/tests/lib/mocha-2.2.5/lib/reporters/index.js
+++ /dev/null
@@ -1,17 +0,0 @@
-exports.Base = require('./base');
-exports.Dot = require('./dot');
-exports.Doc = require('./doc');
-exports.TAP = require('./tap');
-exports.JSON = require('./json');
-exports.HTML = require('./html');
-exports.List = require('./list');
-exports.Min = require('./min');
-exports.Spec = require('./spec');
-exports.Nyan = require('./nyan');
-exports.XUnit = require('./xunit');
-exports.Markdown = require('./markdown');
-exports.Progress = require('./progress');
-exports.Landing = require('./landing');
-exports.JSONCov = require('./json-cov');
-exports.HTMLCov = require('./html-cov');
-exports.JSONStream = require('./json-stream');
diff --git a/tests/lib/mocha-2.2.5/lib/reporters/json-cov.js b/tests/lib/mocha-2.2.5/lib/reporters/json-cov.js
deleted file mode 100755
index 309c0ef54a..0000000000
--- a/tests/lib/mocha-2.2.5/lib/reporters/json-cov.js
+++ /dev/null
@@ -1,152 +0,0 @@
-/**
- * Module dependencies.
- */
-
-var Base = require('./base');
-
-/**
- * Expose `JSONCov`.
- */
-
-exports = module.exports = JSONCov;
-
-/**
- * Initialize a new `JsCoverage` reporter.
- *
- * @param {Runner} runner
- * @param {Boolean} output
- * @api public
- */
-
-function JSONCov(runner, output) {
- var self = this
- , output = 1 == arguments.length ? true : output;
-
- Base.call(this, runner);
-
- var tests = []
- , failures = []
- , passes = [];
-
- runner.on('test end', function(test){
- tests.push(test);
- });
-
- runner.on('pass', function(test){
- passes.push(test);
- });
-
- runner.on('fail', function(test){
- failures.push(test);
- });
-
- runner.on('end', function(){
- var cov = global._$jscoverage || {};
- var result = self.cov = map(cov);
- result.stats = self.stats;
- result.tests = tests.map(clean);
- result.failures = failures.map(clean);
- result.passes = passes.map(clean);
- if (!output) return;
- process.stdout.write(JSON.stringify(result, null, 2 ));
- });
-}
-
-/**
- * Map jscoverage data to a JSON structure
- * suitable for reporting.
- *
- * @param {Object} cov
- * @return {Object}
- * @api private
- */
-
-function map(cov) {
- var ret = {
- instrumentation: 'node-jscoverage'
- , sloc: 0
- , hits: 0
- , misses: 0
- , coverage: 0
- , files: []
- };
-
- for (var filename in cov) {
- var data = coverage(filename, cov[filename]);
- ret.files.push(data);
- ret.hits += data.hits;
- ret.misses += data.misses;
- ret.sloc += data.sloc;
- }
-
- ret.files.sort(function(a, b) {
- return a.filename.localeCompare(b.filename);
- });
-
- if (ret.sloc > 0) {
- ret.coverage = (ret.hits / ret.sloc) * 100;
- }
-
- return ret;
-}
-
-/**
- * Map jscoverage data for a single source file
- * to a JSON structure suitable for reporting.
- *
- * @param {String} filename name of the source file
- * @param {Object} data jscoverage coverage data
- * @return {Object}
- * @api private
- */
-
-function coverage(filename, data) {
- var ret = {
- filename: filename,
- coverage: 0,
- hits: 0,
- misses: 0,
- sloc: 0,
- source: {}
- };
-
- data.source.forEach(function(line, num){
- num++;
-
- if (data[num] === 0) {
- ret.misses++;
- ret.sloc++;
- } else if (data[num] !== undefined) {
- ret.hits++;
- ret.sloc++;
- }
-
- ret.source[num] = {
- source: line
- , coverage: data[num] === undefined
- ? ''
- : data[num]
- };
- });
-
- ret.coverage = ret.hits / ret.sloc * 100;
-
- return ret;
-}
-
-/**
- * Return a plain-object representation of `test`
- * free of cyclic properties etc.
- *
- * @param {Object} test
- * @return {Object}
- * @api private
- */
-
-function clean(test) {
- return {
- title: test.title
- , fullTitle: test.fullTitle()
- , duration: test.duration
- }
-}
diff --git a/tests/lib/mocha-2.2.5/lib/reporters/templates/coverage.jade b/tests/lib/mocha-2.2.5/lib/reporters/templates/coverage.jade
deleted file mode 100755
index edd59d8864..0000000000
--- a/tests/lib/mocha-2.2.5/lib/reporters/templates/coverage.jade
+++ /dev/null
@@ -1,51 +0,0 @@
-doctype html
-html
- head
- title Coverage
- meta(charset='utf-8')
- include script.html
- include style.html
- body
- #coverage
- h1#overview Coverage
- include menu
-
- #stats(class=coverageClass(cov.coverage))
- .percentage #{cov.coverage | 0}%
- .sloc= cov.sloc
- .hits= cov.hits
- .misses= cov.misses
-
- #files
- for file in cov.files
- .file
- h2(id=file.filename)= file.filename
- #stats(class=coverageClass(file.coverage))
- .percentage #{file.coverage | 0}%
- .sloc= file.sloc
- .hits= file.hits
- .misses= file.misses
-
- table#source
- thead
- tr
- th Line
- th Hits
- th Source
- tbody
- for line, number in file.source
- if line.coverage > 0
- tr.hit
- td.line= number
- td.hits= line.coverage
- td.source= line.source
- else if 0 === line.coverage
- tr.miss
- td.line= number
- td.hits 0
- td.source= line.source
- else
- tr
- td.line= number
- td.hits
- td.source= line.source || ' '
diff --git a/tests/lib/mocha-2.2.5/lib/reporters/templates/menu.jade b/tests/lib/mocha-2.2.5/lib/reporters/templates/menu.jade
deleted file mode 100755
index c682e3f0ee..0000000000
--- a/tests/lib/mocha-2.2.5/lib/reporters/templates/menu.jade
+++ /dev/null
@@ -1,13 +0,0 @@
-#menu
- li
- a(href='#overview') overview
- for file in cov.files
- li
- span.cov(class=coverageClass(file.coverage)) #{file.coverage | 0}
- a(href='##{file.filename}')
- segments = file.filename.split('/')
- basename = segments.pop()
- if segments.length
- span.dirname= segments.join('/') + '/'
- span.basename= basename
- a#logo(href='http://mochajs.org/') m
diff --git a/tests/lib/mocha-2.2.5/lib/reporters/templates/script.html b/tests/lib/mocha-2.2.5/lib/reporters/templates/script.html
deleted file mode 100755
index 073cf7939c..0000000000
--- a/tests/lib/mocha-2.2.5/lib/reporters/templates/script.html
+++ /dev/null
@@ -1,34 +0,0 @@
-<script>
-
-headings = [];
-
-onload = function(){
- headings = document.querySelectorAll('h2');
-};
-
-onscroll = function(e){
- var heading = find(window.scrollY);
- if (!heading) return;
- var links = document.querySelectorAll('#menu a')
- , link;
-
- for (var i = 0, len = links.length; i < len; ++i) {
- link = links[i];
- link.className = link.getAttribute('href') == '#' + heading.id
- ? 'active'
- : '';
- }
-};
-
-function find(y) {
- var i = headings.length
- , heading;
-
- while (i--) {
- heading = headings[i];
- if (y >= heading.offsetTop) {
- return heading;
- }
- }
-}
-</script>
diff --git a/tests/lib/mocha-2.2.5/lib/reporters/templates/style.html b/tests/lib/mocha-2.2.5/lib/reporters/templates/style.html
deleted file mode 100755
index 4c9c37cfd9..0000000000
--- a/tests/lib/mocha-2.2.5/lib/reporters/templates/style.html
+++ /dev/null
@@ -1,324 +0,0 @@
-<style>
-
-body {
- font: 14px/1.6 "Helvetica Neue", Helvetica, Arial, sans-serif;
- margin: 0;
- color: #2C2C2C;
- border-top: 2px solid #ddd;
-}
-
-#coverage {
- padding: 60px 400px 60px 60px;
-}
-
-h1 a {
- color: inherit;
- font-weight: inherit;
-}
-
-h1 a:hover {
- text-decoration: none;
-}
-
-.onload h1 {
- opacity: 1;
-}
-
-h2 {
- width: 80%;
- margin-top: 80px;
- margin-bottom: 0;
- font-weight: 100;
- letter-spacing: 1px;
- border-bottom: 1px solid #eee;
-}
-
-a {
- color: #8A6343;
- font-weight: bold;
- text-decoration: none;
-}
-
-a:hover {
- text-decoration: underline;
-}
-
-ul {
- margin-top: 20px;
- padding: 0 15px;
- width: 100%;
-}
-
-ul li {
- float: left;
- width: 40%;
- margin-top: 5px;
- margin-right: 60px;
- list-style: none;
- border-bottom: 1px solid #eee;
- padding: 5px 0;
- font-size: 12px;
-}
-
-ul::after {
- content: '.';
- height: 0;
- display: block;
- visibility: hidden;
- clear: both;
-}
-
-code {
- font: 12px monaco, monospace;
-}
-
-pre {
- margin: 30px;
- padding: 30px;
- border: 1px solid #eee;
- border-bottom-color: #ddd;
- -webkit-border-radius: 2px;
- -moz-border-radius: 2px;
- border-radius: 2px;
- -webkit-box-shadow: inset 0 0 10px #eee;
- -moz-box-shadow: inset 0 0 10px #eee;
- box-shadow: inset 0 0 10px #eee;
- overflow-x: auto;
-}
-
-img {
- margin: 30px;
- padding: 1px;
- -webkit-border-radius: 3px;
- -moz-border-radius: 3px;
- border-radius: 3px;
- -webkit-box-shadow: 0 3px 10px #dedede, 0 1px 5px #888;
- -moz-box-shadow: 0 3px 10px #dedede, 0 1px 5px #888;
- box-shadow: 0 3px 10px #dedede, 0 1px 5px #888;
- max-width: 100%;
-}
-
-footer {
- background: #eee;
- width: 100%;
- padding: 50px 0;
- text-align: right;
- border-top: 1px solid #ddd;
-}
-
-footer span {
- display: block;
- margin-right: 30px;
- color: #888;
- font-size: 12px;
-}
-
-#menu {
- position: fixed;
- font-size: 12px;
- overflow-y: auto;
- top: 0;
- right: 0;
- margin: 0;
- height: 100%;
- padding: 15px 0;
- text-align: right;
- border-left: 1px solid #eee;
- max-width: 400px;
- overflow: auto;
- white-space: nowrap;
-
- -moz-box-shadow: 0 0 2px #888
- , inset 5px 0 20px rgba(0,0,0,.5)
- , inset 5px 0 3px rgba(0,0,0,.3);
- -webkit-box-shadow: 0 0 2px #888
- , inset 5px 0 20px rgba(0,0,0,.5)
- , inset 5px 0 3px rgba(0,0,0,.3);
- box-shadow: 0 0 2px #888
- , inset 5px 0 20px rgba(0,0,0,.5)
- , inset 5px 0 3px rgba(0,0,0,.3);
- -webkit-font-smoothing: antialiased;
- background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGYAAABmCAMAAAAOARRQAAABelBMVEUjJSU6OzshIyM5OjoqKy02NjgsLS01NTYjJCUzNTUgISMlJSc0NTUvMDA6PDwlJyg1NjYoKis2NjYrLS02ODkpKyw0NDYrLC04ODovLzA4Ojo0NDUtLy86OjwjIyU4OTosLS82ODgtLS8hIyQvMTEnKCooKSsrKy0qLCwkJSUnKCkrLCwpKiwwMjIxMzMqLC0tLS0pKissLC00NTYwMDIwMTQpKysoKSovMDEtLzA2OTkxMzUrKywvLy8qKyszNTY5OzsqKiw6OjswMDExNDUoKiozNDUvMDIyNDY1Njg2Njk5OTozMzU0NjY4ODkiIyUiIyQ4OTkuMDEmKCowMjQwMTErLS4qKywwMTMhIiMpKiopKy0tLjAkJScxNDQvLzExNDYyNDQmKCk5OTslJig5OjskJSYxMzQrLS8gISIwMTIoKCk1NTUlJSUnJygwMDA4ODgiIiMhISI8PDw6Ojo5OTkpKSojIyQ7OzsyMjIpKSssLCw6Ozw1NjlrfLakAAAg2UlEQVR42jR6i3ea6rYvPgANIAhVXh8WvkQlioUiFlFcBtAmoiRNdzxqu9p0J7vrdK29zuPeex77nnvO/35n1r1ndHRktI0jTOacv/l7lCBK5UqVpOha/YxmWK7BC4TQFKVXrbYsnimqxuuMVlOQ0XltWjUdCwRJ1M+tC1KudOs9q6+da2adUewG0SC0SwELfHtgDds93VEuydEbl3QMWeNoYkR7b/0x1ZRobGI3mLwzAhePqTAwhg6aogjNsGy7/jwQ4rkdqe7CWLxF8k9LfMVFyRS7VJqtkrW8Vt/bkR8FZJao16ipknbC3Yw2lM7laO6HBEOadEZ2tpf65c4v8e3u7FyU6qbiNNyCuzXZ6pawgnwgmrpTT/Q7w2EZmiIJ0dzWDI7mhQ80IfRnMu2kzA5r5r1pIFoia+/d93HRYp1GV8TbrkWoU/+jdI0Ff6yGwTjT1Hn8J+8m1rKpGiYPuNiHnMtNMIv+zpsk84MYTNW1/+DpwXLvckdOCMYowVNPREe0QlM8xRHXXFhcNDzupwsSmb5pH+0t0RP2Qk+QtI7F1Qm6JRC6ZPBtPq/dq/kH+jxtCljn9TIpW6rQIgmSVyj6lPICIw4N/taka41PFUInth0je9+jO6Kt1G4/a7V2LEgG02B0pHVuCZrgltSKMuIl5SyufUv9mYuQi+mFgzbBEtFo2g+Dh4sSTrLNu8JPh00sQydpb00tqXBvqRN7Q7kqzcnIxCGnvZt/WmJacoOEO6Dcn8Qre03pOCSQxbMOXUuDNx9SxuLz4W1I18gvjViQ67zV0rxdWL8Te/TQkuo8STS41DR48W7L6YP2uWIqiUV8rd6Gbf/rnegKZeG8TpAM6afhGze9JAOxbLjsnUXEbrZ9vLYd7MT32cPF5mKKxmjy7huaoD9n62GOxni3iIJwv0IzZAZjdZkUtolCNLVfYZNaquFjGszVVf+J0vrz4CawoKdHnOzb0NMH7CDBOybfYNJ4rfeMyFNjkFYVTzMFs87rnPGXLUOeNKRVc0LnU7/UIgelzsy3CMuth0YfvnY0wsD3vODUL3eJcKqHQpm8yM3XZQWJxO6Un9iYloyyLpOwN2obHy6W6gbpcb44XmyC+mg+itAcaprGcrwZCqMj/GmtKn0zPvpTz/Cv1dw21XwP3cRupg3H3MF/S71eTKj1YrdwKdc2Mw0fRmb2sFf8lW3aU6JbIZSEPqvXvjM7G/aApyXlXeqKfMq0g/Su3rUGJPSPrtGElgknrZM3xUXqsAP6zMCNVn5u8aJnSNpJv2uru7t2jfRziW2+GuhqfldUNbPk71olwo+46ePUo1U3WKk/e5YK07F/wGRgcpODmQnIlVeHCWBE4puBi2jq28UKpqiN1/4UOrGz59TNYrrQHtd+11sG40BGD+pXdelNqGOg4NXe8W4eacJV/NS9/2Umtym6WQqveqR9xdCMElpxnbkalM4Vf9uaEcWZaKdyibEIjWKxJZPN95niCL3GiaXyssIrHxoLkqkzLCXULN46/f2h3tQJgyip+Tk9EAjJ9aJshq7t8X45aowSKspMSvPf7r9R8yxNptIaHS5ozuEm6luPDApugyNP8OaqiQ4BjaequXA54SLC83eHIY2r+CZp4409Xqw8Aa2oI7XkCrQi+in0w5AqF/kLNrcUz+qkl/lAobY1jSnx5OJNhyXIz3qfNFlXc0TKaglNwdWkWYt9QQ1Kr6W8zue21iNrdJk+N5oCr2O9nEtWKC7IS5J/zdDEYrmnAYfg6agCy+qcgz7ZofeDc4PbUWSvkshWuAc7OjiUyLkj+RAtdlwXJcjxdpkTTHDhK8lBCi8+JtvDVL1W6elmOM++YS0LuSlaP1oUvAeiW3cFnvTr8EbTz1tsSMYdGeZe40sRWu5uAfj7q+ZoKv2FNQ0p5XY1lmlcigHZqTPpabufEVrNuNPi165w3uCVQJHyJqmSJ7ZHnguqwtCmwViIJijj04ba2JNYtB+yORf5gg1/9t9iw4vUpeqiunSAbf+IBdj/b+iG2qrHvuNP0Vd/+ThVZT/lrvHYjjgDbbyxaqgHNM2uhxa1GW3UedZYhMMwM4mQhltouK+IV4NdbIQNM+8Yv311RZk9kT4tiYR4LkyFcuPpdcjuhUuFqBAWRZa11lcZ3gEBlXywsNhrt+plISZP5DlsV9l4EgY6J3yZPTUcMrgaWAT3oI79eSbGEbcJpr6BD8kyDiVt+G0/hXosQN4NFXKlfWIfsIs0BHODVok1/IGnKFHJYIquh8Xo+2+bkQNTGgWmN/fZ0Y33LSj6lr1GyV7mWIKg7ZTRZPGuhF/zjRNcQ1UPtSYgnWQxSs0yrVhwNDcdGMNSNe2JT3WuzbAM3HykyAajS3Uphf6STKEqxLas9EnmnhA/lyj9Uj+JoY7SVgVmGLl46Rm2u98sbkap2lzAdKBG4r6LgulQOSSjQv1GWdQ0jtDUK/mAaqM1Uqjpu4k3Rvfvxv7YTxLSK+wN3E5jVIzmF23uZ7hiH/sVP49D7tvoKp4S8b1LuvRlivVB/algbhcFITYVXvDpLzpDfplR2uD5V4XJFxpjmIpLc9Y5sB2TpBRix7Bme6GZIq+06v3XzNeTcA4obQIKxrnT4C2JpOqD92dbmSX8MGazly5EsZVMvSU1f4RZwyu8iQXbVdeLlZrjuTT1jrY1uk5c7iZ7RsvhhluqAkq4JpVQAg7RJFtSu+xgJ8Pv6O1j5DkLxT8mkbfyRW5DrQmG7hiDIjCgBsADbjuof6YHLGeV6a5Q1Smx9joUXPpdaaDx97A/Wq00oJkdR7ZYuQRfS533JtxO1erduqWOYIt3wh0wpbLuCNIYkwxbswbikCUu2CDCS+Q+7rgVtfRcm+SOcdKPRlZ/rE7wNVUEE39KTS5uvUKN1PUnkloPkyzhyGQ8qkouEjJ3H/VXdqG6asSRiw3ecMlBvDDt8dDhBHXMwZ2Cajzjr7/76T+IavqPYvz6r7//E/3X3+N//h/0QozbjPgPiir69P/8X3/9F/yv8b/827/++98WItPu5/Hvwd8YPf5bp/2/lX/T/+Of/0MJ/lYTa+L/Ef+d9vN/3/2T6P/+jyTzu/evf6U7vxN7B6pJkRtAF6jUr8I+P8RsP/ptGhfqFk+pQ/DgAy6NJtRYJdXmp4gK7WLqLKJ+MaKhGjOojvL+SnIWrkpy0SLHDe4QuyNzaEA15mLMCcmE8Em+4HdOihW4/ZWuppJEmzeAwcDtv7MuLc9y2V5atvxXNe3S4DUMt5/Qy2LM9kSYKiVWBuKlfp4nxTntpuW03JbIlkiRvBXmT23g1I2OYe6IizUHPIq6zm6mbfsbteKmi/sg9J+ocQBMctGFO7iljo8TPN+z3jxw4do+ZwfqoR9dkNTKHyM305GpTkfhcHexVkPVGEbUOjuo9f0UMPHBFlGEx0SLvJvVRKTwW7PSew5oPme+E42+frJa9cGt2njS3dK5kIif2eYbhuSEQXEqMVfUjhGIuin0G0/W5ezJyJQy3SpMLai4M0JUWb5u1k9tny5bd1pPwYBpQuDCXZl62xg4CdVEAtflXHs6JKmP/pH6mOl796Lgopj0o8d5kKh00hxG3OSdEE/QBo9Hgr8JJqAeLDwJohG5j/DGh61Rc/+tf22/8kEnxHNCEjo0ElvvGfESZkqmz2BDcKV1H1buSkhkdg7p1IMGs2s17nYjpblrWuE2K9WEO/hcRp5e9oOF/QBmOaDtgil+oaU6szPrdwW65fOB0KUTsVUn7LFU7J8e6cxJIl9+FHw5MQMzuQJ+4oxMH3iW/5GK+hWuG0T+gTLs+fAjdtUd58TmIUq04EeyRCYCjkldow234aIgR5bqwrtZosZ+6YEqAmDqatJ9lWasz4IquKALPtd92hGI3Z2BdzzZue+REl1Om4DIWD+RrtUTOJLI+S0jHowXXdAxsGLSd40zYNuEUlOGhrwL6c7tcOtUOvpJCP7QBQS19H+GvZn05ewjlVLz+IGKoC9TyfQjLMBNmXCuqqtTdOSukZW48B0HqgSTCBrBnlFvF4CG2Su7yFzqmJFURK3UmTT3ru050r0ptUpMilYnBJWfl2Bv6kPlUuE1kxxpdzui9AubsR2N2boVSu81OulAwBqoSr1LZ0LLYOomyZHmjqnXlP72s8LnDouEJjtodBvdHaG1jMySYO7crWd90MpCRyCG14vb5IE7Arupw/y/RcCm/Tm3zK6zYj8PYNaGldiUfkB/LHWcmf2lVM+mwyU27a0qq2tscrQ/vzBjN26DnntIrOyGizzXK35yKQdYnUABkyN4saz3WD/viF+eCcsXnIajdWYJWaYHRstIis9CS+tqnFGmz2j5uzfr3Z4prqgK4XOT/PyftvjZqIm8lhkfxJ7Ol3CJF1piYBGAG8wtAk56Drw1YwmOpcz+NdfkSpSLplRXLXHL0Rquj6YW/gabqgK7Dgr6NwtH0B/AN7XrN+MVJ6AmXmUuqmQulrNNYPmH0RoDogydOKLo/QbfYNARSQQKISRCzRXU+q9WWJFL3LZW6u34CkeG97xC0NNGaJ0bvK6SnZS3zPskr5EtuCgjMWR5o2x5BqhKmDWJPRe7JMEOyRb5uUKlHaGVtq5ivSOaSliSXp9SQm2qk8MRJh10MAp9QQ2H5t59J8rjiwSZtoIfMGjlLPVNdYl/LBR0AO6WLGDmkLkIPRE45Y9MftdAK/yNu1Hn6tzOQTesgQ+8fSzB19wO91vCnO23vOWQdwJ63SJrYjdfKFW6W281PKs2k8iT9ai1cgJ4sa3xqdvmtxR8/+D1B8AKc2u+6JftryRhMWSQtoSBgIyyQGyxcnELuAasXN12oSriU4RMz1DD6RL0TSV+om7i1Yt+jEE/jnawM8cX/UhN4nkiv/w9eALrzNhXuQfOzFL0Fi6SjF7/4Qn8rLYBoa85cvgAnkCEBP+HPbEnquVXCZsMS/yzYw2Vru60P/+nJPYKkzZFjmbykzUoEqV836T5q3fP/L383dF82tx18/AZgZczMAgyeWYKmSZIqtHL+e+O4ZRcq9VI3g/qPeCoiK4pcgEqdbS0S/Be54sbVQOuJVPNBblIghzeasNu7h/g+Sz1IdhI5lCwq1nUb3Ji4OCIcqQZqtqJ5w7rXrg/DA9IgVmEGhDgGecEwnCTHffXcXs0V3OCEVzYDKS1vp/oX+ng+6XVU86UjA6FMO2RXOOOrqY1GgPvrAk9HV/BXtCu5RuwF8qgdGDLsBcui4E33ymdBip1X8uKyhIWT8qNRDsXz+gvO9UiEC0d8RG4Tf2x8H4slljgHtCBcxHLTWOYJm5H/fCPCzOgf9qgOUxTRZ0Pc6ha5yLuLVT9ntvIa6gacE99mCovdUumTQdRP4RPsS9129eEe2uSvvGh0bV4Y3QPPhPZMqhZWSMa5R0Hc1SGO4IVOQc0FrirlibTVfKRrYkD8kz3b+X65/QkUNaZdrdl3mCap0Hf3YcCw/LiouJYNbqz88UqeDYv93yO7vvXtgl4XCyAO4ODkY6W+83+LZU//p3/zXNGGrUKClCiOnL27iJZbNWDF02XXAOeFlB7IaADoMH1Yqr+UP9biyZDEa/iJt4MDeIz6GKTdLVBfWGVtRN4fdT2rgReX8UXwF2zOrradm4J0nyTgdPnai3RvzpZvCKDUqjOwD/QA6EDaMCLewX6QWYVnHY1sx1bd8ovYnPm1ZvPH+rE20lWjOCnZ66/xDt0QAl15FjfBcZp+i9OU0RNPQ0t3x2pSNWo8eiYudwsnuP1Hq6iH1LJCJynkYsfgJ0p3pF6SoQk2l+jqE8CPk+ziGJRSKjs+W5AO185umPdkYzlK4wl7TC9NxyyDP7ZoyYVoXiuS6SjnInlLWrwz1i8bGTKXX0AVQWkSfIlglW3zRJRJ8bg5VgE6ZEnqNu9B++0GNQvDQJvFize4ESNKBJP+8vA3LM4AX5SIBq08Mob+7QMTCZx4nwP/64+4BnlZC+8WtlP/CXw6t1PwMwkJ3jhP1FiXLhDF/3I6FGUzO2DSi9ABxKyyL9paZxSEz40ZCPQToDAJu1959k7QdbVxgB4icsu2s4zsTPJhcEDo+N1GX4zSk/wriRh8AqwL62972i9HJHd1ydaLXVzvKvOfGGw5RVcUVMiKXFH4APdkQU/dc5BX0YfKTNZYXCW9mb8bc8mufoQP6BbdQmT99ZjoYfr/go4TgQX9IDgztim7wyFeGMfbNaeqj8Dzs38pgcqwSv2hbqB3oSGKWKy+sesY7p57wAHldqE6NDudk/W7s/zjrK4rZFlFvaGxnSZdHbc1y47qDN6xkoK8O3bfr2j41dlJZ71rB4dlDqapPFa8N6xBrprUdtenUCHwxKNhw1uuTBh+9uU45k4REpQABN2bAO9DSLqoIL26gNroWgup5pUMxHUNSq4Gyz47vBPvilpo5f9OYI2ddAqTqmnxXERxQJ3UK8fHbVE9HagHi3+tqNRoNsArdmAxHA5LwtQo9ZAaNKUTljnokljo2x8scqVpEEIPc01fPCdHOCg0DeWBz8D5TVAAfx8aRH5X2ZYNI3ebKDZdeJ+oBDAxmRqJ30Eh2/DaeAy5diVNMpEDmXiPDsGTzBLXy8eVDdJoIafgx/gxMyQi454QrW56nCyeELgSuNNEmYkflF+t3CZQOVRWjKhIuCclmQSlAXT3+4JGG75B4t/5hQ+ldMP4LsAW6z3XmU6IJJwpnGVnsgUZhoY1fZlwTR8wSU7xRejf2uCx9Z5trVTRRJP9KnEb134dEieil6eCOGWgboI7xsqsqM99jfJLTePjygKlH2CVxxsse9QRzTBFjD/Kjqitr/CCTBt/SJ6nLxz7cKP9pFqBpp0lN5y+adKNsZjrPuroemZauH9aTTFD3EKHW8S55XBLFQAt1jgxTQCTwxmx/JyfsZDN1RroN3VaxpSenpIX7K+ZbL8VdlQDcI4Cbzg3QJLa9yVqNxUelu+EtxLVqeekaAvSJkO6sSVqbUajxqhKshNpvZqoeApF0k/0P0ikkwUcbdwc4A1ejN7Oo0O15kG7hTMoK3hZRBCX7YYeLW0wvcXx/18n/u37yLgzBYVBUvORGli+sfRcX/74uD6P4hq+7xu54TlWJLFzT63uwUDwuEDdOjJQqx7JV+ZjaEAPi7t0MMrR4Q8Rkf18uxD6RK0RKh0hL8YU+DeL97i4pa5ZSyAfXKwZRS/8gXcxdZXm62RBDj8U3sN8x95b5PpPs/mCBKYvpaA50pN5Ct/499AFTtwQ5vgeSh+NHrKIi4NVpwM/XzRaNfJD856lPE6M21zWPguFsH7jbLVyEDfRmt4VwrhCJ5VTYmcSPfGgO5clfN+vbaDZ7sakU5+2vZ2WCDY031NxJarVytfDDVtiafcTGO2rJ/taoL3zChN2qmjxofczTOYQPPVQPh0JVtYgdUQINcSiNEEy58UdYXX1MpWUCEBx7LbcGtAm8XWRQTVOaoV3ySri4RShhs/B/0m4jX6OAwXOvcA09bNSG4czEGv/Wey6V/jbTCNTW6awXdNTcA1GsPe1E9fZdGl7R0vyoVpIdJtfC6d32NNErrvq/R+d65VG+YOwRXppXxOCYyGNSf1K3x6VxAW/vtz4EC1SgCOSPdN62sLsoIzuDfg8GwZAbquVO8HIuFP/ToVoeUB7nnwMF35a1wK1tI6fkrqFKhQdeJpwyls0pIy8AZde3/6LUUbFaYJthyUJSU/kqDXTLQElnn0Jr4B2RVghNrmNmoEn7pXIeshPguXVsvwoTdmClq49JJU3LWhHyWTrJL9bRP6VKv3tZoA/th77p5Jw++OEENvyvWy/pNeExiDUVQaXIRGh8xySZTI36yueFaSXo1uJY0RnXYgEOoWWOJHeaVuX/bGNhHsh2yinznl/++NJcE9j6fBPRcBdq9hb8awNw8U7Bl6GM7x69EDOIIbX/npZ++amlHR9L/35mE/2Ss4gb0xCcY4VyTFLRE796vHysLAamqcyO+aFQyJIDBNslbH2/MrAvZiSEIedc/cqjmv4fbda2pXbv+F5a2szSsdkm9noiNURXt8edUhGUF6fSZWd1IJaXKFwD+49R6eCXD4Bkef7j9tRtNMVgW8BhRz/Qpy1TmeYk0doyjZoJSbePOReVHgkFsCFuQJ+Lgc4BxeAsK/cOiNDRmdNw0ctYhn/nQ498dYI5znzGLoJi1rav7Cn88rL3wLePVtDK5gl77Tki3gHEsIAQ2+IKgarj7Y8W1IQzV5V9N+0TjLqbg68WfKcOmBCOj3JkwJhVIkwDhc+JorXuZEPMEh0vvH3x7iqf+VAwXgd4diZiaJD1zHL9Snx6Wfg4IugreyhabQkcir+y5XgDtdx3Avs7lkeeCBwDvZoTUCXx5QrZkcEqWfYEiEYRs/EphmRALSNGR1Iclgdr5VFoELpzF4++f35w3/j0t5ucW3n2ch4PQCLuUXupsPRR7UA5FjSKrMtPcKAZJfagO4lGE7FH3YKMjorpK0ZxAv+i2JkJhtAMWWWFej4RhPR/cJ3DxwocCvXDi4SGZU4cu+K32XndiFWgopAl+0GApcwf1XvymJcFs39jExIBO4yUjU9MExBLQYc9H+W7+IgdESPRpciT+rKZPebVtaVq+1GYO/5xTAL3HASjNTGIgMvdjWbgc7JvdE1zIFpuC0U9ESiZyzBixzxWxj4Kwh8My34q+FK3KNLtmsA1qyrmKSNQOXCPUZd+ONelBTvFoUI/CYsqa/RhtKiyMf2CgSFqEPk59Y3uqnlZ8gFpswfSYyko23yVZYxzKGxGm49Zqxg1l8oz5Ra9XaRwHkuxepmgyhm0SoNy2KlbcEqK+9QqS9PNx9Ihm9U7gsR55SSJ1FBDNnkuWKxIZ0SDpXuOGwZdoUbOMDPHP4vBAgz2VlSEJAHZGJVbYIg7l/FO5KfIVvxC8pPPxMGcNMoevFDeStt2iqztE10n2TA4dgJH76YS9HDhKHD3iCx6ieFX84BAI3QQnngh76f5ruPQVbr5qZmck/5UjDc26lfrOvUBWy0Ogl8bCoOkMOns81TnC3cuUS9KW8+9A+fe3XYZOFUPG1u5epSSmDLw0s5s2F0W30ANeo+zJkJQz9SPZgzwYpEoktofhGVfmLOAB20boCbW1QWq/NpET/hnMecw/uSyAH4NJc3ECOU4nnkK1fj3S/i5dwb3R7k00AqQQUwt7Ie1qV0aY/VQX0J8hLPy7eBNXMHYZYDNxHZ2Qh6AuXJxq+AeRec/Q+JLhZV6hpXwQEzw7bf5v9uUf2vpq3qlhmy0IIGTkwYdCfSAFmqbdo+3XvDTDjFJde0mbeQLcn2n31xaAqJ0ixO/CLsT4I4G4DoncVTgRGNBtsCcjISWT+oeXZ4Iedw/8OsJI1aPnNKLX/60VvcZb94uasRxCkqlPQ11u1Sa2hHvB80WQENxVyzjns0/PiEByyil21Te6oisk3mNCEMrhouCFO3yEZTHHOCMy9eb/4Tmi8cVf3Lf7P53SY2hX3PSN033As3ETIMLHWumWEO9JXHA2y2SIBlIPpLGG2qvNsCIlIr+B1SWAqRKm2w6Blf7U+zCSBwJrfHG5i8J5Gax/cVonMlon7aHJX/gSvucIncRP93XCqkv7D8IFKFsLiBgHqUpXhE3pYjEcV1dk/JD9zFVCfEaQIVX8Jmfz7IIofcBKQ4OaG+C3xC2veX9CD+iAFXDNaGg9eTVxvkbJRJlW4Nk9Wk13kn696jWppRDe/8pDrYMO9ZyxZ98ReKSz9kWKLLyk2zCZgAniCkLJVX3n1M9DYbomyahWiv/KixRIV9hj/oFz87I+HLznbPTjpa+D+bZQnMuRsljTpv90vQUt/pK7jCFnA30B/jtroSF2/m/gpWn1aQs5WeA6ghzF8SdqWI20fghdSeDOCSCmLgTkfaGgGDmw7nHFkRzGtag57IHS2na06I+gzEphXo1w/Zx2BM/jKL2nZoFjHggtFQjYi8nSVRSXIE58RPbBObXk7uuIL9+rs/5Zo7suJInEUxgsiZZAWS25iBtpEiZeBgDtghEoAE0sjcayNq85M4tbu/LF5h51335PsGzQ09O875+vUS89lkWMyNOFoip2PuyWyMP/iU2XIZdfCCJNDjebDoBLQdpy7QQZC7s9c0wjHJervQNDu2jWzBW5MSAJMr7bP+Iv92BkS/GGgzjEn7MF1IRKFwwzbjbS4/slGOmhx9cZrFu7HSEefojNv3r0UaKfKOWzXsq1zEugbzlMDFsacRJJI/iJlK3vtkZ+PLZIVMFlKA32wbq2Kd5T0uCLZ1CPkAfCdzkz2EYscjDcZq2AWfziN2covN4kXE1lQXPPLTNM1xx3tbiepcO/t3SWm4w87qfh99SL0ZnY+LKFPLPeXVM2mIIoVWt+9Nk0I7nY4O79iGYqxZ8RVz289an6NVdJWnSKZvJQCAuHNiVaDxPAFoH392t9wot5t0/qmU95eEWNbU2udUW5sN9JVqcYlvAIfLeYC33oUzzxZgSktsv21mA7Uly1FA5VnoJFh6N244Wmv3YJGFv/TCPryaw+ZORlpZjQdq/2DYXr3EZskfed0G61P09ipTKmlTQ1067Rg5+PAk5FlQ9e0SWbGf2B/08kqymOTMVOznsALHHNFH4LFRKl2F/NOiYFl9khNHnSu9Ak5sq26Ynl/i2fdTle29Y1ugqmR5Yj4YT9pvslFyYCbw0mNFr5rVQm1LvkG27QMq9ph3t8fmn6r6SQ4oSbr5tz+J1kIawGzDxb6VYOvvWhobDTXfBeNv3b4aNm5XUinsCGqG2q/45m3+LoCOsddFceYhRx1Tsss9PLdPfJdErFMjYd3gddjiP0+XQjcRadZP6bwNLySvunFf20Czy6JqdEW2a96KxdYdOryBv1BjbuUq2yCHeh+6sk7fGmmPi50pe/1l5TyPe5oHW9oPnhPswLyf2TFDdCyYlhwBCstv5C1HwlW7xWoGT9XZt4qVj5WryLPLLD6h/5cMLEjWzgCeAIKNsLak92aBqBsHl4AJwl2N4jfvbSkBExGimv0nFvv09uDScQbjx+w4kPQjgjlW+g9ws9VEJvI2k8N6XxVu0uIwovgTFdunG24gBtaDi+y1YLQwZ8mwbip5fVlO3k0n0AEr/ETbtu8Vjkm+nNSiEb7X/3fMjBL5A8PdgG+/FnbexbFFExmEfetXAnisEKy5z44WVPpQZjSy/jzeGn4yDRsFGqhh87QPaDBWhlo37IFbe/C0xynS91d2tP/AJoJS0sVF6iwAAAAAElFTkSuQmCC");
-}
-
-#menu::after {
- display: block;
- content: '';
- padding-top: 80px;
-}
-
-#logo {
- position: fixed;
- bottom: 10px;
- right: 10px;
- background: rgba(255,255,255,.1);
- font-size: 11px;
- display: block;
- width: 20px;
- height: 20px;
- line-height: 20px;
- text-align: center;
- -webkit-border-radius: 20px;
- -moz-border-radius: 20px;
- border-radius: 20px;
- -webkit-box-shadow: 0 0 3px rgba(0,0,0,.2);
- -moz-box-shadow: 0 0 3px rgba(0,0,0,.2);
- box-shadow: 0 0 3px rgba(0,0,0,.2);
- color: inherit;
-}
-
-#menu li a {
- display: block;
- color: white;
- padding: 0 35px 0 25px;
- -webkit-transition: background 300ms;
- -moz-transition: background 300ms;
-}
-
-#menu li {
- position: relative;
- list-style: none;
-}
-
-#menu a:hover,
-#menu a.active {
- text-decoration: none;
- background: rgba(255,255,255,.1);
-}
-
-#menu li:hover .cov {
- opacity: 1;
-}
-
-#menu li .dirname {
- opacity: .60;
- padding-right: 2px;
-}
-
-#menu li .basename {
- opacity: 1;
-}
-
-#menu .cov {
- background: rgba(0,0,0,.4);
- position: absolute;
- top: 0;
- right: 8px;
- font-size: 9px;
- opacity: .6;
- text-align: left;
- width: 17px;
- -webkit-border-radius: 10px;
- -moz-border-radius: 10px;
- border-radius: 10px;
- padding: 2px 3px;
- text-align: center;
-}
-
-#stats:nth-child(2n) {
- display: inline-block;
- margin-top: 15px;
- border: 1px solid #eee;
- padding: 10px;
- -webkit-box-shadow: inset 0 0 2px #eee;
- -moz-box-shadow: inset 0 0 2px #eee;
- box-shadow: inset 0 0 2px #eee;
- -webkit-border-radius: 5px;
- -moz-border-radius: 5px;
- border-radius: 5px;
-}
-
-#stats div {
- float: left;
- padding: 0 5px;
-}
-
-#stats::after {
- display: block;
- content: '';
- clear: both;
-}
-
-#stats .sloc::after {
- content: ' SLOC';
- color: #b6b6b6;
-}
-
-#stats .percentage::after {
- content: ' coverage';
- color: #b6b6b6;
-}
-
-#stats .hits,
-#stats .misses {
- display: none;
-}
-
-.high {
- color: #00d4b4;
-}
-.medium {
- color: #e87d0d;
-}
-.low {
- color: #d4081a;
-}
-.terrible {
- color: #d4081a;
- font-weight: bold;
-}
-
-table {
- width: 80%;
- margin-top: 10px;
- border-collapse: collapse;
- border: 1px solid #cbcbcb;
- color: #363636;
- -webkit-border-radius: 3px;
- -moz-border-radius: 3px;
- border-radius: 3px;
-}
-
-table thead {
- display: none;
-}
-
-table td.line,
-table td.hits {
- width: 20px;
- background: #eaeaea;
- text-align: center;
- font-size: 11px;
- padding: 0 10px;
- color: #949494;
-}
-
-table td.hits {
- width: 10px;
- padding: 2px 5px;
- color: rgba(0,0,0,.2);
- background: #f0f0f0;
-}
-
-tr.miss td.line,
-tr.miss td.hits {
- background: #e6c3c7;
-}
-
-tr.miss td {
- background: #f8d5d8;
-}
-
-td.source {
- padding-left: 15px;
- line-height: 15px;
- white-space: pre;
- font: 12px monaco, monospace;
-}
-
-code .comment { color: #ddd }
-code .init { color: #2F6FAD }
-code .string { color: #5890AD }
-code .keyword { color: #8A6343 }
-code .number { color: #2F6FAD }
-</style>
diff --git a/tests/lib/mocha-2.2.5/lib/reporters/xunit.js b/tests/lib/mocha-2.2.5/lib/reporters/xunit.js
deleted file mode 100755
index 77cd347094..0000000000
--- a/tests/lib/mocha-2.2.5/lib/reporters/xunit.js
+++ /dev/null
@@ -1,149 +0,0 @@
-/**
- * Module dependencies.
- */
-
-var Base = require('./base')
- , utils = require('../utils')
- , fs = require('fs')
- , escape = utils.escape;
-
-/**
- * Save timer references to avoid Sinon interfering (see GH-237).
- */
-
-var Date = global.Date
- , setTimeout = global.setTimeout
- , setInterval = global.setInterval
- , clearTimeout = global.clearTimeout
- , clearInterval = global.clearInterval;
-
-/**
- * Expose `XUnit`.
- */
-
-exports = module.exports = XUnit;
-
-/**
- * Initialize a new `XUnit` reporter.
- *
- * @param {Runner} runner
- * @api public
- */
-
-function XUnit(runner, options) {
- Base.call(this, runner);
- var stats = this.stats
- , tests = []
- , self = this;
-
- if (options.reporterOptions && options.reporterOptions.output) {
- if (! fs.createWriteStream) {
- throw new Error('file output not supported in browser');
- }
- self.fileStream = fs.createWriteStream(options.reporterOptions.output);
- }
-
- runner.on('pending', function(test){
- tests.push(test);
- });
-
- runner.on('pass', function(test){
- tests.push(test);
- });
-
- runner.on('fail', function(test){
- tests.push(test);
- });
-
- runner.on('end', function(){
- self.write(tag('testsuite', {
- name: 'Mocha Tests'
- , tests: stats.tests
- , failures: stats.failures
- , errors: stats.failures
- , skipped: stats.tests - stats.failures - stats.passes
- , timestamp: (new Date).toUTCString()
- , time: (stats.duration / 1000) || 0
- }, false));
-
- tests.forEach(function(t) { self.test(t); });
- self.write('</testsuite>');
- });
-}
-
-/**
- * Override done to close the stream (if it's a file).
- */
-XUnit.prototype.done = function(failures, fn) {
- if (this.fileStream) {
- this.fileStream.end(function() {
- fn(failures);
- });
- } else {
- fn(failures);
- }
-};
-
-/**
- * Inherit from `Base.prototype`.
- */
-
-XUnit.prototype.__proto__ = Base.prototype;
-
-/**
- * Write out the given line
- */
-XUnit.prototype.write = function(line) {
- if (this.fileStream) {
- this.fileStream.write(line + '\n');
- } else {
- console.log(line);
- }
-};
-
-/**
- * Output tag for the given `test.`
- */
-
-XUnit.prototype.test = function(test, ostream) {
- var attrs = {
- classname: test.parent.fullTitle()
- , name: test.title
- , time: (test.duration / 1000) || 0
- };
-
- if ('failed' == test.state) {
- var err = test.err;
- this.write(tag('testcase', attrs, false, tag('failure', {}, false, cdata(escape(err.message) + "\n" + err.stack))));
- } else if (test.pending) {
- this.write(tag('testcase', attrs, false, tag('skipped', {}, true)));
- } else {
- this.write(tag('testcase', attrs, true) );
- }
-};
-
-/**
- * HTML tag helper.
- */
-
-function tag(name, attrs, close, content) {
- var end = close ? '/>' : '>'
- , pairs = []
- , tag;
-
- for (var key in attrs) {
- pairs.push(key + '="' + escape(attrs[key]) + '"');
- }
-
- tag = '<' + name + (pairs.length ? ' ' + pairs.join(' ') : '') + end;
- if (content) tag += content + '</' + name + end;
- return tag;
-}
-
-/**
- * Return cdata escaped CDATA `str`.
- */
-
-function cdata(str) {
- return '<![CDATA[' + escape(str) + ']]>';
-}
diff --git a/tests/lib/mocha-2.2.5/lib/runnable.js b/tests/lib/mocha-2.2.5/lib/runnable.js
deleted file mode 100755
index 6e4803fd7f..0000000000
--- a/tests/lib/mocha-2.2.5/lib/runnable.js
+++ /dev/null
@@ -1,280 +0,0 @@
-/**
- * Module dependencies.
- */
-
-var EventEmitter = require('events').EventEmitter
- , debug = require('debug')('mocha:runnable')
- , Pending = require('./pending')
- , milliseconds = require('./ms')
- , utils = require('./utils');
-
-/**
- * Save timer references to avoid Sinon interfering (see GH-237).
- */
-
-var Date = global.Date
- , setTimeout = global.setTimeout
- , setInterval = global.setInterval
- , clearTimeout = global.clearTimeout
- , clearInterval = global.clearInterval;
-
-/**
- * Object#toString().
- */
-
-var toString = Object.prototype.toString;
-
-/**
- * Expose `Runnable`.
- */
-
-module.exports = Runnable;
-
-/**
- * Initialize a new `Runnable` with the given `title` and callback `fn`.
- *
- * @param {String} title
- * @param {Function} fn
- * @api private
- */
-
-function Runnable(title, fn) {
- this.title = title;
- this.fn = fn;
- this.async = fn && fn.length;
- this.sync = ! this.async;
- this._timeout = 2000;
- this._slow = 75;
- this._enableTimeouts = true;
- this.timedOut = false;
- this._trace = new Error('done() called multiple times')
-}
-
-/**
- * Inherit from `EventEmitter.prototype`.
- */
-
-Runnable.prototype.__proto__ = EventEmitter.prototype;
-
-/**
- * Set & get timeout `ms`.
- *
- * @param {Number|String} ms
- * @return {Runnable|Number} ms or self
- * @api private
- */
-
-Runnable.prototype.timeout = function(ms){
- if (0 == arguments.length) return this._timeout;
- if (ms === 0) this._enableTimeouts = false;
- if ('string' == typeof ms) ms = milliseconds(ms);
- debug('timeout %d', ms);
- this._timeout = ms;
- if (this.timer) this.resetTimeout();
- return this;
-};
-
-/**
- * Set & get slow `ms`.
- *
- * @param {Number|String} ms
- * @return {Runnable|Number} ms or self
- * @api private
- */
-
-Runnable.prototype.slow = function(ms){
- if (0 === arguments.length) return this._slow;
- if ('string' == typeof ms) ms = milliseconds(ms);
- debug('timeout %d', ms);
- this._slow = ms;
- return this;
-};
-
-/**
- * Set and & get timeout `enabled`.
- *
- * @param {Boolean} enabled
- * @return {Runnable|Boolean} enabled or self
- * @api private
- */
-
-Runnable.prototype.enableTimeouts = function(enabled){
- if (arguments.length === 0) return this._enableTimeouts;
- debug('enableTimeouts %s', enabled);
- this._enableTimeouts = enabled;
- return this;
-};
-
-/**
- * Halt and mark as pending.
- *
- * @api private
- */
-
-Runnable.prototype.skip = function(){
- throw new Pending();
-};
-
-/**
- * Return the full title generated by recursively
- * concatenating the parent's full title.
- *
- * @return {String}
- * @api public
- */
-
-Runnable.prototype.fullTitle = function(){
- return this.parent.fullTitle() + ' ' + this.title;
-};
-
-/**
- * Clear the timeout.
- *
- * @api private
- */
-
-Runnable.prototype.clearTimeout = function(){
- clearTimeout(this.timer);
-};
-
-/**
- * Inspect the runnable void of private properties.
- *
- * @return {String}
- * @api private
- */
-
-Runnable.prototype.inspect = function(){
- return JSON.stringify(this, function(key, val){
- if ('_' == key[0]) return;
- if ('parent' == key) return '#<Suite>';
- if ('ctx' == key) return '#<Context>';
- return val;
- }, 2);
-};
-
-/**
- * Reset the timeout.
- *
- * @api private
- */
-
-Runnable.prototype.resetTimeout = function(){
- var self = this;
- var ms = this.timeout() || 1e9;
-
- if (!this._enableTimeouts) return;
- this.clearTimeout();
- this.timer = setTimeout(function(){
- if (!self._enableTimeouts) return;
- self.callback(new Error('timeout of ' + ms + 'ms exceeded. Ensure the done() callback is being called in this test.'));
- self.timedOut = true;
- }, ms);
-};
-
-/**
- * Whitelist these globals for this test run
- *
- * @api private
- */
-Runnable.prototype.globals = function(arr){
- var self = this;
- this._allowedGlobals = arr;
-};
-
-/**
- * Run the test and invoke `fn(err)`.
- *
- * @param {Function} fn
- * @api private
- */
-
-Runnable.prototype.run = function(fn){
- var self = this
- , start = new Date
- , ctx = this.ctx
- , finished
- , emitted;
-
- // Some times the ctx exists but it is not runnable
- if (ctx && ctx.runnable) ctx.runnable(this);
-
- // called multiple times
- function multiple(err) {
- if (emitted) return;
- emitted = true;
- self.emit('error', err || new Error('done() called multiple times; stacktrace may be inaccurate'));
- }
-
- // finished
- function done(err) {
- var ms = self.timeout();
- if (self.timedOut) return;
- if (finished) return multiple(err || self._trace);
-
- // Discard the resolution if this test has already failed asynchronously
- if (self.state) return;
-
- self.clearTimeout();
- self.duration = new Date - start;
- finished = true;
- if (!err && self.duration > ms && self._enableTimeouts) err = new Error('timeout of ' + ms + 'ms exceeded. Ensure the done() callback is being called in this test.');
- fn(err);
- }
-
- // for .resetTimeout()
- this.callback = done;
-
- // explicit async with `done` argument
- if (this.async) {
- this.resetTimeout();
-
- try {
- this.fn.call(ctx, function(err){
- if (err instanceof Error || toString.call(err) === "[object Error]") return done(err);
- if (null != err) {
- if (Object.prototype.toString.call(err) === '[object Object]') {
- return done(new Error('done() invoked with non-Error: ' + JSON.stringify(err)));
- } else {
- return done(new Error('done() invoked with non-Error: ' + err));
- }
- }
- done();
- });
- } catch (err) {
- done(utils.getError(err));
- }
- return;
- }
-
- if (this.asyncOnly) {
- return done(new Error('--async-only option in use without declaring `done()`'));
- }
-
- // sync or promise-returning
- try {
- if (this.pending) {
- done();
- } else {
- callFn(this.fn);
- }
- } catch (err) {
- done(utils.getError(err));
- }
-
- function callFn(fn) {
- var result = fn.call(ctx);
- if (result && typeof result.then === 'function') {
- self.resetTimeout();
- result
- .then(function() {
- done()
- },
- function(reason) {
- done(reason || new Error('Promise rejected with no or falsy reason'))
- });
- } else {
- done();
- }
- }
-};
diff --git a/tests/lib/mocha-2.2.5/lib/runner.js b/tests/lib/mocha-2.2.5/lib/runner.js
deleted file mode 100755
index 3199dc921a..0000000000
--- a/tests/lib/mocha-2.2.5/lib/runner.js
+++ /dev/null
@@ -1,716 +0,0 @@
-/**
- * Module dependencies.
- */
-
-var EventEmitter = require('events').EventEmitter
- , debug = require('debug')('mocha:runner')
- , Pending = require('./pending')
- , Test = require('./test')
- , utils = require('./utils')
- , filter = utils.filter
- , keys = utils.keys
- , type = utils.type
- , stringify = utils.stringify
- , stackFilter = utils.stackTraceFilter();
-
-/**
- * Non-enumerable globals.
- */
-
-var globals = [
- 'setTimeout',
- 'clearTimeout',
- 'setInterval',
- 'clearInterval',
- 'XMLHttpRequest',
- 'Date',
- 'setImmediate',
- 'clearImmediate'
-];
-
-/**
- * Expose `Runner`.
- */
-
-module.exports = Runner;
-
-/**
- * Initialize a `Runner` for the given `suite`.
- *
- * Events:
- *
- * - `start` execution started
- * - `end` execution complete
- * - `suite` (suite) test suite execution started
- * - `suite end` (suite) all tests (and sub-suites) have finished
- * - `test` (test) test execution started
- * - `test end` (test) test completed
- * - `hook` (hook) hook execution started
- * - `hook end` (hook) hook complete
- * - `pass` (test) test passed
- * - `fail` (test, err) test failed
- * - `pending` (test) test pending
- *
- * @param {Suite} suite Root suite
- * @param {boolean} [delay] Whether or not to delay execution of root suite
- * until ready.
- * @api public
- */
-
-function Runner(suite, delay) {
- var self = this;
- this._globals = [];
- this._abort = false;
- this._delay = delay;
- this.suite = suite;
- this.total = suite.total();
- this.failures = 0;
- this.on('test end', function(test){ self.checkGlobals(test); });
- this.on('hook end', function(hook){ self.checkGlobals(hook); });
- this.grep(/.*/);
- this.globals(this.globalProps().concat(extraGlobals()));
-}
-
-/**
- * Wrapper for setImmediate, process.nextTick, or browser polyfill.
- *
- * @param {Function} fn
- * @api private
- */
-
-Runner.immediately = global.setImmediate || process.nextTick;
-
-/**
- * Inherit from `EventEmitter.prototype`.
- */
-
-Runner.prototype.__proto__ = EventEmitter.prototype;
-
-/**
- * Run tests with full titles matching `re`. Updates runner.total
- * with number of tests matched.
- *
- * @param {RegExp} re
- * @param {Boolean} invert
- * @return {Runner} for chaining
- * @api public
- */
-
-Runner.prototype.grep = function(re, invert){
- debug('grep %s', re);
- this._grep = re;
- this._invert = invert;
- this.total = this.grepTotal(this.suite);
- return this;
-};
-
-/**
- * Returns the number of tests matching the grep search for the
- * given suite.
- *
- * @param {Suite} suite
- * @return {Number}
- * @api public
- */
-
-Runner.prototype.grepTotal = function(suite) {
- var self = this;
- var total = 0;
-
- suite.eachTest(function(test){
- var match = self._grep.test(test.fullTitle());
- if (self._invert) match = !match;
- if (match) total++;
- });
-
- return total;
-};
-
-/**
- * Return a list of global properties.
- *
- * @return {Array}
- * @api private
- */
-
-Runner.prototype.globalProps = function() {
- var props = utils.keys(global);
-
- // non-enumerables
- for (var i = 0; i < globals.length; ++i) {
- if (~utils.indexOf(props, globals[i])) continue;
- props.push(globals[i]);
- }
-
- return props;
-};
-
-/**
- * Allow the given `arr` of globals.
- *
- * @param {Array} arr
- * @return {Runner} for chaining
- * @api public
- */
-
-Runner.prototype.globals = function(arr){
- if (0 == arguments.length) return this._globals;
- debug('globals %j', arr);
- this._globals = this._globals.concat(arr);
- return this;
-};
-
-/**
- * Check for global variable leaks.
- *
- * @api private
- */
-
-Runner.prototype.checkGlobals = function(test){
- if (this.ignoreLeaks) return;
- var ok = this._globals;
-
- var globals = this.globalProps();
- var leaks;
-
- if (test) {
- ok = ok.concat(test._allowedGlobals || []);
- }
-
- if(this.prevGlobalsLength == globals.length) return;
- this.prevGlobalsLength = globals.length;
-
- leaks = filterLeaks(ok, globals);
- this._globals = this._globals.concat(leaks);
-
- if (leaks.length > 1) {
- this.fail(test, new Error('global leaks detected: ' + leaks.join(', ') + ''));
- } else if (leaks.length) {
- this.fail(test, new Error('global leak detected: ' + leaks[0]));
- }
-};
-
-/**
- * Fail the given `test`.
- *
- * @param {Test} test
- * @param {Error} err
- * @api private
- */
-
-Runner.prototype.fail = function(test, err) {
- ++this.failures;
- test.state = 'failed';
-
- if (!(err instanceof Error)) {
- err = new Error('the ' + type(err) + ' ' + stringify(err) + ' was thrown, throw an Error :)');
- }
-
- err.stack = (this.fullStackTrace || !err.stack)
- ? err.stack
- : stackFilter(err.stack);
-
- this.emit('fail', test, err);
-};
-
-/**
- * Fail the given `hook` with `err`.
- *
- * Hook failures work in the following pattern:
- * - If bail, then exit
- * - Failed `before` hook skips all tests in a suite and subsuites,
- * but jumps to corresponding `after` hook
- * - Failed `before each` hook skips remaining tests in a
- * suite and jumps to corresponding `after each` hook,
- * which is run only once
- * - Failed `after` hook does not alter
- * execution order
- * - Failed `after each` hook skips remaining tests in a
- * suite and subsuites, but executes other `after each`
- * hooks
- *
- * @param {Hook} hook
- * @param {Error} err
- * @api private
- */
-
-Runner.prototype.failHook = function(hook, err){
- this.fail(hook, err);
- if (this.suite.bail()) {
- this.emit('end');
- }
-};
-
-/**
- * Run hook `name` callbacks and then invoke `fn()`.
- *
- * @param {String} name
- * @param {Function} function
- * @api private
- */
-
-Runner.prototype.hook = function(name, fn){
- var suite = this.suite
- , hooks = suite['_' + name]
- , self = this
- , timer;
-
- function next(i) {
- var hook = hooks[i];
- if (!hook) return fn();
- self.currentRunnable = hook;
-
- hook.ctx.currentTest = self.test;
-
- self.emit('hook', hook);
-
- hook.on('error', function(err){
- self.failHook(hook, err);
- });
-
- hook.run(function(err){
- hook.removeAllListeners('error');
- var testError = hook.error();
- if (testError) self.fail(self.test, testError);
- if (err) {
- if (err instanceof Pending) {
- suite.pending = true;
- } else {
- self.failHook(hook, err);
-
- // stop executing hooks, notify callee of hook err
- return fn(err);
- }
- }
- self.emit('hook end', hook);
- delete hook.ctx.currentTest;
- next(++i);
- });
- }
-
- Runner.immediately(function(){
- next(0);
- });
-};
-
-/**
- * Run hook `name` for the given array of `suites`
- * in order, and callback `fn(err, errSuite)`.
- *
- * @param {String} name
- * @param {Array} suites
- * @param {Function} fn
- * @api private
- */
-
-Runner.prototype.hooks = function(name, suites, fn){
- var self = this
- , orig = this.suite;
-
- function next(suite) {
- self.suite = suite;
-
- if (!suite) {
- self.suite = orig;
- return fn();
- }
-
- self.hook(name, function(err){
- if (err) {
- var errSuite = self.suite;
- self.suite = orig;
- return fn(err, errSuite);
- }
-
- next(suites.pop());
- });
- }
-
- next(suites.pop());
-};
-
-/**
- * Run hooks from the top level down.
- *
- * @param {String} name
- * @param {Function} fn
- * @api private
- */
-
-Runner.prototype.hookUp = function(name, fn){
- var suites = [this.suite].concat(this.parents()).reverse();
- this.hooks(name, suites, fn);
-};
-
-/**
- * Run hooks from the bottom up.
- *
- * @param {String} name
- * @param {Function} fn
- * @api private
- */
-
-Runner.prototype.hookDown = function(name, fn){
- var suites = [this.suite].concat(this.parents());
- this.hooks(name, suites, fn);
-};
-
-/**
- * Return an array of parent Suites from
- * closest to furthest.
- *
- * @return {Array}
- * @api private
- */
-
-Runner.prototype.parents = function(){
- var suite = this.suite
- , suites = [];
- while (suite = suite.parent) suites.push(suite);
- return suites;
-};
-
-/**
- * Run the current test and callback `fn(err)`.
- *
- * @param {Function} fn
- * @api private
- */
-
-Runner.prototype.runTest = function(fn){
- var test = this.test
- , self = this;
-
- if (this.asyncOnly) test.asyncOnly = true;
-
- try {
- test.on('error', function(err){
- self.fail(test, err);
- });
- test.run(fn);
- } catch (err) {
- fn(err);
- }
-};
-
-/**
- * Run tests in the given `suite` and invoke
- * the callback `fn()` when complete.
- *
- * @param {Suite} suite
- * @param {Function} fn
- * @api private
- */
-
-Runner.prototype.runTests = function(suite, fn){
- var self = this
- , tests = suite.tests.slice()
- , test;
-
-
- function hookErr(err, errSuite, after) {
- // before/after Each hook for errSuite failed:
- var orig = self.suite;
-
- // for failed 'after each' hook start from errSuite parent,
- // otherwise start from errSuite itself
- self.suite = after ? errSuite.parent : errSuite;
-
- if (self.suite) {
- // call hookUp afterEach
- self.hookUp('afterEach', function(err2, errSuite2) {
- self.suite = orig;
- // some hooks may fail even now
- if (err2) return hookErr(err2, errSuite2, true);
- // report error suite
- fn(errSuite);
- });
- } else {
- // there is no need calling other 'after each' hooks
- self.suite = orig;
- fn(errSuite);
- }
- }
-
- function next(err, errSuite) {
- // if we bail after first err
- if (self.failures && suite._bail) return fn();
-
- if (self._abort) return fn();
-
- if (err) return hookErr(err, errSuite, true);
-
- // next test
- test = tests.shift();
-
- // all done
- if (!test) return fn();
-
- // grep
- var match = self._grep.test(test.fullTitle());
- if (self._invert) match = !match;
- if (!match) return next();
-
- // pending
- if (test.pending) {
- self.emit('pending', test);
- self.emit('test end', test);
- return next();
- }
-
- // execute test and hook(s)
- self.emit('test', self.test = test);
- self.hookDown('beforeEach', function(err, errSuite){
-
- if (suite.pending) {
- self.emit('pending', test);
- self.emit('test end', test);
- return next();
- }
- if (err) return hookErr(err, errSuite, false);
-
- self.currentRunnable = self.test;
- self.runTest(function(err){
- test = self.test;
-
- if (err) {
- if (err instanceof Pending) {
- self.emit('pending', test);
- } else {
- self.fail(test, err);
- }
- self.emit('test end', test);
-
- if (err instanceof Pending) {
- return next();
- }
-
- return self.hookUp('afterEach', next);
- }
-
- test.state = 'passed';
- self.emit('pass', test);
- self.emit('test end', test);
- self.hookUp('afterEach', next);
- });
- });
- }
-
- this.next = next;
- next();
-};
-
-/**
- * Run the given `suite` and invoke the
- * callback `fn()` when complete.
- *
- * @param {Suite} suite
- * @param {Function} fn
- * @api private
- */
-
-Runner.prototype.runSuite = function(suite, fn){
- var total = this.grepTotal(suite)
- , self = this
- , i = 0;
-
- debug('run suite %s', suite.fullTitle());
-
- if (!total) return fn();
-
- this.emit('suite', this.suite = suite);
-
- function next(errSuite) {
- if (errSuite) {
- // current suite failed on a hook from errSuite
- if (errSuite == suite) {
- // if errSuite is current suite
- // continue to the next sibling suite
- return done();
- } else {
- // errSuite is among the parents of current suite
- // stop execution of errSuite and all sub-suites
- return done(errSuite);
- }
- }
-
- if (self._abort) return done();
-
- var curr = suite.suites[i++];
- if (!curr) return done();
- self.runSuite(curr, next);
- }
-
- function done(errSuite) {
- self.suite = suite;
- self.hook('afterAll', function(){
- self.emit('suite end', suite);
- fn(errSuite);
- });
- }
-
- this.hook('beforeAll', function(err){
- if (err) return done();
- self.runTests(suite, next);
- });
-};
-
-/**
- * Handle uncaught exceptions.
- *
- * @param {Error} err
- * @api private
- */
-
-Runner.prototype.uncaught = function(err){
- if (err) {
- debug('uncaught exception %s', err !== function () {
- return this;
- }.call(err) ? err : ( err.message || err ));
- } else {
- debug('uncaught undefined exception');
- err = utils.undefinedError();
- }
- err.uncaught = true;
-
- var runnable = this.currentRunnable;
- if (!runnable) return;
-
- runnable.clearTimeout();
-
- // Ignore errors if complete
- if (runnable.state) return;
- this.fail(runnable, err);
-
- // recover from test
- if ('test' == runnable.type) {
- this.emit('test end', runnable);
- this.hookUp('afterEach', this.next);
- return;
- }
-
- // bail on hooks
- this.emit('end');
-};
-
-/**
- * Run the root suite and invoke `fn(failures)`
- * on completion.
- *
- * @param {Function} fn
- * @return {Runner} for chaining
- * @api public
- */
-
-Runner.prototype.run = function(fn){
- var self = this,
- rootSuite = this.suite;
-
- fn = fn || function(){};
-
- function uncaught(err){
- self.uncaught(err);
- }
-
- function start() {
- self.emit('start');
- self.runSuite(rootSuite, function(){
- debug('finished running');
- self.emit('end');
- });
- }
-
- debug('start');
-
- // callback
- this.on('end', function(){
- debug('end');
- process.removeListener('uncaughtException', uncaught);
- fn(self.failures);
- });
-
- // uncaught exception
- process.on('uncaughtException', uncaught);
-
- if (this._delay) {
- // for reporters, I guess.
- // might be nice to debounce some dots while we wait.
- this.emit('waiting', rootSuite);
- rootSuite.once('run', start);
- }
- else {
- start();
- }
-
- return this;
-};
-
-/**
- * Cleanly abort execution
- *
- * @return {Runner} for chaining
- * @api public
- */
-Runner.prototype.abort = function(){
- debug('aborting');
- this._abort = true;
-};
-
-/**
- * Filter leaks with the given globals flagged as `ok`.
- *
- * @param {Array} ok
- * @param {Array} globals
- * @return {Array}
- * @api private
- */
-
-function filterLeaks(ok, globals) {
- return filter(globals, function(key){
- // Firefox and Chrome exposes iframes as index inside the window object
- if (/^d+/.test(key)) return false;
-
- // in firefox
- // if runner runs in an iframe, this iframe's window.getInterface method not init at first
- // it is assigned in some seconds
- if (global.navigator && /^getInterface/.test(key)) return false;
-
- // an iframe could be approached by window[iframeIndex]
- // in ie6,7,8 and opera, iframeIndex is enumerable, this could cause leak
- if (global.navigator && /^\d+/.test(key)) return false;
-
- // Opera and IE expose global variables for HTML element IDs (issue #243)
- if (/^mocha-/.test(key)) return false;
-
- var matched = filter(ok, function(ok){
- if (~ok.indexOf('*')) return 0 == key.indexOf(ok.split('*')[0]);
- return key == ok;
- });
- return matched.length == 0 && (!global.navigator || 'onerror' !== key);
- });
-}
-
-/**
- * Array of globals dependent on the environment.
- *
- * @return {Array}
- * @api private
- */
-
-function extraGlobals() {
- if (typeof(process) === 'object' &&
- typeof(process.version) === 'string') {
-
- var nodeVersion = process.version.split('.').reduce(function(a, v) {
- return a << 8 | v;
- });
-
- // 'errno' was renamed to process._errno in v0.9.11.
-
- if (nodeVersion < 0x00090B) {
- return ['errno'];
- }
- }
-
- return [];
-}
diff --git a/tests/lib/mocha-2.2.5/lib/test.js b/tests/lib/mocha-2.2.5/lib/test.js
deleted file mode 100755
index 4a4cf63cce..0000000000
--- a/tests/lib/mocha-2.2.5/lib/test.js
+++ /dev/null
@@ -1,31 +0,0 @@
-/**
- * Module dependencies.
- */
-
-var Runnable = require('./runnable');
-
-/**
- * Expose `Test`.
- */
-
-module.exports = Test;
-
-/**
- * Initialize a new `Test` with the given `title` and callback `fn`.
- *
- * @param {String} title
- * @param {Function} fn
- * @api private
- */
-
-function Test(title, fn) {
- Runnable.call(this, title, fn);
- this.pending = !fn;
- this.type = 'test';
-}
-
-/**
- * Inherit from `Runnable.prototype`.
- */
-
-Test.prototype.__proto__ = Runnable.prototype;
diff --git a/tests/lib/mocha-2.2.5/mocha.js b/tests/lib/mocha-2.2.5/mocha.js
deleted file mode 100755
index 5ff1385758..0000000000
--- a/tests/lib/mocha-2.2.5/mocha.js
+++ /dev/null
@@ -1,6564 +0,0 @@
-;(function(){
-
-// CommonJS require()
-
-function require(p){
- var path = require.resolve(p)
- , mod = require.modules[path];
- if (!mod) throw new Error('failed to require "' + p + '"');
- if (!mod.exports) {
- mod.exports = {};
- mod.call(mod.exports, mod, mod.exports, require.relative(path));
- }
- return mod.exports;
- }
-
-require.modules = {};
-
-require.resolve = function (path){
- var orig = path
- , reg = path + '.js'
- , index = path + '/index.js';
- return require.modules[reg] && reg
- || require.modules[index] && index
- || orig;
- };
-
-require.register = function (path, fn){
- require.modules[path] = fn;
- };
-
-require.relative = function (parent) {
- return function(p){
- if ('.' != p.charAt(0)) return require(p);
-
- var path = parent.split('/')
- , segs = p.split('/');
- path.pop();
-
- for (var i = 0; i < segs.length; i++) {
- var seg = segs[i];
- if ('..' == seg) path.pop();
- else if ('.' != seg) path.push(seg);
- }
-
- return require(path.join('/'));
- };
- };
-
-
-require.register("browser/debug.js", function(module, exports, require){
-module.exports = function(type){
- return function(){
- }
-};
-
-}); // module: browser/debug.js
-
-require.register("browser/diff.js", function(module, exports, require){
-/* See LICENSE file for terms of use */
-
-/*
- * Text diff implementation.
- *
- * This library supports the following APIS:
- * JsDiff.diffChars: Character by character diff
- * JsDiff.diffWords: Word (as defined by \b regex) diff which ignores whitespace
- * JsDiff.diffLines: Line based diff
- *
- * JsDiff.diffCss: Diff targeted at CSS content
- *
- * These methods are based on the implementation proposed in
- * "An O(ND) Difference Algorithm and its Variations" (Myers, 1986).
- * http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.4.6927
- */
-var JsDiff = (function() {
- /*jshint maxparams: 5*/
- function clonePath(path) {
- return { newPos: path.newPos, components: path.components.slice(0) };
- }
- function removeEmpty(array) {
- var ret = [];
- for (var i = 0; i < array.length; i++) {
- if (array[i]) {
- ret.push(array[i]);
- }
- }
- return ret;
- }
- function escapeHTML(s) {
- var n = s;
- n = n.replace(/&/g, '&amp;');
- n = n.replace(/</g, '&lt;');
- n = n.replace(/>/g, '&gt;');
- n = n.replace(/"/g, '&quot;');
-
- return n;
- }
-
- var Diff = function(ignoreWhitespace) {
- this.ignoreWhitespace = ignoreWhitespace;
- };
- Diff.prototype = {
- diff: function(oldString, newString) {
- // Handle the identity case (this is due to unrolling editLength == 0
- if (newString === oldString) {
- return [{ value: newString }];
- }
- if (!newString) {
- return [{ value: oldString, removed: true }];
- }
- if (!oldString) {
- return [{ value: newString, added: true }];
- }
-
- newString = this.tokenize(newString);
- oldString = this.tokenize(oldString);
-
- var newLen = newString.length, oldLen = oldString.length;
- var maxEditLength = newLen + oldLen;
- var bestPath = [{ newPos: -1, components: [] }];
-
- // Seed editLength = 0
- var oldPos = this.extractCommon(bestPath[0], newString, oldString, 0);
- if (bestPath[0].newPos+1 >= newLen && oldPos+1 >= oldLen) {
- return bestPath[0].components;
- }
-
- for (var editLength = 1; editLength <= maxEditLength; editLength++) {
- for (var diagonalPath = -1*editLength; diagonalPath <= editLength; diagonalPath+=2) {
- var basePath;
- var addPath = bestPath[diagonalPath-1],
- removePath = bestPath[diagonalPath+1];
- oldPos = (removePath ? removePath.newPos : 0) - diagonalPath;
- if (addPath) {
- // No one else is going to attempt to use this value, clear it
- bestPath[diagonalPath-1] = undefined;
- }
-
- var canAdd = addPath && addPath.newPos+1 < newLen;
- var canRemove = removePath && 0 <= oldPos && oldPos < oldLen;
- if (!canAdd && !canRemove) {
- bestPath[diagonalPath] = undefined;
- continue;
- }
-
- // Select the diagonal that we want to branch from. We select the prior
- // path whose position in the new string is the farthest from the origin
- // and does not pass the bounds of the diff graph
- if (!canAdd || (canRemove && addPath.newPos < removePath.newPos)) {
- basePath = clonePath(removePath);
- this.pushComponent(basePath.components, oldString[oldPos], undefined, true);
- } else {
- basePath = clonePath(addPath);
- basePath.newPos++;
- this.pushComponent(basePath.components, newString[basePath.newPos], true, undefined);
- }
-
- var oldPos = this.extractCommon(basePath, newString, oldString, diagonalPath);
-
- if (basePath.newPos+1 >= newLen && oldPos+1 >= oldLen) {
- return basePath.components;
- } else {
- bestPath[diagonalPath] = basePath;
- }
- }
- }
- },
-
- pushComponent: function(components, value, added, removed) {
- var last = components[components.length-1];
- if (last && last.added === added && last.removed === removed) {
- // We need to clone here as the component clone operation is just
- // as shallow array clone
- components[components.length-1] =
- {value: this.join(last.value, value), added: added, removed: removed };
- } else {
- components.push({value: value, added: added, removed: removed });
- }
- },
- extractCommon: function(basePath, newString, oldString, diagonalPath) {
- var newLen = newString.length,
- oldLen = oldString.length,
- newPos = basePath.newPos,
- oldPos = newPos - diagonalPath;
- while (newPos+1 < newLen && oldPos+1 < oldLen && this.equals(newString[newPos+1], oldString[oldPos+1])) {
- newPos++;
- oldPos++;
-
- this.pushComponent(basePath.components, newString[newPos], undefined, undefined);
- }
- basePath.newPos = newPos;
- return oldPos;
- },
-
- equals: function(left, right) {
- var reWhitespace = /\S/;
- if (this.ignoreWhitespace && !reWhitespace.test(left) && !reWhitespace.test(right)) {
- return true;
- } else {
- return left === right;
- }
- },
- join: function(left, right) {
- return left + right;
- },
- tokenize: function(value) {
- return value;
- }
- };
-
- var CharDiff = new Diff();
-
- var WordDiff = new Diff(true);
- var WordWithSpaceDiff = new Diff();
- WordDiff.tokenize = WordWithSpaceDiff.tokenize = function(value) {
- return removeEmpty(value.split(/(\s+|\b)/));
- };
-
- var CssDiff = new Diff(true);
- CssDiff.tokenize = function(value) {
- return removeEmpty(value.split(/([{}:;,]|\s+)/));
- };
-
- var LineDiff = new Diff();
- LineDiff.tokenize = function(value) {
- var retLines = [],
- lines = value.split(/^/m);
-
- for(var i = 0; i < lines.length; i++) {
- var line = lines[i],
- lastLine = lines[i - 1];
-
- // Merge lines that may contain windows new lines
- if (line == '\n' && lastLine && lastLine[lastLine.length - 1] === '\r') {
- retLines[retLines.length - 1] += '\n';
- } else if (line) {
- retLines.push(line);
- }
- }
-
- return retLines;
- };
-
- return {
- Diff: Diff,
-
- diffChars: function(oldStr, newStr) { return CharDiff.diff(oldStr, newStr); },
- diffWords: function(oldStr, newStr) { return WordDiff.diff(oldStr, newStr); },
- diffWordsWithSpace: function(oldStr, newStr) { return WordWithSpaceDiff.diff(oldStr, newStr); },
- diffLines: function(oldStr, newStr) { return LineDiff.diff(oldStr, newStr); },
-
- diffCss: function(oldStr, newStr) { return CssDiff.diff(oldStr, newStr); },
-
- createPatch: function(fileName, oldStr, newStr, oldHeader, newHeader) {
- var ret = [];
-
- ret.push('Index: ' + fileName);
- ret.push('===================================================================');
- ret.push('--- ' + fileName + (typeof oldHeader === 'undefined' ? '' : '\t' + oldHeader));
- ret.push('+++ ' + fileName + (typeof newHeader === 'undefined' ? '' : '\t' + newHeader));
-
- var diff = LineDiff.diff(oldStr, newStr);
- if (!diff[diff.length-1].value) {
- diff.pop(); // Remove trailing newline add
- }
- diff.push({value: '', lines: []}); // Append an empty value to make cleanup easier
-
- function contextLines(lines) {
- return lines.map(function(entry) { return ' ' + entry; });
- }
- function eofNL(curRange, i, current) {
- var last = diff[diff.length-2],
- isLast = i === diff.length-2,
- isLastOfType = i === diff.length-3 && (current.added !== last.added || current.removed !== last.removed);
-
- // Figure out if this is the last line for the given file and missing NL
- if (!/\n$/.test(current.value) && (isLast || isLastOfType)) {
- curRange.push('\\ No newline at end of file');
- }
- }
-
- var oldRangeStart = 0, newRangeStart = 0, curRange = [],
- oldLine = 1, newLine = 1;
- for (var i = 0; i < diff.length; i++) {
- var current = diff[i],
- lines = current.lines || current.value.replace(/\n$/, '').split('\n');
- current.lines = lines;
-
- if (current.added || current.removed) {
- if (!oldRangeStart) {
- var prev = diff[i-1];
- oldRangeStart = oldLine;
- newRangeStart = newLine;
-
- if (prev) {
- curRange = contextLines(prev.lines.slice(-4));
- oldRangeStart -= curRange.length;
- newRangeStart -= curRange.length;
- }
- }
- curRange.push.apply(curRange, lines.map(function(entry) { return (current.added?'+':'-') + entry; }));
- eofNL(curRange, i, current);
-
- if (current.added) {
- newLine += lines.length;
- } else {
- oldLine += lines.length;
- }
- } else {
- if (oldRangeStart) {
- // Close out any changes that have been output (or join overlapping)
- if (lines.length <= 8 && i < diff.length-2) {
- // Overlapping
- curRange.push.apply(curRange, contextLines(lines));
- } else {
- // end the range and output
- var contextSize = Math.min(lines.length, 4);
- ret.push(
- '@@ -' + oldRangeStart + ',' + (oldLine-oldRangeStart+contextSize)
- + ' +' + newRangeStart + ',' + (newLine-newRangeStart+contextSize)
- + ' @@');
- ret.push.apply(ret, curRange);
- ret.push.apply(ret, contextLines(lines.slice(0, contextSize)));
- if (lines.length <= 4) {
- eofNL(ret, i, current);
- }
-
- oldRangeStart = 0; newRangeStart = 0; curRange = [];
- }
- }
- oldLine += lines.length;
- newLine += lines.length;
- }
- }
-
- return ret.join('\n') + '\n';
- },
-
- applyPatch: function(oldStr, uniDiff) {
- var diffstr = uniDiff.split('\n');
- var diff = [];
- var remEOFNL = false,
- addEOFNL = false;
-
- for (var i = (diffstr[0][0]==='I'?4:0); i < diffstr.length; i++) {
- if(diffstr[i][0] === '@') {
- var meh = diffstr[i].split(/@@ -(\d+),(\d+) \+(\d+),(\d+) @@/);
- diff.unshift({
- start:meh[3],
- oldlength:meh[2],
- oldlines:[],
- newlength:meh[4],
- newlines:[]
- });
- } else if(diffstr[i][0] === '+') {
- diff[0].newlines.push(diffstr[i].substr(1));
- } else if(diffstr[i][0] === '-') {
- diff[0].oldlines.push(diffstr[i].substr(1));
- } else if(diffstr[i][0] === ' ') {
- diff[0].newlines.push(diffstr[i].substr(1));
- diff[0].oldlines.push(diffstr[i].substr(1));
- } else if(diffstr[i][0] === '\\') {
- if (diffstr[i-1][0] === '+') {
- remEOFNL = true;
- } else if(diffstr[i-1][0] === '-') {
- addEOFNL = true;
- }
- }
- }
-
- var str = oldStr.split('\n');
- for (var i = diff.length - 1; i >= 0; i--) {
- var d = diff[i];
- for (var j = 0; j < d.oldlength; j++) {
- if(str[d.start-1+j] !== d.oldlines[j]) {
- return false;
- }
- }
- Array.prototype.splice.apply(str,[d.start-1,+d.oldlength].concat(d.newlines));
- }
-
- if (remEOFNL) {
- while (!str[str.length-1]) {
- str.pop();
- }
- } else if (addEOFNL) {
- str.push('');
- }
- return str.join('\n');
- },
-
- convertChangesToXML: function(changes){
- var ret = [];
- for ( var i = 0; i < changes.length; i++) {
- var change = changes[i];
- if (change.added) {
- ret.push('<ins>');
- } else if (change.removed) {
- ret.push('<del>');
- }
-
- ret.push(escapeHTML(change.value));
-
- if (change.added) {
- ret.push('</ins>');
- } else if (change.removed) {
- ret.push('</del>');
- }
- }
- return ret.join('');
- },
-
- // See: http://code.google.com/p/google-diff-match-patch/wiki/API
- convertChangesToDMP: function(changes){
- var ret = [], change;
- for ( var i = 0; i < changes.length; i++) {
- change = changes[i];
- ret.push([(change.added ? 1 : change.removed ? -1 : 0), change.value]);
- }
- return ret;
- }
- };
-})();
-
-if (typeof module !== 'undefined') {
- module.exports = JsDiff;
-}
-
-}); // module: browser/diff.js
-
-require.register("browser/escape-string-regexp.js", function(module, exports, require){
-'use strict';
-
-var matchOperatorsRe = /[|\\{}()[\]^$+*?.]/g;
-
-module.exports = function (str) {
- if (typeof str !== 'string') {
- throw new TypeError('Expected a string');
- }
-
- return str.replace(matchOperatorsRe, '\\$&');
-};
-
-}); // module: browser/escape-string-regexp.js
-
-require.register("browser/events.js", function(module, exports, require){
-/**
- * Module exports.
- */
-
-exports.EventEmitter = EventEmitter;
-
-/**
- * Check if `obj` is an array.
- */
-
-function isArray(obj) {
- return '[object Array]' == {}.toString.call(obj);
-}
-
-/**
- * Event emitter constructor.
- *
- * @api public
- */
-
-function EventEmitter(){};
-
-/**
- * Adds a listener.
- *
- * @api public
- */
-
-EventEmitter.prototype.on = function (name, fn) {
- if (!this.$events) {
- this.$events = {};
- }
-
- if (!this.$events[name]) {
- this.$events[name] = fn;
- } else if (isArray(this.$events[name])) {
- this.$events[name].push(fn);
- } else {
- this.$events[name] = [this.$events[name], fn];
- }
-
- return this;
-};
-
-EventEmitter.prototype.addListener = EventEmitter.prototype.on;
-
-/**
- * Adds a volatile listener.
- *
- * @api public
- */
-
-EventEmitter.prototype.once = function (name, fn) {
- var self = this;
-
- function on () {
- self.removeListener(name, on);
- fn.apply(this, arguments);
- };
-
- on.listener = fn;
- this.on(name, on);
-
- return this;
-};
-
-/**
- * Removes a listener.
- *
- * @api public
- */
-
-EventEmitter.prototype.removeListener = function (name, fn) {
- if (this.$events && this.$events[name]) {
- var list = this.$events[name];
-
- if (isArray(list)) {
- var pos = -1;
-
- for (var i = 0, l = list.length; i < l; i++) {
- if (list[i] === fn || (list[i].listener && list[i].listener === fn)) {
- pos = i;
- break;
- }
- }
-
- if (pos < 0) {
- return this;
- }
-
- list.splice(pos, 1);
-
- if (!list.length) {
- delete this.$events[name];
- }
- } else if (list === fn || (list.listener && list.listener === fn)) {
- delete this.$events[name];
- }
- }
-
- return this;
-};
-
-/**
- * Removes all listeners for an event.
- *
- * @api public
- */
-
-EventEmitter.prototype.removeAllListeners = function (name) {
- if (name === undefined) {
- this.$events = {};
- return this;
- }
-
- if (this.$events && this.$events[name]) {
- this.$events[name] = null;
- }
-
- return this;
-};
-
-/**
- * Gets all listeners for a certain event.
- *
- * @api public
- */
-
-EventEmitter.prototype.listeners = function (name) {
- if (!this.$events) {
- this.$events = {};
- }
-
- if (!this.$events[name]) {
- this.$events[name] = [];
- }
-
- if (!isArray(this.$events[name])) {
- this.$events[name] = [this.$events[name]];
- }
-
- return this.$events[name];
-};
-
-/**
- * Emits an event.
- *
- * @api public
- */
-
-EventEmitter.prototype.emit = function (name) {
- if (!this.$events) {
- return false;
- }
-
- var handler = this.$events[name];
-
- if (!handler) {
- return false;
- }
-
- var args = [].slice.call(arguments, 1);
-
- if ('function' == typeof handler) {
- handler.apply(this, args);
- } else if (isArray(handler)) {
- var listeners = handler.slice();
-
- for (var i = 0, l = listeners.length; i < l; i++) {
- listeners[i].apply(this, args);
- }
- } else {
- return false;
- }
-
- return true;
-};
-
-}); // module: browser/events.js
-
-require.register("browser/fs.js", function(module, exports, require){
-
-}); // module: browser/fs.js
-
-require.register("browser/glob.js", function(module, exports, require){
-
-}); // module: browser/glob.js
-
-require.register("browser/path.js", function(module, exports, require){
-
-}); // module: browser/path.js
-
-require.register("browser/progress.js", function(module, exports, require){
-/**
- * Expose `Progress`.
- */
-
-module.exports = Progress;
-
-/**
- * Initialize a new `Progress` indicator.
- */
-
-function Progress() {
- this.percent = 0;
- this.size(0);
- this.fontSize(11);
- this.font('helvetica, arial, sans-serif');
-}
-
-/**
- * Set progress size to `n`.
- *
- * @param {Number} n
- * @return {Progress} for chaining
- * @api public
- */
-
-Progress.prototype.size = function(n){
- this._size = n;
- return this;
-};
-
-/**
- * Set text to `str`.
- *
- * @param {String} str
- * @return {Progress} for chaining
- * @api public
- */
-
-Progress.prototype.text = function(str){
- this._text = str;
- return this;
-};
-
-/**
- * Set font size to `n`.
- *
- * @param {Number} n
- * @return {Progress} for chaining
- * @api public
- */
-
-Progress.prototype.fontSize = function(n){
- this._fontSize = n;
- return this;
-};
-
-/**
- * Set font `family`.
- *
- * @param {String} family
- * @return {Progress} for chaining
- */
-
-Progress.prototype.font = function(family){
- this._font = family;
- return this;
-};
-
-/**
- * Update percentage to `n`.
- *
- * @param {Number} n
- * @return {Progress} for chaining
- */
-
-Progress.prototype.update = function(n){
- this.percent = n;
- return this;
-};
-
-/**
- * Draw on `ctx`.
- *
- * @param {CanvasRenderingContext2d} ctx
- * @return {Progress} for chaining
- */
-
-Progress.prototype.draw = function(ctx){
- try {
- var percent = Math.min(this.percent, 100)
- , size = this._size
- , half = size / 2
- , x = half
- , y = half
- , rad = half - 1
- , fontSize = this._fontSize;
-
- ctx.font = fontSize + 'px ' + this._font;
-
- var angle = Math.PI * 2 * (percent / 100);
- ctx.clearRect(0, 0, size, size);
-
- // outer circle
- ctx.strokeStyle = '#9f9f9f';
- ctx.beginPath();
- ctx.arc(x, y, rad, 0, angle, false);
- ctx.stroke();
-
- // inner circle
- ctx.strokeStyle = '#eee';
- ctx.beginPath();
- ctx.arc(x, y, rad - 1, 0, angle, true);
- ctx.stroke();
-
- // text
- var text = this._text || (percent | 0) + '%'
- , w = ctx.measureText(text).width;
-
- ctx.fillText(
- text
- , x - w / 2 + 1
- , y + fontSize / 2 - 1);
- } catch (ex) {} //don't fail if we can't render progress
- return this;
-};
-
-}); // module: browser/progress.js
-
-require.register("browser/tty.js", function(module, exports, require){
-exports.isatty = function(){
- return true;
-};
-
-exports.getWindowSize = function(){
- if ('innerHeight' in global) {
- return [global.innerHeight, global.innerWidth];
- } else {
- // In a Web Worker, the DOM Window is not available.
- return [640, 480];
- }
-};
-
-}); // module: browser/tty.js
-
-require.register("context.js", function(module, exports, require){
-/**
- * Expose `Context`.
- */
-
-module.exports = Context;
-
-/**
- * Initialize a new `Context`.
- *
- * @api private
- */
-
-function Context(){}
-
-/**
- * Set or get the context `Runnable` to `runnable`.
- *
- * @param {Runnable} runnable
- * @return {Context}
- * @api private
- */
-
-Context.prototype.runnable = function(runnable){
- if (0 == arguments.length) return this._runnable;
- this.test = this._runnable = runnable;
- return this;
-};
-
-/**
- * Set test timeout `ms`.
- *
- * @param {Number} ms
- * @return {Context} self
- * @api private
- */
-
-Context.prototype.timeout = function(ms){
- if (arguments.length === 0) return this.runnable().timeout();
- this.runnable().timeout(ms);
- return this;
-};
-
-/**
- * Set test timeout `enabled`.
- *
- * @param {Boolean} enabled
- * @return {Context} self
- * @api private
- */
-
-Context.prototype.enableTimeouts = function (enabled) {
- this.runnable().enableTimeouts(enabled);
- return this;
-};
-
-
-/**
- * Set test slowness threshold `ms`.
- *
- * @param {Number} ms
- * @return {Context} self
- * @api private
- */
-
-Context.prototype.slow = function(ms){
- this.runnable().slow(ms);
- return this;
-};
-
-/**
- * Mark a test as skipped.
- *
- * @return {Context} self
- * @api private
- */
-
-Context.prototype.skip = function(){
- this.runnable().skip();
- return this;
-};
-
-/**
- * Inspect the context void of `._runnable`.
- *
- * @return {String}
- * @api private
- */
-
-Context.prototype.inspect = function(){
- return JSON.stringify(this, function(key, val){
- if ('_runnable' == key) return;
- if ('test' == key) return;
- return val;
- }, 2);
-};
-
-}); // module: context.js
-
-require.register("hook.js", function(module, exports, require){
-/**
- * Module dependencies.
- */
-
-var Runnable = require('./runnable');
-
-/**
- * Expose `Hook`.
- */
-
-module.exports = Hook;
-
-/**
- * Initialize a new `Hook` with the given `title` and callback `fn`.
- *
- * @param {String} title
- * @param {Function} fn
- * @api private
- */
-
-function Hook(title, fn) {
- Runnable.call(this, title, fn);
- this.type = 'hook';
-}
-
-/**
- * Inherit from `Runnable.prototype`.
- */
-
-function F(){};
-F.prototype = Runnable.prototype;
-Hook.prototype = new F;
-Hook.prototype.constructor = Hook;
-
-
-/**
- * Get or set the test `err`.
- *
- * @param {Error} err
- * @return {Error}
- * @api public
- */
-
-Hook.prototype.error = function(err){
- if (0 == arguments.length) {
- var err = this._error;
- this._error = null;
- return err;
- }
-
- this._error = err;
-};
-
-}); // module: hook.js
-
-require.register("interfaces/bdd.js", function(module, exports, require){
-/**
- * Module dependencies.
- */
-
-var Suite = require('../suite')
- , Test = require('../test')
- , utils = require('../utils')
- , escapeRe = require('browser/escape-string-regexp');
-
-/**
- * BDD-style interface:
- *
- * describe('Array', function(){
- * describe('#indexOf()', function(){
- * it('should return -1 when not present', function(){
- *
- * });
- *
- * it('should return the index when present', function(){
- *
- * });
- * });
- * });
- *
- */
-
-module.exports = function(suite){
- var suites = [suite];
-
- suite.on('pre-require', function(context, file, mocha){
-
- var common = require('./common')(suites, context);
-
- context.before = common.before;
- context.after = common.after;
- context.beforeEach = common.beforeEach;
- context.afterEach = common.afterEach;
- context.run = mocha.options.delay && common.runWithSuite(suite);
- /**
- * Describe a "suite" with the given `title`
- * and callback `fn` containing nested suites
- * and/or tests.
- */
-
- context.describe = context.context = function(title, fn){
- var suite = Suite.create(suites[0], title);
- suite.file = file;
- suites.unshift(suite);
- fn.call(suite);
- suites.shift();
- return suite;
- };
-
- /**
- * Pending describe.
- */
-
- context.xdescribe =
- context.xcontext =
- context.describe.skip = function(title, fn){
- var suite = Suite.create(suites[0], title);
- suite.pending = true;
- suites.unshift(suite);
- fn.call(suite);
- suites.shift();
- };
-
- /**
- * Exclusive suite.
- */
-
- context.describe.only = function(title, fn){
- var suite = context.describe(title, fn);
- mocha.grep(suite.fullTitle());
- return suite;
- };
-
- /**
- * Describe a specification or test-case
- * with the given `title` and callback `fn`
- * acting as a thunk.
- */
-
- context.it = context.specify = function(title, fn){
- var suite = suites[0];
- if (suite.pending) fn = null;
- var test = new Test(title, fn);
- test.file = file;
- suite.addTest(test);
- return test;
- };
-
- /**
- * Exclusive test-case.
- */
-
- context.it.only = function(title, fn){
- var test = context.it(title, fn);
- var reString = '^' + escapeRe(test.fullTitle()) + '$';
- mocha.grep(new RegExp(reString));
- return test;
- };
-
- /**
- * Pending test case.
- */
-
- context.xit =
- context.xspecify =
- context.it.skip = function(title){
- context.it(title);
- };
-
- });
-};
-
-}); // module: interfaces/bdd.js
-
-require.register("interfaces/common.js", function(module, exports, require){
-/**
- * Functions common to more than one interface
- * @module lib/interfaces/common
- */
-
-'use strict';
-
-module.exports = function (suites, context) {
-
- return {
- /**
- * This is only present if flag --delay is passed into Mocha. It triggers
- * root suite execution. Returns a function which runs the root suite.
- */
- runWithSuite: function runWithSuite(suite) {
- return function run() {
- suite.run();
- };
- },
-
- /**
- * Execute before running tests.
- */
- before: function (name, fn) {
- suites[0].beforeAll(name, fn);
- },
-
- /**
- * Execute after running tests.
- */
- after: function (name, fn) {
- suites[0].afterAll(name, fn);
- },
-
- /**
- * Execute before each test case.
- */
- beforeEach: function (name, fn) {
- suites[0].beforeEach(name, fn);
- },
-
- /**
- * Execute after each test case.
- */
- afterEach: function (name, fn) {
- suites[0].afterEach(name, fn);
- },
-
- test: {
- /**
- * Pending test case.
- */
- skip: function (title) {
- context.test(title);
- }
- }
- }
-};
-
-}); // module: interfaces/common.js
-
-require.register("interfaces/exports.js", function(module, exports, require){
-/**
- * Module dependencies.
- */
-
-var Suite = require('../suite')
- , Test = require('../test');
-
-/**
- * TDD-style interface:
- *
- * exports.Array = {
- * '#indexOf()': {
- * 'should return -1 when the value is not present': function(){
- *
- * },
- *
- * 'should return the correct index when the value is present': function(){
- *
- * }
- * }
- * };
- *
- */
-
-module.exports = function(suite){
- var suites = [suite];
-
- suite.on('require', visit);
-
- function visit(obj, file) {
- var suite;
- for (var key in obj) {
- if ('function' == typeof obj[key]) {
- var fn = obj[key];
- switch (key) {
- case 'before':
- suites[0].beforeAll(fn);
- break;
- case 'after':
- suites[0].afterAll(fn);
- break;
- case 'beforeEach':
- suites[0].beforeEach(fn);
- break;
- case 'afterEach':
- suites[0].afterEach(fn);
- break;
- default:
- var test = new Test(key, fn);
- test.file = file;
- suites[0].addTest(test);
- }
- } else {
- suite = Suite.create(suites[0], key);
- suites.unshift(suite);
- visit(obj[key]);
- suites.shift();
- }
- }
- }
-};
-
-}); // module: interfaces/exports.js
-
-require.register("interfaces/index.js", function(module, exports, require){
-exports.bdd = require('./bdd');
-exports.tdd = require('./tdd');
-exports.qunit = require('./qunit');
-exports.exports = require('./exports');
-
-}); // module: interfaces/index.js
-
-require.register("interfaces/qunit.js", function(module, exports, require){
-/**
- * Module dependencies.
- */
-
-var Suite = require('../suite')
- , Test = require('../test')
- , escapeRe = require('browser/escape-string-regexp')
- , utils = require('../utils');
-
-/**
- * QUnit-style interface:
- *
- * suite('Array');
- *
- * test('#length', function(){
- * var arr = [1,2,3];
- * ok(arr.length == 3);
- * });
- *
- * test('#indexOf()', function(){
- * var arr = [1,2,3];
- * ok(arr.indexOf(1) == 0);
- * ok(arr.indexOf(2) == 1);
- * ok(arr.indexOf(3) == 2);
- * });
- *
- * suite('String');
- *
- * test('#length', function(){
- * ok('foo'.length == 3);
- * });
- *
- */
-
-module.exports = function(suite){
- var suites = [suite];
-
- suite.on('pre-require', function(context, file, mocha){
-
- var common = require('./common')(suites, context);
-
- context.before = common.before;
- context.after = common.after;
- context.beforeEach = common.beforeEach;
- context.afterEach = common.afterEach;
- context.run = mocha.options.delay && common.runWithSuite(suite);
- /**
- * Describe a "suite" with the given `title`.
- */
-
- context.suite = function(title){
- if (suites.length > 1) suites.shift();
- var suite = Suite.create(suites[0], title);
- suite.file = file;
- suites.unshift(suite);
- return suite;
- };
-
- /**
- * Exclusive test-case.
- */
-
- context.suite.only = function(title, fn){
- var suite = context.suite(title, fn);
- mocha.grep(suite.fullTitle());
- };
-
- /**
- * Describe a specification or test-case
- * with the given `title` and callback `fn`
- * acting as a thunk.
- */
-
- context.test = function(title, fn){
- var test = new Test(title, fn);
- test.file = file;
- suites[0].addTest(test);
- return test;
- };
-
- /**
- * Exclusive test-case.
- */
-
- context.test.only = function(title, fn){
- var test = context.test(title, fn);
- var reString = '^' + escapeRe(test.fullTitle()) + '$';
- mocha.grep(new RegExp(reString));
- };
-
- context.test.skip = common.test.skip;
-
- });
-};
-
-}); // module: interfaces/qunit.js
-
-require.register("interfaces/tdd.js", function(module, exports, require){
-/**
- * Module dependencies.
- */
-
-var Suite = require('../suite')
- , Test = require('../test')
- , escapeRe = require('browser/escape-string-regexp')
- , utils = require('../utils');
-
-/**
- * TDD-style interface:
- *
- * suite('Array', function(){
- * suite('#indexOf()', function(){
- * suiteSetup(function(){
- *
- * });
- *
- * test('should return -1 when not present', function(){
- *
- * });
- *
- * test('should return the index when present', function(){
- *
- * });
- *
- * suiteTeardown(function(){
- *
- * });
- * });
- * });
- *
- */
-
-module.exports = function(suite){
- var suites = [suite];
-
- suite.on('pre-require', function(context, file, mocha){
-
- var common = require('./common')(suites, context);
-
- context.setup = common.beforeEach;
- context.teardown = common.afterEach;
- context.suiteSetup = common.before;
- context.suiteTeardown = common.after;
- context.run = mocha.options.delay && common.runWithSuite(suite);
- /**
- * Describe a "suite" with the given `title`
- * and callback `fn` containing nested suites
- * and/or tests.
- */
-
- context.suite = function(title, fn){
- var suite = Suite.create(suites[0], title);
- suite.file = file;
- suites.unshift(suite);
- fn.call(suite);
- suites.shift();
- return suite;
- };
-
- /**
- * Pending suite.
- */
- context.suite.skip = function(title, fn) {
- var suite = Suite.create(suites[0], title);
- suite.pending = true;
- suites.unshift(suite);
- fn.call(suite);
- suites.shift();
- };
-
- /**
- * Exclusive test-case.
- */
-
- context.suite.only = function(title, fn){
- var suite = context.suite(title, fn);
- mocha.grep(suite.fullTitle());
- };
-
- /**
- * Describe a specification or test-case
- * with the given `title` and callback `fn`
- * acting as a thunk.
- */
-
- context.test = function(title, fn){
- var suite = suites[0];
- if (suite.pending) fn = null;
- var test = new Test(title, fn);
- test.file = file;
- suite.addTest(test);
- return test;
- };
-
- /**
- * Exclusive test-case.
- */
-
- context.test.only = function(title, fn){
- var test = context.test(title, fn);
- var reString = '^' + escapeRe(test.fullTitle()) + '$';
- mocha.grep(new RegExp(reString));
- };
-
- context.test.skip = common.test.skip;
- });
-};
-
-}); // module: interfaces/tdd.js
-
-require.register("mocha.js", function(module, exports, require){
-/*!
- * mocha
- * Copyright(c) 2011 TJ Holowaychuk <tj@vision-media.ca>
- * MIT Licensed
- */
-
-/**
- * Module dependencies.
- */
-
-var path = require('browser/path')
- , escapeRe = require('browser/escape-string-regexp')
- , utils = require('./utils');
-
-/**
- * Expose `Mocha`.
- */
-
-exports = module.exports = Mocha;
-
-/**
- * To require local UIs and reporters when running in node.
- */
-
-if (typeof process !== 'undefined' && typeof process.cwd === 'function') {
- var join = path.join
- , cwd = process.cwd();
- module.paths.push(cwd, join(cwd, 'node_modules'));
-}
-
-/**
- * Expose internals.
- */
-
-exports.utils = utils;
-exports.interfaces = require('./interfaces');
-exports.reporters = require('./reporters');
-exports.Runnable = require('./runnable');
-exports.Context = require('./context');
-exports.Runner = require('./runner');
-exports.Suite = require('./suite');
-exports.Hook = require('./hook');
-exports.Test = require('./test');
-
-/**
- * Return image `name` path.
- *
- * @param {String} name
- * @return {String}
- * @api private
- */
-
-function image(name) {
- return __dirname + '/../images/' + name + '.png';
-}
-
-/**
- * Setup mocha with `options`.
- *
- * Options:
- *
- * - `ui` name "bdd", "tdd", "exports" etc
- * - `reporter` reporter instance, defaults to `mocha.reporters.spec`
- * - `globals` array of accepted globals
- * - `timeout` timeout in milliseconds
- * - `bail` bail on the first test failure
- * - `slow` milliseconds to wait before considering a test slow
- * - `ignoreLeaks` ignore global leaks
- * - `fullTrace` display the full stack-trace on failing
- * - `grep` string or regexp to filter tests with
- *
- * @param {Object} options
- * @api public
- */
-
-function Mocha(options) {
- options = options || {};
- this.files = [];
- this.options = options;
- if (options.grep) this.grep(new RegExp(options.grep));
- if (options.fgrep) this.grep(options.fgrep);
- this.suite = new exports.Suite('', new exports.Context);
- this.ui(options.ui);
- this.bail(options.bail);
- this.reporter(options.reporter, options.reporterOptions);
- if (null != options.timeout) this.timeout(options.timeout);
- this.useColors(options.useColors);
- if (options.enableTimeouts !== null) this.enableTimeouts(options.enableTimeouts);
- if (options.slow) this.slow(options.slow);
-
- this.suite.on('pre-require', function (context) {
- exports.afterEach = context.afterEach || context.teardown;
- exports.after = context.after || context.suiteTeardown;
- exports.beforeEach = context.beforeEach || context.setup;
- exports.before = context.before || context.suiteSetup;
- exports.describe = context.describe || context.suite;
- exports.it = context.it || context.test;
- exports.setup = context.setup || context.beforeEach;
- exports.suiteSetup = context.suiteSetup || context.before;
- exports.suiteTeardown = context.suiteTeardown || context.after;
- exports.suite = context.suite || context.describe;
- exports.teardown = context.teardown || context.afterEach;
- exports.test = context.test || context.it;
- exports.run = context.run;
- });
-}
-
-/**
- * Enable or disable bailing on the first failure.
- *
- * @param {Boolean} [bail]
- * @api public
- */
-
-Mocha.prototype.bail = function(bail){
- if (0 == arguments.length) bail = true;
- this.suite.bail(bail);
- return this;
-};
-
-/**
- * Add test `file`.
- *
- * @param {String} file
- * @api public
- */
-
-Mocha.prototype.addFile = function(file){
- this.files.push(file);
- return this;
-};
-
-/**
- * Set reporter to `reporter`, defaults to "spec".
- *
- * @param {String|Function} reporter name or constructor
- * @param {Object} reporterOptions optional options
- * @api public
- */
-Mocha.prototype.reporter = function(reporter, reporterOptions){
- if ('function' == typeof reporter) {
- this._reporter = reporter;
- } else {
- reporter = reporter || 'spec';
- var _reporter;
- try { _reporter = require('./reporters/' + reporter); } catch (err) {}
- if (!_reporter) try { _reporter = require(reporter); } catch (err) {
- err.message.indexOf('Cannot find module') !== -1
- ? console.warn('"' + reporter + '" reporter not found')
- : console.warn('"' + reporter + '" reporter blew up with error:\n' + err.stack);
- }
- if (!_reporter && reporter === 'teamcity')
- console.warn('The Teamcity reporter was moved to a package named ' +
- 'mocha-teamcity-reporter ' +
- '(https://npmjs.org/package/mocha-teamcity-reporter).');
- if (!_reporter) throw new Error('invalid reporter "' + reporter + '"');
- this._reporter = _reporter;
- }
- this.options.reporterOptions = reporterOptions;
- return this;
-};
-
-/**
- * Set test UI `name`, defaults to "bdd".
- *
- * @param {String} bdd
- * @api public
- */
-
-Mocha.prototype.ui = function(name){
- name = name || 'bdd';
- this._ui = exports.interfaces[name];
- if (!this._ui) try { this._ui = require(name); } catch (err) {}
- if (!this._ui) throw new Error('invalid interface "' + name + '"');
- this._ui = this._ui(this.suite);
- return this;
-};
-
-/**
- * Load registered files.
- *
- * @api private
- */
-
-Mocha.prototype.loadFiles = function(fn){
- var self = this;
- var suite = this.suite;
- var pending = this.files.length;
- this.files.forEach(function(file){
- file = path.resolve(file);
- suite.emit('pre-require', global, file, self);
- suite.emit('require', require(file), file, self);
- suite.emit('post-require', global, file, self);
- --pending || (fn && fn());
- });
-};
-
-/**
- * Enable growl support.
- *
- * @api private
- */
-
-Mocha.prototype._growl = function(runner, reporter) {
- var notify = require('growl');
-
- runner.on('end', function(){
- var stats = reporter.stats;
- if (stats.failures) {
- var msg = stats.failures + ' of ' + runner.total + ' tests failed';
- notify(msg, { name: 'mocha', title: 'Failed', image: image('error') });
- } else {
- notify(stats.passes + ' tests passed in ' + stats.duration + 'ms', {
- name: 'mocha'
- , title: 'Passed'
- , image: image('ok')
- });
- }
- });
-};
-
-/**
- * Add regexp to grep, if `re` is a string it is escaped.
- *
- * @param {RegExp|String} re
- * @return {Mocha}
- * @api public
- */
-
-Mocha.prototype.grep = function(re){
- this.options.grep = 'string' == typeof re
- ? new RegExp(escapeRe(re))
- : re;
- return this;
-};
-
-/**
- * Invert `.grep()` matches.
- *
- * @return {Mocha}
- * @api public
- */
-
-Mocha.prototype.invert = function(){
- this.options.invert = true;
- return this;
-};
-
-/**
- * Ignore global leaks.
- *
- * @param {Boolean} ignore
- * @return {Mocha}
- * @api public
- */
-
-Mocha.prototype.ignoreLeaks = function(ignore){
- this.options.ignoreLeaks = !!ignore;
- return this;
-};
-
-/**
- * Enable global leak checking.
- *
- * @return {Mocha}
- * @api public
- */
-
-Mocha.prototype.checkLeaks = function(){
- this.options.ignoreLeaks = false;
- return this;
-};
-
-/**
- * Display long stack-trace on failing
- *
- * @return {Mocha}
- * @api public
- */
-
-Mocha.prototype.fullTrace = function() {
- this.options.fullStackTrace = true;
- return this;
-};
-
-/**
- * Enable growl support.
- *
- * @return {Mocha}
- * @api public
- */
-
-Mocha.prototype.growl = function(){
- this.options.growl = true;
- return this;
-};
-
-/**
- * Ignore `globals` array or string.
- *
- * @param {Array|String} globals
- * @return {Mocha}
- * @api public
- */
-
-Mocha.prototype.globals = function(globals){
- this.options.globals = (this.options.globals || []).concat(globals);
- return this;
-};
-
-/**
- * Emit color output.
- *
- * @param {Boolean} colors
- * @return {Mocha}
- * @api public
- */
-
-Mocha.prototype.useColors = function(colors){
- if (colors !== undefined) {
- this.options.useColors = colors;
- }
- return this;
-};
-
-/**
- * Use inline diffs rather than +/-.
- *
- * @param {Boolean} inlineDiffs
- * @return {Mocha}
- * @api public
- */
-
-Mocha.prototype.useInlineDiffs = function(inlineDiffs) {
- this.options.useInlineDiffs = arguments.length && inlineDiffs != undefined
- ? inlineDiffs
- : false;
- return this;
-};
-
-/**
- * Set the timeout in milliseconds.
- *
- * @param {Number} timeout
- * @return {Mocha}
- * @api public
- */
-
-Mocha.prototype.timeout = function(timeout){
- this.suite.timeout(timeout);
- return this;
-};
-
-/**
- * Set slowness threshold in milliseconds.
- *
- * @param {Number} slow
- * @return {Mocha}
- * @api public
- */
-
-Mocha.prototype.slow = function(slow){
- this.suite.slow(slow);
- return this;
-};
-
-/**
- * Enable timeouts.
- *
- * @param {Boolean} enabled
- * @return {Mocha}
- * @api public
- */
-
-Mocha.prototype.enableTimeouts = function(enabled) {
- this.suite.enableTimeouts(arguments.length && enabled !== undefined
- ? enabled
- : true);
- return this
-};
-
-/**
- * Makes all tests async (accepting a callback)
- *
- * @return {Mocha}
- * @api public
- */
-
-Mocha.prototype.asyncOnly = function(){
- this.options.asyncOnly = true;
- return this;
-};
-
-/**
- * Disable syntax highlighting (in browser).
- * @returns {Mocha}
- * @api public
- */
-Mocha.prototype.noHighlighting = function() {
- this.options.noHighlighting = true;
- return this;
-};
-
-/**
- * Delay root suite execution.
- * @returns {Mocha}
- * @api public
- */
-Mocha.prototype.delay = function delay() {
- this.options.delay = true;
- return this;
-};
-
-/**
- * Run tests and invoke `fn()` when complete.
- *
- * @param {Function} fn
- * @return {Runner}
- * @api public
- */
-Mocha.prototype.run = function(fn){
- if (this.files.length) this.loadFiles();
- var suite = this.suite;
- var options = this.options;
- options.files = this.files;
- var runner = new exports.Runner(suite, options.delay);
- var reporter = new this._reporter(runner, options);
- runner.ignoreLeaks = false !== options.ignoreLeaks;
- runner.fullStackTrace = options.fullStackTrace;
- runner.asyncOnly = options.asyncOnly;
- if (options.grep) runner.grep(options.grep, options.invert);
- if (options.globals) runner.globals(options.globals);
- if (options.growl) this._growl(runner, reporter);
- if (options.useColors !== undefined) {
- exports.reporters.Base.useColors = options.useColors;
- }
- exports.reporters.Base.inlineDiffs = options.useInlineDiffs;
-
- function done(failures) {
- if (reporter.done) {
- reporter.done(failures, fn);
- } else fn && fn(failures);
- }
-
- return runner.run(done);
-};
-
-}); // module: mocha.js
-
-require.register("ms.js", function(module, exports, require){
-/**
- * Helpers.
- */
-
-var s = 1000;
-var m = s * 60;
-var h = m * 60;
-var d = h * 24;
-var y = d * 365.25;
-
-/**
- * Parse or format the given `val`.
- *
- * Options:
- *
- * - `long` verbose formatting [false]
- *
- * @param {String|Number} val
- * @param {Object} options
- * @return {String|Number}
- * @api public
- */
-
-module.exports = function(val, options){
- options = options || {};
- if ('string' == typeof val) return parse(val);
- return options['long'] ? longFormat(val) : shortFormat(val);
-};
-
-/**
- * Parse the given `str` and return milliseconds.
- *
- * @param {String} str
- * @return {Number}
- * @api private
- */
-
-function parse(str) {
- var match = /^((?:\d+)?\.?\d+) *(ms|seconds?|s|minutes?|m|hours?|h|days?|d|years?|y)?$/i.exec(str);
- if (!match) return;
- var n = parseFloat(match[1]);
- var type = (match[2] || 'ms').toLowerCase();
- switch (type) {
- case 'years':
- case 'year':
- case 'y':
- return n * y;
- case 'days':
- case 'day':
- case 'd':
- return n * d;
- case 'hours':
- case 'hour':
- case 'h':
- return n * h;
- case 'minutes':
- case 'minute':
- case 'm':
- return n * m;
- case 'seconds':
- case 'second':
- case 's':
- return n * s;
- case 'ms':
- return n;
- }
-}
-
-/**
- * Short format for `ms`.
- *
- * @param {Number} ms
- * @return {String}
- * @api private
- */
-
-function shortFormat(ms) {
- if (ms >= d) return Math.round(ms / d) + 'd';
- if (ms >= h) return Math.round(ms / h) + 'h';
- if (ms >= m) return Math.round(ms / m) + 'm';
- if (ms >= s) return Math.round(ms / s) + 's';
- return ms + 'ms';
-}
-
-/**
- * Long format for `ms`.
- *
- * @param {Number} ms
- * @return {String}
- * @api private
- */
-
-function longFormat(ms) {
- return plural(ms, d, 'day')
- || plural(ms, h, 'hour')
- || plural(ms, m, 'minute')
- || plural(ms, s, 'second')
- || ms + ' ms';
-}
-
-/**
- * Pluralization helper.
- */
-
-function plural(ms, n, name) {
- if (ms < n) return;
- if (ms < n * 1.5) return Math.floor(ms / n) + ' ' + name;
- return Math.ceil(ms / n) + ' ' + name + 's';
-}
-
-}); // module: ms.js
-
-require.register("pending.js", function(module, exports, require){
-
-/**
- * Expose `Pending`.
- */
-
-module.exports = Pending;
-
-/**
- * Initialize a new `Pending` error with the given message.
- *
- * @param {String} message
- */
-
-function Pending(message) {
- this.message = message;
-}
-
-}); // module: pending.js
-
-require.register("reporters/base.js", function(module, exports, require){
-/**
- * Module dependencies.
- */
-
-var tty = require('browser/tty')
- , diff = require('browser/diff')
- , ms = require('../ms')
- , utils = require('../utils')
- , supportsColor = process.env ? require('supports-color') : null;
-
-/**
- * Save timer references to avoid Sinon interfering (see GH-237).
- */
-
-var Date = global.Date
- , setTimeout = global.setTimeout
- , setInterval = global.setInterval
- , clearTimeout = global.clearTimeout
- , clearInterval = global.clearInterval;
-
-/**
- * Check if both stdio streams are associated with a tty.
- */
-
-var isatty = tty.isatty(1) && tty.isatty(2);
-
-/**
- * Expose `Base`.
- */
-
-exports = module.exports = Base;
-
-/**
- * Enable coloring by default, except in the browser interface.
- */
-
-exports.useColors = process.env
- ? (supportsColor || (process.env.MOCHA_COLORS !== undefined))
- : false;
-
-/**
- * Inline diffs instead of +/-
- */
-
-exports.inlineDiffs = false;
-
-/**
- * Default color map.
- */
-
-exports.colors = {
- 'pass': 90
- , 'fail': 31
- , 'bright pass': 92
- , 'bright fail': 91
- , 'bright yellow': 93
- , 'pending': 36
- , 'suite': 0
- , 'error title': 0
- , 'error message': 31
- , 'error stack': 90
- , 'checkmark': 32
- , 'fast': 90
- , 'medium': 33
- , 'slow': 31
- , 'green': 32
- , 'light': 90
- , 'diff gutter': 90
- , 'diff added': 42
- , 'diff removed': 41
-};
-
-/**
- * Default symbol map.
- */
-
-exports.symbols = {
- ok: '✓',
- err: '✖',
- dot: '․'
-};
-
-// With node.js on Windows: use symbols available in terminal default fonts
-if ('win32' == process.platform) {
- exports.symbols.ok = '\u221A';
- exports.symbols.err = '\u00D7';
- exports.symbols.dot = '.';
-}
-
-/**
- * Color `str` with the given `type`,
- * allowing colors to be disabled,
- * as well as user-defined color
- * schemes.
- *
- * @param {String} type
- * @param {String} str
- * @return {String}
- * @api private
- */
-
-var color = exports.color = function(type, str) {
- if (!exports.useColors) return String(str);
- return '\u001b[' + exports.colors[type] + 'm' + str + '\u001b[0m';
-};
-
-/**
- * Expose term window size, with some
- * defaults for when stderr is not a tty.
- */
-
-exports.window = {
- width: isatty
- ? process.stdout.getWindowSize
- ? process.stdout.getWindowSize(1)[0]
- : tty.getWindowSize()[1]
- : 75
-};
-
-/**
- * Expose some basic cursor interactions
- * that are common among reporters.
- */
-
-exports.cursor = {
- hide: function(){
- isatty && process.stdout.write('\u001b[?25l');
- },
-
- show: function(){
- isatty && process.stdout.write('\u001b[?25h');
- },
-
- deleteLine: function(){
- isatty && process.stdout.write('\u001b[2K');
- },
-
- beginningOfLine: function(){
- isatty && process.stdout.write('\u001b[0G');
- },
-
- CR: function(){
- if (isatty) {
- exports.cursor.deleteLine();
- exports.cursor.beginningOfLine();
- } else {
- process.stdout.write('\r');
- }
- }
-};
-
-/**
- * Outut the given `failures` as a list.
- *
- * @param {Array} failures
- * @api public
- */
-
-exports.list = function(failures){
- console.log();
- failures.forEach(function(test, i){
- // format
- var fmt = color('error title', ' %s) %s:\n')
- + color('error message', ' %s')
- + color('error stack', '\n%s\n');
-
- // msg
- var err = test.err
- , message = err.message || ''
- , stack = err.stack || message
- , index = stack.indexOf(message)
- , actual = err.actual
- , expected = err.expected
- , escape = true;
- if (index === -1) {
- msg = message;
- } else {
- index += message.length;
- msg = stack.slice(0, index);
- // remove msg from stack
- stack = stack.slice(index + 1);
- }
-
- // uncaught
- if (err.uncaught) {
- msg = 'Uncaught ' + msg;
- }
- // explicitly show diff
- if (err.showDiff !== false && sameType(actual, expected)
- && expected !== undefined) {
-
- if ('string' !== typeof actual) {
- escape = false;
- err.actual = actual = utils.stringify(actual);
- err.expected = expected = utils.stringify(expected);
- }
-
- fmt = color('error title', ' %s) %s:\n%s') + color('error stack', '\n%s\n');
- var match = message.match(/^([^:]+): expected/);
- msg = '\n ' + color('error message', match ? match[1] : msg);
-
- if (exports.inlineDiffs) {
- msg += inlineDiff(err, escape);
- } else {
- msg += unifiedDiff(err, escape);
- }
- }
-
- // indent stack trace
- stack = stack.replace(/^/gm, ' ');
-
- console.log(fmt, (i + 1), test.fullTitle(), msg, stack);
- });
-};
-
-/**
- * Initialize a new `Base` reporter.
- *
- * All other reporters generally
- * inherit from this reporter, providing
- * stats such as test duration, number
- * of tests passed / failed etc.
- *
- * @param {Runner} runner
- * @api public
- */
-
-function Base(runner) {
- var self = this
- , stats = this.stats = { suites: 0, tests: 0, passes: 0, pending: 0, failures: 0 }
- , failures = this.failures = [];
-
- if (!runner) return;
- this.runner = runner;
-
- runner.stats = stats;
-
- runner.on('start', function(){
- stats.start = new Date;
- });
-
- runner.on('suite', function(suite){
- stats.suites = stats.suites || 0;
- suite.root || stats.suites++;
- });
-
- runner.on('test end', function(test){
- stats.tests = stats.tests || 0;
- stats.tests++;
- });
-
- runner.on('pass', function(test){
- stats.passes = stats.passes || 0;
-
- var medium = test.slow() / 2;
- test.speed = test.duration > test.slow()
- ? 'slow'
- : test.duration > medium
- ? 'medium'
- : 'fast';
-
- stats.passes++;
- });
-
- runner.on('fail', function(test, err){
- stats.failures = stats.failures || 0;
- stats.failures++;
- test.err = err;
- failures.push(test);
- });
-
- runner.on('end', function(){
- stats.end = new Date;
- stats.duration = new Date - stats.start;
- });
-
- runner.on('pending', function(){
- stats.pending++;
- });
-}
-
-/**
- * Output common epilogue used by many of
- * the bundled reporters.
- *
- * @api public
- */
-
-Base.prototype.epilogue = function(){
- var stats = this.stats;
- var tests;
- var fmt;
-
- console.log();
-
- // passes
- fmt = color('bright pass', ' ')
- + color('green', ' %d passing')
- + color('light', ' (%s)');
-
- console.log(fmt,
- stats.passes || 0,
- ms(stats.duration));
-
- // pending
- if (stats.pending) {
- fmt = color('pending', ' ')
- + color('pending', ' %d pending');
-
- console.log(fmt, stats.pending);
- }
-
- // failures
- if (stats.failures) {
- fmt = color('fail', ' %d failing');
-
- console.log(fmt, stats.failures);
-
- Base.list(this.failures);
- console.log();
- }
-
- console.log();
-};
-
-/**
- * Pad the given `str` to `len`.
- *
- * @param {String} str
- * @param {String} len
- * @return {String}
- * @api private
- */
-
-function pad(str, len) {
- str = String(str);
- return Array(len - str.length + 1).join(' ') + str;
-}
-
-
-/**
- * Returns an inline diff between 2 strings with coloured ANSI output
- *
- * @param {Error} Error with actual/expected
- * @return {String} Diff
- * @api private
- */
-
-function inlineDiff(err, escape) {
- var msg = errorDiff(err, 'WordsWithSpace', escape);
-
- // linenos
- var lines = msg.split('\n');
- if (lines.length > 4) {
- var width = String(lines.length).length;
- msg = lines.map(function(str, i){
- return pad(++i, width) + ' |' + ' ' + str;
- }).join('\n');
- }
-
- // legend
- msg = '\n'
- + color('diff removed', 'actual')
- + ' '
- + color('diff added', 'expected')
- + '\n\n'
- + msg
- + '\n';
-
- // indent
- msg = msg.replace(/^/gm, ' ');
- return msg;
-}
-
-/**
- * Returns a unified diff between 2 strings
- *
- * @param {Error} Error with actual/expected
- * @return {String} Diff
- * @api private
- */
-
-function unifiedDiff(err, escape) {
- var indent = ' ';
- function cleanUp(line) {
- if (escape) {
- line = escapeInvisibles(line);
- }
- if (line[0] === '+') return indent + colorLines('diff added', line);
- if (line[0] === '-') return indent + colorLines('diff removed', line);
- if (line.match(/\@\@/)) return null;
- if (line.match(/\\ No newline/)) return null;
- else return indent + line;
- }
- function notBlank(line) {
- return line != null;
- }
- var msg = diff.createPatch('string', err.actual, err.expected);
- var lines = msg.split('\n').splice(4);
- return '\n '
- + colorLines('diff added', '+ expected') + ' '
- + colorLines('diff removed', '- actual')
- + '\n\n'
- + lines.map(cleanUp).filter(notBlank).join('\n');
-}
-
-/**
- * Return a character diff for `err`.
- *
- * @param {Error} err
- * @return {String}
- * @api private
- */
-
-function errorDiff(err, type, escape) {
- var actual = escape ? escapeInvisibles(err.actual) : err.actual;
- var expected = escape ? escapeInvisibles(err.expected) : err.expected;
- return diff['diff' + type](actual, expected).map(function(str){
- if (str.added) return colorLines('diff added', str.value);
- if (str.removed) return colorLines('diff removed', str.value);
- return str.value;
- }).join('');
-}
-
-/**
- * Returns a string with all invisible characters in plain text
- *
- * @param {String} line
- * @return {String}
- * @api private
- */
-function escapeInvisibles(line) {
- return line.replace(/\t/g, '<tab>')
- .replace(/\r/g, '<CR>')
- .replace(/\n/g, '<LF>\n');
-}
-
-/**
- * Color lines for `str`, using the color `name`.
- *
- * @param {String} name
- * @param {String} str
- * @return {String}
- * @api private
- */
-
-function colorLines(name, str) {
- return str.split('\n').map(function(str){
- return color(name, str);
- }).join('\n');
-}
-
-/**
- * Check that a / b have the same type.
- *
- * @param {Object} a
- * @param {Object} b
- * @return {Boolean}
- * @api private
- */
-
-function sameType(a, b) {
- a = Object.prototype.toString.call(a);
- b = Object.prototype.toString.call(b);
- return a == b;
-}
-
-}); // module: reporters/base.js
-
-require.register("reporters/doc.js", function(module, exports, require){
-/**
- * Module dependencies.
- */
-
-var Base = require('./base')
- , utils = require('../utils');
-
-/**
- * Expose `Doc`.
- */
-
-exports = module.exports = Doc;
-
-/**
- * Initialize a new `Doc` reporter.
- *
- * @param {Runner} runner
- * @api public
- */
-
-function Doc(runner) {
- Base.call(this, runner);
-
- var self = this
- , stats = this.stats
- , total = runner.total
- , indents = 2;
-
- function indent() {
- return Array(indents).join(' ');
- }
-
- runner.on('suite', function(suite){
- if (suite.root) return;
- ++indents;
- console.log('%s<section class="suite">', indent());
- ++indents;
- console.log('%s<h1>%s</h1>', indent(), utils.escape(suite.title));
- console.log('%s<dl>', indent());
- });
-
- runner.on('suite end', function(suite){
- if (suite.root) return;
- console.log('%s</dl>', indent());
- --indents;
- console.log('%s</section>', indent());
- --indents;
- });
-
- runner.on('pass', function(test){
- console.log('%s <dt>%s</dt>', indent(), utils.escape(test.title));
- var code = utils.escape(utils.clean(test.fn.toString()));
- console.log('%s <dd><pre><code>%s</code></pre></dd>', indent(), code);
- });
-
- runner.on('fail', function(test, err){
- console.log('%s <dt class="error">%s</dt>', indent(), utils.escape(test.title));
- var code = utils.escape(utils.clean(test.fn.toString()));
- console.log('%s <dd class="error"><pre><code>%s</code></pre></dd>', indent(), code);
- console.log('%s <dd class="error">%s</dd>', indent(), utils.escape(err));
- });
-}
-
-}); // module: reporters/doc.js
-
-require.register("reporters/dot.js", function(module, exports, require){
-/**
- * Module dependencies.
- */
-
-var Base = require('./base')
- , color = Base.color;
-
-/**
- * Expose `Dot`.
- */
-
-exports = module.exports = Dot;
-
-/**
- * Initialize a new `Dot` matrix test reporter.
- *
- * @param {Runner} runner
- * @api public
- */
-
-function Dot(runner) {
- Base.call(this, runner);
-
- var self = this
- , stats = this.stats
- , width = Base.window.width * .75 | 0
- , n = -1;
-
- runner.on('start', function(){
- process.stdout.write('\n');
- });
-
- runner.on('pending', function(test){
- if (++n % width == 0) process.stdout.write('\n ');
- process.stdout.write(color('pending', Base.symbols.dot));
- });
-
- runner.on('pass', function(test){
- if (++n % width == 0) process.stdout.write('\n ');
- if ('slow' == test.speed) {
- process.stdout.write(color('bright yellow', Base.symbols.dot));
- } else {
- process.stdout.write(color(test.speed, Base.symbols.dot));
- }
- });
-
- runner.on('fail', function(test, err){
- if (++n % width == 0) process.stdout.write('\n ');
- process.stdout.write(color('fail', Base.symbols.dot));
- });
-
- runner.on('end', function(){
- console.log();
- self.epilogue();
- });
-}
-
-/**
- * Inherit from `Base.prototype`.
- */
-
-function F(){};
-F.prototype = Base.prototype;
-Dot.prototype = new F;
-Dot.prototype.constructor = Dot;
-
-
-}); // module: reporters/dot.js
-
-require.register("reporters/html-cov.js", function(module, exports, require){
-/**
- * Module dependencies.
- */
-
-var JSONCov = require('./json-cov')
- , fs = require('browser/fs');
-
-/**
- * Expose `HTMLCov`.
- */
-
-exports = module.exports = HTMLCov;
-
-/**
- * Initialize a new `JsCoverage` reporter.
- *
- * @param {Runner} runner
- * @api public
- */
-
-function HTMLCov(runner) {
- var jade = require('jade')
- , file = __dirname + '/templates/coverage.jade'
- , str = fs.readFileSync(file, 'utf8')
- , fn = jade.compile(str, { filename: file })
- , self = this;
-
- JSONCov.call(this, runner, false);
-
- runner.on('end', function(){
- process.stdout.write(fn({
- cov: self.cov
- , coverageClass: coverageClass
- }));
- });
-}
-
-/**
- * Return coverage class for `n`.
- *
- * @return {String}
- * @api private
- */
-
-function coverageClass(n) {
- if (n >= 75) return 'high';
- if (n >= 50) return 'medium';
- if (n >= 25) return 'low';
- return 'terrible';
-}
-
-}); // module: reporters/html-cov.js
-
-require.register("reporters/html.js", function(module, exports, require){
-/**
- * Module dependencies.
- */
-
-var Base = require('./base')
- , utils = require('../utils')
- , Progress = require('../browser/progress')
- , escape = utils.escape;
-
-/**
- * Save timer references to avoid Sinon interfering (see GH-237).
- */
-
-var Date = global.Date
- , setTimeout = global.setTimeout
- , setInterval = global.setInterval
- , clearTimeout = global.clearTimeout
- , clearInterval = global.clearInterval;
-
-/**
- * Expose `HTML`.
- */
-
-exports = module.exports = HTML;
-
-/**
- * Stats template.
- */
-
-var statsTemplate = '<ul id="mocha-stats">'
- + '<li class="progress"><canvas width="40" height="40"></canvas></li>'
- + '<li class="passes"><a href="#">passes:</a> <em>0</em></li>'
- + '<li class="failures"><a href="#">failures:</a> <em>0</em></li>'
- + '<li class="duration">duration: <em>0</em>s</li>'
- + '</ul>';
-
-/**
- * Initialize a new `HTML` reporter.
- *
- * @param {Runner} runner
- * @api public
- */
-
-function HTML(runner) {
- Base.call(this, runner);
-
- var self = this
- , stats = this.stats
- , total = runner.total
- , stat = fragment(statsTemplate)
- , items = stat.getElementsByTagName('li')
- , passes = items[1].getElementsByTagName('em')[0]
- , passesLink = items[1].getElementsByTagName('a')[0]
- , failures = items[2].getElementsByTagName('em')[0]
- , failuresLink = items[2].getElementsByTagName('a')[0]
- , duration = items[3].getElementsByTagName('em')[0]
- , canvas = stat.getElementsByTagName('canvas')[0]
- , report = fragment('<ul id="mocha-report"></ul>')
- , stack = [report]
- , progress
- , ctx
- , root = document.getElementById('mocha');
-
- if (canvas.getContext) {
- var ratio = window.devicePixelRatio || 1;
- canvas.style.width = canvas.width;
- canvas.style.height = canvas.height;
- canvas.width *= ratio;
- canvas.height *= ratio;
- ctx = canvas.getContext('2d');
- ctx.scale(ratio, ratio);
- progress = new Progress;
- }
-
- if (!root) return error('#mocha div missing, add it to your document');
-
- // pass toggle
- on(passesLink, 'click', function(){
- unhide();
- var name = /pass/.test(report.className) ? '' : ' pass';
- report.className = report.className.replace(/fail|pass/g, '') + name;
- if (report.className.trim()) hideSuitesWithout('test pass');
- });
-
- // failure toggle
- on(failuresLink, 'click', function(){
- unhide();
- var name = /fail/.test(report.className) ? '' : ' fail';
- report.className = report.className.replace(/fail|pass/g, '') + name;
- if (report.className.trim()) hideSuitesWithout('test fail');
- });
-
- root.appendChild(stat);
- root.appendChild(report);
-
- if (progress) progress.size(40);
-
- runner.on('suite', function(suite){
- if (suite.root) return;
-
- // suite
- var url = self.suiteURL(suite);
- var el = fragment('<li class="suite"><h1><a href="%s">%s</a></h1></li>', url, escape(suite.title));
-
- // container
- stack[0].appendChild(el);
- stack.unshift(document.createElement('ul'));
- el.appendChild(stack[0]);
- });
-
- runner.on('suite end', function(suite){
- if (suite.root) return;
- stack.shift();
- });
-
- runner.on('fail', function(test, err){
- if ('hook' == test.type) runner.emit('test end', test);
- });
-
- runner.on('test end', function(test){
- // TODO: add to stats
- var percent = stats.tests / this.total * 100 | 0;
- if (progress) progress.update(percent).draw(ctx);
-
- // update stats
- var ms = new Date - stats.start;
- text(passes, stats.passes);
- text(failures, stats.failures);
- text(duration, (ms / 1000).toFixed(2));
-
- // test
- if ('passed' == test.state) {
- var url = self.testURL(test);
- var el = fragment('<li class="test pass %e"><h2>%e<span class="duration">%ems</span> <a href="%s" class="replay">‣</a></h2></li>', test.speed, test.title, test.duration, url);
- } else if (test.pending) {
- var el = fragment('<li class="test pass pending"><h2>%e</h2></li>', test.title);
- } else {
- var el = fragment('<li class="test fail"><h2>%e <a href="%e" class="replay">‣</a></h2></li>', test.title, self.testURL(test));
- var str = test.err.stack || test.err.toString();
-
- // FF / Opera do not add the message
- if (!~str.indexOf(test.err.message)) {
- str = test.err.message + '\n' + str;
- }
-
- // <=IE7 stringifies to [Object Error]. Since it can be overloaded, we
- // check for the result of the stringifying.
- if ('[object Error]' == str) str = test.err.message;
-
- // Safari doesn't give you a stack. Let's at least provide a source line.
- if (!test.err.stack && test.err.sourceURL && test.err.line !== undefined) {
- str += "\n(" + test.err.sourceURL + ":" + test.err.line + ")";
- }
-
- el.appendChild(fragment('<pre class="error">%e</pre>', str));
- }
-
- // toggle code
- // TODO: defer
- if (!test.pending) {
- var h2 = el.getElementsByTagName('h2')[0];
-
- on(h2, 'click', function(){
- pre.style.display = 'none' == pre.style.display
- ? 'block'
- : 'none';
- });
-
- var pre = fragment('<pre><code>%e</code></pre>', utils.clean(test.fn.toString()));
- el.appendChild(pre);
- pre.style.display = 'none';
- }
-
- // Don't call .appendChild if #mocha-report was already .shift()'ed off the stack.
- if (stack[0]) stack[0].appendChild(el);
- });
-}
-
-/**
- * Makes a URL, preserving querystring ("search") parameters.
- * @param {string} s
- * @returns {string} your new URL
- */
-var makeUrl = function makeUrl(s) {
- var search = window.location.search;
-
- // Remove previous grep query parameter if present
- if (search) {
- search = search.replace(/[?&]grep=[^&\s]*/g, '').replace(/^&/, '?');
- }
-
- return window.location.pathname + (search ? search + '&' : '?' ) + 'grep=' + encodeURIComponent(s);
-};
-
-/**
- * Provide suite URL
- *
- * @param {Object} [suite]
- */
-HTML.prototype.suiteURL = function(suite){
- return makeUrl(suite.fullTitle());
-};
-
-/**
- * Provide test URL
- *
- * @param {Object} [test]
- */
-
-HTML.prototype.testURL = function(test){
- return makeUrl(test.fullTitle());
-};
-
-/**
- * Display error `msg`.
- */
-
-function error(msg) {
- document.body.appendChild(fragment('<div id="mocha-error">%s</div>', msg));
-}
-
-/**
- * Return a DOM fragment from `html`.
- */
-
-function fragment(html) {
- var args = arguments
- , div = document.createElement('div')
- , i = 1;
-
- div.innerHTML = html.replace(/%([se])/g, function(_, type){
- switch (type) {
- case 's': return String(args[i++]);
- case 'e': return escape(args[i++]);
- }
- });
-
- return div.firstChild;
-}
-
-/**
- * Check for suites that do not have elements
- * with `classname`, and hide them.
- */
-
-function hideSuitesWithout(classname) {
- var suites = document.getElementsByClassName('suite');
- for (var i = 0; i < suites.length; i++) {
- var els = suites[i].getElementsByClassName(classname);
- if (0 == els.length) suites[i].className += ' hidden';
- }
-}
-
-/**
- * Unhide .hidden suites.
- */
-
-function unhide() {
- var els = document.getElementsByClassName('suite hidden');
- for (var i = 0; i < els.length; ++i) {
- els[i].className = els[i].className.replace('suite hidden', 'suite');
- }
-}
-
-/**
- * Set `el` text to `str`.
- */
-
-function text(el, str) {
- if (el.textContent) {
- el.textContent = str;
- } else {
- el.innerText = str;
- }
-}
-
-/**
- * Listen on `event` with callback `fn`.
- */
-
-function on(el, event, fn) {
- if (el.addEventListener) {
- el.addEventListener(event, fn, false);
- } else {
- el.attachEvent('on' + event, fn);
- }
-}
-
-}); // module: reporters/html.js
-
-require.register("reporters/index.js", function(module, exports, require){
-exports.Base = require('./base');
-exports.Dot = require('./dot');
-exports.Doc = require('./doc');
-exports.TAP = require('./tap');
-exports.JSON = require('./json');
-exports.HTML = require('./html');
-exports.List = require('./list');
-exports.Min = require('./min');
-exports.Spec = require('./spec');
-exports.Nyan = require('./nyan');
-exports.XUnit = require('./xunit');
-exports.Markdown = require('./markdown');
-exports.Progress = require('./progress');
-exports.Landing = require('./landing');
-exports.JSONCov = require('./json-cov');
-exports.HTMLCov = require('./html-cov');
-exports.JSONStream = require('./json-stream');
-
-}); // module: reporters/index.js
-
-require.register("reporters/json-cov.js", function(module, exports, require){
-/**
- * Module dependencies.
- */
-
-var Base = require('./base');
-
-/**
- * Expose `JSONCov`.
- */
-
-exports = module.exports = JSONCov;
-
-/**
- * Initialize a new `JsCoverage` reporter.
- *
- * @param {Runner} runner
- * @param {Boolean} output
- * @api public
- */
-
-function JSONCov(runner, output) {
- var self = this
- , output = 1 == arguments.length ? true : output;
-
- Base.call(this, runner);
-
- var tests = []
- , failures = []
- , passes = [];
-
- runner.on('test end', function(test){
- tests.push(test);
- });
-
- runner.on('pass', function(test){
- passes.push(test);
- });
-
- runner.on('fail', function(test){
- failures.push(test);
- });
-
- runner.on('end', function(){
- var cov = global._$jscoverage || {};
- var result = self.cov = map(cov);
- result.stats = self.stats;
- result.tests = tests.map(clean);
- result.failures = failures.map(clean);
- result.passes = passes.map(clean);
- if (!output) return;
- process.stdout.write(JSON.stringify(result, null, 2 ));
- });
-}
-
-/**
- * Map jscoverage data to a JSON structure
- * suitable for reporting.
- *
- * @param {Object} cov
- * @return {Object}
- * @api private
- */
-
-function map(cov) {
- var ret = {
- instrumentation: 'node-jscoverage'
- , sloc: 0
- , hits: 0
- , misses: 0
- , coverage: 0
- , files: []
- };
-
- for (var filename in cov) {
- var data = coverage(filename, cov[filename]);
- ret.files.push(data);
- ret.hits += data.hits;
- ret.misses += data.misses;
- ret.sloc += data.sloc;
- }
-
- ret.files.sort(function(a, b) {
- return a.filename.localeCompare(b.filename);
- });
-
- if (ret.sloc > 0) {
- ret.coverage = (ret.hits / ret.sloc) * 100;
- }
-
- return ret;
-}
-
-/**
- * Map jscoverage data for a single source file
- * to a JSON structure suitable for reporting.
- *
- * @param {String} filename name of the source file
- * @param {Object} data jscoverage coverage data
- * @return {Object}
- * @api private
- */
-
-function coverage(filename, data) {
- var ret = {
- filename: filename,
- coverage: 0,
- hits: 0,
- misses: 0,
- sloc: 0,
- source: {}
- };
-
- data.source.forEach(function(line, num){
- num++;
-
- if (data[num] === 0) {
- ret.misses++;
- ret.sloc++;
- } else if (data[num] !== undefined) {
- ret.hits++;
- ret.sloc++;
- }
-
- ret.source[num] = {
- source: line
- , coverage: data[num] === undefined
- ? ''
- : data[num]
- };
- });
-
- ret.coverage = ret.hits / ret.sloc * 100;
-
- return ret;
-}
-
-/**
- * Return a plain-object representation of `test`
- * free of cyclic properties etc.
- *
- * @param {Object} test
- * @return {Object}
- * @api private
- */
-
-function clean(test) {
- return {
- title: test.title
- , fullTitle: test.fullTitle()
- , duration: test.duration
- }
-}
-
-}); // module: reporters/json-cov.js
-
-require.register("reporters/json-stream.js", function(module, exports, require){
-/**
- * Module dependencies.
- */
-
-var Base = require('./base')
- , color = Base.color;
-
-/**
- * Expose `List`.
- */
-
-exports = module.exports = List;
-
-/**
- * Initialize a new `List` test reporter.
- *
- * @param {Runner} runner
- * @api public
- */
-
-function List(runner) {
- Base.call(this, runner);
-
- var self = this
- , stats = this.stats
- , total = runner.total;
-
- runner.on('start', function(){
- console.log(JSON.stringify(['start', { total: total }]));
- });
-
- runner.on('pass', function(test){
- console.log(JSON.stringify(['pass', clean(test)]));
- });
-
- runner.on('fail', function(test, err){
- test = clean(test);
- test.err = err.message;
- console.log(JSON.stringify(['fail', test]));
- });
-
- runner.on('end', function(){
- process.stdout.write(JSON.stringify(['end', self.stats]));
- });
-}
-
-/**
- * Return a plain-object representation of `test`
- * free of cyclic properties etc.
- *
- * @param {Object} test
- * @return {Object}
- * @api private
- */
-
-function clean(test) {
- return {
- title: test.title
- , fullTitle: test.fullTitle()
- , duration: test.duration
- }
-}
-
-}); // module: reporters/json-stream.js
-
-require.register("reporters/json.js", function(module, exports, require){
-/**
- * Module dependencies.
- */
-
-var Base = require('./base')
- , cursor = Base.cursor
- , color = Base.color;
-
-/**
- * Expose `JSON`.
- */
-
-exports = module.exports = JSONReporter;
-
-/**
- * Initialize a new `JSON` reporter.
- *
- * @param {Runner} runner
- * @api public
- */
-
-function JSONReporter(runner) {
- var self = this;
- Base.call(this, runner);
-
- var tests = []
- , pending = []
- , failures = []
- , passes = [];
-
- runner.on('test end', function(test){
- tests.push(test);
- });
-
- runner.on('pass', function(test){
- passes.push(test);
- });
-
- runner.on('fail', function(test){
- failures.push(test);
- });
-
- runner.on('pending', function(test){
- pending.push(test);
- });
-
- runner.on('end', function(){
- var obj = {
- stats: self.stats,
- tests: tests.map(clean),
- pending: pending.map(clean),
- failures: failures.map(clean),
- passes: passes.map(clean)
- };
-
- runner.testResults = obj;
-
- process.stdout.write(JSON.stringify(obj, null, 2));
- });
-}
-
-/**
- * Return a plain-object representation of `test`
- * free of cyclic properties etc.
- *
- * @param {Object} test
- * @return {Object}
- * @api private
- */
-
-function clean(test) {
- return {
- title: test.title,
- fullTitle: test.fullTitle(),
- duration: test.duration,
- err: errorJSON(test.err || {})
- }
-}
-
-/**
- * Transform `error` into a JSON object.
- * @param {Error} err
- * @return {Object}
- */
-
-function errorJSON(err) {
- var res = {};
- Object.getOwnPropertyNames(err).forEach(function(key) {
- res[key] = err[key];
- }, err);
- return res;
-}
-
-}); // module: reporters/json.js
-
-require.register("reporters/landing.js", function(module, exports, require){
-/**
- * Module dependencies.
- */
-
-var Base = require('./base')
- , cursor = Base.cursor
- , color = Base.color;
-
-/**
- * Expose `Landing`.
- */
-
-exports = module.exports = Landing;
-
-/**
- * Airplane color.
- */
-
-Base.colors.plane = 0;
-
-/**
- * Airplane crash color.
- */
-
-Base.colors['plane crash'] = 31;
-
-/**
- * Runway color.
- */
-
-Base.colors.runway = 90;
-
-/**
- * Initialize a new `Landing` reporter.
- *
- * @param {Runner} runner
- * @api public
- */
-
-function Landing(runner) {
- Base.call(this, runner);
-
- var self = this
- , stats = this.stats
- , width = Base.window.width * .75 | 0
- , total = runner.total
- , stream = process.stdout
- , plane = color('plane', '✈')
- , crashed = -1
- , n = 0;
-
- function runway() {
- var buf = Array(width).join('-');
- return ' ' + color('runway', buf);
- }
-
- runner.on('start', function(){
- stream.write('\n\n\n ');
- cursor.hide();
- });
-
- runner.on('test end', function(test){
- // check if the plane crashed
- var col = -1 == crashed
- ? width * ++n / total | 0
- : crashed;
-
- // show the crash
- if ('failed' == test.state) {
- plane = color('plane crash', '✈');
- crashed = col;
- }
-
- // render landing strip
- stream.write('\u001b['+(width+1)+'D\u001b[2A');
- stream.write(runway());
- stream.write('\n ');
- stream.write(color('runway', Array(col).join('⋅')));
- stream.write(plane)
- stream.write(color('runway', Array(width - col).join('⋅') + '\n'));
- stream.write(runway());
- stream.write('\u001b[0m');
- });
-
- runner.on('end', function(){
- cursor.show();
- console.log();
- self.epilogue();
- });
-}
-
-/**
- * Inherit from `Base.prototype`.
- */
-
-function F(){};
-F.prototype = Base.prototype;
-Landing.prototype = new F;
-Landing.prototype.constructor = Landing;
-
-
-}); // module: reporters/landing.js
-
-require.register("reporters/list.js", function(module, exports, require){
-/**
- * Module dependencies.
- */
-
-var Base = require('./base')
- , cursor = Base.cursor
- , color = Base.color;
-
-/**
- * Expose `List`.
- */
-
-exports = module.exports = List;
-
-/**
- * Initialize a new `List` test reporter.
- *
- * @param {Runner} runner
- * @api public
- */
-
-function List(runner) {
- Base.call(this, runner);
-
- var self = this
- , stats = this.stats
- , n = 0;
-
- runner.on('start', function(){
- console.log();
- });
-
- runner.on('test', function(test){
- process.stdout.write(color('pass', ' ' + test.fullTitle() + ': '));
- });
-
- runner.on('pending', function(test){
- var fmt = color('checkmark', ' -')
- + color('pending', ' %s');
- console.log(fmt, test.fullTitle());
- });
-
- runner.on('pass', function(test){
- var fmt = color('checkmark', ' '+Base.symbols.dot)
- + color('pass', ' %s: ')
- + color(test.speed, '%dms');
- cursor.CR();
- console.log(fmt, test.fullTitle(), test.duration);
- });
-
- runner.on('fail', function(test, err){
- cursor.CR();
- console.log(color('fail', ' %d) %s'), ++n, test.fullTitle());
- });
-
- runner.on('end', self.epilogue.bind(self));
-}
-
-/**
- * Inherit from `Base.prototype`.
- */
-
-function F(){};
-F.prototype = Base.prototype;
-List.prototype = new F;
-List.prototype.constructor = List;
-
-
-}); // module: reporters/list.js
-
-require.register("reporters/markdown.js", function(module, exports, require){
-/**
- * Module dependencies.
- */
-
-var Base = require('./base')
- , utils = require('../utils');
-
-/**
- * Constants
- */
-
-var SUITE_PREFIX = '$';
-
-/**
- * Expose `Markdown`.
- */
-
-exports = module.exports = Markdown;
-
-/**
- * Initialize a new `Markdown` reporter.
- *
- * @param {Runner} runner
- * @api public
- */
-
-function Markdown(runner) {
- Base.call(this, runner);
-
- var self = this
- , stats = this.stats
- , level = 0
- , buf = '';
-
- function title(str) {
- return Array(level).join('#') + ' ' + str;
- }
-
- function indent() {
- return Array(level).join(' ');
- }
-
- function mapTOC(suite, obj) {
- var ret = obj,
- key = SUITE_PREFIX + suite.title;
- obj = obj[key] = obj[key] || { suite: suite };
- suite.suites.forEach(function(suite){
- mapTOC(suite, obj);
- });
- return ret;
- }
-
- function stringifyTOC(obj, level) {
- ++level;
- var buf = '';
- var link;
- for (var key in obj) {
- if ('suite' == key) continue;
- if (key !== SUITE_PREFIX) {
- link = ' - [' + key.substring(1) + ']';
- link += '(#' + utils.slug(obj[key].suite.fullTitle()) + ')\n';
- buf += Array(level).join(' ') + link;
- }
- buf += stringifyTOC(obj[key], level);
- }
- return buf;
- }
-
- function generateTOC(suite) {
- var obj = mapTOC(suite, {});
- return stringifyTOC(obj, 0);
- }
-
- generateTOC(runner.suite);
-
- runner.on('suite', function(suite){
- ++level;
- var slug = utils.slug(suite.fullTitle());
- buf += '<a name="' + slug + '"></a>' + '\n';
- buf += title(suite.title) + '\n';
- });
-
- runner.on('suite end', function(suite){
- --level;
- });
-
- runner.on('pass', function(test){
- var code = utils.clean(test.fn.toString());
- buf += test.title + '.\n';
- buf += '\n```js\n';
- buf += code + '\n';
- buf += '```\n\n';
- });
-
- runner.on('end', function(){
- process.stdout.write('# TOC\n');
- process.stdout.write(generateTOC(runner.suite));
- process.stdout.write(buf);
- });
-}
-
-}); // module: reporters/markdown.js
-
-require.register("reporters/min.js", function(module, exports, require){
-/**
- * Module dependencies.
- */
-
-var Base = require('./base');
-
-/**
- * Expose `Min`.
- */
-
-exports = module.exports = Min;
-
-/**
- * Initialize a new `Min` minimal test reporter (best used with --watch).
- *
- * @param {Runner} runner
- * @api public
- */
-
-function Min(runner) {
- Base.call(this, runner);
-
- runner.on('start', function(){
- // clear screen
- process.stdout.write('\u001b[2J');
- // set cursor position
- process.stdout.write('\u001b[1;3H');
- });
-
- runner.on('end', this.epilogue.bind(this));
-}
-
-/**
- * Inherit from `Base.prototype`.
- */
-
-function F(){};
-F.prototype = Base.prototype;
-Min.prototype = new F;
-Min.prototype.constructor = Min;
-
-
-}); // module: reporters/min.js
-
-require.register("reporters/nyan.js", function(module, exports, require){
-/**
- * Module dependencies.
- */
-
-var Base = require('./base');
-
-/**
- * Expose `Dot`.
- */
-
-exports = module.exports = NyanCat;
-
-/**
- * Initialize a new `Dot` matrix test reporter.
- *
- * @param {Runner} runner
- * @api public
- */
-
-function NyanCat(runner) {
- Base.call(this, runner);
- var self = this
- , stats = this.stats
- , width = Base.window.width * .75 | 0
- , rainbowColors = this.rainbowColors = self.generateColors()
- , colorIndex = this.colorIndex = 0
- , numerOfLines = this.numberOfLines = 4
- , trajectories = this.trajectories = [[], [], [], []]
- , nyanCatWidth = this.nyanCatWidth = 11
- , trajectoryWidthMax = this.trajectoryWidthMax = (width - nyanCatWidth)
- , scoreboardWidth = this.scoreboardWidth = 5
- , tick = this.tick = 0
- , n = 0;
-
- runner.on('start', function(){
- Base.cursor.hide();
- self.draw();
- });
-
- runner.on('pending', function(test){
- self.draw();
- });
-
- runner.on('pass', function(test){
- self.draw();
- });
-
- runner.on('fail', function(test, err){
- self.draw();
- });
-
- runner.on('end', function(){
- Base.cursor.show();
- for (var i = 0; i < self.numberOfLines; i++) write('\n');
- self.epilogue();
- });
-}
-
-/**
- * Draw the nyan cat
- *
- * @api private
- */
-
-NyanCat.prototype.draw = function(){
- this.appendRainbow();
- this.drawScoreboard();
- this.drawRainbow();
- this.drawNyanCat();
- this.tick = !this.tick;
-};
-
-/**
- * Draw the "scoreboard" showing the number
- * of passes, failures and pending tests.
- *
- * @api private
- */
-
-NyanCat.prototype.drawScoreboard = function(){
- var stats = this.stats;
-
- function draw(type, n) {
- write(' ');
- write(Base.color(type, n));
- write('\n');
- }
-
- draw('green', stats.passes);
- draw('fail', stats.failures);
- draw('pending', stats.pending);
- write('\n');
-
- this.cursorUp(this.numberOfLines);
-};
-
-/**
- * Append the rainbow.
- *
- * @api private
- */
-
-NyanCat.prototype.appendRainbow = function(){
- var segment = this.tick ? '_' : '-';
- var rainbowified = this.rainbowify(segment);
-
- for (var index = 0; index < this.numberOfLines; index++) {
- var trajectory = this.trajectories[index];
- if (trajectory.length >= this.trajectoryWidthMax) trajectory.shift();
- trajectory.push(rainbowified);
- }
-};
-
-/**
- * Draw the rainbow.
- *
- * @api private
- */
-
-NyanCat.prototype.drawRainbow = function(){
- var self = this;
-
- this.trajectories.forEach(function(line, index) {
- write('\u001b[' + self.scoreboardWidth + 'C');
- write(line.join(''));
- write('\n');
- });
-
- this.cursorUp(this.numberOfLines);
-};
-
-/**
- * Draw the nyan cat
- *
- * @api private
- */
-
-NyanCat.prototype.drawNyanCat = function() {
- var self = this;
- var startWidth = this.scoreboardWidth + this.trajectories[0].length;
- var dist = '\u001b[' + startWidth + 'C';
- var padding = '';
-
- write(dist);
- write('_,------,');
- write('\n');
-
- write(dist);
- padding = self.tick ? ' ' : ' ';
- write('_|' + padding + '/\\_/\\ ');
- write('\n');
-
- write(dist);
- padding = self.tick ? '_' : '__';
- var tail = self.tick ? '~' : '^';
- var face;
- write(tail + '|' + padding + this.face() + ' ');
- write('\n');
-
- write(dist);
- padding = self.tick ? ' ' : ' ';
- write(padding + '"" "" ');
- write('\n');
-
- this.cursorUp(this.numberOfLines);
-};
-
-/**
- * Draw nyan cat face.
- *
- * @return {String}
- * @api private
- */
-
-NyanCat.prototype.face = function() {
- var stats = this.stats;
- if (stats.failures) {
- return '( x .x)';
- } else if (stats.pending) {
- return '( o .o)';
- } else if(stats.passes) {
- return '( ^ .^)';
- } else {
- return '( - .-)';
- }
-};
-
-/**
- * Move cursor up `n`.
- *
- * @param {Number} n
- * @api private
- */
-
-NyanCat.prototype.cursorUp = function(n) {
- write('\u001b[' + n + 'A');
-};
-
-/**
- * Move cursor down `n`.
- *
- * @param {Number} n
- * @api private
- */
-
-NyanCat.prototype.cursorDown = function(n) {
- write('\u001b[' + n + 'B');
-};
-
-/**
- * Generate rainbow colors.
- *
- * @return {Array}
- * @api private
- */
-
-NyanCat.prototype.generateColors = function(){
- var colors = [];
-
- for (var i = 0; i < (6 * 7); i++) {
- var pi3 = Math.floor(Math.PI / 3);
- var n = (i * (1.0 / 6));
- var r = Math.floor(3 * Math.sin(n) + 3);
- var g = Math.floor(3 * Math.sin(n + 2 * pi3) + 3);
- var b = Math.floor(3 * Math.sin(n + 4 * pi3) + 3);
- colors.push(36 * r + 6 * g + b + 16);
- }
-
- return colors;
-};
-
-/**
- * Apply rainbow to the given `str`.
- *
- * @param {String} str
- * @return {String}
- * @api private
- */
-
-NyanCat.prototype.rainbowify = function(str){
- if (!Base.useColors)
- return str;
- var color = this.rainbowColors[this.colorIndex % this.rainbowColors.length];
- this.colorIndex += 1;
- return '\u001b[38;5;' + color + 'm' + str + '\u001b[0m';
-};
-
-/**
- * Stdout helper.
- */
-
-function write(string) {
- process.stdout.write(string);
-}
-
-/**
- * Inherit from `Base.prototype`.
- */
-
-function F(){};
-F.prototype = Base.prototype;
-NyanCat.prototype = new F;
-NyanCat.prototype.constructor = NyanCat;
-
-
-}); // module: reporters/nyan.js
-
-require.register("reporters/progress.js", function(module, exports, require){
-/**
- * Module dependencies.
- */
-
-var Base = require('./base')
- , cursor = Base.cursor
- , color = Base.color;
-
-/**
- * Expose `Progress`.
- */
-
-exports = module.exports = Progress;
-
-/**
- * General progress bar color.
- */
-
-Base.colors.progress = 90;
-
-/**
- * Initialize a new `Progress` bar test reporter.
- *
- * @param {Runner} runner
- * @param {Object} options
- * @api public
- */
-
-function Progress(runner, options) {
- Base.call(this, runner);
-
- var self = this
- , options = options || {}
- , stats = this.stats
- , width = Base.window.width * .50 | 0
- , total = runner.total
- , complete = 0
- , max = Math.max
- , lastN = -1;
-
- // default chars
- options.open = options.open || '[';
- options.complete = options.complete || '▬';
- options.incomplete = options.incomplete || Base.symbols.dot;
- options.close = options.close || ']';
- options.verbose = false;
-
- // tests started
- runner.on('start', function(){
- console.log();
- cursor.hide();
- });
-
- // tests complete
- runner.on('test end', function(){
- complete++;
- var incomplete = total - complete
- , percent = complete / total
- , n = width * percent | 0
- , i = width - n;
-
- if (lastN === n && !options.verbose) {
- // Don't re-render the line if it hasn't changed
- return;
- }
- lastN = n;
-
- cursor.CR();
- process.stdout.write('\u001b[J');
- process.stdout.write(color('progress', ' ' + options.open));
- process.stdout.write(Array(n).join(options.complete));
- process.stdout.write(Array(i).join(options.incomplete));
- process.stdout.write(color('progress', options.close));
- if (options.verbose) {
- process.stdout.write(color('progress', ' ' + complete + ' of ' + total));
- }
- });
-
- // tests are complete, output some stats
- // and the failures if any
- runner.on('end', function(){
- cursor.show();
- console.log();
- self.epilogue();
- });
-}
-
-/**
- * Inherit from `Base.prototype`.
- */
-
-function F(){};
-F.prototype = Base.prototype;
-Progress.prototype = new F;
-Progress.prototype.constructor = Progress;
-
-
-}); // module: reporters/progress.js
-
-require.register("reporters/spec.js", function(module, exports, require){
-/**
- * Module dependencies.
- */
-
-var Base = require('./base')
- , cursor = Base.cursor
- , color = Base.color;
-
-/**
- * Expose `Spec`.
- */
-
-exports = module.exports = Spec;
-
-/**
- * Initialize a new `Spec` test reporter.
- *
- * @param {Runner} runner
- * @api public
- */
-
-function Spec(runner) {
- Base.call(this, runner);
-
- var self = this
- , stats = this.stats
- , indents = 0
- , n = 0;
-
- function indent() {
- return Array(indents).join(' ')
- }
-
- runner.on('start', function(){
- console.log();
- });
-
- runner.on('suite', function(suite){
- ++indents;
- console.log(color('suite', '%s%s'), indent(), suite.title);
- });
-
- runner.on('suite end', function(suite){
- --indents;
- if (1 == indents) console.log();
- });
-
- runner.on('pending', function(test){
- var fmt = indent() + color('pending', ' - %s');
- console.log(fmt, test.title);
- });
-
- runner.on('pass', function(test){
- if ('fast' == test.speed) {
- var fmt = indent()
- + color('checkmark', ' ' + Base.symbols.ok)
- + color('pass', ' %s');
- cursor.CR();
- console.log(fmt, test.title);
- } else {
- var fmt = indent()
- + color('checkmark', ' ' + Base.symbols.ok)
- + color('pass', ' %s')
- + color(test.speed, ' (%dms)');
- cursor.CR();
- console.log(fmt, test.title, test.duration);
- }
- });
-
- runner.on('fail', function(test, err){
- cursor.CR();
- console.log(indent() + color('fail', ' %d) %s'), ++n, test.title);
- });
-
- runner.on('end', self.epilogue.bind(self));
-}
-
-/**
- * Inherit from `Base.prototype`.
- */
-
-function F(){};
-F.prototype = Base.prototype;
-Spec.prototype = new F;
-Spec.prototype.constructor = Spec;
-
-
-}); // module: reporters/spec.js
-
-require.register("reporters/tap.js", function(module, exports, require){
-/**
- * Module dependencies.
- */
-
-var Base = require('./base')
- , cursor = Base.cursor
- , color = Base.color;
-
-/**
- * Expose `TAP`.
- */
-
-exports = module.exports = TAP;
-
-/**
- * Initialize a new `TAP` reporter.
- *
- * @param {Runner} runner
- * @api public
- */
-
-function TAP(runner) {
- Base.call(this, runner);
-
- var self = this
- , stats = this.stats
- , n = 1
- , passes = 0
- , failures = 0;
-
- runner.on('start', function(){
- var total = runner.grepTotal(runner.suite);
- console.log('%d..%d', 1, total);
- });
-
- runner.on('test end', function(){
- ++n;
- });
-
- runner.on('pending', function(test){
- console.log('ok %d %s # SKIP -', n, title(test));
- });
-
- runner.on('pass', function(test){
- passes++;
- console.log('ok %d %s', n, title(test));
- });
-
- runner.on('fail', function(test, err){
- failures++;
- console.log('not ok %d %s', n, title(test));
- if (err.stack) console.log(err.stack.replace(/^/gm, ' '));
- });
-
- runner.on('end', function(){
- console.log('# tests ' + (passes + failures));
- console.log('# pass ' + passes);
- console.log('# fail ' + failures);
- });
-}
-
-/**
- * Return a TAP-safe title of `test`
- *
- * @param {Object} test
- * @return {String}
- * @api private
- */
-
-function title(test) {
- return test.fullTitle().replace(/#/g, '');
-}
-
-}); // module: reporters/tap.js
-
-require.register("reporters/xunit.js", function(module, exports, require){
-/**
- * Module dependencies.
- */
-
-var Base = require('./base')
- , utils = require('../utils')
- , fs = require('browser/fs')
- , escape = utils.escape;
-
-/**
- * Save timer references to avoid Sinon interfering (see GH-237).
- */
-
-var Date = global.Date
- , setTimeout = global.setTimeout
- , setInterval = global.setInterval
- , clearTimeout = global.clearTimeout
- , clearInterval = global.clearInterval;
-
-/**
- * Expose `XUnit`.
- */
-
-exports = module.exports = XUnit;
-
-/**
- * Initialize a new `XUnit` reporter.
- *
- * @param {Runner} runner
- * @api public
- */
-
-function XUnit(runner, options) {
- Base.call(this, runner);
- var stats = this.stats
- , tests = []
- , self = this;
-
- if (options.reporterOptions && options.reporterOptions.output) {
- if (! fs.createWriteStream) {
- throw new Error('file output not supported in browser');
- }
- self.fileStream = fs.createWriteStream(options.reporterOptions.output);
- }
-
- runner.on('pending', function(test){
- tests.push(test);
- });
-
- runner.on('pass', function(test){
- tests.push(test);
- });
-
- runner.on('fail', function(test){
- tests.push(test);
- });
-
- runner.on('end', function(){
- self.write(tag('testsuite', {
- name: 'Mocha Tests'
- , tests: stats.tests
- , failures: stats.failures
- , errors: stats.failures
- , skipped: stats.tests - stats.failures - stats.passes
- , timestamp: (new Date).toUTCString()
- , time: (stats.duration / 1000) || 0
- }, false));
-
- tests.forEach(function(t) { self.test(t); });
- self.write('</testsuite>');
- });
-}
-
-/**
- * Override done to close the stream (if it's a file).
- */
-XUnit.prototype.done = function(failures, fn) {
- if (this.fileStream) {
- this.fileStream.end(function() {
- fn(failures);
- });
- } else {
- fn(failures);
- }
-};
-
-/**
- * Inherit from `Base.prototype`.
- */
-
-function F(){};
-F.prototype = Base.prototype;
-XUnit.prototype = new F;
-XUnit.prototype.constructor = XUnit;
-
-
-/**
- * Write out the given line
- */
-XUnit.prototype.write = function(line) {
- if (this.fileStream) {
- this.fileStream.write(line + '\n');
- } else {
- console.log(line);
- }
-};
-
-/**
- * Output tag for the given `test.`
- */
-
-XUnit.prototype.test = function(test, ostream) {
- var attrs = {
- classname: test.parent.fullTitle()
- , name: test.title
- , time: (test.duration / 1000) || 0
- };
-
- if ('failed' == test.state) {
- var err = test.err;
- this.write(tag('testcase', attrs, false, tag('failure', {}, false, cdata(escape(err.message) + "\n" + err.stack))));
- } else if (test.pending) {
- this.write(tag('testcase', attrs, false, tag('skipped', {}, true)));
- } else {
- this.write(tag('testcase', attrs, true) );
- }
-};
-
-/**
- * HTML tag helper.
- */
-
-function tag(name, attrs, close, content) {
- var end = close ? '/>' : '>'
- , pairs = []
- , tag;
-
- for (var key in attrs) {
- pairs.push(key + '="' + escape(attrs[key]) + '"');
- }
-
- tag = '<' + name + (pairs.length ? ' ' + pairs.join(' ') : '') + end;
- if (content) tag += content + '</' + name + end;
- return tag;
-}
-
-/**
- * Return cdata escaped CDATA `str`.
- */
-
-function cdata(str) {
- return '<![CDATA[' + escape(str) + ']]>';
-}
-
-}); // module: reporters/xunit.js
-
-require.register("runnable.js", function(module, exports, require){
-/**
- * Module dependencies.
- */
-
-var EventEmitter = require('browser/events').EventEmitter
- , debug = require('browser/debug')('mocha:runnable')
- , Pending = require('./pending')
- , milliseconds = require('./ms')
- , utils = require('./utils');
-
-/**
- * Save timer references to avoid Sinon interfering (see GH-237).
- */
-
-var Date = global.Date
- , setTimeout = global.setTimeout
- , setInterval = global.setInterval
- , clearTimeout = global.clearTimeout
- , clearInterval = global.clearInterval;
-
-/**
- * Object#toString().
- */
-
-var toString = Object.prototype.toString;
-
-/**
- * Expose `Runnable`.
- */
-
-module.exports = Runnable;
-
-/**
- * Initialize a new `Runnable` with the given `title` and callback `fn`.
- *
- * @param {String} title
- * @param {Function} fn
- * @api private
- */
-
-function Runnable(title, fn) {
- this.title = title;
- this.fn = fn;
- this.async = fn && fn.length;
- this.sync = ! this.async;
- this._timeout = 2000;
- this._slow = 75;
- this._enableTimeouts = true;
- this.timedOut = false;
- this._trace = new Error('done() called multiple times')
-}
-
-/**
- * Inherit from `EventEmitter.prototype`.
- */
-
-function F(){};
-F.prototype = EventEmitter.prototype;
-Runnable.prototype = new F;
-Runnable.prototype.constructor = Runnable;
-
-
-/**
- * Set & get timeout `ms`.
- *
- * @param {Number|String} ms
- * @return {Runnable|Number} ms or self
- * @api private
- */
-
-Runnable.prototype.timeout = function(ms){
- if (0 == arguments.length) return this._timeout;
- if (ms === 0) this._enableTimeouts = false;
- if ('string' == typeof ms) ms = milliseconds(ms);
- debug('timeout %d', ms);
- this._timeout = ms;
- if (this.timer) this.resetTimeout();
- return this;
-};
-
-/**
- * Set & get slow `ms`.
- *
- * @param {Number|String} ms
- * @return {Runnable|Number} ms or self
- * @api private
- */
-
-Runnable.prototype.slow = function(ms){
- if (0 === arguments.length) return this._slow;
- if ('string' == typeof ms) ms = milliseconds(ms);
- debug('timeout %d', ms);
- this._slow = ms;
- return this;
-};
-
-/**
- * Set and & get timeout `enabled`.
- *
- * @param {Boolean} enabled
- * @return {Runnable|Boolean} enabled or self
- * @api private
- */
-
-Runnable.prototype.enableTimeouts = function(enabled){
- if (arguments.length === 0) return this._enableTimeouts;
- debug('enableTimeouts %s', enabled);
- this._enableTimeouts = enabled;
- return this;
-};
-
-/**
- * Halt and mark as pending.
- *
- * @api private
- */
-
-Runnable.prototype.skip = function(){
- throw new Pending();
-};
-
-/**
- * Return the full title generated by recursively
- * concatenating the parent's full title.
- *
- * @return {String}
- * @api public
- */
-
-Runnable.prototype.fullTitle = function(){
- return this.parent.fullTitle() + ' ' + this.title;
-};
-
-/**
- * Clear the timeout.
- *
- * @api private
- */
-
-Runnable.prototype.clearTimeout = function(){
- clearTimeout(this.timer);
-};
-
-/**
- * Inspect the runnable void of private properties.
- *
- * @return {String}
- * @api private
- */
-
-Runnable.prototype.inspect = function(){
- return JSON.stringify(this, function(key, val){
- if ('_' == key[0]) return;
- if ('parent' == key) return '#<Suite>';
- if ('ctx' == key) return '#<Context>';
- return val;
- }, 2);
-};
-
-/**
- * Reset the timeout.
- *
- * @api private
- */
-
-Runnable.prototype.resetTimeout = function(){
- var self = this;
- var ms = this.timeout() || 1e9;
-
- if (!this._enableTimeouts) return;
- this.clearTimeout();
- this.timer = setTimeout(function(){
- if (!self._enableTimeouts) return;
- self.callback(new Error('timeout of ' + ms + 'ms exceeded. Ensure the done() callback is being called in this test.'));
- self.timedOut = true;
- }, ms);
-};
-
-/**
- * Whitelist these globals for this test run
- *
- * @api private
- */
-Runnable.prototype.globals = function(arr){
- var self = this;
- this._allowedGlobals = arr;
-};
-
-/**
- * Run the test and invoke `fn(err)`.
- *
- * @param {Function} fn
- * @api private
- */
-
-Runnable.prototype.run = function(fn){
- var self = this
- , start = new Date
- , ctx = this.ctx
- , finished
- , emitted;
-
- // Some times the ctx exists but it is not runnable
- if (ctx && ctx.runnable) ctx.runnable(this);
-
- // called multiple times
- function multiple(err) {
- if (emitted) return;
- emitted = true;
- self.emit('error', err || new Error('done() called multiple times; stacktrace may be inaccurate'));
- }
-
- // finished
- function done(err) {
- var ms = self.timeout();
- if (self.timedOut) return;
- if (finished) return multiple(err || self._trace);
-
- // Discard the resolution if this test has already failed asynchronously
- if (self.state) return;
-
- self.clearTimeout();
- self.duration = new Date - start;
- finished = true;
- if (!err && self.duration > ms && self._enableTimeouts) err = new Error('timeout of ' + ms + 'ms exceeded. Ensure the done() callback is being called in this test.');
- fn(err);
- }
-
- // for .resetTimeout()
- this.callback = done;
-
- // explicit async with `done` argument
- if (this.async) {
- this.resetTimeout();
-
- try {
- this.fn.call(ctx, function(err){
- if (err instanceof Error || toString.call(err) === "[object Error]") return done(err);
- if (null != err) {
- if (Object.prototype.toString.call(err) === '[object Object]') {
- return done(new Error('done() invoked with non-Error: ' + JSON.stringify(err)));
- } else {
- return done(new Error('done() invoked with non-Error: ' + err));
- }
- }
- done();
- });
- } catch (err) {
- done(utils.getError(err));
- }
- return;
- }
-
- if (this.asyncOnly) {
- return done(new Error('--async-only option in use without declaring `done()`'));
- }
-
- // sync or promise-returning
- try {
- if (this.pending) {
- done();
- } else {
- callFn(this.fn);
- }
- } catch (err) {
- done(utils.getError(err));
- }
-
- function callFn(fn) {
- var result = fn.call(ctx);
- if (result && typeof result.then === 'function') {
- self.resetTimeout();
- result
- .then(function() {
- done()
- },
- function(reason) {
- done(reason || new Error('Promise rejected with no or falsy reason'))
- });
- } else {
- done();
- }
- }
-};
-
-}); // module: runnable.js
-
-require.register("runner.js", function(module, exports, require){
-/**
- * Module dependencies.
- */
-
-var EventEmitter = require('browser/events').EventEmitter
- , debug = require('browser/debug')('mocha:runner')
- , Pending = require('./pending')
- , Test = require('./test')
- , utils = require('./utils')
- , filter = utils.filter
- , keys = utils.keys
- , type = utils.type
- , stringify = utils.stringify
- , stackFilter = utils.stackTraceFilter();
-
-/**
- * Non-enumerable globals.
- */
-
-var globals = [
- 'setTimeout',
- 'clearTimeout',
- 'setInterval',
- 'clearInterval',
- 'XMLHttpRequest',
- 'Date',
- 'setImmediate',
- 'clearImmediate'
-];
-
-/**
- * Expose `Runner`.
- */
-
-module.exports = Runner;
-
-/**
- * Initialize a `Runner` for the given `suite`.
- *
- * Events:
- *
- * - `start` execution started
- * - `end` execution complete
- * - `suite` (suite) test suite execution started
- * - `suite end` (suite) all tests (and sub-suites) have finished
- * - `test` (test) test execution started
- * - `test end` (test) test completed
- * - `hook` (hook) hook execution started
- * - `hook end` (hook) hook complete
- * - `pass` (test) test passed
- * - `fail` (test, err) test failed
- * - `pending` (test) test pending
- *
- * @param {Suite} suite Root suite
- * @param {boolean} [delay] Whether or not to delay execution of root suite
- * until ready.
- * @api public
- */
-
-function Runner(suite, delay) {
- var self = this;
- this._globals = [];
- this._abort = false;
- this._delay = delay;
- this.suite = suite;
- this.total = suite.total();
- this.failures = 0;
- this.on('test end', function(test){ self.checkGlobals(test); });
- this.on('hook end', function(hook){ self.checkGlobals(hook); });
- this.grep(/.*/);
- this.globals(this.globalProps().concat(extraGlobals()));
-}
-
-/**
- * Wrapper for setImmediate, process.nextTick, or browser polyfill.
- *
- * @param {Function} fn
- * @api private
- */
-
-Runner.immediately = global.setImmediate || process.nextTick;
-
-/**
- * Inherit from `EventEmitter.prototype`.
- */
-
-function F(){};
-F.prototype = EventEmitter.prototype;
-Runner.prototype = new F;
-Runner.prototype.constructor = Runner;
-
-
-/**
- * Run tests with full titles matching `re`. Updates runner.total
- * with number of tests matched.
- *
- * @param {RegExp} re
- * @param {Boolean} invert
- * @return {Runner} for chaining
- * @api public
- */
-
-Runner.prototype.grep = function(re, invert){
- debug('grep %s', re);
- this._grep = re;
- this._invert = invert;
- this.total = this.grepTotal(this.suite);
- return this;
-};
-
-/**
- * Returns the number of tests matching the grep search for the
- * given suite.
- *
- * @param {Suite} suite
- * @return {Number}
- * @api public
- */
-
-Runner.prototype.grepTotal = function(suite) {
- var self = this;
- var total = 0;
-
- suite.eachTest(function(test){
- var match = self._grep.test(test.fullTitle());
- if (self._invert) match = !match;
- if (match) total++;
- });
-
- return total;
-};
-
-/**
- * Return a list of global properties.
- *
- * @return {Array}
- * @api private
- */
-
-Runner.prototype.globalProps = function() {
- var props = utils.keys(global);
-
- // non-enumerables
- for (var i = 0; i < globals.length; ++i) {
- if (~utils.indexOf(props, globals[i])) continue;
- props.push(globals[i]);
- }
-
- return props;
-};
-
-/**
- * Allow the given `arr` of globals.
- *
- * @param {Array} arr
- * @return {Runner} for chaining
- * @api public
- */
-
-Runner.prototype.globals = function(arr){
- if (0 == arguments.length) return this._globals;
- debug('globals %j', arr);
- this._globals = this._globals.concat(arr);
- return this;
-};
-
-/**
- * Check for global variable leaks.
- *
- * @api private
- */
-
-Runner.prototype.checkGlobals = function(test){
- if (this.ignoreLeaks) return;
- var ok = this._globals;
-
- var globals = this.globalProps();
- var leaks;
-
- if (test) {
- ok = ok.concat(test._allowedGlobals || []);
- }
-
- if(this.prevGlobalsLength == globals.length) return;
- this.prevGlobalsLength = globals.length;
-
- leaks = filterLeaks(ok, globals);
- this._globals = this._globals.concat(leaks);
-
- if (leaks.length > 1) {
- this.fail(test, new Error('global leaks detected: ' + leaks.join(', ') + ''));
- } else if (leaks.length) {
- this.fail(test, new Error('global leak detected: ' + leaks[0]));
- }
-};
-
-/**
- * Fail the given `test`.
- *
- * @param {Test} test
- * @param {Error} err
- * @api private
- */
-
-Runner.prototype.fail = function(test, err) {
- ++this.failures;
- test.state = 'failed';
-
- if (!(err instanceof Error)) {
- err = new Error('the ' + type(err) + ' ' + stringify(err) + ' was thrown, throw an Error :)');
- }
-
- err.stack = (this.fullStackTrace || !err.stack)
- ? err.stack
- : stackFilter(err.stack);
-
- this.emit('fail', test, err);
-};
-
-/**
- * Fail the given `hook` with `err`.
- *
- * Hook failures work in the following pattern:
- * - If bail, then exit
- * - Failed `before` hook skips all tests in a suite and subsuites,
- * but jumps to corresponding `after` hook
- * - Failed `before each` hook skips remaining tests in a
- * suite and jumps to corresponding `after each` hook,
- * which is run only once
- * - Failed `after` hook does not alter
- * execution order
- * - Failed `after each` hook skips remaining tests in a
- * suite and subsuites, but executes other `after each`
- * hooks
- *
- * @param {Hook} hook
- * @param {Error} err
- * @api private
- */
-
-Runner.prototype.failHook = function(hook, err){
- this.fail(hook, err);
- if (this.suite.bail()) {
- this.emit('end');
- }
-};
-
-/**
- * Run hook `name` callbacks and then invoke `fn()`.
- *
- * @param {String} name
- * @param {Function} function
- * @api private
- */
-
-Runner.prototype.hook = function(name, fn){
- var suite = this.suite
- , hooks = suite['_' + name]
- , self = this
- , timer;
-
- function next(i) {
- var hook = hooks[i];
- if (!hook) return fn();
- self.currentRunnable = hook;
-
- hook.ctx.currentTest = self.test;
-
- self.emit('hook', hook);
-
- hook.on('error', function(err){
- self.failHook(hook, err);
- });
-
- hook.run(function(err){
- hook.removeAllListeners('error');
- var testError = hook.error();
- if (testError) self.fail(self.test, testError);
- if (err) {
- if (err instanceof Pending) {
- suite.pending = true;
- } else {
- self.failHook(hook, err);
-
- // stop executing hooks, notify callee of hook err
- return fn(err);
- }
- }
- self.emit('hook end', hook);
- delete hook.ctx.currentTest;
- next(++i);
- });
- }
-
- Runner.immediately(function(){
- next(0);
- });
-};
-
-/**
- * Run hook `name` for the given array of `suites`
- * in order, and callback `fn(err, errSuite)`.
- *
- * @param {String} name
- * @param {Array} suites
- * @param {Function} fn
- * @api private
- */
-
-Runner.prototype.hooks = function(name, suites, fn){
- var self = this
- , orig = this.suite;
-
- function next(suite) {
- self.suite = suite;
-
- if (!suite) {
- self.suite = orig;
- return fn();
- }
-
- self.hook(name, function(err){
- if (err) {
- var errSuite = self.suite;
- self.suite = orig;
- return fn(err, errSuite);
- }
-
- next(suites.pop());
- });
- }
-
- next(suites.pop());
-};
-
-/**
- * Run hooks from the top level down.
- *
- * @param {String} name
- * @param {Function} fn
- * @api private
- */
-
-Runner.prototype.hookUp = function(name, fn){
- var suites = [this.suite].concat(this.parents()).reverse();
- this.hooks(name, suites, fn);
-};
-
-/**
- * Run hooks from the bottom up.
- *
- * @param {String} name
- * @param {Function} fn
- * @api private
- */
-
-Runner.prototype.hookDown = function(name, fn){
- var suites = [this.suite].concat(this.parents());
- this.hooks(name, suites, fn);
-};
-
-/**
- * Return an array of parent Suites from
- * closest to furthest.
- *
- * @return {Array}
- * @api private
- */
-
-Runner.prototype.parents = function(){
- var suite = this.suite
- , suites = [];
- while (suite = suite.parent) suites.push(suite);
- return suites;
-};
-
-/**
- * Run the current test and callback `fn(err)`.
- *
- * @param {Function} fn
- * @api private
- */
-
-Runner.prototype.runTest = function(fn){
- var test = this.test
- , self = this;
-
- if (this.asyncOnly) test.asyncOnly = true;
-
- try {
- test.on('error', function(err){
- self.fail(test, err);
- });
- test.run(fn);
- } catch (err) {
- fn(err);
- }
-};
-
-/**
- * Run tests in the given `suite` and invoke
- * the callback `fn()` when complete.
- *
- * @param {Suite} suite
- * @param {Function} fn
- * @api private
- */
-
-Runner.prototype.runTests = function(suite, fn){
- var self = this
- , tests = suite.tests.slice()
- , test;
-
-
- function hookErr(err, errSuite, after) {
- // before/after Each hook for errSuite failed:
- var orig = self.suite;
-
- // for failed 'after each' hook start from errSuite parent,
- // otherwise start from errSuite itself
- self.suite = after ? errSuite.parent : errSuite;
-
- if (self.suite) {
- // call hookUp afterEach
- self.hookUp('afterEach', function(err2, errSuite2) {
- self.suite = orig;
- // some hooks may fail even now
- if (err2) return hookErr(err2, errSuite2, true);
- // report error suite
- fn(errSuite);
- });
- } else {
- // there is no need calling other 'after each' hooks
- self.suite = orig;
- fn(errSuite);
- }
- }
-
- function next(err, errSuite) {
- // if we bail after first err
- if (self.failures && suite._bail) return fn();
-
- if (self._abort) return fn();
-
- if (err) return hookErr(err, errSuite, true);
-
- // next test
- test = tests.shift();
-
- // all done
- if (!test) return fn();
-
- // grep
- var match = self._grep.test(test.fullTitle());
- if (self._invert) match = !match;
- if (!match) return next();
-
- // pending
- if (test.pending) {
- self.emit('pending', test);
- self.emit('test end', test);
- return next();
- }
-
- // execute test and hook(s)
- self.emit('test', self.test = test);
- self.hookDown('beforeEach', function(err, errSuite){
-
- if (suite.pending) {
- self.emit('pending', test);
- self.emit('test end', test);
- return next();
- }
- if (err) return hookErr(err, errSuite, false);
-
- self.currentRunnable = self.test;
- self.runTest(function(err){
- test = self.test;
-
- if (err) {
- if (err instanceof Pending) {
- self.emit('pending', test);
- } else {
- self.fail(test, err);
- }
- self.emit('test end', test);
-
- if (err instanceof Pending) {
- return next();
- }
-
- return self.hookUp('afterEach', next);
- }
-
- test.state = 'passed';
- self.emit('pass', test);
- self.emit('test end', test);
- self.hookUp('afterEach', next);
- });
- });
- }
-
- this.next = next;
- next();
-};
-
-/**
- * Run the given `suite` and invoke the
- * callback `fn()` when complete.
- *
- * @param {Suite} suite
- * @param {Function} fn
- * @api private
- */
-
-Runner.prototype.runSuite = function(suite, fn){
- var total = this.grepTotal(suite)
- , self = this
- , i = 0;
-
- debug('run suite %s', suite.fullTitle());
-
- if (!total) return fn();
-
- this.emit('suite', this.suite = suite);
-
- function next(errSuite) {
- if (errSuite) {
- // current suite failed on a hook from errSuite
- if (errSuite == suite) {
- // if errSuite is current suite
- // continue to the next sibling suite
- return done();
- } else {
- // errSuite is among the parents of current suite
- // stop execution of errSuite and all sub-suites
- return done(errSuite);
- }
- }
-
- if (self._abort) return done();
-
- var curr = suite.suites[i++];
- if (!curr) return done();
- self.runSuite(curr, next);
- }
-
- function done(errSuite) {
- self.suite = suite;
- self.hook('afterAll', function(){
- self.emit('suite end', suite);
- fn(errSuite);
- });
- }
-
- this.hook('beforeAll', function(err){
- if (err) return done();
- self.runTests(suite, next);
- });
-};
-
-/**
- * Handle uncaught exceptions.
- *
- * @param {Error} err
- * @api private
- */
-
-Runner.prototype.uncaught = function(err){
- if (err) {
- debug('uncaught exception %s', err !== function () {
- return this;
- }.call(err) ? err : ( err.message || err ));
- } else {
- debug('uncaught undefined exception');
- err = utils.undefinedError();
- }
- err.uncaught = true;
-
- var runnable = this.currentRunnable;
- if (!runnable) return;
-
- runnable.clearTimeout();
-
- // Ignore errors if complete
- if (runnable.state) return;
- this.fail(runnable, err);
-
- // recover from test
- if ('test' == runnable.type) {
- this.emit('test end', runnable);
- this.hookUp('afterEach', this.next);
- return;
- }
-
- // bail on hooks
- this.emit('end');
-};
-
-/**
- * Run the root suite and invoke `fn(failures)`
- * on completion.
- *
- * @param {Function} fn
- * @return {Runner} for chaining
- * @api public
- */
-
-Runner.prototype.run = function(fn){
- var self = this,
- rootSuite = this.suite;
-
- fn = fn || function(){};
-
- function uncaught(err){
- self.uncaught(err);
- }
-
- function start() {
- self.emit('start');
- self.runSuite(rootSuite, function(){
- debug('finished running');
- self.emit('end');
- });
- }
-
- debug('start');
-
- // callback
- this.on('end', function(){
- debug('end');
- process.removeListener('uncaughtException', uncaught);
- fn(self.failures);
- });
-
- // uncaught exception
- process.on('uncaughtException', uncaught);
-
- if (this._delay) {
- // for reporters, I guess.
- // might be nice to debounce some dots while we wait.
- this.emit('waiting', rootSuite);
- rootSuite.once('run', start);
- }
- else {
- start();
- }
-
- return this;
-};
-
-/**
- * Cleanly abort execution
- *
- * @return {Runner} for chaining
- * @api public
- */
-Runner.prototype.abort = function(){
- debug('aborting');
- this._abort = true;
-};
-
-/**
- * Filter leaks with the given globals flagged as `ok`.
- *
- * @param {Array} ok
- * @param {Array} globals
- * @return {Array}
- * @api private
- */
-
-function filterLeaks(ok, globals) {
- return filter(globals, function(key){
- // Firefox and Chrome exposes iframes as index inside the window object
- if (/^d+/.test(key)) return false;
-
- // in firefox
- // if runner runs in an iframe, this iframe's window.getInterface method not init at first
- // it is assigned in some seconds
- if (global.navigator && /^getInterface/.test(key)) return false;
-
- // an iframe could be approached by window[iframeIndex]
- // in ie6,7,8 and opera, iframeIndex is enumerable, this could cause leak
- if (global.navigator && /^\d+/.test(key)) return false;
-
- // Opera and IE expose global variables for HTML element IDs (issue #243)
- if (/^mocha-/.test(key)) return false;
-
- var matched = filter(ok, function(ok){
- if (~ok.indexOf('*')) return 0 == key.indexOf(ok.split('*')[0]);
- return key == ok;
- });
- return matched.length == 0 && (!global.navigator || 'onerror' !== key);
- });
-}
-
-/**
- * Array of globals dependent on the environment.
- *
- * @return {Array}
- * @api private
- */
-
-function extraGlobals() {
- if (typeof(process) === 'object' &&
- typeof(process.version) === 'string') {
-
- var nodeVersion = process.version.split('.').reduce(function(a, v) {
- return a << 8 | v;
- });
-
- // 'errno' was renamed to process._errno in v0.9.11.
-
- if (nodeVersion < 0x00090B) {
- return ['errno'];
- }
- }
-
- return [];
-}
-
-}); // module: runner.js
-
-require.register("suite.js", function(module, exports, require){
-/**
- * Module dependencies.
- */
-
-var EventEmitter = require('browser/events').EventEmitter
- , debug = require('browser/debug')('mocha:suite')
- , milliseconds = require('./ms')
- , utils = require('./utils')
- , Hook = require('./hook');
-
-/**
- * Expose `Suite`.
- */
-
-exports = module.exports = Suite;
-
-/**
- * Create a new `Suite` with the given `title`
- * and parent `Suite`. When a suite with the
- * same title is already present, that suite
- * is returned to provide nicer reporter
- * and more flexible meta-testing.
- *
- * @param {Suite} parent
- * @param {String} title
- * @return {Suite}
- * @api public
- */
-
-exports.create = function(parent, title){
- var suite = new Suite(title, parent.ctx);
- suite.parent = parent;
- if (parent.pending) suite.pending = true;
- title = suite.fullTitle();
- parent.addSuite(suite);
- return suite;
-};
-
-/**
- * Initialize a new `Suite` with the given
- * `title` and `ctx`.
- *
- * @param {String} title
- * @param {Context} ctx
- * @api private
- */
-
-function Suite(title, parentContext) {
- this.title = title;
- var context = function() {};
- context.prototype = parentContext;
- this.ctx = new context();
- this.suites = [];
- this.tests = [];
- this.pending = false;
- this._beforeEach = [];
- this._beforeAll = [];
- this._afterEach = [];
- this._afterAll = [];
- this.root = !title;
- this._timeout = 2000;
- this._enableTimeouts = true;
- this._slow = 75;
- this._bail = false;
- this.delayed = false;
-}
-
-/**
- * Inherit from `EventEmitter.prototype`.
- */
-
-function F(){};
-F.prototype = EventEmitter.prototype;
-Suite.prototype = new F;
-Suite.prototype.constructor = Suite;
-
-
-/**
- * Return a clone of this `Suite`.
- *
- * @return {Suite}
- * @api private
- */
-
-Suite.prototype.clone = function(){
- var suite = new Suite(this.title);
- debug('clone');
- suite.ctx = this.ctx;
- suite.timeout(this.timeout());
- suite.enableTimeouts(this.enableTimeouts());
- suite.slow(this.slow());
- suite.bail(this.bail());
- return suite;
-};
-
-/**
- * Set timeout `ms` or short-hand such as "2s".
- *
- * @param {Number|String} ms
- * @return {Suite|Number} for chaining
- * @api private
- */
-
-Suite.prototype.timeout = function(ms){
- if (0 == arguments.length) return this._timeout;
- if (ms.toString() === '0') this._enableTimeouts = false;
- if ('string' == typeof ms) ms = milliseconds(ms);
- debug('timeout %d', ms);
- this._timeout = parseInt(ms, 10);
- return this;
-};
-
-/**
- * Set timeout `enabled`.
- *
- * @param {Boolean} enabled
- * @return {Suite|Boolean} self or enabled
- * @api private
- */
-
-Suite.prototype.enableTimeouts = function(enabled){
- if (arguments.length === 0) return this._enableTimeouts;
- debug('enableTimeouts %s', enabled);
- this._enableTimeouts = enabled;
- return this;
-};
-
-/**
- * Set slow `ms` or short-hand such as "2s".
- *
- * @param {Number|String} ms
- * @return {Suite|Number} for chaining
- * @api private
- */
-
-Suite.prototype.slow = function(ms){
- if (0 === arguments.length) return this._slow;
- if ('string' == typeof ms) ms = milliseconds(ms);
- debug('slow %d', ms);
- this._slow = ms;
- return this;
-};
-
-/**
- * Sets whether to bail after first error.
- *
- * @param {Boolean} bail
- * @return {Suite|Number} for chaining
- * @api private
- */
-
-Suite.prototype.bail = function(bail){
- if (0 == arguments.length) return this._bail;
- debug('bail %s', bail);
- this._bail = bail;
- return this;
-};
-
-/**
- * Run `fn(test[, done])` before running tests.
- *
- * @param {Function} fn
- * @return {Suite} for chaining
- * @api private
- */
-
-Suite.prototype.beforeAll = function(title, fn){
- if (this.pending) return this;
- if ('function' === typeof title) {
- fn = title;
- title = fn.name;
- }
- title = '"before all" hook' + (title ? ': ' + title : '');
-
- var hook = new Hook(title, fn);
- hook.parent = this;
- hook.timeout(this.timeout());
- hook.enableTimeouts(this.enableTimeouts());
- hook.slow(this.slow());
- hook.ctx = this.ctx;
- this._beforeAll.push(hook);
- this.emit('beforeAll', hook);
- return this;
-};
-
-/**
- * Run `fn(test[, done])` after running tests.
- *
- * @param {Function} fn
- * @return {Suite} for chaining
- * @api private
- */
-
-Suite.prototype.afterAll = function(title, fn){
- if (this.pending) return this;
- if ('function' === typeof title) {
- fn = title;
- title = fn.name;
- }
- title = '"after all" hook' + (title ? ': ' + title : '');
-
- var hook = new Hook(title, fn);
- hook.parent = this;
- hook.timeout(this.timeout());
- hook.enableTimeouts(this.enableTimeouts());
- hook.slow(this.slow());
- hook.ctx = this.ctx;
- this._afterAll.push(hook);
- this.emit('afterAll', hook);
- return this;
-};
-
-/**
- * Run `fn(test[, done])` before each test case.
- *
- * @param {Function} fn
- * @return {Suite} for chaining
- * @api private
- */
-
-Suite.prototype.beforeEach = function(title, fn){
- if (this.pending) return this;
- if ('function' === typeof title) {
- fn = title;
- title = fn.name;
- }
- title = '"before each" hook' + (title ? ': ' + title : '');
-
- var hook = new Hook(title, fn);
- hook.parent = this;
- hook.timeout(this.timeout());
- hook.enableTimeouts(this.enableTimeouts());
- hook.slow(this.slow());
- hook.ctx = this.ctx;
- this._beforeEach.push(hook);
- this.emit('beforeEach', hook);
- return this;
-};
-
-/**
- * Run `fn(test[, done])` after each test case.
- *
- * @param {Function} fn
- * @return {Suite} for chaining
- * @api private
- */
-
-Suite.prototype.afterEach = function(title, fn){
- if (this.pending) return this;
- if ('function' === typeof title) {
- fn = title;
- title = fn.name;
- }
- title = '"after each" hook' + (title ? ': ' + title : '');
-
- var hook = new Hook(title, fn);
- hook.parent = this;
- hook.timeout(this.timeout());
- hook.enableTimeouts(this.enableTimeouts());
- hook.slow(this.slow());
- hook.ctx = this.ctx;
- this._afterEach.push(hook);
- this.emit('afterEach', hook);
- return this;
-};
-
-/**
- * Add a test `suite`.
- *
- * @param {Suite} suite
- * @return {Suite} for chaining
- * @api private
- */
-
-Suite.prototype.addSuite = function(suite){
- suite.parent = this;
- suite.timeout(this.timeout());
- suite.enableTimeouts(this.enableTimeouts());
- suite.slow(this.slow());
- suite.bail(this.bail());
- this.suites.push(suite);
- this.emit('suite', suite);
- return this;
-};
-
-/**
- * Add a `test` to this suite.
- *
- * @param {Test} test
- * @return {Suite} for chaining
- * @api private
- */
-
-Suite.prototype.addTest = function(test){
- test.parent = this;
- test.timeout(this.timeout());
- test.enableTimeouts(this.enableTimeouts());
- test.slow(this.slow());
- test.ctx = this.ctx;
- this.tests.push(test);
- this.emit('test', test);
- return this;
-};
-
-/**
- * Return the full title generated by recursively
- * concatenating the parent's full title.
- *
- * @return {String}
- * @api public
- */
-
-Suite.prototype.fullTitle = function(){
- if (this.parent) {
- var full = this.parent.fullTitle();
- if (full) return full + ' ' + this.title;
- }
- return this.title;
-};
-
-/**
- * Return the total number of tests.
- *
- * @return {Number}
- * @api public
- */
-
-Suite.prototype.total = function(){
- return utils.reduce(this.suites, function(sum, suite){
- return sum + suite.total();
- }, 0) + this.tests.length;
-};
-
-/**
- * Iterates through each suite recursively to find
- * all tests. Applies a function in the format
- * `fn(test)`.
- *
- * @param {Function} fn
- * @return {Suite}
- * @api private
- */
-
-Suite.prototype.eachTest = function(fn){
- utils.forEach(this.tests, fn);
- utils.forEach(this.suites, function(suite){
- suite.eachTest(fn);
- });
- return this;
-};
-
-/**
- * This will run the root suite if we happen to be running in delayed mode.
- */
-Suite.prototype.run = function run() {
- if (this.root) {
- this.emit('run');
- }
-};
-
-}); // module: suite.js
-
-require.register("test.js", function(module, exports, require){
-/**
- * Module dependencies.
- */
-
-var Runnable = require('./runnable');
-
-/**
- * Expose `Test`.
- */
-
-module.exports = Test;
-
-/**
- * Initialize a new `Test` with the given `title` and callback `fn`.
- *
- * @param {String} title
- * @param {Function} fn
- * @api private
- */
-
-function Test(title, fn) {
- Runnable.call(this, title, fn);
- this.pending = !fn;
- this.type = 'test';
-}
-
-/**
- * Inherit from `Runnable.prototype`.
- */
-
-function F(){};
-F.prototype = Runnable.prototype;
-Test.prototype = new F;
-Test.prototype.constructor = Test;
-
-
-}); // module: test.js
-
-require.register("utils.js", function(module, exports, require){
-/**
- * Module dependencies.
- */
-
-var fs = require('browser/fs')
- , path = require('browser/path')
- , basename = path.basename
- , exists = fs.existsSync || path.existsSync
- , glob = require('browser/glob')
- , join = path.join
- , debug = require('browser/debug')('mocha:watch');
-
-/**
- * Ignored directories.
- */
-
-var ignore = ['node_modules', '.git'];
-
-/**
- * Escape special characters in the given string of html.
- *
- * @param {String} html
- * @return {String}
- * @api private
- */
-
-exports.escape = function(html){
- return String(html)
- .replace(/&/g, '&amp;')
- .replace(/"/g, '&quot;')
- .replace(/</g, '&lt;')
- .replace(/>/g, '&gt;');
-};
-
-/**
- * Array#forEach (<=IE8)
- *
- * @param {Array} array
- * @param {Function} fn
- * @param {Object} scope
- * @api private
- */
-
-exports.forEach = function(arr, fn, scope){
- for (var i = 0, l = arr.length; i < l; i++)
- fn.call(scope, arr[i], i);
-};
-
-/**
- * Array#map (<=IE8)
- *
- * @param {Array} array
- * @param {Function} fn
- * @param {Object} scope
- * @api private
- */
-
-exports.map = function(arr, fn, scope){
- var result = [];
- for (var i = 0, l = arr.length; i < l; i++)
- result.push(fn.call(scope, arr[i], i, arr));
- return result;
-};
-
-/**
- * Array#indexOf (<=IE8)
- *
- * @parma {Array} arr
- * @param {Object} obj to find index of
- * @param {Number} start
- * @api private
- */
-
-exports.indexOf = function(arr, obj, start){
- for (var i = start || 0, l = arr.length; i < l; i++) {
- if (arr[i] === obj)
- return i;
- }
- return -1;
-};
-
-/**
- * Array#reduce (<=IE8)
- *
- * @param {Array} array
- * @param {Function} fn
- * @param {Object} initial value
- * @api private
- */
-
-exports.reduce = function(arr, fn, val){
- var rval = val;
-
- for (var i = 0, l = arr.length; i < l; i++) {
- rval = fn(rval, arr[i], i, arr);
- }
-
- return rval;
-};
-
-/**
- * Array#filter (<=IE8)
- *
- * @param {Array} array
- * @param {Function} fn
- * @api private
- */
-
-exports.filter = function(arr, fn){
- var ret = [];
-
- for (var i = 0, l = arr.length; i < l; i++) {
- var val = arr[i];
- if (fn(val, i, arr)) ret.push(val);
- }
-
- return ret;
-};
-
-/**
- * Object.keys (<=IE8)
- *
- * @param {Object} obj
- * @return {Array} keys
- * @api private
- */
-
-exports.keys = Object.keys || function(obj) {
- var keys = []
- , has = Object.prototype.hasOwnProperty; // for `window` on <=IE8
-
- for (var key in obj) {
- if (has.call(obj, key)) {
- keys.push(key);
- }
- }
-
- return keys;
-};
-
-/**
- * Watch the given `files` for changes
- * and invoke `fn(file)` on modification.
- *
- * @param {Array} files
- * @param {Function} fn
- * @api private
- */
-
-exports.watch = function(files, fn){
- var options = { interval: 100 };
- files.forEach(function(file){
- debug('file %s', file);
- fs.watchFile(file, options, function(curr, prev){
- if (prev.mtime < curr.mtime) fn(file);
- });
- });
-};
-
-/**
- * Array.isArray (<=IE8)
- *
- * @param {Object} obj
- * @return {Boolean}
- * @api private
- */
-var isArray = Array.isArray || function (obj) {
- return '[object Array]' == {}.toString.call(obj);
-};
-
-/**
- * @description
- * Buffer.prototype.toJSON polyfill
- * @type {Function}
- */
-if(typeof Buffer !== 'undefined' && Buffer.prototype) {
- Buffer.prototype.toJSON = Buffer.prototype.toJSON || function () {
- return Array.prototype.slice.call(this, 0);
- };
-}
-
-/**
- * Ignored files.
- */
-
-function ignored(path){
- return !~ignore.indexOf(path);
-}
-
-/**
- * Lookup files in the given `dir`.
- *
- * @return {Array}
- * @api private
- */
-
-exports.files = function(dir, ext, ret){
- ret = ret || [];
- ext = ext || ['js'];
-
- var re = new RegExp('\\.(' + ext.join('|') + ')$');
-
- fs.readdirSync(dir)
- .filter(ignored)
- .forEach(function(path){
- path = join(dir, path);
- if (fs.statSync(path).isDirectory()) {
- exports.files(path, ext, ret);
- } else if (path.match(re)) {
- ret.push(path);
- }
- });
-
- return ret;
-};
-
-/**
- * Compute a slug from the given `str`.
- *
- * @param {String} str
- * @return {String}
- * @api private
- */
-
-exports.slug = function(str){
- return str
- .toLowerCase()
- .replace(/ +/g, '-')
- .replace(/[^-\w]/g, '');
-};
-
-/**
- * Strip the function definition from `str`,
- * and re-indent for pre whitespace.
- */
-
-exports.clean = function(str) {
- str = str
- .replace(/\r\n?|[\n\u2028\u2029]/g, "\n").replace(/^\uFEFF/, '')
- .replace(/^function *\(.*\)\s*{|\(.*\) *=> *{?/, '')
- .replace(/\s+\}$/, '');
-
- var spaces = str.match(/^\n?( *)/)[1].length
- , tabs = str.match(/^\n?(\t*)/)[1].length
- , re = new RegExp('^\n?' + (tabs ? '\t' : ' ') + '{' + (tabs ? tabs : spaces) + '}', 'gm');
-
- str = str.replace(re, '');
-
- return exports.trim(str);
-};
-
-/**
- * Trim the given `str`.
- *
- * @param {String} str
- * @return {String}
- * @api private
- */
-
-exports.trim = function(str){
- return str.replace(/^\s+|\s+$/g, '');
-};
-
-/**
- * Parse the given `qs`.
- *
- * @param {String} qs
- * @return {Object}
- * @api private
- */
-
-exports.parseQuery = function(qs){
- return exports.reduce(qs.replace('?', '').split('&'), function(obj, pair){
- var i = pair.indexOf('=')
- , key = pair.slice(0, i)
- , val = pair.slice(++i);
-
- obj[key] = decodeURIComponent(val);
- return obj;
- }, {});
-};
-
-/**
- * Highlight the given string of `js`.
- *
- * @param {String} js
- * @return {String}
- * @api private
- */
-
-function highlight(js) {
- return js
- .replace(/</g, '&lt;')
- .replace(/>/g, '&gt;')
- .replace(/\/\/(.*)/gm, '<span class="comment">//$1</span>')
- .replace(/('.*?')/gm, '<span class="string">$1</span>')
- .replace(/(\d+\.\d+)/gm, '<span class="number">$1</span>')
- .replace(/(\d+)/gm, '<span class="number">$1</span>')
- .replace(/\bnew[ \t]+(\w+)/gm, '<span class="keyword">new</span> <span class="init">$1</span>')
- .replace(/\b(function|new|throw|return|var|if|else)\b/gm, '<span class="keyword">$1</span>')
-}
-
-/**
- * Highlight the contents of tag `name`.
- *
- * @param {String} name
- * @api private
- */
-
-exports.highlightTags = function(name) {
- var code = document.getElementById('mocha').getElementsByTagName(name);
- for (var i = 0, len = code.length; i < len; ++i) {
- code[i].innerHTML = highlight(code[i].innerHTML);
- }
-};
-
-/**
- * If a value could have properties, and has none, this function is called, which returns
- * a string representation of the empty value.
- *
- * Functions w/ no properties return `'[Function]'`
- * Arrays w/ length === 0 return `'[]'`
- * Objects w/ no properties return `'{}'`
- * All else: return result of `value.toString()`
- *
- * @param {*} value Value to inspect
- * @param {string} [type] The type of the value, if known.
- * @returns {string}
- */
-var emptyRepresentation = function emptyRepresentation(value, type) {
- type = type || exports.type(value);
-
- switch(type) {
- case 'function':
- return '[Function]';
- case 'object':
- return '{}';
- case 'array':
- return '[]';
- default:
- return value.toString();
- }
-};
-
-/**
- * Takes some variable and asks `{}.toString()` what it thinks it is.
- * @param {*} value Anything
- * @example
- * type({}) // 'object'
- * type([]) // 'array'
- * type(1) // 'number'
- * type(false) // 'boolean'
- * type(Infinity) // 'number'
- * type(null) // 'null'
- * type(new Date()) // 'date'
- * type(/foo/) // 'regexp'
- * type('type') // 'string'
- * type(global) // 'global'
- * @api private
- * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/toString
- * @returns {string}
- */
-exports.type = function type(value) {
- if (typeof Buffer !== 'undefined' && Buffer.isBuffer(value)) {
- return 'buffer';
- }
- return Object.prototype.toString.call(value)
- .replace(/^\[.+\s(.+?)\]$/, '$1')
- .toLowerCase();
-};
-
-/**
- * @summary Stringify `value`.
- * @description Different behavior depending on type of value.
- * - If `value` is undefined or null, return `'[undefined]'` or `'[null]'`, respectively.
- * - If `value` is not an object, function or array, return result of `value.toString()` wrapped in double-quotes.
- * - If `value` is an *empty* object, function, or array, return result of function
- * {@link emptyRepresentation}.
- * - If `value` has properties, call {@link exports.canonicalize} on it, then return result of
- * JSON.stringify().
- *
- * @see exports.type
- * @param {*} value
- * @return {string}
- * @api private
- */
-
-exports.stringify = function(value) {
- var type = exports.type(value);
-
- if (!~exports.indexOf(['object', 'array', 'function'], type)) {
- if(type != 'buffer') {
- return jsonStringify(value);
- }
- var json = value.toJSON();
- // Based on the toJSON result
- return jsonStringify(json.data && json.type ? json.data : json, 2)
- .replace(/,(\n|$)/g, '$1');
- }
-
- for (var prop in value) {
- if (Object.prototype.hasOwnProperty.call(value, prop)) {
- return jsonStringify(exports.canonicalize(value), 2).replace(/,(\n|$)/g, '$1');
- }
- }
-
- return emptyRepresentation(value, type);
-};
-
-/**
- * @description
- * like JSON.stringify but more sense.
- * @param {Object} object
- * @param {Number=} spaces
- * @param {number=} depth
- * @returns {*}
- * @private
- */
-function jsonStringify(object, spaces, depth) {
- if(typeof spaces == 'undefined') return _stringify(object); // primitive types
-
- depth = depth || 1;
- var space = spaces * depth
- , str = isArray(object) ? '[' : '{'
- , end = isArray(object) ? ']' : '}'
- , length = object.length || exports.keys(object).length
- , repeat = function(s, n) { return new Array(n).join(s); }; // `.repeat()` polyfill
-
- function _stringify(val) {
- switch (exports.type(val)) {
- case 'null':
- case 'undefined':
- val = '[' + val + ']';
- break;
- case 'array':
- case 'object':
- val = jsonStringify(val, spaces, depth + 1);
- break;
- case 'boolean':
- case 'regexp':
- case 'number':
- val = val === 0 && (1/val) === -Infinity // `-0`
- ? '-0'
- : val.toString();
- break;
- case 'date':
- val = '[Date: ' + val.toISOString() + ']';
- break;
- case 'buffer':
- var json = val.toJSON();
- // Based on the toJSON result
- json = json.data && json.type ? json.data : json;
- val = '[Buffer: ' + jsonStringify(json, 2, depth + 1) + ']';
- break;
- default:
- val = (val == '[Function]' || val == '[Circular]')
- ? val
- : '"' + val + '"'; //string
- }
- return val;
- }
-
- for(var i in object) {
- if(!object.hasOwnProperty(i)) continue; // not my business
- --length;
- str += '\n ' + repeat(' ', space)
- + (isArray(object) ? '' : '"' + i + '": ') // key
- + _stringify(object[i]) // value
- + (length ? ',' : ''); // comma
- }
-
- return str + (str.length != 1 // [], {}
- ? '\n' + repeat(' ', --space) + end
- : end);
-}
-
-/**
- * Return if obj is a Buffer
- * @param {Object} arg
- * @return {Boolean}
- * @api private
- */
-exports.isBuffer = function (arg) {
- return typeof Buffer !== 'undefined' && Buffer.isBuffer(arg);
-};
-
-/**
- * @summary Return a new Thing that has the keys in sorted order. Recursive.
- * @description If the Thing...
- * - has already been seen, return string `'[Circular]'`
- * - is `undefined`, return string `'[undefined]'`
- * - is `null`, return value `null`
- * - is some other primitive, return the value
- * - is not a primitive or an `Array`, `Object`, or `Function`, return the value of the Thing's `toString()` method
- * - is a non-empty `Array`, `Object`, or `Function`, return the result of calling this function again.
- * - is an empty `Array`, `Object`, or `Function`, return the result of calling `emptyRepresentation()`
- *
- * @param {*} value Thing to inspect. May or may not have properties.
- * @param {Array} [stack=[]] Stack of seen values
- * @return {(Object|Array|Function|string|undefined)}
- * @see {@link exports.stringify}
- * @api private
- */
-
-exports.canonicalize = function(value, stack) {
- var canonicalizedObj,
- type = exports.type(value),
- prop,
- withStack = function withStack(value, fn) {
- stack.push(value);
- fn();
- stack.pop();
- };
-
- stack = stack || [];
-
- if (exports.indexOf(stack, value) !== -1) {
- return '[Circular]';
- }
-
- switch(type) {
- case 'undefined':
- case 'buffer':
- case 'null':
- canonicalizedObj = value;
- break;
- case 'array':
- withStack(value, function () {
- canonicalizedObj = exports.map(value, function (item) {
- return exports.canonicalize(item, stack);
- });
- });
- break;
- case 'function':
- for (prop in value) {
- canonicalizedObj = {};
- break;
- }
- if (!canonicalizedObj) {
- canonicalizedObj = emptyRepresentation(value, type);
- break;
- }
- /* falls through */
- case 'object':
- canonicalizedObj = canonicalizedObj || {};
- withStack(value, function () {
- exports.forEach(exports.keys(value).sort(), function (key) {
- canonicalizedObj[key] = exports.canonicalize(value[key], stack);
- });
- });
- break;
- case 'date':
- case 'number':
- case 'regexp':
- case 'boolean':
- canonicalizedObj = value;
- break;
- default:
- canonicalizedObj = value.toString();
- }
-
- return canonicalizedObj;
-};
-
-/**
- * Lookup file names at the given `path`.
- */
-exports.lookupFiles = function lookupFiles(path, extensions, recursive) {
- var files = [];
- var re = new RegExp('\\.(' + extensions.join('|') + ')$');
-
- if (!exists(path)) {
- if (exists(path + '.js')) {
- path += '.js';
- } else {
- files = glob.sync(path);
- if (!files.length) throw new Error("cannot resolve path (or pattern) '" + path + "'");
- return files;
- }
- }
-
- try {
- var stat = fs.statSync(path);
- if (stat.isFile()) return path;
- }
- catch (ignored) {
- return;
- }
-
- fs.readdirSync(path).forEach(function(file) {
- file = join(path, file);
- try {
- var stat = fs.statSync(file);
- if (stat.isDirectory()) {
- if (recursive) {
- files = files.concat(lookupFiles(file, extensions, recursive));
- }
- return;
- }
- }
- catch (ignored) {
- return;
- }
- if (!stat.isFile() || !re.test(file) || basename(file)[0] === '.') return;
- files.push(file);
- });
-
- return files;
-};
-
-/**
- * Generate an undefined error with a message warning the user.
- *
- * @return {Error}
- */
-
-exports.undefinedError = function() {
- return new Error('Caught undefined error, did you throw without specifying what?');
-};
-
-/**
- * Generate an undefined error if `err` is not defined.
- *
- * @param {Error} err
- * @return {Error}
- */
-
-exports.getError = function(err) {
- return err || exports.undefinedError();
-};
-
-
-/**
- * @summary
- * This Filter based on `mocha-clean` module.(see: `github.com/rstacruz/mocha-clean`)
- * @description
- * When invoking this function you get a filter function that get the Error.stack as an input,
- * and return a prettify output.
- * (i.e: strip Mocha, node_modules, bower and componentJS from stack trace).
- * @returns {Function}
- */
-
-exports.stackTraceFilter = function() {
- var slash = '/'
- , is = typeof document === 'undefined'
- ? { node: true }
- : { browser: true }
- , cwd = is.node
- ? process.cwd() + slash
- : location.href.replace(/\/[^\/]*$/, '/');
-
- function isNodeModule (line) {
- return (~line.indexOf('node_modules'));
- }
-
- function isMochaInternal (line) {
- return (~line.indexOf('node_modules' + slash + 'mocha')) ||
- (~line.indexOf('components' + slash + 'mochajs')) ||
- (~line.indexOf('components' + slash + 'mocha'));
- }
-
- // node_modules, bower, componentJS
- function isBrowserModule(line) {
- return (~line.indexOf('node_modules')) ||
- (~line.indexOf('components'));
- }
-
- function isNodeInternal (line) {
- return (~line.indexOf('(timers.js:')) ||
- (~line.indexOf('(events.js:')) ||
- (~line.indexOf('(node.js:')) ||
- (~line.indexOf('(module.js:')) ||
- (~line.indexOf('GeneratorFunctionPrototype.next (native)')) ||
- false
- }
-
- return function(stack) {
- stack = stack.split('\n');
-
- stack = exports.reduce(stack, function(list, line) {
- if (is.node && (isNodeModule(line) ||
- isMochaInternal(line) ||
- isNodeInternal(line)))
- return list;
-
- if (is.browser && (isBrowserModule(line)))
- return list;
-
- // Clean up cwd(absolute)
- list.push(line.replace(cwd, ''));
- return list;
- }, []);
-
- return stack.join('\n');
- }
-};
-}); // module: utils.js
-// The global object is "self" in Web Workers.
-var global = (function() { return this; })();
-
-/**
- * Save timer references to avoid Sinon interfering (see GH-237).
- */
-
-var Date = global.Date;
-var setTimeout = global.setTimeout;
-var setInterval = global.setInterval;
-var clearTimeout = global.clearTimeout;
-var clearInterval = global.clearInterval;
-
-/**
- * Node shims.
- *
- * These are meant only to allow
- * mocha.js to run untouched, not
- * to allow running node code in
- * the browser.
- */
-
-var process = {};
-process.exit = function(status){};
-process.stdout = {};
-
-var uncaughtExceptionHandlers = [];
-
-var originalOnerrorHandler = global.onerror;
-
-/**
- * Remove uncaughtException listener.
- * Revert to original onerror handler if previously defined.
- */
-
-process.removeListener = function(e, fn){
- if ('uncaughtException' == e) {
- if (originalOnerrorHandler) {
- global.onerror = originalOnerrorHandler;
- } else {
- global.onerror = function() {};
- }
- var i = Mocha.utils.indexOf(uncaughtExceptionHandlers, fn);
- if (i != -1) { uncaughtExceptionHandlers.splice(i, 1); }
- }
-};
-
-/**
- * Implements uncaughtException listener.
- */
-
-process.on = function(e, fn){
- if ('uncaughtException' == e) {
- global.onerror = function(err, url, line){
- fn(new Error(err + ' (' + url + ':' + line + ')'));
- return true;
- };
- uncaughtExceptionHandlers.push(fn);
- }
-};
-
-/**
- * Expose mocha.
- */
-
-var Mocha = global.Mocha = require('mocha'),
- mocha = global.mocha = new Mocha({ reporter: 'html' });
-
-// The BDD UI is registered by default, but no UI will be functional in the
-// browser without an explicit call to the overridden `mocha.ui` (see below).
-// Ensure that this default UI does not expose its methods to the global scope.
-mocha.suite.removeAllListeners('pre-require');
-
-var immediateQueue = []
- , immediateTimeout;
-
-function timeslice() {
- var immediateStart = new Date().getTime();
- while (immediateQueue.length && (new Date().getTime() - immediateStart) < 100) {
- immediateQueue.shift()();
- }
- if (immediateQueue.length) {
- immediateTimeout = setTimeout(timeslice, 0);
- } else {
- immediateTimeout = null;
- }
-}
-
-/**
- * High-performance override of Runner.immediately.
- */
-
-Mocha.Runner.immediately = function(callback) {
- immediateQueue.push(callback);
- if (!immediateTimeout) {
- immediateTimeout = setTimeout(timeslice, 0);
- }
-};
-
-/**
- * Function to allow assertion libraries to throw errors directly into mocha.
- * This is useful when running tests in a browser because window.onerror will
- * only receive the 'message' attribute of the Error.
- */
-mocha.throwError = function(err) {
- Mocha.utils.forEach(uncaughtExceptionHandlers, function (fn) {
- fn(err);
- });
- throw err;
-};
-
-/**
- * Override ui to ensure that the ui functions are initialized.
- * Normally this would happen in Mocha.prototype.loadFiles.
- */
-
-mocha.ui = function(ui){
- Mocha.prototype.ui.call(this, ui);
- this.suite.emit('pre-require', global, null, this);
- return this;
-};
-
-/**
- * Setup mocha with the given setting options.
- */
-
-mocha.setup = function(opts){
- if ('string' == typeof opts) opts = { ui: opts };
- for (var opt in opts) this[opt](opts[opt]);
- return this;
-};
-
-/**
- * Run mocha, returning the Runner.
- */
-
-mocha.run = function(fn){
- var options = mocha.options;
- mocha.globals('location');
-
- var query = Mocha.utils.parseQuery(global.location.search || '');
- if (query.grep) mocha.grep(new RegExp(query.grep));
- if (query.fgrep) mocha.grep(query.fgrep);
- if (query.invert) mocha.invert();
-
- return Mocha.prototype.run.call(mocha, function(err){
- // The DOM Document is not available in Web Workers.
- var document = global.document;
- if (document && document.getElementById('mocha') && options.noHighlighting !== true) {
- Mocha.utils.highlightTags('code');
- }
- if (fn) fn(err);
- });
-};
-
-/**
- * Expose the process shim.
- */
-
-Mocha.process = process;
-})();
diff --git a/tests/lib/mocha-2.2.5/package.json b/tests/lib/mocha-2.2.5/package.json
deleted file mode 100755
index 28e16ffd42..0000000000
--- a/tests/lib/mocha-2.2.5/package.json
+++ /dev/null
@@ -1,75 +0,0 @@
-{
- "name": "mocha",
- "version": "2.2.5",
- "description": "simple, flexible, fun test framework",
- "keywords": [
- "mocha",
- "test",
- "bdd",
- "tdd",
- "tap"
- ],
- "author": "TJ Holowaychuk <tj@vision-media.ca>",
- "contributors": [
- "Joshua Appelman <joshua@jbna.nl>",
- "Christoffer Hallas <christoffer.hallas@gmail.com>",
- "Christopher Hiller <chiller@badwing.com>",
- "Travis Jeffery <tj@travisjeffery.com>",
- "Daniel St. Jules <danielst.jules@gmail.com>",
- "David da Silva Contín <dasilvacontin@gmail.com>",
- "Ariel Mashraki <ariel@mashraki.co.il>",
- "Pawel Kozlowski <pkozlowski.opensource@gmail.com>"
- ],
- "license": "MIT",
- "repository": {
- "type": "git",
- "url": "git://github.com/mochajs/mocha.git"
- },
- "maintainers": [
- "travisjeffery <tj@travisjeffery.com>",
- "jbnicolai <joshua@jbna.nl>",
- "boneskull <chiller@badwing.com>"
- ],
- "main": "./index",
- "browser": "./mocha.js",
- "bin": {
- "mocha": "./bin/mocha",
- "_mocha": "./bin/_mocha"
- },
- "engines": {
- "node": ">= 0.8.x"
- },
- "scripts": {
- "test": "make test-all"
- },
- "dependencies": {
- "commander": "2.3.0",
- "debug": "2.0.0",
- "diff": "1.4.0",
- "escape-string-regexp": "1.0.2",
- "glob": "3.2.3",
- "growl": "1.8.1",
- "jade": "0.26.3",
- "mkdirp": "0.5.0",
- "supports-color": "~1.2.0"
- },
- "devDependencies": {
- "coffee-script": "~1.8.0",
- "should": "~4.0.0"
- },
- "files": [
- "bin",
- "images",
- "lib",
- "index.js",
- "mocha.css",
- "mocha.js",
- "LICENSE"
- ],
- "licenses": [
- {
- "type": "MIT",
- "url": "https://raw.github.com/mochajs/mocha/master/LICENSE"
- }
- ]
-} \ No newline at end of file
diff --git a/tests/lib/mocha-2.2.5/support/compile.js b/tests/lib/mocha-2.2.5/support/compile.js
deleted file mode 100755
index bea017ab51..0000000000
--- a/tests/lib/mocha-2.2.5/support/compile.js
+++ /dev/null
@@ -1,157 +0,0 @@
-/**
- * Module dependencies.
- */
-
-var fs = require('fs');
-
-/**
- * Arguments.
- */
-
-var args = process.argv.slice(2)
- , pending = args.length
- , files = {};
-
-console.log('');
-
-// parse arguments
-
-args.forEach(function(file){
- var mod = file.replace('lib/', '');
- fs.readFile(file, 'utf8', function(err, js){
- if (err) throw err;
- console.log(' \u001b[90mcompile : \u001b[0m\u001b[36m%s\u001b[0m', file);
- files[file] = ~js.indexOf('require: off')
- ? js
- : parse(js);
- --pending || compile();
- });
-});
-
-/**
- * Parse the given `js`.
- */
-
-function parse(js) {
- return parseRequires(parseInheritance(js));
-}
-
-/**
- * Parse requires.
- */
-
-function parseRequires(js) {
- return js
- .replace(/require\('events'\)/g , "require('browser/events')")
- .replace(/require\('debug'\)/g , "require('browser/debug')")
- .replace(/require\('path'\)/g , "require('browser/path')")
- .replace(/require\('diff'\)/g , "require('browser/diff')")
- .replace(/require\('tty'\)/g , "require('browser/tty')")
- .replace(/require\('escape-string-regexp'\)/g , "require('browser/escape-string-regexp')")
- .replace(/require\('glob'\)/g , "require('browser/glob')")
- .replace(/require\('fs'\)/g , "require('browser/fs')");
-}
-
-/**
- * Parse __proto__.
- */
-
-function parseInheritance(js) {
- return js
- .replace(/^ *(\w+)\.prototype\.__proto__ * = *(\w+)\.prototype *;?/gm, function(_, child, parent){
- return 'function F(){};\n'
- + 'F.prototype = ' + parent + '.prototype;\n'
- + child + '.prototype = new F;\n'
- + child + '.prototype.constructor = '+ child + ';\n';
- });
-}
-
-/**
- * Compile the files.
- */
-
-function compile() {
- var buf = '';
- buf += '\n// CommonJS require()\n\n';
- buf += browser.require + '\n\n';
- buf += 'require.modules = {};\n\n';
- buf += 'require.resolve = ' + browser.resolve + ';\n\n';
- buf += 'require.register = ' + browser.register + ';\n\n';
- buf += 'require.relative = ' + browser.relative + ';\n\n';
- args.forEach(function(file){
- var js = files[file];
- file = file.replace('lib/', '');
- buf += '\nrequire.register("' + file + '", function(module, exports, require){\n';
- buf += js;
- buf += '\n}); // module: ' + file + '\n';
- });
- fs.writeFile('_mocha.js', buf, function(err){
- if (err) throw err;
- console.log(' \u001b[90m create : \u001b[0m\u001b[36m%s\u001b[0m', 'mocha.js');
- console.log();
- });
-}
-
-// refactored version of weepy's
-// https://github.com/weepy/brequire/blob/master/browser/brequire.js
-
-var browser = {
-
- /**
- * Require a module.
- */
-
- require: function require(p){
- var path = require.resolve(p)
- , mod = require.modules[path];
- if (!mod) throw new Error('failed to require "' + p + '"');
- if (!mod.exports) {
- mod.exports = {};
- mod.call(mod.exports, mod, mod.exports, require.relative(path));
- }
- return mod.exports;
- },
-
- /**
- * Resolve module path.
- */
-
- resolve: function(path){
- var orig = path
- , reg = path + '.js'
- , index = path + '/index.js';
- return require.modules[reg] && reg
- || require.modules[index] && index
- || orig;
- },
-
- /**
- * Return relative require().
- */
-
- relative: function(parent) {
- return function(p){
- if ('.' != p.charAt(0)) return require(p);
-
- var path = parent.split('/')
- , segs = p.split('/');
- path.pop();
-
- for (var i = 0; i < segs.length; i++) {
- var seg = segs[i];
- if ('..' == seg) path.pop();
- else if ('.' != seg) path.push(seg);
- }
-
- return require(path.join('/'));
- };
- },
-
- /**
- * Register a module.
- */
-
- register: function(path, fn){
- require.modules[path] = fn;
- }
-};
diff --git a/tests/lib/mocha-2.2.5/support/foot.js b/tests/lib/mocha-2.2.5/support/foot.js
deleted file mode 100755
index 0319a0fe5f..0000000000
--- a/tests/lib/mocha-2.2.5/support/foot.js
+++ /dev/null
@@ -1 +0,0 @@
-})();
diff --git a/tests/lib/mocha-2.2.5/support/head.js b/tests/lib/mocha-2.2.5/support/head.js
deleted file mode 100755
index 55d38175ec..0000000000
--- a/tests/lib/mocha-2.2.5/support/head.js
+++ /dev/null
@@ -1 +0,0 @@
-;(function(){
diff --git a/tests/lib/mocha-2.2.5/test.js b/tests/lib/mocha-2.2.5/test.js
deleted file mode 100755
index 47de23e5e6..0000000000
--- a/tests/lib/mocha-2.2.5/test.js
+++ /dev/null
@@ -1,9 +0,0 @@
-function usedToBeAsync (cb) {
- cb()
-}
-
-it('test', function() {
- this.timeout(4294967296);
- usedToBeAsync(done)
-});
-
diff --git a/tests/lib/mocha-3.1.0/.editorconfig b/tests/lib/mocha-3.1.0/.editorconfig
new file mode 100644
index 0000000000..e3a4859eeb
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/.editorconfig
@@ -0,0 +1,18 @@
+# This file is for unifying the coding style for different editors and IDEs
+# editorconfig.org
+
+root = true
+
+[*]
+end_of_line = lf
+charset = utf-8
+insert_final_newline = true
+trim_trailing_whitespace = true
+indent_style = space
+indent_size = 2
+
+[Makefile]
+indent_style = tab
+
+[*.md]
+trim_trailing_whitespace = false
diff --git a/tests/lib/mocha-3.1.0/.eslintignore b/tests/lib/mocha-3.1.0/.eslintignore
new file mode 100644
index 0000000000..2b550ca81d
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/.eslintignore
@@ -0,0 +1,3 @@
+lib/to-iso-string/
+test/**/*
+!test/runner.js
diff --git a/tests/lib/mocha-3.1.0/.eslintrc b/tests/lib/mocha-3.1.0/.eslintrc
new file mode 100644
index 0000000000..d5c733f79f
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/.eslintrc
@@ -0,0 +1,129 @@
+---
+env:
+ node: true
+
+rules:
+ brace-style: [2, 1tbs]
+ camelcase: 2
+ comma-dangle: [2, never]
+ comma-spacing: [2, {before: false, after: true}]
+ comma-style: [2, last]
+ computed-property-spacing: [2, never]
+ consistent-return: 0
+ consistent-this: [1, self]
+ curly: [2, all]
+ default-case: 2
+ dot-location: [2, property]
+ dot-notation: [2, { allowKeywords: true, allowPattern: "^long$" }]
+ eol-last: 2
+ eqeqeq: 2
+ func-style: [2, declaration]
+ guard-for-in: 2 # TODO: Change to error
+ handle-callback-err: [2, ^(err|error)$]
+ indent: [2, 2, { SwitchCase: 1 }]
+ key-spacing: [2, { beforeColon: false, afterColon: true }]
+ max-len: [0, 80, 2] # TODO: Change to error
+ max-params: [1, 4]
+ new-cap: 0 # TODO: Change to error
+ new-parens: 2
+ no-alert: 2
+ no-array-constructor: 0
+ no-bitwise: 0
+ no-caller: 2
+ no-catch-shadow: 2
+ no-cond-assign: [1, except-parens] # TODO: Change to error
+ no-console: 0
+ no-constant-condition: 0
+ no-control-regex: 2
+ no-debugger: 1
+ no-delete-var: 2
+ no-dupe-args: 2
+ no-dupe-keys: 2
+ no-duplicate-case: 2
+ no-else-return: 2
+ no-empty: 2
+ no-empty-character-class: 2
+ no-eq-null: 0
+ no-eval: 2
+ no-ex-assign: 2
+ no-extend-native: 2
+ no-extra-bind: 2
+ no-extra-boolean-cast: 2
+ no-extra-semi: 2
+ no-fallthrough: 2
+ no-floating-decimal: 0
+ no-func-assign: 2
+ no-implied-eval: 2
+ no-inner-declarations: [2, functions]
+ no-invalid-regexp: 2
+ no-irregular-whitespace: 2
+ no-iterator: 2
+ no-labels: 2
+ no-lone-blocks: 2
+ no-lonely-if: 2
+ no-loop-func: 2
+ no-mixed-requires: [0, false]
+ no-mixed-spaces-and-tabs: [2, false]
+ no-multi-spaces: 2
+ no-multi-str: 2
+ no-multiple-empty-lines: [2, { max: 1 }]
+ no-native-reassign: 2
+ no-negated-in-lhs: 2
+ no-nested-ternary: 2
+ no-new: 2
+ no-new-func: 2
+ no-new-object: 2
+ no-new-require: 2
+ no-new-wrappers: 2
+ no-obj-calls: 2
+ no-octal: 2
+ no-octal-escape: 2
+ no-path-concat: 2
+ no-process-exit: 2
+ no-proto: 1 # TODO: Change to error
+ no-redeclare: 2
+ no-regex-spaces: 2
+ no-return-assign: 2
+ no-script-url: 2
+ no-self-compare: 2
+ no-sequences: 2
+ no-shadow: 0
+ no-shadow-restricted-names: 2
+ no-spaced-func: 2
+ no-sparse-arrays: 2
+ no-trailing-spaces: 2
+ no-undef: 2
+ no-undef-init: 2
+ no-underscore-dangle: 0 # TODO: Change to error
+ no-unneeded-ternary: 2
+ no-unreachable: 2
+ no-unused-expressions: 0
+ no-unused-vars: [2, { vars: all, args: after-used }]
+ no-use-before-define: 0
+ no-void: 2
+ no-with: 2
+ object-curly-spacing: [2, always]
+ one-var: [2, never]
+ operator-assignment: [2, always]
+ operator-linebreak: [2, before]
+ padded-blocks: [2, never]
+ quote-props: [2, as-needed]
+ quotes: [2, single, avoid-escape]
+ radix: 2
+ semi: [2, always]
+ semi-spacing: [2, { before: false, after: true }]
+ space-before-blocks: [2, always]
+ space-before-function-paren: [2, never]
+ space-in-parens: [2, never]
+ space-infix-ops: 2
+ keyword-spacing: 2
+ space-unary-ops: [2, { words: true, nonwords: false }]
+ spaced-comment: [2, always, { exceptions: ['!'] }]
+ strict: [0, global] # TODO: Change to error
+ use-isnan: 2
+ valid-jsdoc: [0, { requireReturn: false }] # TODO: Change to warning
+ valid-typeof: 2
+ vars-on-top: 0
+ wrap-iife: 2
+ wrap-regex: 2
+ yoda: [2, never]
diff --git a/tests/lib/mocha-3.1.0/.gitignore b/tests/lib/mocha-3.1.0/.gitignore
new file mode 100644
index 0000000000..fa1c0b0ccf
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/.gitignore
@@ -0,0 +1,17 @@
+.DS_Store
+node_modules
+*.sock
+testing
+_mocha.js
+my-reporter.js
+*.sw*
+lib/browser/diff.js
+.idea
+*.iml
+*.patch
+*.diff
+npm-debug.log*
+.envrc
+.karma/
+*.orig
+
diff --git a/tests/lib/mocha-3.1.0/.mailmap b/tests/lib/mocha-3.1.0/.mailmap
new file mode 100644
index 0000000000..528a26775e
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/.mailmap
@@ -0,0 +1,12 @@
+TJ Holowaychuk <tj@vision-media.ca>
+Travis Jeffery <tj@travisjeffery.com> <travisjeffery@gmail.com>
+Travis Jeffery <tj@travisjeffery.com> Dr. Travis Jeffery <tj@travisjeffery.com>
+Christopher Hiller <boneskull@boneskull.com> Christopher Hiller <chiller@badwing.com>
+David da Silva Contín <dasilvacontin@gmail.com> David da Silva <daviddasilvacontin@me.com>
+David da Silva Contín <dasilvacontin@gmail.com> David da Silva <dasilvacontin@gmail.com>
+David da Silva Contín <dasilvacontin@gmail.com> <daviddasilvacontin@gmail.com>
+Ariel Mashraki <ariel@mashraki.co.il> Ariel Mashraki <ariel@codeoasis.com>
+Ariel Mashraki <ariel@mashraki.co.il> Ariel Mashraki <ariel.mashraki@ironsrc.com>
+Forbes Lindesay <forbes@lindesay.co.uk> Forbes Lindesay <fpfl2@cam.ac.uk>
+Ben Bradley <ben@bradleyit.com> Ben Bradley <[ben.bradley@cigna.com|mailto:ben.bradley@cigna.com]>
+Glen Mailer <glenjamin@gmail.com> Glen Mailer <glen.mailer@bskyb.com>
diff --git a/tests/lib/mocha-3.1.0/.npmignore b/tests/lib/mocha-3.1.0/.npmignore
new file mode 100644
index 0000000000..e3216decb2
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/.npmignore
@@ -0,0 +1,2 @@
+assets/
+
diff --git a/tests/lib/mocha-3.1.0/.travis.yml b/tests/lib/mocha-3.1.0/.travis.yml
new file mode 100644
index 0000000000..29b4c419e5
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/.travis.yml
@@ -0,0 +1,55 @@
+# in order to use 'trusty' dist, need this.
+# see https://docs.travis-ci.com/user/trusty-ci-environment/
+sudo: required
+
+# trust dist provides a modern build chain (as opposed to 'precise' dist)
+# which absolves us from having to install compilers and stuff
+dist: trusty
+
+language: node_js
+
+env:
+ global:
+ # phantomjs hosts binaries @ bitbucket, which has fairly restrictive
+ # rate-limiting. pull it from this sketchy site in China instead.
+ - PHANTOMJS_CDNURL='https://cnpmjs.org/downloads'
+ # we're going to use s3 to temporarily store Karma test bundles for debugging
+ - AWS_ACCESS_KEY_ID=AKIAJ3QQTLQXWXYJ6PTA
+ - secure: k4musDC734E1NFOWaY5qb/l0B9K1cfusFTvMZFayTMs5ubKjeNYCgct2sDSvO5tO7Un935I0sYOOSRPvANPhs8dP1a/8/x0PnwIfnpoCFQCCaI0bWnIQj7nOZ2TaEB/fngZCerCFpNDlzqI6BmaR+XoMvA74v2YD/vVXnzvXNQk=
+
+matrix:
+ fast_finish: true
+ include:
+ - node_js: '6'
+ env: TARGET=test-node
+ - node_js: '5'
+ env: TARGET=test-node
+ - node_js: '4'
+ env: TARGET=test-node
+ - node_js: 'iojs'
+ env: TARGET=test-node
+ - node_js: '0.12'
+ env: TARGET=test-node
+ - node_js: '0.11'
+ env: TARGET=test-node
+ - node_js: '0.10'
+ env: TARGET=test-node
+ - node_js: '6'
+ env: TARGET=lint
+ - node_js: '6'
+ env: TARGET=test-browser S3=1
+
+before_install: scripts/travis-before-install.sh
+
+before_script: scripts/travis-before-script.sh
+
+script: make $TARGET
+
+after_script: scripts/travis-after-script.sh
+
+notifications:
+ urls:
+ # for gitter
+ - secure: fUrHenYJs+pTuLtgBRoYyrlyfVekxaIGmLWq7bhUUqBj/7p5eCkQFn13LlPht0/4WWZOiPBcdTN7tKnz3Ho7ATUJhAchvOWDUgL5gtTvOzeCHbPuCvHz/VLK6hMoPdbLA45M864NDLotfHvyh62WgQaVw9iPc80eb+umaDPrYiU=
+ on_success: change
+ on_failure: always
diff --git a/tests/lib/mocha-3.1.0/CHANGELOG.md b/tests/lib/mocha-3.1.0/CHANGELOG.md
new file mode 100644
index 0000000000..27d04fac00
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/CHANGELOG.md
@@ -0,0 +1,1418 @@
+# 3.1.0 / 2016-09-27
+
+## :tada: Enhancement
+
+- [#2357]: Support `--inspect` on command-line ([@simov])
+- [#2194]: Human-friendly error if no files are matched on command-line ([@Munter])
+- [#1744]: Human-friendly error if a Suite has no callback (BDD/TDD only) ([@anton])
+
+## :bug: Bug Fix
+
+- [#2488]: Fix case in which *variables beginning with lowercase "D"* may not have been reported properly as global leaks ([@JustATrick]) :laughing:
+- [#2465]: Always halt execution in async function when `this.skip()` is called ([@boneskull])
+- [#2445]: Exits with expected code 130 when `SIGINT` encountered; exit code can no longer rollover at 256 ([@Munter])
+- [#2315]: Fix uncaught TypeError thrown from callback stack ([@1999])
+- Fix broken `only()`/`skip()` in IE7/IE8 ([@boneskull])
+- [#2502]: Fix broken stack trace filter on Node.js under Windows ([@boneskull])
+- [#2496]: Fix diff output for objects instantiated with `String` constructor ([more](https://youtrack.jetbrains.com/issue/WEB-23383)) ([@boneskull])
+
+[#2496]: https://github.com/mochajs/mocha/issues/2496
+[#2502]: https://github.com/mochajs/mocha/issues/2502
+[#2315]: https://github.com/mochajs/mocha/issues/2315
+[#2445]: https://github.com/mochajs/mocha/pull/2445
+[#2465]: https://github.com/mochajs/mocha/issues/2465
+[#2488]: https://github.com/mochajs/mocha/issues/2488
+[#1744]: https://github.com/mochajs/mocha/issues/1744
+[#2194]: https://github.com/mochajs/mocha/issues/2194
+[#2357]: https://github.com/mochajs/mocha/issues/2357
+[@1999]: https://github.com/1999
+[@JustATrick]: https://github.com/JustATrick
+[@anton]: https://github.com/anton
+[@simov]: https://github.com/simov
+
+# 3.0.2 / 2016-08-08
+
+## :bug: Bug Fix
+
+- [#2424]: Fix error loading Mocha via Require.js ([@boneskull])
+- [#2417]: Fix execution of *deeply* nested `describe.only()` suites ([@not-an-aardvark])
+- Remove references to `json-cov` and `html-cov` reporters in CLI ([@boneskull])
+
+[#2417]: https://github.com/mochajs/mocha/issues/2417
+[#2424]: https://github.com/mochajs/mocha/issues/2424
+
+# 3.0.1 / 2016-08-03
+
+## :bug: Bug Fix
+
+- [#2406]: Restore execution of nested `describe.only()` suites ([@not-an-aardvark])
+
+[#2406]: https://github.com/mochajs/mocha/issues/2406
+[@not-an-aardvark]: https://github.com/not-an-aardvark
+
+# 3.0.0 / 2016-07-31
+
+## :boom: Breaking Changes
+
+- :warning: Due to the increasing difficulty of applying security patches made within its dependency tree, as well as looming incompatibilities with Node.js v7.0, **Mocha no longer supports Node.js v0.8**.
+- :warning: **Mocha may no longer be installed by versions of `npm` less than `1.4.0`.** Previously, this requirement only affected Mocha's development dependencies. In short, this allows Mocha to depend on packages which have dependencies fixed to major versions (`^`).
+- `.only()` is no longer "fuzzy", can be used multiple times, and generally just works like you think it should. :joy:
+- To avoid common bugs, when a test injects a callback function (suggesting asynchronous execution), calls it, *and* returns a `Promise`, Mocha will now throw an exception:
+
+ ```js
+ const assert = require('assert');
+
+ it('should complete this test', function (done) {
+ return new Promise(function (resolve) {
+ assert.ok(true);
+ resolve();
+ })
+ .then(done);
+ });
+ ```
+
+ The above test will fail with `Error: Resolution method is overspecified. Specify a callback *or* return a Promise; not both.`.
+- When a test timeout value *greater than* `2147483648` is specified in any context (`--timeout`, `mocha.setup()`, per-suite, per-test, etc.), the timeout will be *disabled* and the test(s) will be allowed to run indefinitely. This is equivalent to specifying a timeout value of `0`. See [MDN](https://developer.mozilla.org/docs/Web/API/WindowTimers/setTimeout#Maximum_delay_value) for reasoning.
+- The `dot` reporter now uses more visually distinctive characters when indicating "pending" and "failed" tests.
+- Mocha no longer supports [component](https://www.npmjs.com/package/component).
+- The long-forsaken `HTMLCov` and `JSONCov` reporters--and any relationship to the "node-jscoverage" project--have been removed.
+- `spec` reporter now omits leading carriage returns (`\r`) in non-TTY environment.
+
+## :tada: Enhancements
+
+- [#808]: Allow regular-expression-like strings in `--grep` and browser's `grep` querystring; enables flags such as `i` for case-insensitive matches and `u` for unicode. ([@a8m])
+- [#2000]: Use distinctive characters in `dot` reporter; `,` will denote a "pending" test and `!` will denote a "failing" test. ([@elliottcable])
+- [#1632]: Throw a useful exception when a suite or test lacks a title. ([@a8m])
+- [#1481]: Better `.only()` behavior. ([@a8m])
+- [#2334]: Allow `this.skip()` in async tests and hooks. ([@boneskull])
+- [#1320]: Throw a useful exception when test resolution method is overspecified. ([@jugglinmike])
+- [#2364]: Support `--preserve-symlinks`. ([@rosswarren])
+
+## :bug: Bug Fixes
+
+- [#2259]: Restore ES3 compatibility. Specifically, support an environment lacking `Date.prototype.toISOString()`, `JSON`, or has a non-standard implementation of `JSON`. ([@ndhoule], [@boneskull])
+- [#2286]: Fix `after()` failing to execute if test skipped using `this.skip()` in `beforeEach()`; no longer marks the entire suite as "pending". ([@dasilvacontin], [@boneskull])
+- [#2208]: Fix function name display in `markdown` and `html` (browser) reporters. ([@ScottFreeCode])
+- [#2299]: Fix progress bar in `html` (browser) reporter. ([@AviVahl])
+- [#2307]: Fix `doc` reporter crashing when test fails. ([@jleyba])
+- [#2323]: Ensure browser entry point (`browser-entry.js`) is published to npm (for use with bundlers). ([@boneskull])
+- [#2310]: Ensure custom reporter with an absolute path works in Windows. ([@silentcloud])
+- [#2311]: Fix problem wherein calling `this.slow()` without a value would blast any previously set value. ([@boneskull])
+- [#1813]: Ensure Mocha's own test suite will run in Windows. ([@tswaters], [@TimothyGu], [@boneskull])
+- [#2317]: Ensure all interfaces are displayed in `--help` on CLI. ([@ScottFreeCode])
+- [#1644]: Don't exhibit undefined behavior when calling `this.timeout()` with very large values ([@callumacrae], [@boneskull])
+- [#2361]: Don't truncate name of thrown anonymous exception. ([@boneskull])
+- [#2367]: Fix invalid CSS. ([@bensontrent])
+- [#2401]: Remove carriage return before each test line in spec reporter. ([@Munter])
+
+## :nut_and_bolt: Other
+
+- Upgrade production dependencies to address security advisories (and because now we can): `glob`, `commander`, `escape-string-regexp`,
+and `supports-color`. ([@boneskull], [@RobLoach])
+- Add Windows to CI. ([@boneskull], [@TimothyGu])
+- Ensure appropriate `engines` field in `package.json`. ([@shinnn], [@boneskull])
+- [#2348]: Upgrade ESLint to v2 ([@anthony-redfox])
+
+We :heart: our [backers and sponsors](https://opencollective.com/mochajs)!
+
+:shipit:
+
+[#2401]: https://github.com/mochajs/mocha/pull/2401
+[#2348]: https://github.com/mochajs/mocha/issues/2348
+[#808]: https://github.com/mochajs/mocha/issues/808
+[#2361]: https://github.com/mochajs/mocha/pull/2361
+[#2367]: https://github.com/mochajs/mocha/pull/2367
+[#2364]: https://github.com/mochajs/mocha/pull/2364
+[#1320]: https://github.com/mochajs/mocha/pull/1320
+[#2307]: https://github.com/mochajs/mocha/pull/2307
+[#2259]: https://github.com/mochajs/mocha/pull/2259
+[#2208]: https://github.com/mochajs/mocha/pull/2208
+[#2299]: https://github.com/mochajs/mocha/pull/2299
+[#2286]: https://github.com/mochajs/mocha/issues/2286
+[#1644]: https://github.com/mochajs/mocha/issues/1644
+[#2310]: https://github.com/mochajs/mocha/issues/2310
+[#2311]: https://github.com/mochajs/mocha/issues/2311
+[#2323]: https://github.com/mochajs/mocha/issues/2323
+[#2000]: https://github.com/mochajs/mocha/pull/2000
+[#1632]: https://github.com/mochajs/mocha/issues/1632
+[#1813]: https://github.com/mochajs/mocha/issues/1813
+[#2334]: https://github.com/mochajs/mocha/issues/2334
+[#2317]: https://github.com/mochajs/mocha/issues/2317
+[#1481]: https://github.com/mochajs/mocha/issues/1481
+[@elliottcable]: https://github.com/elliottcable
+[@RobLoach]: https://github.com/robloach
+[@AviVahl]: https://github.com/avivahl
+[@silentcloud]: https://github.com/silentcloud
+[@tswaters]: https://github.com/tswaters
+[@jleyba]: https://github.com/jleyba
+[@TimothyGu]: https://github.com/timothygu
+[@callumacrae]: https://github.com/callumacrae
+[@shinnn]: https://github.com/shinnn
+[@bensontrent]: https://github.com/bensontrent
+[@jugglinmike]: https://github.com/jugglinmike
+[@rosswarren]: https://github.com/rosswarren
+[@anthony-redfox]: https://github.com/anthony-redfox
+[@Munter]: https://github.com/munter
+
+# 2.5.3 / 2016-05-25
+
+- [#2112] - Fix HTML reporter regression causing duplicate error output ([@danielstjules] via 6d24063)
+- [#2119] - Make HTML reporter failure/passed links preventDefault to avoid SPA's hash navigation ([@jimenglish81] via 9e93efc)
+
+[@danielstjules]: https://github.com/danielstjules
+[@jimenglish81]: https://github.com/jimenglish81
+[#2112]: https://github.com/mochajs/mocha/pull/2112
+[#2119]: https://github.com/mochajs/mocha/pull/2119
+
+# 2.5.2 / 2016-05-24
+
+- [#2178] - Avoid double and triple xUnit XML escaping ([@graingert] via 49b5ff1)
+
+[@graingert]: https://github.com/graingert
+[#2178]: https://github.com/mochajs/mocha/pull/2178
+
+# 2.5.1 / 2016-05-23
+
+- Fix [to-iso-string](https://npmjs.com/package/to-iso-string) dependency ([@boneskull] via bd9450b)
+
+Thanks @entertainyou, @SimenB, @just-paja for the heads-up.
+
+# 2.5.0 / 2016-05-23
+
+> This has been awhile coming! We needed to feel confident that the next release wouldn't break browser compatibility (e.g. the last few patch releases).
+>
+> ### Browser Tests in CI
+>
+> We now run unit tests against PhantomJS v1.x and an assortment of browsers on [SauceLabs](https://saucelabs.com), including:
+> - Internet Explorer v8.0
+> - Chrome (latest)
+> - Firefox (latest)
+> - Safari (latest)
+> - Microsoft Edge (latest)
+>
+> To accomplish this, we now run Mocha's unit tests (and a handful of integration tests) via [Karma](https://npmjs.com/package/karma) and a modified [karma-mocha](https://npmjs.com/package/karma-mocha). Along the way, we had to solve issue [#880] (apologies to @mderijcke and @sukima who had PRs addressing this), as well as replace most usages of [should](https://npmjs.com/package/should) with [expect.js](https://npmjs.com/package/expect.js) for IE8.
+>
+> Going forward, when sending PRs, your code will *only* run against PhantomJS v1.x (and not hit SauceLabs) [because security](https://docs.travis-ci.com/user/pull-requests/#Security-Restrictions-when-testing-Pull-Requests).
+>
+> ### Node.js 6.x
+> Node.js 6.x "just worked" before, but now it's in the CI matrix, so it's "officially" supported. Mocha *still retains support* for Node.js 0.8.x.
+>
+> ### "Minor" Release
+> You'll see mostly bug fixes below, but also a couple features--as such, it's a "minor" release.
+>
+> ### TYVM
+>
+> Thanks to everyone who contributed, and our fabulous [sponsors and backers](https://opencollective.com/mochajs)!
+
+- [#2079] - Add browser checks to CI; update [browserify](https://npmjs.com/package/browserify) to v13.0.0 ([@dasilvacontin], [@ScottFreeCode], [@boneskull] via c04c1d7, 0b1e9b3, 0dde0fa, f8a3d86, 9e8cbaa)
+- [#880] - Make Mocha browserifyable ([@boneskull] via 524862b)
+- [#2121] - Update [glob](https://npmjs.com/package/glob) to v3.2.11 ([@astorije] via 7920fc4)
+- [#2126] - Fix dupe error messages in stack trace filter ([@Turbo87] via 4301caa)
+- [#2109] - Fix certain diffs when objects cannot be coerced into primitives ([@joshlory] via 61fbb7f)
+- [#1827] - Fix TWBS/`mocha.css` collisions ([@irnc] via 0543798)
+- [#1760], [#1936] - Fix `this.skip()` in HTML reporter ([@mislav] via cb4248b)
+- [#2115] - Fix exceptions thrown from hooks in HTML reporter ([@danielstjules] via e290bc0)
+- [#2089] - Handle Symbol values in `util.stringify()` ([@ryym] via ea61d05)
+- [#2097] - Fix diff for objects overriding `Object.prototype.hasOwnProperty` ([@mantoni] via b20fdfe)
+- [#2101] - Properly handle non-string "messages" thrown from assertion libraries ([@jkimbo] via 9c41051)
+- [#2124] - Update [growl](https://npmjs.com/package/growl) ([@benjamine] via 9ae6a85)
+- [#2162], [#2205] - JSDoc fixes ([@OlegTsyba] via 8031f20, [@ScottFreeCode] via f83b1d9)
+- [#2132] - Remove Growl-related cruft ([@julienw] via 00d6469)
+- [#2172] - Add [OpenCollective](https://opencollective.com) badge, sponsors & backers ([@xdamman], [@boneskull] via caee94f)
+- [#1841] - Add new logo, banner assets ([@dasilvacontin] via 00fd0e1)
+- [#2214] - Update `README.md` header ([@dasilvacontin] via c0f9be2)
+- [#2236] - Better checks for Node.js v0.8 compatibility in CI ([@dasilvacontin] via ba5637d)
+- [#2239] - Add Node.js v6.x to CI matrix ([@boneskull] via 3904da4)
+
+[#880]: https://github.com/mochajs/mocha/issues/880
+[#1841]: https://github.com/mochajs/mocha/pull/1841
+[#2239]: https://github.com/mochajs/mocha/issues/2239
+[#2153]: https://github.com/mochajs/mocha/pull/2153
+[#2214]: https://github.com/mochajs/mocha/pull/2214
+[#2236]: https://github.com/mochajs/mocha/pull/2236
+[#2079]: https://github.com/mochajs/mocha/issues/2079
+[#2231]: https://github.com/mochajs/mocha/pull/2231
+[#2089]: https://github.com/mochajs/mocha/issues/2089
+[#2097]: https://github.com/mochajs/mocha/pull/2097
+[#1760]: https://github.com/mochajs/mocha/issues/1760
+[#1936]: https://github.com/mochajs/mocha/issues/1936
+[#2115]: https://github.com/mochajs/mocha/pull/2115
+[#1827]: https://github.com/mochajs/mocha/pull/1827
+[#2101]: https://github.com/mochajs/mocha/pull/2101
+[#2124]: https://github.com/mochajs/mocha/pull/2124
+[#2109]: https://github.com/mochajs/mocha/issues/2109
+[#2162]: https://github.com/mochajs/mocha/pull/2162
+[#2132]: https://github.com/mochajs/mocha/issues/2132
+[#2126]: https://github.com/mochajs/mocha/issues/2126
+[#2121]: https://github.com/mochajs/mocha/issues/2121
+[#2205]: https://github.com/mochajs/mocha/pull/2205
+[#2172]: https://github.com/mochajs/mocha/pull/2172
+[@xdamman]: https://github.com/xdamman
+[@Turbo87]: https://github.com/Turbo87
+[@OlegTsyba]: https://github.com/OlegTsyba
+[@ryym]: https://github.com/ryym
+[@mantoni]: https://github.com/mantoni
+[@mislav]: https://github.com/mislav
+[@irnc]: https://github.com/irnc
+[@jkimbo]: https://github.com/jkimbo
+[@benjamine]: https://github.com/benjamine
+[@joshlory]: https://github.com/joshlory
+[@julienw]: https://github.com/julienw
+[@ScottFreeCode]: https://github.com/ScottFreeCode
+[@astorije]: https://github.com/astorije
+[@dasilvacontin]: https://github.com/dasilvacontin
+
+2.4.5 / 2016-01-28
+==================
+
+* [#2080], [#2078], [#2072], [#2073], [#1200] - Revert changes to console colors in changeset [1192914](https://github.com/mochajs/mocha/commit/119291449cd03a11cdeda9e37cf718a69a012896) and subsequent related changes thereafter. Restores compatibility with IE8 & PhantomJS. See also [mantoni/mochify.js#129](https://github.com/mantoni/mochify.js/issues/129) and [openlayers/ol3#4746](https://github.com/openlayers/ol3/pull/4746) ([@boneskull])
+* [#2082] - Fix several test assertions ([@mislav])
+
+[#1200]: https://github.com/mochajs/mocha/issues/1200
+[#2082]: https://github.com/mochajs/mocha/pull/2082
+
+2.4.4 / 2016-01-27
+==================
+
+* [#2080] - Fix broken RequireJS compatibility ([@boneskull])
+
+[#2080]: https://github.com/mochajs/mocha/issues/2080
+
+2.4.3 / 2016-01-27
+==================
+
+* [#2078] - Fix broken IE8 ([@boneskull])
+
+[#2078]: https://github.com/mochajs/mocha/issues/2078
+
+2.4.2 / 2016-01-26
+==================
+
+* [#2053] - Fix web worker compatibility ([@mislav])
+* [#2072] - Fix Windows color output ([@thedark1337])
+* [#2073] - Fix colors in `progress` and `landing` reporters ([@gyandeeps])
+
+[#2053]: https://github.com/mochajs/mocha/pull/2053
+[#2072]: https://github.com/mochajs/mocha/pull/2072
+[#2073]: https://github.com/mochajs/mocha/pull/2073
+[@gyandeeps]: https://github.com/gyandeeps
+[@thedark1337]: https://github.com/thedark1337
+
+2.4.1 / 2016-01-26
+==================
+
+* [#2067] - Fix HTML/doc reporter regressions ([@danielstjules])
+
+[#2067]: https://github.com/mochajs/mocha/pull/2067
+
+2.4.0 / 2016-01-25
+==================
+
+* [#1945] - Correctly skip tests when skipping in suite's before() ([@ryanshawty])
+* [#2056] - chore(license): update license year to 2016 ([@pra85])
+* [#2048] - Fix `this.skip` from spec with HTML reporter ([@mislav])
+* [#2033] - Update tests for newer versions of should.js ([@tomhughes])
+* [#2037] - Fix for memory leak caused by referenced to deferred test ([@bd82])
+* [#2038] - Also run Travis-CI on node.js 4 & 5 ([@bd82])
+* [#2028] - Remove reference to test before afterAll hook runs ([@stonelgh])
+* Bump mkdirp to 0.5.1 to support strict mode ([@danielstjules])
+* [#1977] - safely stringify PhantomJS undefined value ([@ahamid])
+* Add the ability to retry tests ([@@longlho])
+* [#1982] - Enable --log-timer-events option [@Alaneor]
+* Fix #1980: Load mocha.opts from bin/mocha and bin/_mocha ([@danielstjules])
+* [#1976] - Simplify function call ([@iclanzan])
+* [#1963] - Add support --perf-basic-prof ([@robraux])
+* [#1981] - Fix HTML reporter handling of done and exceptions ([@Standard8])
+* [#1993] - propagate "file" property for "exports" interface ([@segrey])
+* [#1999] - Add support for strict mode ([@tmont])
+* [#2005] - XUnit Reporter Writes to stdout, falls back to console.log ([@jonnyreeves])
+* [#2021] - Fix non ES5 compliant regexp ([@zetaben])
+* [#1965] - Don't double install BDD UI ([@cowboyd])
+* [#1995] - Make sure the xunit output dir exists before writing to it ([@ianwremmel])
+* Use chalk for the base reporter colors; closes #1200 ([@boneskull])
+* Fix requiring custom interfaces ([@jgkim])
+* [#1967] Silence Bluebird js warnings ([@krisr])
+
+[#1945]: https://github.com/mochajs/mocha/pull/1945
+[#2056]: https://github.com/mochajs/mocha/pull/2056
+[#2048]: https://github.com/mochajs/mocha/pull/2048
+[#2033]: https://github.com/mochajs/mocha/pull/2033
+[#2037]: https://github.com/mochajs/mocha/pull/2037
+[#2038]: https://github.com/mochajs/mocha/pull/2038
+[#2028]: https://github.com/mochajs/mocha/pull/2028
+[#1977]: https://github.com/mochajs/mocha/pull/1977
+[#1982]: https://github.com/mochajs/mocha/pull/1982
+[#1976]: https://github.com/mochajs/mocha/pull/1976
+[#1963]: https://github.com/mochajs/mocha/pull/1963
+[#1981]: https://github.com/mochajs/mocha/pull/1981
+[#1993]: https://github.com/mochajs/mocha/pull/1993
+[#1999]: https://github.com/mochajs/mocha/pull/1999
+[#2005]: https://github.com/mochajs/mocha/pull/2005
+[#2021]: https://github.com/mochajs/mocha/pull/2021
+[1965#]: https://github.com/mochajs/mocha/pull/1965
+[#1995]: https://github.com/mochajs/mocha/pull/1995
+[#1967]: https://github.com/mochajs/mocha/pull/1967
+[@ryanshawty]: https://github.com/ryanshawty
+[@pra85]: https://github.com/pra85
+[@mislav]: https://github.com/mislav
+[@tomhughes]: https://github.com/tomhughes
+[@bd82]: https://github.com/bd82
+[@stonelgh]: https://github.com/stonelgh
+[@danielstjules]: https://github.com/danielstjules
+[@ahamid]: https://github.com/ahamid
+[@longlho]: https://github.com/longlho
+[@Alaneor]: https://github.com/Alaneor
+[@iclanzan]: https://github.com/iclanzan
+[@robraux]: https://github.com/robraux
+[@Standard8]: https://github.com/Standard8
+[@segrey]: https://github.com/segrey
+[@tmont]: https://github.com/tmont
+[@jonnyreeves]: https://github.com/jonnyreeves
+[@zetaben]: https://github.com/zetaben
+[@cowboyd]: https://github.com/cowboyd
+[@ianwremmel]: https://github.com/ianwremmel
+[@boneskull]: https://github.com/boneskull
+[@jgkim]: https://github.com/jgkim
+[@krisr]: https://github.com/krisr
+
+2.3.4 / 2015-11-15
+==================
+
+ * Update debug dependency to 2.2.0
+ * remove duplication of mocha.opts on process.argv
+ * Fix typo in test/reporters/nyan.js
+
+2.3.3 / 2015-09-19
+==================
+
+ * [#1875] - Fix Markdown reporter exceeds maximum call stack size ([@danielstjules])
+ * [#1864] - Fix xunit missing output with --reporter-options output ([@danielstjules])
+ * [#1846] - Support all harmony flags ([@danielstjules])
+ * Fix fragile xunit reporter spec ([@danielstjules])
+ * [#1669] - Fix catch uncaught errors outside test suite execution ([@danielstjules])
+ * [#1868] - Revert jade to support npm < v1.3.7 ([@danielstjules])
+ * [#1766] - Don't remove modules/components from stack trace in the browser ([@danielstjules])
+ * [#1798] - Fix correctly attribute mutiple done err with hooks ([@danielstjules])
+ * Fix use utils.reduce for IE8 compatibility ([@wsw0108])
+ * Some linting errors fixed by [@danielstjules]
+ * Call the inspect() function if message is not set ([@kevinburke])
+
+[#1875]: https://github.com/mochajs/mocha/issues/1875
+[#1864]: https://github.com/mochajs/mocha/issues/1864
+[#1846]: https://github.com/mochajs/mocha/issues/1846
+[#1669]: https://github.com/mochajs/mocha/issues/1669
+[#1868]: https://github.com/mochajs/mocha/issues/1868
+[#1766]: https://github.com/mochajs/mocha/issues/1766
+[#1798]: https://github.com/mochajs/mocha/issues/1798
+[@danielstjules]: https://github.com/danielstjules
+[@wsw0108]: https://github.com/wsw0108
+[@kevinburke]: https://github.com/kevinburke
+
+2.3.2 / 2015-09-07
+==================
+ * [#1868] - Fix compatibility with older versions of NPM ([@boneskull])
+
+ [#1868]: https://github.com/mochajs/mocha/issues/1868
+
+2.3.1 / 2015-09-06
+==================
+
+ * [#1812] - Fix: Bail flag causes before() hooks to be run even after a failure ([@aaroncrows])
+
+ [#1812]: https://github.com/mochajs/mocha/issues/1812
+ [aaroncrows]: https://github.com/aaroncrows
+
+2.3.0 / 2015-08-30
+==================
+
+ * [#553] - added --allowUncaught option ([@amsul])
+ * [#1490] - Allow --async-only to be satisfied by returning a promise ([@jlai])
+ * [#1829] - support --max-old-space-size ([@gigadude])
+ * [#1811] - upgrade Jade dependency ([@outsideris])
+ * [#1769] - Fix async hook error handling ([@ajaykodali])
+ * [#1230] - More descriptive beforeEach/afterEach messages ([@duncanbeevers])
+ * [#1787] - Scope loading behaviour instead of using early return ([@aryeguy])
+ * [#1789] - Fix: html-runner crashing ([@sunesimonsen])
+ * [#1749] - Fix maximum call stack error on large amount of tests ([@tinganho])
+ * [#1230] - Decorate failed hook titles with test title ([@duncanbeevers])
+ * [#1260] - Build using Browserify ([@ndhoule])
+ * [#1728] - Don't use `__proto__` ([@ndhoule])
+ * [#1781] - Fix hook error tests ([@glenjamin])
+ * [#1754] - Allow boolean --reporter-options ([@papandreou])
+ * [#1766] - Fix overly aggressive stack suppression ([@moll])
+ * [#1752] - Avoid potential infinite loop ([@gsilk])
+ * [#1761] - Fix problems running under PhantomJS ([@chromakode])
+ * [#1700] - Fix more problems running under PhantomJS ([@jbnicolai])
+ * [#1774] - Support escaped spaces in CLI options ([@adamgruber])
+ * [#1687] - Fix HTML reporter links with special chars ([@benvinegar])
+ * [#1359] - Adopt code style and enforce it using ESLint ([@ndhoule] w/ assist from [@jbnicolai] & [@boneskull])
+ * various refactors ([@jbnicolai])
+ * [#1758] - Add cross-frame compatible Error checking ([@outdooricon])
+ * [#1741] - Remove moot `version` property from bower.json ([@kkirsche])
+ * [#1739] - Improve `HISTORY.md` ([@rstacruz])
+ * [#1730] - Support more io.js flags ([@ryedog])
+ * [#1349] - Allow HTML in HTML reporter errors ([@papandreou] / [@sunesimonsen])
+ * [#1572] - Prevent default browser behavior for failure/pass links ([@jschilli])
+ * [#1630] - Support underscored harmony flags ([@dominicbarnes])
+ * [#1718] - Support more harmony flags ([@slyg])
+ * [#1689] - Add stack to JSON-stream reporter ([@jonathandelgado])
+ * [#1654] - Fix `ReferenceError` "location is not defined" ([@jakemmarsh])
+
+ [#553]: https://github.com/mochajs/mocha/issues/553
+ [#1490]: https://github.com/mochajs/mocha/issues/1490
+ [#1829]: https://github.com/mochajs/mocha/issues/1829
+ [#1811]: https://github.com/mochajs/mocha/issues/1811
+ [#1769]: https://github.com/mochajs/mocha/issues/1769
+ [#1230]: https://github.com/mochajs/mocha/issues/1230
+ [#1787]: https://github.com/mochajs/mocha/issues/1787
+ [#1789]: https://github.com/mochajs/mocha/issues/1789
+ [#1749]: https://github.com/mochajs/mocha/issues/1749
+ [#1230]: https://github.com/mochajs/mocha/issues/1230
+ [#1260]: https://github.com/mochajs/mocha/issues/1260
+ [#1728]: https://github.com/mochajs/mocha/issues/1728
+ [#1781]: https://github.com/mochajs/mocha/issues/1781
+ [#1754]: https://github.com/mochajs/mocha/issues/1754
+ [#1766]: https://github.com/mochajs/mocha/issues/1766
+ [#1752]: https://github.com/mochajs/mocha/issues/1752
+ [#1761]: https://github.com/mochajs/mocha/issues/1761
+ [#1700]: https://github.com/mochajs/mocha/issues/1700
+ [#1774]: https://github.com/mochajs/mocha/issues/1774
+ [#1687]: https://github.com/mochajs/mocha/issues/1687
+ [#1359]: https://github.com/mochajs/mocha/issues/1359
+ [#1758]: https://github.com/mochajs/mocha/issues/1758
+ [#1741]: https://github.com/mochajs/mocha/issues/1741
+ [#1739]: https://github.com/mochajs/mocha/issues/1739
+ [#1730]: https://github.com/mochajs/mocha/issues/1730
+ [#1349]: https://github.com/mochajs/mocha/issues/1349
+ [#1572]: https://github.com/mochajs/mocha/issues/1572
+ [#1630]: https://github.com/mochajs/mocha/issues/1630
+ [#1718]: https://github.com/mochajs/mocha/issues/1718
+ [#1689]: https://github.com/mochajs/mocha/issues/1689
+ [#1654]: https://github.com/mochajs/mocha/issues/1654
+ [@adamgruber]: https://github.com/adamgruber
+ [@ajaykodali]: https://github.com/ajaykodali
+ [@amsul]: https://github.com/amsul
+ [@aryeguy]: https://github.com/aryeguy
+ [@benvinegar]: https://github.com/benvinegar
+ [@boneskull]: https://github.com/boneskull
+ [@chromakode]: https://github.com/chromakode
+ [@dominicbarnes]: https://github.com/dominicbarnes
+ [@duncanbeevers]: https://github.com/duncanbeevers
+ [@gigadude]: https://github.com/gigadude
+ [@glenjamin]: https://github.com/glenjamin
+ [@gsilk]: https://github.com/gsilk
+ [@jakemmarsh]: https://github.com/jakemmarsh
+ [@jbnicolai]: https://github.com/jbnicolai
+ [@jlai]: https://github.com/jlai
+ [@jonathandelgado]: https://github.com/jonathandelgado
+ [@jschilli]: https://github.com/jschilli
+ [@kkirsche]: https://github.com/kkirsche
+ [@moll]: https://github.com/moll
+ [@ndhoule]: https://github.com/ndhoule
+ [@outdooricon]: https://github.com/outdooricon
+ [@outsideris]: https://github.com/outsideris
+ [@papandreou]: https://github.com/papandreou
+ [@rstacruz]: https://github.com/rstacruz
+ [@ryedog]: https://github.com/ryedog
+ [@slyg]: https://github.com/slyg
+ [@sunesimonsen]: https://github.com/sunesimonsen
+ [@tinganho]: https://github.com/tinganho
+
+2.2.5 / 2015-05-14
+==================
+
+ * [#1699] - Upgrade jsdiff to v1.4.0 ([@nylen])
+ * [#1648] - fix diff background colors in the console ([@nylen])
+ * [#1327] - fix tests running twice, a regression issue. ([#1686], [@danielstjules])
+ * [#1675] - add integration tests ([@danielstjules])
+ * [#1682] - use a valid SPDX license identifier in package.json ([@kemitchell])
+ * [#1660] - fix assertion of invalid dates ([#1661], [@a8m])
+ * [#1241] - fix issue with multiline diffs appearing as single line ([#1655], [@a8m])
+
+[#1699]: https://github.com/mochajs/mocha/issues/1699
+[#1648]: https://github.com/mochajs/mocha/issues/1648
+[#1327]: https://github.com/mochajs/mocha/issues/1327
+[#1686]: https://github.com/mochajs/mocha/issues/1686
+[#1675]: https://github.com/mochajs/mocha/issues/1675
+[#1682]: https://github.com/mochajs/mocha/issues/1682
+[#1660]: https://github.com/mochajs/mocha/issues/1660
+[#1661]: https://github.com/mochajs/mocha/issues/1661
+[#1241]: https://github.com/mochajs/mocha/issues/1241
+[#1655]: https://github.com/mochajs/mocha/issues/1655
+[@nylen]: https://github.com/nylen
+[@danielstjules]: https://github.com/danielstjules
+[@kemitchell]: https://github.com/kemitchell
+[@a8m]: https://github.com/a8m
+
+2.2.4 / 2015-04-08
+==================
+
+ * Load mocha.opts in _mocha for now (close #1645)
+
+2.2.3 / 2015-04-07
+==================
+
+ * fix(reporter/base): string diff - issue #1241
+ * fix(reporter/base): string diff - issue #1241
+ * fix(reporter/base): don't show diffs for errors without expectation
+ * fix(reporter/base): don't assume error message is first line of stack
+ * improve: dry up reporter/base test
+ * fix(reporter/base): explicitly ignore showDiff #1614
+ * Add iojs to travis build
+ * Pass `--allow-natives-syntax` flag to node.
+ * Support --harmony_classes flag for io.js
+ * Fix 1556: Update utils.clean to handle newlines in func declarations
+ * Fix 1606: fix err handling in IE <= 8 and non-ES5 browsers
+ * Fix 1585: make _mocha executable again
+ * chore(package.json): add a8m as a contributor
+ * Fixed broken link on html-cov reporter
+ * support --es_staging flag
+ * fix issue where menu overlaps content.
+ * update contributors in package.json
+ * Remove trailing whitespace from reporter output
+ * Remove contributors list from readme
+ * log third-party reporter errors
+ * [Fix] Exclude not own properties when looping on options
+ * fix: support node args in mocha.opts (close #1573)
+ * fix(reporter/base): string diff - issue #1241
+
+2.2.1 / 2015-03-09
+==================
+
+ * Fix passing of args intended for node/iojs.
+
+2.2.0 / 2015-03-06
+==================
+
+ * Update mocha.js
+ * Add --fgrep. Use grep for RegExp, fgrep for str
+ * Ignore async global errors after spec resolution
+ * Fixing errors that prevent mocha.js from loading in the browser - fixes #1558
+ * fix(utils): issue #1558 + make
+ * add ability to delay root suite; closes #362, closes #1124
+ * fix insanity in http tests
+ * update travis: add node 0.12, add gitter, remove slack
+ * building
+ * resolve #1548: ensure the environment's "node" executable is used
+ * reporters/base: use supports-color to detect colorable term
+ * travis: use docker containers
+ * small fix: commander option for --expose-gc
+ * Ignore asynchronous errors after global failure
+ * Improve error output when a test fails with a non-error
+ * updated travis badge, uses svg instead of img
+ * Allow skip from test context for #332
+ * [JSHINT] Unnecessary semicolon fixed in bin/_mocha
+ * Added a reminder about the done() callback to test timeout error messages
+ * fixes #1496, in Mocha.run(fn), check if fn exists before executing it, added tests too
+ * Add Harmony Proxy flag for iojs
+ * test(utils|ms|*): test existing units
+ * add support for some iojs flags
+ * fix(utils.stringify): issue #1229, diff viewer
+ * Remove slack link
+ * Prevent multiple 'grep=' querystring params in html reporter
+ * Use grep as regexp (close #1381)
+ * utils.stringify should handle objects without an Object prototype
+ * in runnable test, comparing to undefined error's message rather than a literal
+ * Fix test running output truncation on async STDIO
+ * ammended for deprecated customFds option in child_process
+
+2.1.0 / 2014-12-23
+==================
+
+ * showDiff: don’t stringify strings
+ * Clean up unused module dependencies.
+ * Filter zero-length strings from mocha.opts
+ * only write to stdout in reporters
+ * Revert "only write to stdout in reporters"
+ * Print colored output only to a tty
+ * update summary in README.md
+ * rename Readme.md/History.md to README.md/HISTORY.md because neurotic
+ * add .mailmap to fix "git shortlog" or "git summary" output
+ * fixes #1461: nyan-reporter now respects Base.useColors, fixed bug where Base.color would not return a string when str wasn't a string.
+ * Use existing test URL builder in failed replay links
+ * modify .travis.yml: use travis_retry; closes #1449
+ * fix -t 0 behavior; closes #1446
+ * fix tests (whoops)
+ * improve diff behavior
+ * Preserve pathname when linking to individual tests
+ * Fix test
+ * Tiny typo in comments fixed
+ * after hooks now being called on failed tests when using bail, fixes #1093
+ * fix throwing undefined/null now makes tests fail, fixes #1395
+ * compiler extensions are added as watched extensions, removed non-standard extensions from watch regex, resolves #1221
+ * prefix/namespace for suite titles in markdown reporter, fixes #554
+ * fix more bad markdown in CONTRIBUTING.md
+ * fix bad markdown in CONTRIBUTING.md
+ * add setImmediate/clearImmediate to globals; closes #1435
+ * Fix buffer diffs (closes #1132, closes #1433)
+ * add a CONTRIBUTING.md. closes #882
+ * fix intermittent build failures (maybe). closes #1407
+ * add Slack notification to .travis.yml
+ * Fix slack link
+ * Add slack room to readme
+ * Update maintainers
+ * update maintainers and contributors
+ * resolves #1393: kill children with more effort on SIGINT
+ * xunit reporter support for optionally writing to a file
+ * if a reporter has a .done method, call it before exiting
+ * add support for reporter options
+ * only write to stdout in reporters
+
+2.0.0 / 2014-10-21
+==================
+
+ * remove: support for node 0.6.x, 0.4.x
+ * fix: landing reporter with non ansi characters (#211)
+ * fix: html reporter - preserve query params when navigating to suites/tests (#1358)
+ * fix: json stream reporter add error message to failed test
+ * fix: fixes for visionmedia -> mochajs
+ * fix: use stdio, fixes node deprecation warnings (#1391)
+
+1.21.5 / 2014-10-11
+==================
+
+ * fix: build for NodeJS v0.6.x
+ * fix: do not attempt to highlight syntax when non-HTML reporter is used
+ * update: escape-string-regexp to 1.0.2.
+ * fix: botched indentation in canonicalize()
+ * fix: .gitignore: ignore .patch and .diff files
+ * fix: changed 'Catched' to 'Caught' in uncaught exception error handler messages
+ * add: `pending` field for json reporter
+ * fix: Runner.prototype.uncaught: don't double-end runnables that already have a state.
+ * fix: --recursive, broken by f0facd2e
+ * update: replaces escapeRegexp with the escape-string-regexp package.
+ * update: commander to 2.3.0.
+ * update: diff to 1.0.8.
+ * fix: ability to disable syntax highlighting (#1329)
+ * fix: added empty object to errorJSON() call to catch when no error is present
+ * fix: never time out after calling enableTimeouts(false)
+ * fix: timeout(0) will work at suite level (#1300)
+ * Fix for --watch+only() issue (#888 )
+ * fix: respect err.showDiff, add Base reporter test (#810)
+
+1.22.1-3 / 2014-07-27
+==================
+
+ * fix: disabling timeouts with this.timeout(0) (#1301)
+
+1.22.1-3 / 2014-07-27
+==================
+
+ * fix: local uis and reporters (#1288)
+ * fix: building 1.21.0's changes in the browser (#1284)
+
+1.21.0 / 2014-07-23
+==================
+
+ * add: --no-timeouts option (#1262, #1268)
+ * add: --*- deprecation node flags (#1217)
+ * add: --watch-extensions argument (#1247)
+ * change: spec reporter is default (#1228)
+ * fix: diff output showing incorrect +/- (#1182)
+ * fix: diffs of circular structures (#1179)
+ * fix: re-render the progress bar when progress has changed only (#1151)
+ * fix support for environments with global and window (#1159)
+ * fix: reverting to previously defined onerror handler (#1178)
+ * fix: stringify non error objects passed to done() (#1270)
+ * fix: using local ui, reporters (#1267)
+ * fix: cleaning es6 arrows (#1176)
+ * fix: don't include attrs in failure tag for xunit (#1244)
+ * fix: fail tests that return a promise if promise is rejected w/o a reason (#1224)
+ * fix: showing failed tests in doc reporter (#1117)
+ * fix: dot reporter dots being off (#1204)
+ * fix: catch empty throws (#1219)
+ * fix: honoring timeout for sync operations (#1242)
+ * update: growl to 1.8.0
+
+1.20.1 / 2014-06-03
+==================
+
+ * update: should dev dependency to ~4.0.0 (#1231)
+
+1.20.0 / 2014-05-28
+==================
+
+ * add: filenames to suite objects (#1222)
+
+1.19.0 / 2014-05-17
+==================
+
+ * add: browser script option to package.json
+ * add: export file in Mocha.Test objects (#1174)
+ * add: add docs for wrapped node flags
+ * fix: mocha.run() to return error status in browser (#1216)
+ * fix: clean() to show failure details (#1205)
+ * fix: regex that generates html for new keyword (#1201)
+ * fix: sibling suites have inherited but separate contexts (#1164)
+
+
+1.18.2 / 2014-03-18
+==================
+
+ * fix: html runner was prevented from using #mocha as the default root el (#1162)
+
+1.18.1 / 2014-03-18
+==================
+
+ * fix: named before/after hooks in bdd, tdd, qunit interfaces (#1161)
+
+1.18.0 / 2014-03-13
+==================
+
+ * add: promise support (#329)
+ * add: named before/after hooks (#966)
+
+1.17.1 / 2014-01-22
+==================
+
+ * fix: expected messages in should.js (should.js#168)
+ * fix: expect errno global in node versions < v0.9.11 (#1111)
+ * fix: unreliable checkGlobals optimization (#1110)
+
+1.17.0 / 2014-01-09
+==================
+
+ * add: able to require globals (describe, it, etc.) through mocha (#1077)
+ * fix: abort previous run on --watch change (#1100)
+ * fix: reset context for each --watch triggered run (#1099)
+ * fix: error when cli can't resolve path or pattern (#799)
+ * fix: canonicalize objects before stringifying and diffing them (#1079)
+ * fix: make CR call behave like carriage return for non tty (#1087)
+
+
+1.16.2 / 2013-12-23
+==================
+
+ * fix: couple issues with ie 8 (#1082, #1081)
+ * fix: issue running the xunit reporter in browsers (#1068)
+ * fix: issue with firefox < 3.5 (#725)
+
+
+1.16.1 / 2013-12-19
+==================
+
+ * fix: recompiled for missed changes from the last release
+
+
+1.16.0 / 2013-12-19
+==================
+
+ * add: Runnable.globals(arr) for per test global whitelist (#1046)
+ * add: mocha.throwError(err) for assertion libs to call (#985)
+ * remove: --watch's spinner (#806)
+ * fix: duplicate test output for multi-line specs in spec reporter (#1006)
+ * fix: gracefully exit on SIGINT (#1063)
+ * fix expose the specified ui only in the browser (#984)
+ * fix: ensure process exit code is preserved when using --no-exit (#1059)
+ * fix: return true from window.onerror handler (#868)
+ * fix: xunit reporter to use process.stdout.write (#1068)
+ * fix: utils.clean(str) indentation (#761)
+ * fix: xunit reporter returning test duration a NaN (#1039)
+
+1.15.1 / 2013-12-03
+==================
+
+ * fix: recompiled for missed changes from the last release
+
+1.15.0 / 2013-12-02
+==================
+
+ * add: `--no-exit` to prevent `process.exit()` (#1018)
+ * fix: using inline diffs (#1044)
+ * fix: show pending test details in xunit reporter (#1051)
+ * fix: faster global leak detection (#1024)
+ * fix: yui compression (#1035)
+ * fix: wrapping long lines in test results (#1030, #1031)
+ * fix: handle errors in hooks (#1043)
+
+1.14.0 / 2013-11-02
+==================
+
+ * add: unified diff (#862)
+ * add: set MOCHA_COLORS env var to use colors (#965)
+ * add: able to override tests links in html reporters (#776)
+ * remove: teamcity reporter (#954)
+ * update: commander dependency to 2.0.0 (#1010)
+ * fix: mocha --ui will try to require the ui if not built in, as --reporter does (#1022)
+ * fix: send cursor commands only if isatty (#184, #1003)
+ * fix: include assertion message in base reporter (#993, #991)
+ * fix: consistent return of it, it.only, and describe, describe.only (#840)
+
+1.13.0 / 2013-09-15
+==================
+
+ * add: sort test files with --sort (#813)
+ * update: diff depedency to 1.0.7
+ * update: glob dependency to 3.2.3 (#927)
+ * fix: diffs show whitespace differences (#976)
+ * fix: improve global leaks (#783)
+ * fix: firefox window.getInterface leak
+ * fix: accessing iframe via window[iframeIndex] leak
+ * fix: faster global leak checking
+ * fix: reporter pending css selector (#970)
+
+1.12.1 / 2013-08-29
+==================
+
+ * remove test.js from .gitignore
+ * update included version of ms.js
+
+1.12.0 / 2013-07-01
+==================
+
+ * add: prevent diffs for differing types. Closes #900
+ * add `Mocha.process` hack for phantomjs
+ * fix: use compilers with requires
+ * fix regexps in diffs. Closes #890
+ * fix xunit NaN on failure. Closes #894
+ * fix: strip tab indentation in `clean` utility method
+ * fix: textmate bundle installation
+
+1.11.0 / 2013-06-12
+==================
+
+ * add --prof support
+ * add --harmony support
+ * add --harmony-generators support
+ * add "Uncaught " prefix to uncaught exceptions
+ * add web workers support
+ * add `suite.skip()`
+ * change to output # of pending / passing even on failures. Closes #872
+ * fix: prevent hooks from being called if we are bailing
+ * fix `this.timeout(0)`
+
+1.10.0 / 2013-05-21
+==================
+
+ * add add better globbing support for windows via `glob` module
+ * add support to pass through flags such as --debug-brk=1234. Closes #852
+ * add test.only, test.skip to qunit interface
+ * change to always use word-based diffs for now. Closes #733
+ * change `mocha init` tests.html to index.html
+ * fix `process` global leak in the browser
+ * fix: use resolve() instead of join() for --require
+ * fix: filterLeaks() condition to not consider indices in global object as leaks
+ * fix: restrict mocha.css styling to #mocha id
+ * fix: save timer references to avoid Sinon interfering in the browser build.
+
+1.9.0 / 2013-04-03
+==================
+
+ * add improved setImmediate implementation
+ * replace --ignore-leaks with --check-leaks
+ * change default of ignoreLeaks to true. Closes #791
+ * remove scrolling for HTML reporter
+ * fix retina support
+ * fix tmbundle, restrict to js scope
+
+1.8.2 / 2013-03-11
+==================
+
+ * add `setImmediate` support for 0.10.x
+ * fix mocha -w spinner on windows
+
+1.8.1 / 2013-01-09
+==================
+
+ * fix .bail() arity check causing it to default to true
+
+1.8.0 / 2013-01-08
+==================
+
+ * add Mocha() options bail support
+ * add `Mocha#bail()` method
+ * add instanceof check back for inheriting from Error
+ * add component.json
+ * add diff.js to browser build
+ * update growl
+ * fix TAP reporter failures comment :D
+
+1.7.4 / 2012-12-06
+==================
+
+ * add total number of passes and failures to TAP
+ * remove .bind() calls. re #680
+ * fix indexOf. Closes #680
+
+1.7.3 / 2012-11-30
+==================
+
+ * fix uncaught error support for the browser
+ * revert uncaught "fix" which breaks node
+
+1.7.2 / 2012-11-28
+==================
+
+ * fix uncaught errors to expose the original error message
+
+1.7.0 / 2012-11-07
+==================
+
+ * add `--async-only` support to prevent false positives for missing `done()`
+ * add sorting by filename in code coverage
+ * add HTML 5 doctype to browser template.
+ * add play button to html reporter to rerun a single test
+ * add `this.timeout(ms)` as Suite#timeout(ms). Closes #599
+ * update growl dependency to 1.6.x
+ * fix encoding of test-case ?grep. Closes #637
+ * fix unicode chars on windows
+ * fix dom globals in Opera/IE. Closes #243
+ * fix markdown reporter a tags
+ * fix `this.timeout("5s")` support
+
+1.6.0 / 2012-10-02
+==================
+
+ * add object diffs when `err.showDiff` is present
+ * add hiding of empty suites when pass/failures are toggled
+ * add faster `.length` checks to `checkGlobals()` before performing the filter
+
+1.5.0 / 2012-09-21
+==================
+
+ * add `ms()` to `.slow()` and `.timeout()`
+ * add `Mocha#checkLeaks()` to re-enable global leak checks
+ * add `this.slow()` option [aheckmann]
+ * add tab, CR, LF to error diffs for now
+ * add faster `.checkGlobals()` solution [guille]
+ * remove `fn.call()` from reduce util
+ * remove `fn.call()` from filter util
+ * fix forEach. Closes #582
+ * fix relaying of signals [TooTallNate]
+ * fix TAP reporter grep number
+
+1.4.2 / 2012-09-01
+==================
+
+ * add support to multiple `Mocha#globals()` calls, and strings
+ * add `mocha.reporter()` constructor support [jfirebaugh]
+ * add `mocha.timeout()`
+ * move query-string parser to utils.js
+ * move highlight code to utils.js
+ * fix third-party reporter support [exogen]
+ * fix client-side API to match node-side [jfirebaugh]
+ * fix mocha in iframe [joliss]
+
+1.4.1 / 2012-08-28
+==================
+
+ * add missing `Markdown` export
+ * fix `Mocha#grep()`, escape regexp strings
+ * fix reference error when `devicePixelRatio` is not defined. Closes #549
+
+1.4.0 / 2012-08-22
+==================
+
+ * add mkdir -p to `mocha init`. Closes #539
+ * add `.only()`. Closes #524
+ * add `.skip()`. Closes #524
+ * change str.trim() to use utils.trim(). Closes #533
+ * fix HTML progress indicator retina display
+ * fix url-encoding of click-to-grep HTML functionality
+
+1.3.2 / 2012-08-01
+==================
+
+ * fix exports double-execution regression. Closes #531
+
+1.3.1 / 2012-08-01
+==================
+
+ * add passes/failures toggling to HTML reporter
+ * add pending state to `xit()` and `xdescribe()` [Brian Moore]
+ * add the @charset "UTF-8"; to fix #522 with FireFox. [Jonathan Creamer]
+ * add border-bottom to #stats links
+ * add check for runnable in `Runner#uncaught()`. Closes #494
+ * add 0.4 and 0.6 back to travis.yml
+ * add `-E, --growl-errors` to growl on failures only
+ * add prefixes to debug() names. Closes #497
+ * add `Mocha#invert()` to js api
+ * change dot reporter to use sexy unicode dots
+ * fix error when clicking pending test in HTML reporter
+ * fix `make tm`
+
+1.3.0 / 2012-07-05
+==================
+
+ * add window scrolling to `HTML` reporter
+ * add v8 `--trace-*` option support
+ * add support for custom reports via `--reporter MODULE`
+ * add `--invert` switch to invert `--grep` matches
+ * fix export of `Nyan` reporter. Closes #495
+ * fix escaping of `HTML` suite titles. Closes #486
+ * fix `done()` called multiple times with an error test
+ * change `--grep` - regexp escape the input
+
+1.2.2 / 2012-06-28
+==================
+
+ * Added 0.8.0 support
+
+1.2.1 / 2012-06-25
+==================
+
+ * Added `this.test.error(err)` support to after each hooks. Closes #287
+ * Added: export top-level suite on global mocha object (mocha.suite). Closes #448
+ * Fixed `js` code block format error in markdown reporter
+ * Fixed deprecation warning when using `path.existsSync`
+ * Fixed --globals with wildcard
+ * Fixed chars in nyan when his head moves back
+ * Remove `--growl` from test/mocha.opts. Closes #289
+
+1.2.0 / 2012-06-17
+==================
+
+ * Added `nyan` reporter [Atsuya Takagi]
+ * Added `mocha init <path>` to copy client files
+ * Added "specify" synonym for "it" [domenic]
+ * Added global leak wildcard support [nathanbowser]
+ * Fixed runner emitter leak. closes #432
+ * Fixed omission of .js extension. Closes #454
+
+1.1.0 / 2012-05-30
+==================
+
+ * Added: check each `mocha(1)` arg for directories to walk
+ * Added `--recursive` [tricknotes]
+ * Added `context` for BDD [hokaccha]
+ * Added styling for new clickable titles
+ * Added clickable suite titles to HTML reporter
+ * Added warning when strings are thrown as errors
+ * Changed: green arrows again in HTML reporter styling
+ * Changed ul/li elements instead of divs for better copy-and-pasting [joliss]
+ * Fixed issue #325 - add better grep support to js api
+ * Fixed: save timer references to avoid Sinon interfering.
+
+1.0.3 / 2012-04-30
+==================
+
+ * Fixed string diff newlines
+ * Fixed: removed mocha.css target. Closes #401
+
+1.0.2 / 2012-04-25
+==================
+
+ * Added HTML reporter duration. Closes #47
+ * Fixed: one postMessage event listener [exogen]
+ * Fixed: allow --globals to be used multiple times. Closes #100 [brendannee]
+ * Fixed #158: removes jquery include from browser tests
+ * Fixed grep. Closes #372 [brendannee]
+ * Fixed #166 - When grepping don't display the empty suites
+ * Removed test/browser/style.css. Closes #385
+
+1.0.1 / 2012-04-04
+==================
+
+ * Fixed `.timeout()` in hooks
+ * Fixed: allow callback for `mocha.run()` in client version
+ * Fixed browser hook error display. Closes #361
+
+1.0.0 / 2012-03-24
+==================
+
+ * Added js API. Closes #265
+ * Added: initial run of tests with `--watch`. Closes #345
+ * Added: mark `location` as a global on the CS. Closes #311
+ * Added `markdown` reporter (GitHub flavour)
+ * Added: scrolling menu to coverage.html. Closes #335
+ * Added source line to html report for Safari [Tyson Tate]
+ * Added "min" reporter, useful for `--watch` [Jakub Nešetřil]
+ * Added support for arbitrary compilers via . Closes #338 [Ian Young]
+ * Added Teamcity export to lib/reporters/index [Michael Riley]
+ * Fixed chopping of first char in error reporting. Closes #334 [reported by topfunky]
+ * Fixed terrible FF / Opera stack traces
+
+0.14.1 / 2012-03-06
+==================
+
+ * Added lib-cov to _.npmignore_
+ * Added reporter to `mocha.run([reporter])` as argument
+ * Added some margin-top to the HTML reporter
+ * Removed jQuery dependency
+ * Fixed `--watch`: purge require cache. Closes #266
+
+0.14.0 / 2012-03-01
+==================
+
+ * Added string diff support for terminal reporters
+
+0.13.0 / 2012-02-23
+==================
+
+ * Added preliminary test coverage support. Closes #5
+ * Added `HTMLCov` reporter
+ * Added `JSONCov` reporter [kunklejr]
+ * Added `xdescribe()` and `xit()` to the BDD interface. Closes #263 (docs * Changed: make json reporter output pretty json
+ * Fixed node-inspector support, swapped `--debug` for `debug` to match node.
+needed)
+Closes #247
+
+0.12.1 / 2012-02-14
+==================
+
+ * Added `npm docs mocha` support [TooTallNate]
+ * Added a `Context` object used for hook and test-case this. Closes #253
+ * Fixed `Suite#clone()` `.ctx` reference. Closes #262
+
+0.12.0 / 2012-02-02
+==================
+
+ * Added .coffee `--watch` support. Closes #242
+ * Added support to `--require` files relative to the CWD. Closes #241
+ * Added quick n dirty syntax highlighting. Closes #248
+ * Changed: made HTML progress indicator smaller
+ * Fixed xunit errors attribute [dhendo]
+
+0.10.2 / 2012-01-21
+==================
+
+ * Fixed suite count in reporter stats. Closes #222
+ * Fixed `done()` after timeout error reporting [Phil Sung]
+ * Changed the 0-based errors to 1
+
+0.10.1 / 2012-01-17
+==================
+
+ * Added support for node 0.7.x
+ * Fixed absolute path support. Closes #215 [kompiro]
+ * Fixed `--no-colors` option [Jussi Virtanen]
+ * Fixed Arial CSS typo in the correct file
+
+0.10.0 / 2012-01-13
+==================
+
+ * Added `-b, --bail` to exit on first exception [guillermo]
+ * Added support for `-gc` / `--expose-gc` [TooTallNate]
+ * Added `qunit`-inspired interface
+ * Added MIT LICENSE. Closes #194
+ * Added: `--watch` all .js in the CWD. Closes #139
+ * Fixed `self.test` reference in runner. Closes #189
+ * Fixed double reporting of uncaught exceptions after timeout. Closes #195
+
+0.8.2 / 2012-01-05
+==================
+
+ * Added test-case context support. Closes #113
+ * Fixed exit status. Closes #187
+ * Update commander. Closes #190
+
+0.8.1 / 2011-12-30
+==================
+
+ * Fixed reporting of uncaught exceptions. Closes #183
+ * Fixed error message defaulting [indutny]
+ * Changed mocha(1) from bash to node for windows [Nathan Rajlich]
+
+0.8.0 / 2011-12-28
+==================
+
+ * Added `XUnit` reporter [FeeFighters/visionmedia]
+ * Added `say(1)` notification support [Maciej Małecki]
+ * Changed: fail when done() is invoked with a non-Error. Closes #171
+ * Fixed `err.stack`, defaulting to message. Closes #180
+ * Fixed: `make tm` mkdir -p the dest. Closes #137
+ * Fixed mocha(1) --help bin name
+ * Fixed `-d` for `--debug` support
+
+0.7.1 / 2011-12-22
+==================
+
+ * Removed `mocha-debug(1)`, use `mocha --debug`
+ * Fixed CWD relative requires
+ * Fixed growl issue on windows [Raynos]
+ * Fixed: platform specific line endings [TooTallNate]
+ * Fixed: escape strings in HTML reporter. Closes #164
+
+0.7.0 / 2011-12-18
+==================
+
+ * Added support for IE{7,8} [guille]
+ * Changed: better browser nextTick implementation [guille]
+
+0.6.0 / 2011-12-18
+==================
+
+ * Added setZeroTimeout timeout for browser (nicer stack traces). Closes #153
+ * Added "view source" on hover for HTML reporter to make it obvious
+ * Changed: replace custom growl with growl lib
+ * Fixed duplicate reporting for HTML reporter. Closes #154
+ * Fixed silent hook errors in the HTML reporter. Closes #150
+
+0.5.0 / 2011-12-14
+==================
+
+ * Added: push node_modules directory onto module.paths for relative require Closes #93
+ * Added teamcity reporter [blindsey]
+ * Fixed: recover from uncaught exceptions for tests. Closes #94
+ * Fixed: only emit "test end" for uncaught within test, not hook
+
+0.4.0 / 2011-12-14
+==================
+
+ * Added support for test-specific timeouts via `this.timeout(0)`. Closes #134
+ * Added guillermo's client-side EventEmitter. Closes #132
+ * Added progress indicator to the HTML reporter
+ * Fixed slow browser tests. Closes #135
+ * Fixed "suite" color for light terminals
+ * Fixed `require()` leak spotted by [guillermo]
+
+0.3.6 / 2011-12-09
+==================
+
+ * Removed suite merging (for now)
+
+0.3.5 / 2011-12-08
+==================
+
+ * Added support for `window.onerror` [guillermo]
+ * Fixed: clear timeout on uncaught exceptions. Closes #131 [guillermo]
+ * Added `mocha.css` to PHONY list.
+ * Added `mocha.js` to PHONY list.
+
+0.3.4 / 2011-12-08
+==================
+
+ * Added: allow `done()` to be called with non-Error
+ * Added: return Runner from `mocha.run()`. Closes #126
+ * Fixed: run afterEach even on failures. Closes #125
+ * Fixed clobbering of current runnable. Closes #121
+
+0.3.3 / 2011-12-08
+==================
+
+ * Fixed hook timeouts. Closes #120
+ * Fixed uncaught exceptions in hooks
+
+0.3.2 / 2011-12-05
+==================
+
+ * Fixed weird reporting when `err.message` is not present
+
+0.3.1 / 2011-12-04
+==================
+
+ * Fixed hook event emitter leak. Closes #117
+ * Fixed: export `Spec` constructor. Closes #116
+
+0.3.0 / 2011-12-04
+==================
+
+ * Added `-w, --watch`. Closes #72
+ * Added `--ignore-leaks` to ignore global leak checking
+ * Added browser `?grep=pattern` support
+ * Added `--globals <names>` to specify accepted globals. Closes #99
+ * Fixed `mocha-debug(1)` on some systems. Closes #232
+ * Fixed growl total, use `runner.total`
+
+0.2.0 / 2011-11-30
+==================
+
+ * Added `--globals <names>` to specify accepted globals. Closes #99
+ * Fixed funky highlighting of messages. Closes #97
+ * Fixed `mocha-debug(1)`. Closes #232
+ * Fixed growl total, use runner.total
+
+0.1.0 / 2011-11-29
+==================
+
+ * Added `suiteSetup` and `suiteTeardown` to TDD interface [David Henderson]
+ * Added growl icons. Closes #84
+ * Fixed coffee-script support
+
+0.0.8 / 2011-11-25
+==================
+
+ * Fixed: use `Runner#total` for accurate reporting
+
+0.0.7 / 2011-11-25
+==================
+
+ * Added `Hook`
+ * Added `Runnable`
+ * Changed: `Test` is `Runnable`
+ * Fixed global leak reporting in hooks
+ * Fixed: > 2 calls to done() only report the error once
+ * Fixed: clear timer on failure. Closes #80
+
+0.0.6 / 2011-11-25
+==================
+
+ * Fixed return on immediate async error. Closes #80
+
+0.0.5 / 2011-11-24
+==================
+
+ * Fixed: make mocha.opts whitespace less picky [kkaefer]
+
+0.0.4 / 2011-11-24
+==================
+
+ * Added `--interfaces`
+ * Added `--reporters`
+ * Added `-c, --colors`. Closes #69
+ * Fixed hook timeouts
+
+0.0.3 / 2011-11-23
+==================
+
+ * Added `-C, --no-colors` to explicitly disable
+ * Added coffee-script support
+
+0.0.2 / 2011-11-22
+==================
+
+ * Fixed global leak detection due to Safari bind() change
+ * Fixed: escape html entities in Doc reporter
+ * Fixed: escape html entities in HTML reporter
+ * Fixed pending test support for HTML reporter. Closes #66
+
+0.0.1 / 2011-11-22
+==================
+
+ * Added `--timeout` second shorthand support, ex `--timeout 3s`.
+ * Fixed "test end" event for uncaughtExceptions. Closes #61
+
+0.0.1-alpha6 / 2011-11-19
+==================
+
+ * Added travis CI support (needs enabling when public)
+ * Added preliminary browser support
+ * Added `make mocha.css` target. Closes #45
+ * Added stack trace to TAP errors. Closes #52
+ * Renamed tearDown to teardown. Closes #49
+ * Fixed: cascading hooksc. Closes #30
+ * Fixed some colors for non-tty
+ * Fixed errors thrown in sync test-cases due to nextTick
+ * Fixed Base.window.width... again give precedence to 0.6.x
+
+0.0.1-alpha5 / 2011-11-17
+==================
+
+ * Added `doc` reporter. Closes #33
+ * Added suite merging. Closes #28
+ * Added TextMate bundle and `make tm`. Closes #20
+
+0.0.1-alpha4 / 2011-11-15
+==================
+
+ * Fixed getWindowSize() for 0.4.x
+
+0.0.1-alpha3 / 2011-11-15
+==================
+
+ * Added `-s, --slow <ms>` to specify "slow" test threshold
+ * Added `mocha-debug(1)`
+ * Added `mocha.opts` support. Closes #31
+ * Added: default [files] to _test/*.js_
+ * Added protection against multiple calls to `done()`. Closes #35
+ * Changed: bright yellow for slow Dot reporter tests
+
+0.0.1-alpha1 / 2011-11-08
+==================
+
+ * Missed this one :)
+
+0.0.1-alpha1 / 2011-11-08
+==================
+
+ * Initial release
diff --git a/tests/lib/mocha-3.1.0/CONTRIBUTING.md b/tests/lib/mocha-3.1.0/CONTRIBUTING.md
new file mode 100644
index 0000000000..6d172f0800
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/CONTRIBUTING.md
@@ -0,0 +1,49 @@
+# Contributing to Mocha
+
+Hi! We could use your help. Let us help you help us. Or something.
+
+## General
+
+1. If you are looking for a place to begin, **please send PRs for bugfixes instead of new features**, and/or **look for issues labeled `PR PLEASE`.**
+
+2. **Help with documentation and the wiki is always appreciated**.
+
+3. Please **be courteous and constructive** when commenting on issues, commits, and pull requests.
+
+## Bug Reports & Issues
+
+1. When reporting a bug, please **provide steps to reproduce**. If possible, show code.
+
+2. Please **show all code in JavaScript**. We don't all read `<insert-language-that-compiles-to-JavaScript-here>`. If you do not, you will be asked to.
+
+3. Because Mocha works with many third-party libraries and tools, **ensure the bug you are reporting is actually within Mocha**.
+
+4. If you report a bug, and it is inactive for a significant amount of time, it may be closed. **Please respond promptly to requests for more information**.
+
+## Pull Requests
+
+1. Before sending a large PR, it's recommended to **create an issue to propose the change**. Nobody wants to write a book of code and throw it away.
+
+2. Because Mocha should be kept as maintainable as possible, its codebase must be kept slim. Historically, *most PRs for new features are not merged*. New features inevitably increase the size of the codebase, and thus reduce maintainability. Only features *deemed essential* are likely to be merged--this is at the discretion of the maintainer(s). If your PR for a feature is not merged, this doesn't necessarily mean your PR was a bad idea, wouldn't be used, or otherwise sucks. It just means **only essential PRs for new features are likely to be merged**.
+
+3. Due to the above, before creating a PR for a new feature, **create an issue to propose the feature.**
+
+4. Please **respect existing coding conventions**, whatever those may be.
+
+5. If your PR has been waiting in limbo for some time, it's very helpful to **rebase against master**, which will make it easier to merge.
+
+6. Please **add tests for new code**.
+
+7. **Always run `npm test` before sending a PR.** If you break the tests, your PR will not be accepted until they are fixed.
+
+## Source Control
+
+1. Please **squash your commits** when sending a pull request. If you are unfamiliar with this process, see [this guide](https://help.github.com/articles/about-git-rebase/). If you have already pushed your changesets and are squashing thereafter, this may necessitate the use of a "force push". Please [read the docs](http://git-scm.com/docs/git-push) before you attempt this.
+
+2. Please **follow the commit message conventions [outlined here](https://medium.com/code-adventures/git-conventions-a940ee20862d).**
+
+## TL;DR
+
+**Be kind, be diligent, look before you leap into a PR, and follow common community conventions**.
+
+*- The Mocha Team*
diff --git a/tests/lib/mocha-2.2.5/LICENSE b/tests/lib/mocha-3.1.0/LICENSE
index ca47f261b3..9919641276 100755..100644
--- a/tests/lib/mocha-2.2.5/LICENSE
+++ b/tests/lib/mocha-3.1.0/LICENSE
@@ -1,6 +1,6 @@
(The MIT License)
-Copyright (c) 2011-2015 TJ Holowaychuk <tj@vision-media.ca>
+Copyright (c) 2011-2016 TJ Holowaychuk <tj@vision-media.ca>
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
diff --git a/tests/lib/mocha-3.1.0/Makefile b/tests/lib/mocha-3.1.0/Makefile
new file mode 100644
index 0000000000..25d84f5c1d
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/Makefile
@@ -0,0 +1,176 @@
+BROWSERIFY := "node_modules/.bin/browserify"
+ESLINT := "node_modules/.bin/eslint"
+KARMA := "node_modules/.bin/karma"
+MOCHA := "bin/mocha"
+
+REPORTER ?= spec
+TM_BUNDLE = JavaScript\ mocha.tmbundle
+SRC = $(shell find lib -name "*.js" -type f | sort)
+TESTS = $(shell find test -name "*.js" -type f | sort)
+
+all: mocha.js
+
+mocha.js: $(SRC) browser-entry.js
+ @printf "==> [Browser :: build]\n"
+ $(BROWSERIFY) ./browser-entry \
+ --plugin ./scripts/dedefine \
+ --ignore 'fs' \
+ --ignore 'glob' \
+ --ignore 'path' \
+ --ignore 'supports-color' > $@
+
+clean:
+ @printf "==> [Clean]\n"
+ rm -f mocha.js
+
+lint:
+ @printf "==> [Test :: Lint]\n"
+ $(ESLINT) browser-entry.js index.js karma.conf.js bin/mocha bin/_mocha "lib/**/*.js" "scripts/**/*.js" test
+
+test-node: test-bdd test-tdd test-qunit test-exports test-unit test-integration test-jsapi test-compilers test-glob test-requires test-reporters test-only test-global-only
+
+test-browser: clean mocha.js test-browser-unit test-browser-bdd test-browser-qunit test-browser-tdd test-browser-exports
+
+test: lint test-node test-browser
+
+test-browser-unit:
+ @printf "==> [Test :: Browser]\n"
+ NODE_PATH=. $(KARMA) start --single-run
+
+test-browser-bdd:
+ @printf "==> [Test :: Browser :: BDD]\n"
+ MOCHA_UI=bdd $(MAKE) test-browser-unit
+
+test-browser-qunit:
+ @printf "==> [Test :: Browser :: QUnit]\n"
+ MOCHA_UI=qunit $(MAKE) test-browser-unit
+
+test-browser-tdd:
+ @printf "==> [Test :: Browser :: TDD]\n"
+ MOCHA_UI=tdd $(MAKE) test-browser-unit
+
+test-jsapi:
+ @printf "==> [Test :: JS API]\n"
+ node test/jsapi
+
+test-unit:
+ @printf "==> [Test :: Unit]\n"
+ $(MOCHA) --reporter $(REPORTER) \
+ test/acceptance/*.js \
+ --growl \
+ test/*.js
+
+test-integration:
+ @printf "==> [Test :: Integrations]\n"
+ $(MOCHA) --timeout 5000 \
+ --reporter $(REPORTER) \
+ test/integration/*.js
+
+test-compilers:
+ @printf "==> [Test :: Compilers]\n"
+ $(MOCHA) --reporter $(REPORTER) \
+ --compilers coffee:coffee-script/register,foo:./test/compiler/foo \
+ test/acceptance/test.coffee \
+ test/acceptance/test.foo
+
+test-requires:
+ @printf "==> [Test :: Requires]\n"
+ $(MOCHA) --reporter $(REPORTER) \
+ --compilers coffee:coffee-script/register \
+ --require test/acceptance/require/a.js \
+ --require test/acceptance/require/b.coffee \
+ --require test/acceptance/require/c.js \
+ --require test/acceptance/require/d.coffee \
+ test/acceptance/require/require.spec.js
+
+test-bdd:
+ @printf "==> [Test :: BDD]\n"
+ $(MOCHA) --reporter $(REPORTER) \
+ --ui bdd \
+ test/acceptance/interfaces/bdd.spec
+
+test-tdd:
+ @printf "==> [Test :: TDD]\n"
+ $(MOCHA) --reporter $(REPORTER) \
+ --ui tdd \
+ test/acceptance/interfaces/tdd.spec
+
+test-qunit:
+ @printf "==> [Test :: QUnit]\n"
+ $(MOCHA) --reporter $(REPORTER) \
+ --ui qunit \
+ test/acceptance/interfaces/qunit.spec
+
+test-exports:
+ @printf "==> [Test :: Exports]\n"
+ $(MOCHA) --reporter $(REPORTER) \
+ --ui exports \
+ test/acceptance/interfaces/exports.spec
+
+test-glob:
+ @printf "==> [Test :: Glob]\n"
+ bash ./test/acceptance/glob/glob.sh
+
+test-reporters:
+ @printf "==> [Test :: Reporters]\n"
+ $(MOCHA) --reporter $(REPORTER) \
+ test/reporters/*.js
+
+test-only:
+ @printf "==> [Test :: Only]\n"
+ $(MOCHA) --reporter $(REPORTER) \
+ --ui tdd \
+ test/acceptance/misc/only/tdd.spec
+
+ $(MOCHA) --reporter $(REPORTER) \
+ --ui bdd \
+ test/acceptance/misc/only/bdd.spec
+
+ $(MOCHA) --reporter $(REPORTER) \
+ --ui qunit \
+ test/acceptance/misc/only/bdd-require.spec
+
+test-global-only:
+ @printf "==> [Test :: Global Only]\n"
+ $(MOCHA) --reporter $(REPORTER) \
+ --ui tdd \
+ test/acceptance/misc/only/global/tdd.spec
+
+ $(MOCHA) --reporter $(REPORTER) \
+ --ui bdd \
+ test/acceptance/misc/only/global/bdd.spec
+
+ $(MOCHA) --reporter $(REPORTER) \
+ --ui qunit \
+ test/acceptance/misc/only/global/qunit.spec
+
+test-mocha:
+ @printf "==> [Test :: Mocha]\n"
+ $(MOCHA) --reporter $(REPORTER) \
+ test/mocha
+
+non-tty:
+ @printf "==> [Test :: Non-TTY]\n"
+ $(MOCHA) --reporter dot \
+ test/acceptance/interfaces/bdd.spec 2>&1 > /tmp/dot.out
+
+ @echo dot:
+ @cat /tmp/dot.out
+
+ $(MOCHA) --reporter list \
+ test/acceptance/interfaces/bdd.spec 2>&1 > /tmp/list.out
+
+ @echo list:
+ @cat /tmp/list.out
+
+ $(MOCHA) --reporter spec \
+ test/acceptance/interfaces/bdd.spec 2>&1 > /tmp/spec.out
+
+ @echo spec:
+ @cat /tmp/spec.out
+
+tm:
+ @printf "==> [TM]\n"
+ open editors/$(TM_BUNDLE)
+
+.PHONY: test-jsapi test-compilers watch test test-node test-bdd test-tdd test-qunit test-exports test-unit test-integration non-tty tm clean test-browser test-browser-unit test-browser-bdd test-browser-qunit test-browser-tdd test-browser-exports lint test-only test-global-only
diff --git a/tests/lib/mocha-3.1.0/README.md b/tests/lib/mocha-3.1.0/README.md
new file mode 100644
index 0000000000..e2d0bb998a
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/README.md
@@ -0,0 +1,84 @@
+<br><br>
+<p align="center">
+ <img src="https://cldup.com/xFVFxOioAU.svg" alt="Mocha test framework"/>
+</p>
+<br><br>
+
+[![Build Status](https://api.travis-ci.org/mochajs/mocha.svg?branch=master)](http://travis-ci.org/mochajs/mocha) [![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/mochajs/mocha?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
+[![OpenCollective](https://opencollective.com/mochajs/backers/badge.svg)](#backers)
+[![OpenCollective](https://opencollective.com/mochajs/sponsors/badge.svg)](#sponsors)
+
+ Mocha is a simple, flexible, fun JavaScript test framework for node.js and the browser. For more information view the [documentation](http://mochajs.org).
+
+## Links
+
+ - [Changelog](https://github.com/mochajs/mocha/blob/master/CHANGELOG.md)
+ - [Google Group](http://groups.google.com/group/mochajs)
+ - [Wiki](https://github.com/mochajs/mocha/wiki)
+ - Mocha [Extensions and reporters](https://github.com/mochajs/mocha/wiki)
+
+
+## Backers
+
+[Become a backer]((https://opencollective.com/mochajs#backer)) and show your support to our open source project.
+
+<a href="https://opencollective.com/mochajs/backer/0/website" target="_blank"><img src="https://opencollective.com/mochajs/backer/0/avatar"></a>
+<a href="https://opencollective.com/mochajs/backer/1/website" target="_blank"><img src="https://opencollective.com/mochajs/backer/1/avatar"></a>
+<a href="https://opencollective.com/mochajs/backer/2/website" target="_blank"><img src="https://opencollective.com/mochajs/backer/2/avatar"></a>
+<a href="https://opencollective.com/mochajs/backer/3/website" target="_blank"><img src="https://opencollective.com/mochajs/backer/3/avatar"></a>
+<a href="https://opencollective.com/mochajs/backer/4/website" target="_blank"><img src="https://opencollective.com/mochajs/backer/4/avatar"></a>
+<a href="https://opencollective.com/mochajs/backer/5/website" target="_blank"><img src="https://opencollective.com/mochajs/backer/5/avatar"></a>
+<a href="https://opencollective.com/mochajs/backer/6/website" target="_blank"><img src="https://opencollective.com/mochajs/backer/6/avatar"></a>
+<a href="https://opencollective.com/mochajs/backer/7/website" target="_blank"><img src="https://opencollective.com/mochajs/backer/7/avatar"></a>
+<a href="https://opencollective.com/mochajs/backer/8/website" target="_blank"><img src="https://opencollective.com/mochajs/backer/8/avatar"></a>
+<a href="https://opencollective.com/mochajs/backer/9/website" target="_blank"><img src="https://opencollective.com/mochajs/backer/9/avatar"></a>
+<a href="https://opencollective.com/mochajs/backer/10/website" target="_blank"><img src="https://opencollective.com/mochajs/backer/10/avatar"></a>
+<a href="https://opencollective.com/mochajs/backer/11/website" target="_blank"><img src="https://opencollective.com/mochajs/backer/11/avatar"></a>
+<a href="https://opencollective.com/mochajs/backer/12/website" target="_blank"><img src="https://opencollective.com/mochajs/backer/12/avatar"></a>
+<a href="https://opencollective.com/mochajs/backer/13/website" target="_blank"><img src="https://opencollective.com/mochajs/backer/13/avatar"></a>
+<a href="https://opencollective.com/mochajs/backer/14/website" target="_blank"><img src="https://opencollective.com/mochajs/backer/14/avatar"></a>
+<a href="https://opencollective.com/mochajs/backer/15/website" target="_blank"><img src="https://opencollective.com/mochajs/backer/15/avatar"></a>
+<a href="https://opencollective.com/mochajs/backer/16/website" target="_blank"><img src="https://opencollective.com/mochajs/backer/16/avatar"></a>
+<a href="https://opencollective.com/mochajs/backer/17/website" target="_blank"><img src="https://opencollective.com/mochajs/backer/17/avatar"></a>
+<a href="https://opencollective.com/mochajs/backer/18/website" target="_blank"><img src="https://opencollective.com/mochajs/backer/18/avatar"></a>
+<a href="https://opencollective.com/mochajs/backer/19/website" target="_blank"><img src="https://opencollective.com/mochajs/backer/19/avatar"></a>
+<a href="https://opencollective.com/mochajs/backer/20/website" target="_blank"><img src="https://opencollective.com/mochajs/backer/20/avatar"></a>
+<a href="https://opencollective.com/mochajs/backer/21/website" target="_blank"><img src="https://opencollective.com/mochajs/backer/21/avatar"></a>
+<a href="https://opencollective.com/mochajs/backer/22/website" target="_blank"><img src="https://opencollective.com/mochajs/backer/22/avatar"></a>
+<a href="https://opencollective.com/mochajs/backer/23/website" target="_blank"><img src="https://opencollective.com/mochajs/backer/23/avatar"></a>
+<a href="https://opencollective.com/mochajs/backer/24/website" target="_blank"><img src="https://opencollective.com/mochajs/backer/24/avatar"></a>
+<a href="https://opencollective.com/mochajs/backer/25/website" target="_blank"><img src="https://opencollective.com/mochajs/backer/25/avatar"></a>
+<a href="https://opencollective.com/mochajs/backer/26/website" target="_blank"><img src="https://opencollective.com/mochajs/backer/26/avatar"></a>
+<a href="https://opencollective.com/mochajs/backer/27/website" target="_blank"><img src="https://opencollective.com/mochajs/backer/27/avatar"></a>
+<a href="https://opencollective.com/mochajs/backer/28/website" target="_blank"><img src="https://opencollective.com/mochajs/backer/28/avatar"></a>
+<a href="https://opencollective.com/mochajs/backer/29/website" target="_blank"><img src="https://opencollective.com/mochajs/backer/29/avatar"></a>
+
+
+## Sponsors
+
+Does your company use Mocha? Ask your manager or marketing team if your company would be interested in supporting our project. Support will allow the maintainers to dedicate more time for maintenance and new features for everyone. Also, your company's logo will show [on GitHub](https://github.com/mochajs/mocha#readme) and on [our site](https://mochajs.org)--who doesn't want a little extra exposure? [Here's the info](https://opencollective.com/mochajs#sponsor).
+
+<a href="https://opencollective.com/mochajs/sponsor/0/website" target="_blank"><img src="https://opencollective.com/mochajs/sponsor/0/avatar"></a>
+<a href="https://opencollective.com/mochajs/sponsor/1/website" target="_blank"><img src="https://opencollective.com/mochajs/sponsor/1/avatar"></a>
+<a href="https://opencollective.com/mochajs/sponsor/2/website" target="_blank"><img src="https://opencollective.com/mochajs/sponsor/2/avatar"></a>
+<a href="https://opencollective.com/mochajs/sponsor/3/website" target="_blank"><img src="https://opencollective.com/mochajs/sponsor/3/avatar"></a>
+<a href="https://opencollective.com/mochajs/sponsor/4/website" target="_blank"><img src="https://opencollective.com/mochajs/sponsor/4/avatar"></a>
+<a href="https://opencollective.com/mochajs/sponsor/5/website" target="_blank"><img src="https://opencollective.com/mochajs/sponsor/5/avatar"></a>
+<a href="https://opencollective.com/mochajs/sponsor/6/website" target="_blank"><img src="https://opencollective.com/mochajs/sponsor/6/avatar"></a>
+<a href="https://opencollective.com/mochajs/sponsor/7/website" target="_blank"><img src="https://opencollective.com/mochajs/sponsor/7/avatar"></a>
+<a href="https://opencollective.com/mochajs/sponsor/8/website" target="_blank"><img src="https://opencollective.com/mochajs/sponsor/8/avatar"></a>
+<a href="https://opencollective.com/mochajs/sponsor/9/website" target="_blank"><img src="https://opencollective.com/mochajs/sponsor/9/avatar"></a>
+<a href="https://opencollective.com/mochajs/sponsor/10/website" target="_blank"><img src="https://opencollective.com/mochajs/sponsor/10/avatar"></a>
+<a href="https://opencollective.com/mochajs/sponsor/11/website" target="_blank"><img src="https://opencollective.com/mochajs/sponsor/11/avatar"></a>
+<a href="https://opencollective.com/mochajs/sponsor/12/website" target="_blank"><img src="https://opencollective.com/mochajs/sponsor/12/avatar"></a>
+<a href="https://opencollective.com/mochajs/sponsor/13/website" target="_blank"><img src="https://opencollective.com/mochajs/sponsor/13/avatar"></a>
+<a href="https://opencollective.com/mochajs/sponsor/14/website" target="_blank"><img src="https://opencollective.com/mochajs/sponsor/14/avatar"></a>
+<a href="https://opencollective.com/mochajs/sponsor/15/website" target="_blank"><img src="https://opencollective.com/mochajs/sponsor/15/avatar"></a>
+<a href="https://opencollective.com/mochajs/sponsor/16/website" target="_blank"><img src="https://opencollective.com/mochajs/sponsor/16/avatar"></a>
+<a href="https://opencollective.com/mochajs/sponsor/17/website" target="_blank"><img src="https://opencollective.com/mochajs/sponsor/17/avatar"></a>
+<a href="https://opencollective.com/mochajs/sponsor/18/website" target="_blank"><img src="https://opencollective.com/mochajs/sponsor/18/avatar"></a>
+<a href="https://opencollective.com/mochajs/sponsor/19/website" target="_blank"><img src="https://opencollective.com/mochajs/sponsor/19/avatar"></a>
+
+## License
+
+MIT
diff --git a/tests/lib/mocha-3.1.0/appveyor.yml b/tests/lib/mocha-3.1.0/appveyor.yml
new file mode 100644
index 0000000000..539b8b073d
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/appveyor.yml
@@ -0,0 +1,26 @@
+environment:
+ matrix:
+ - nodejs_version: '6'
+ - nodejs_version: '4'
+ - nodejs_version: '0.12'
+ - nodejs_version: '0.10'
+install:
+ - ps: Install-Product node $env:nodejs_version
+ - set CI=true
+ - set PATH=%APPDATA%\npm;c:\MinGW\bin;%PATH%
+ - set PHANTOMJS_CDNURL=https://cnpmjs.org/downloads
+ - npm install
+ - copy c:\MinGW\bin\mingw32-make.exe c:\MinGW\bin\make.exe
+matrix:
+ fast_finish: true
+build: off
+version: '{build}'
+shallow_clone: true
+clone_depth: 1
+test_script:
+ - node --version
+ - npm --version
+ - npm test
+skip_commits:
+ message: /\[ci\s+skip\]/
+
diff --git a/tests/lib/mocha-3.1.0/assets/mocha-banner-192.png b/tests/lib/mocha-3.1.0/assets/mocha-banner-192.png
new file mode 100644
index 0000000000..15e076e119
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/assets/mocha-banner-192.png
Binary files differ
diff --git a/tests/lib/mocha-3.1.0/assets/mocha-banner.svg b/tests/lib/mocha-3.1.0/assets/mocha-banner.svg
new file mode 100644
index 0000000000..9f54009600
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/assets/mocha-banner.svg
@@ -0,0 +1,160 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ id="Layer_1"
+ x="0px"
+ y="0px"
+ viewBox="0 0 384.90259 191.99999"
+ enable-background="new 0 0 193 208"
+ xml:space="preserve"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="mocha-banner.svg"
+ width="384.90259"
+ height="192"
+ inkscape:export-filename="/Users/boneskull/Downloads/mocha-banner-192.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"><title
+ id="title4160">Mocha Logo</title><metadata
+ id="metadata32"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title>Mocha Logo</dc:title><dc:date>08-21-2015</dc:date><dc:creator><cc:Agent><dc:title>Dick DeLeon &lt;ddeleon@decipherinc.com&gt;</dc:title></cc:Agent></dc:creator><dc:rights><cc:Agent><dc:title>CC BY-SA 4.0</dc:title></cc:Agent></dc:rights><dc:subject><rdf:Bag><rdf:li>mocha</rdf:li><rdf:li>mochajs</rdf:li></rdf:Bag></dc:subject><dc:contributor><cc:Agent><dc:title>Christopher Hiller &lt;boneskull@boneskull.com&gt;</dc:title></cc:Agent></dc:contributor><cc:license
+ rdf:resource="http://creativecommons.org/licenses/by-sa/3.0/" /></cc:Work><cc:License
+ rdf:about="http://creativecommons.org/licenses/by-sa/3.0/"><cc:permits
+ rdf:resource="http://creativecommons.org/ns#Reproduction" /><cc:permits
+ rdf:resource="http://creativecommons.org/ns#Distribution" /><cc:requires
+ rdf:resource="http://creativecommons.org/ns#Notice" /><cc:requires
+ rdf:resource="http://creativecommons.org/ns#Attribution" /><cc:permits
+ rdf:resource="http://creativecommons.org/ns#DerivativeWorks" /><cc:requires
+ rdf:resource="http://creativecommons.org/ns#ShareAlike" /></cc:License></rdf:RDF></metadata><defs
+ id="defs30" /><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10000"
+ gridtolerance="10000"
+ guidetolerance="10000"
+ inkscape:pageopacity="1"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1920"
+ inkscape:window-height="1031"
+ id="namedview28"
+ showgrid="false"
+ fit-margin-top="5"
+ fit-margin-left="5"
+ fit-margin-right="5"
+ fit-margin-bottom="5"
+ inkscape:zoom="1"
+ inkscape:cx="-211.59419"
+ inkscape:cy="96.021558"
+ inkscape:window-x="1360"
+ inkscape:window-y="23"
+ inkscape:window-maximized="0"
+ inkscape:current-layer="g13-0"
+ showguides="true"
+ inkscape:guide-bbox="true"
+ inkscape:snap-path-clip="true"
+ inkscape:snap-path-mask="true"
+ inkscape:snap-text-baseline="false"><sodipodi:guide
+ position="178.24489,-94.11572"
+ orientation="1,0"
+ id="guide4358" /></sodipodi:namedview><path
+ id="XMLID_229_"
+ d="m 156.71875,146.01685 -68.70282,39.69498 c -2.958045,1.71756 -6.584028,1.71756 -9.542066,0 L 9.77103,146.01685 C 6.812992,144.29928 5,141.1504 5,137.81068 L 5,58.420744 C 5,54.985602 6.812992,51.932143 9.77103,50.214572 L 78.473864,10.5196 c 2.958038,-1.7175702 6.584021,-1.7175702 9.542056,0 l 68.70282,39.694972 c 2.95804,1.717571 4.77104,4.866451 4.77104,8.206172 l 0,79.389936 c -0.0954,3.33972 -1.90842,6.4886 -4.77104,8.20617 z"
+ inkscape:connector-curvature="0"
+ style="clip-rule:evenodd;fill:#8d6748;fill-rule:evenodd" /><path
+ id="XMLID_262_"
+ d="m 83.149473,24.164747 0,0 c 0.954207,0 1.812992,0.286262 2.671781,0.763365 l 59.351606,34.255996 c 1.62216,0.954206 2.67177,2.767198 2.67177,4.67561 l 0,68.511982 c 0,1.90842 -1.04962,3.72141 -2.67177,4.67562 l -59.351606,34.25599 c -0.858789,0.47711 -1.717574,0.76336 -2.671781,0.76336 -0.954206,0 -1.908412,-0.28625 -2.671777,-0.76336 L 21.126082,137.04732 c -1.62215,-0.95421 -2.671778,-2.7672 -2.671778,-4.67562 l 0,-68.511982 c 0,-1.908412 1.049628,-3.721404 2.671778,-4.67561 L 80.477696,24.928112 c 0.858785,-0.477103 1.812992,-0.763365 2.671777,-0.763365 m 0,-2.862618 c -1.431309,0 -2.862618,0.381683 -4.103085,1.145048 L 19.694773,56.703173 c -2.576357,1.431309 -4.103086,4.198506 -4.103086,7.061124 l 0,68.511993 c 0,2.95803 1.526729,5.62981 4.103086,7.06112 l 59.351615,34.25599 c 1.240467,0.76337 2.671776,1.14506 4.103085,1.14506 1.431309,0 2.862617,-0.38169 4.103097,-1.14506 l 59.35159,-34.25599 c 2.57636,-1.43131 4.10309,-4.1985 4.10309,-7.06112 l 0,-68.511993 c 0,-2.958038 -1.52673,-5.629815 -4.10309,-7.061124 L 87.25257,22.447177 c -1.24048,-0.763365 -2.671788,-1.145048 -4.103097,-1.145048 l 0,0 z"
+ inkscape:connector-curvature="0"
+ style="fill:#ffffff" /><g
+ id="XMLID_228_"
+ transform="matrix(0.95420602,0,0,0.95420602,-7.2615534,-2.6484425)"><g
+ id="XMLID_223_"><g
+ id="XMLID_295_"><path
+ d="m 103.6,69.6 c 0,-0.5 -0.4,-1 -1,-1 l -9.4,0 -9.4,0 c -0.5,0 -1,0.4 -1,1 0,3.4 0.5,15.1 5.5,20.8 0.2,0.2 0.4,0.3 0.7,0.3 l 8.4,0 c 0.3,0 0.5,-0.1 0.7,-0.3 5,-5.6 5.5,-17.3 5.5,-20.8 z m -7.4,18.2 -5.9,0 c -0.3,0 -0.5,-0.1 -0.7,-0.3 -3.4,-4 -3.8,-12 -3.9,-14.8 0,-0.5 0.4,-1 1,-1 l 6.6,0 6.6,0 c 0.5,0 1,0.4 1,1 0,2.8 -0.5,10.7 -3.9,14.8 -0.3,0.2 -0.5,0.3 -0.8,0.3 z"
+ id="path8"
+ inkscape:connector-curvature="0"
+ style="fill:#ffffff" /></g></g><path
+ id="XMLID_225_"
+ d="m 95.1,66.6 c 0,0 3.6,-2.1 1.4,-5.9 -1.3,-2 -1.9,-3.7 -1.4,-4.4 -1.3,1.6 -3.5,3.3 -1.1,6.9 0.8,0.9 1.2,2.8 1.1,3.4 z"
+ inkscape:connector-curvature="0"
+ style="fill:#ffffff" /><path
+ id="XMLID_224_"
+ d="m 91.1,66.9 c 0,0 2.4,-1.4 0.9,-4 -0.9,-1.3 -1.3,-2.5 -0.9,-2.9 -0.9,1.1 -2.3,2.2 -0.7,4.7 0.5,0.5 0.7,1.8 0.7,2.2 z"
+ inkscape:connector-curvature="0"
+ style="fill:#ffffff" /><path
+ id="XMLID_227_"
+ d="m 99.3,78.5 c -0.4,2.7 -1.2,5.8 -2.9,7.8 -0.2,0.2 -0.4,0.3 -0.6,0.3 l -5,0 c -0.2,0 -0.5,-0.1 -0.6,-0.3 -1.2,-1.5 -2,-3.5 -2.5,-5.6 0,0 5.8,0.8 9.1,-0.4 2.4,-0.9 2.5,-1.8 2.5,-1.8 z"
+ inkscape:connector-curvature="0"
+ style="fill:#ffffff" /></g><g
+ id="g13"
+ transform="matrix(0.95420602,0,0,0.95420602,-7.2615534,-2.6484425)"><path
+ d="m 33.6,94.7 3.7,0 6.1,9.4 6.1,-9.4 3.7,0 0,20 -3.5,0 0,-14.3 -6.3,9.4 -0.1,0 -6.2,-9.3 0,14.3 -3.5,0 0,-20.1 z"
+ id="path15"
+ inkscape:connector-curvature="0"
+ style="fill:#ffffff" /><path
+ d="m 71.3,115 c -1.5,0 -2.9,-0.3 -4.2,-0.8 -1.3,-0.5 -2.4,-1.3 -3.3,-2.2 -0.9,-0.9 -1.6,-2 -2.1,-3.3 -0.5,-1.2 -0.8,-2.6 -0.8,-4 l 0,-0.1 c 0,-1.4 0.3,-2.7 0.8,-4 0.5,-1.2 1.2,-2.3 2.2,-3.3 0.9,-0.9 2,-1.7 3.3,-2.2 1.3,-0.6 2.7,-0.8 4.2,-0.8 1.5,0 2.9,0.3 4.2,0.8 1.3,0.5 2.4,1.3 3.3,2.2 0.9,0.9 1.6,2 2.1,3.3 0.5,1.2 0.8,2.6 0.8,4 l 0,0.1 c 0,1.4 -0.3,2.7 -0.8,4 -0.5,1.2 -1.2,2.3 -2.2,3.3 -0.9,0.9 -2,1.7 -3.3,2.2 -1.3,0.6 -2.7,0.8 -4.2,0.8 z m 0,-3.2 c 1,0 1.9,-0.2 2.7,-0.6 0.8,-0.4 1.5,-0.9 2.1,-1.5 0.6,-0.6 1,-1.4 1.4,-2.2 0.3,-0.9 0.5,-1.8 0.5,-2.7 l 0,-0.1 c 0,-1 -0.2,-1.9 -0.5,-2.8 -0.3,-0.9 -0.8,-1.6 -1.4,-2.3 -0.6,-0.6 -1.3,-1.1 -2.1,-1.5 -0.8,-0.4 -1.7,-0.6 -2.7,-0.6 -1,0 -1.9,0.2 -2.7,0.6 -0.8,0.4 -1.5,0.9 -2.1,1.5 -0.6,0.6 -1,1.4 -1.4,2.2 -0.3,0.9 -0.5,1.8 -0.5,2.7 l 0,0.1 c 0,1 0.2,1.9 0.5,2.8 0.3,0.9 0.8,1.6 1.4,2.3 0.6,0.6 1.3,1.1 2.1,1.5 0.8,0.4 1.8,0.6 2.7,0.6 z"
+ id="path17"
+ inkscape:connector-curvature="0"
+ style="fill:#ffffff" /><path
+ d="m 98.7,115 c -1.5,0 -2.8,-0.3 -4,-0.8 -1.2,-0.5 -2.3,-1.3 -3.2,-2.2 -0.9,-0.9 -1.6,-2 -2.1,-3.3 -0.5,-1.3 -0.8,-2.6 -0.8,-4 l 0,-0.1 c 0,-1.4 0.3,-2.8 0.8,-4 0.5,-1.2 1.2,-2.3 2.1,-3.3 0.9,-0.9 2,-1.7 3.3,-2.2 1.3,-0.5 2.6,-0.8 4.2,-0.8 0.9,0 1.7,0.1 2.5,0.2 0.8,0.2 1.4,0.4 2.1,0.6 0.6,0.3 1.2,0.6 1.7,1 0.5,0.4 1,0.8 1.5,1.3 l -2.3,2.6 c -0.8,-0.7 -1.6,-1.3 -2.5,-1.8 -0.9,-0.5 -1.9,-0.7 -3.1,-0.7 -1,0 -1.8,0.2 -2.6,0.6 -0.8,0.4 -1.5,0.9 -2.1,1.5 -0.6,0.6 -1,1.4 -1.4,2.2 -0.3,0.9 -0.5,1.8 -0.5,2.7 l 0,0.1 c 0,1 0.2,1.9 0.5,2.8 0.3,0.9 0.8,1.6 1.4,2.3 0.6,0.6 1.3,1.2 2.1,1.5 0.8,0.3 1.7,0.6 2.6,0.6 1.2,0 2.3,-0.2 3.1,-0.7 0.8,-0.5 1.7,-1.1 2.6,-1.9 l 2.3,2.3 c -0.5,0.6 -1,1 -1.6,1.5 -0.6,0.5 -1.2,0.8 -1.8,1.1 -0.6,0.3 -1.4,0.6 -2.1,0.7 -0.9,0.2 -1.8,0.2 -2.7,0.2 z"
+ id="path19"
+ inkscape:connector-curvature="0"
+ style="fill:#ffffff" /><path
+ d="m 113.9,94.7 3.5,0 0,8.3 9.6,0 0,-8.3 3.5,0 0,20 -3.5,0 0,-8.4 -9.6,0 0,8.4 -3.5,0 0,-20 z"
+ id="path21"
+ inkscape:connector-curvature="0"
+ style="fill:#ffffff" /><path
+ d="m 146,94.6 3.2,0 8.8,20.1 -3.7,0 -2,-4.8 -9.4,0 -2.1,4.8 -3.6,0 8.8,-20.1 z m 5,12.2 -3.4,-8 -3.4,8 6.8,0 z"
+ id="path23"
+ inkscape:connector-curvature="0"
+ style="fill:#ffffff" /></g><rect
+ id="XMLID_444_"
+ x="22.414255"
+ y="112.81049"
+ width="121.66127"
+ height="1.0496266"
+ style="fill:#ffffff" /><path
+ id="XMLID_446_"
+ d="m 144.07551,76.932341 -51.71797,0 c 0,0.381682 -0.0954,0.667943 -0.0954,1.049626 l 51.81338,0 0,-1.049626 z"
+ inkscape:connector-curvature="0"
+ style="fill:#ffffff" /><path
+ id="XMLID_448_"
+ d="m 22.414254,76.932341 0,1.049626 48.759928,0 c 0,-0.381683 -0.09542,-0.667944 -0.09542,-1.049626 l -48.664507,0 z"
+ inkscape:connector-curvature="0"
+ style="fill:#ffffff" /><g
+ id="g13-0"
+ transform="matrix(0.95420602,0,0,0.95420602,90.83195,-0.74194725)"
+ style="fill:#8d6748;fill-opacity:1"><text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:41.91966629px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="117.80782"
+ y="99.410042"
+ id="text4344"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan4346"
+ x="117.80782"
+ y="99.410042" /></text>
+<text
+ xml:space="preserve"
+ style="font-style:italic;font-variant:normal;font-weight:300;font-stretch:normal;font-size:23.579813px;line-height:125%;font-family:'Helvetica Neue';-inkscape-font-specification:'Helvetica Neue, Light Italic';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#8d6748;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="92.403748"
+ y="109.94498"
+ id="text4348"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan4350"
+ x="92.403748"
+ y="109.94498"
+ style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:23.579813px;line-height:125%;font-family:'Helvetica Neue';-inkscape-font-specification:'Helvetica Neue, Light Italic';text-align:start;letter-spacing:0.52399588px;writing-mode:lr-tb;text-anchor:start;fill:#8d6748;fill-opacity:1"
+ dx="4.114904e-08">simple, flexible, fun</tspan></text>
+</g></svg> \ No newline at end of file
diff --git a/tests/lib/mocha-3.1.0/assets/mocha-logo-128.png b/tests/lib/mocha-3.1.0/assets/mocha-logo-128.png
new file mode 100644
index 0000000000..d4dbf34603
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/assets/mocha-logo-128.png
Binary files differ
diff --git a/tests/lib/mocha-3.1.0/assets/mocha-logo-192.png b/tests/lib/mocha-3.1.0/assets/mocha-logo-192.png
new file mode 100644
index 0000000000..69fbbff090
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/assets/mocha-logo-192.png
Binary files differ
diff --git a/tests/lib/mocha-3.1.0/assets/mocha-logo-64.png b/tests/lib/mocha-3.1.0/assets/mocha-logo-64.png
new file mode 100644
index 0000000000..10403ff294
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/assets/mocha-logo-64.png
Binary files differ
diff --git a/tests/lib/mocha-3.1.0/assets/mocha-logo.svg b/tests/lib/mocha-3.1.0/assets/mocha-logo.svg
new file mode 100644
index 0000000000..e907e3167e
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/assets/mocha-logo.svg
@@ -0,0 +1,125 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ id="Layer_1"
+ x="0px"
+ y="0px"
+ viewBox="0 0 192 191.99999"
+ enable-background="new 0 0 193 208"
+ xml:space="preserve"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="mocha-logo.svg"
+ width="192"
+ height="192"
+ inkscape:export-filename="/Users/boneskull/Downloads/mocha-logo-192.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"><title
+ id="title4160">Mocha Logo</title><metadata
+ id="metadata32"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title>Mocha Logo</dc:title><dc:date>08-21-2015</dc:date><dc:creator><cc:Agent><dc:title>Dick DeLeon &lt;ddeleon@decipherinc.com&gt;</dc:title></cc:Agent></dc:creator><dc:rights><cc:Agent><dc:title>CC BY-SA 4.0</dc:title></cc:Agent></dc:rights><dc:subject><rdf:Bag><rdf:li>mocha</rdf:li><rdf:li>mochajs</rdf:li></rdf:Bag></dc:subject><dc:contributor><cc:Agent><dc:title>Christopher Hiller &lt;boneskull@boneskull.com&gt;</dc:title></cc:Agent></dc:contributor><cc:license
+ rdf:resource="http://creativecommons.org/licenses/by-sa/3.0/" /></cc:Work><cc:License
+ rdf:about="http://creativecommons.org/licenses/by-sa/3.0/"><cc:permits
+ rdf:resource="http://creativecommons.org/ns#Reproduction" /><cc:permits
+ rdf:resource="http://creativecommons.org/ns#Distribution" /><cc:requires
+ rdf:resource="http://creativecommons.org/ns#Notice" /><cc:requires
+ rdf:resource="http://creativecommons.org/ns#Attribution" /><cc:permits
+ rdf:resource="http://creativecommons.org/ns#DerivativeWorks" /><cc:requires
+ rdf:resource="http://creativecommons.org/ns#ShareAlike" /></cc:License></rdf:RDF></metadata><defs
+ id="defs30" /><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1920"
+ inkscape:window-height="1031"
+ id="namedview28"
+ showgrid="false"
+ fit-margin-top="5"
+ fit-margin-left="5"
+ fit-margin-right="5"
+ fit-margin-bottom="5"
+ inkscape:zoom="1"
+ inkscape:cx="96"
+ inkscape:cy="98.137283"
+ inkscape:window-x="1360"
+ inkscape:window-y="23"
+ inkscape:window-maximized="0"
+ inkscape:current-layer="Layer_1" /><path
+ id="XMLID_229_"
+ d="m 169.47386,143.90113 -68.70282,39.69498 c -2.958045,1.71756 -6.584028,1.71756 -9.542066,0 L 22.52614,143.90113 c -2.958038,-1.71757 -4.77103,-4.86645 -4.77103,-8.20617 l 0,-79.389939 c 0,-3.435142 1.812992,-6.488601 4.77103,-8.206172 L 91.228974,8.403878 c 2.958038,-1.717571 6.584021,-1.717571 9.542056,0 l 68.70282,39.694971 c 2.95804,1.717571 4.77104,4.866451 4.77104,8.206172 l 0,79.389939 c -0.0954,3.33972 -1.90842,6.4886 -4.77104,8.20617 z"
+ inkscape:connector-curvature="0"
+ style="clip-rule:evenodd;fill:#8d6748;fill-rule:evenodd" /><path
+ id="XMLID_262_"
+ d="m 95.904583,22.049024 0,0 c 0.954207,0 1.812992,0.286262 2.671781,0.763365 l 59.351606,34.255996 c 1.62216,0.954206 2.67177,2.767198 2.67177,4.67561 l 0,68.511985 c 0,1.90842 -1.04962,3.72141 -2.67177,4.67562 l -59.351606,34.25599 c -0.858789,0.47711 -1.717574,0.76336 -2.671781,0.76336 -0.954206,0 -1.908412,-0.28625 -2.671777,-0.76336 L 33.881192,134.9316 c -1.62215,-0.95421 -2.671778,-2.7672 -2.671778,-4.67562 l 0,-68.511985 c 0,-1.908412 1.049628,-3.721404 2.671778,-4.67561 L 93.232806,22.812389 c 0.858785,-0.477103 1.812992,-0.763365 2.671777,-0.763365 m 0,-2.862618 c -1.431309,0 -2.862618,0.381683 -4.103085,1.145048 L 32.449883,54.58745 c -2.576357,1.431309 -4.103086,4.198506 -4.103086,7.061124 l 0,68.511996 c 0,2.95803 1.526729,5.62981 4.103086,7.06112 l 59.351615,34.25599 c 1.240467,0.76337 2.671776,1.14506 4.103085,1.14506 1.431309,0 2.862617,-0.38169 4.103097,-1.14506 l 59.35159,-34.25599 c 2.57636,-1.43131 4.10309,-4.1985 4.10309,-7.06112 l 0,-68.511996 c 0,-2.958038 -1.52673,-5.629815 -4.10309,-7.061124 L 100.00768,20.331454 C 98.7672,19.568089 97.335892,19.186406 95.904583,19.186406 l 0,0 z"
+ inkscape:connector-curvature="0"
+ style="fill:#ffffff" /><g
+ id="XMLID_228_"
+ transform="matrix(0.95420602,0,0,0.95420602,5.4935566,-4.7641653)"><g
+ id="XMLID_223_"><g
+ id="XMLID_295_"><path
+ d="m 103.6,69.6 c 0,-0.5 -0.4,-1 -1,-1 l -9.4,0 -9.4,0 c -0.5,0 -1,0.4 -1,1 0,3.4 0.5,15.1 5.5,20.8 0.2,0.2 0.4,0.3 0.7,0.3 l 8.4,0 c 0.3,0 0.5,-0.1 0.7,-0.3 5,-5.6 5.5,-17.3 5.5,-20.8 z m -7.4,18.2 -5.9,0 c -0.3,0 -0.5,-0.1 -0.7,-0.3 -3.4,-4 -3.8,-12 -3.9,-14.8 0,-0.5 0.4,-1 1,-1 l 6.6,0 6.6,0 c 0.5,0 1,0.4 1,1 0,2.8 -0.5,10.7 -3.9,14.8 -0.3,0.2 -0.5,0.3 -0.8,0.3 z"
+ id="path8"
+ inkscape:connector-curvature="0"
+ style="fill:#ffffff" /></g></g><path
+ id="XMLID_225_"
+ d="m 95.1,66.6 c 0,0 3.6,-2.1 1.4,-5.9 -1.3,-2 -1.9,-3.7 -1.4,-4.4 -1.3,1.6 -3.5,3.3 -1.1,6.9 0.8,0.9 1.2,2.8 1.1,3.4 z"
+ inkscape:connector-curvature="0"
+ style="fill:#ffffff" /><path
+ id="XMLID_224_"
+ d="m 91.1,66.9 c 0,0 2.4,-1.4 0.9,-4 -0.9,-1.3 -1.3,-2.5 -0.9,-2.9 -0.9,1.1 -2.3,2.2 -0.7,4.7 0.5,0.5 0.7,1.8 0.7,2.2 z"
+ inkscape:connector-curvature="0"
+ style="fill:#ffffff" /><path
+ id="XMLID_227_"
+ d="m 99.3,78.5 c -0.4,2.7 -1.2,5.8 -2.9,7.8 -0.2,0.2 -0.4,0.3 -0.6,0.3 l -5,0 c -0.2,0 -0.5,-0.1 -0.6,-0.3 -1.2,-1.5 -2,-3.5 -2.5,-5.6 0,0 5.8,0.8 9.1,-0.4 2.4,-0.9 2.5,-1.8 2.5,-1.8 z"
+ inkscape:connector-curvature="0"
+ style="fill:#ffffff" /></g><g
+ id="g13"
+ transform="matrix(0.95420602,0,0,0.95420602,5.4935566,-4.7641653)"><path
+ d="m 33.6,94.7 3.7,0 6.1,9.4 6.1,-9.4 3.7,0 0,20 -3.5,0 0,-14.3 -6.3,9.4 -0.1,0 -6.2,-9.3 0,14.3 -3.5,0 0,-20.1 z"
+ id="path15"
+ inkscape:connector-curvature="0"
+ style="fill:#ffffff" /><path
+ d="m 71.3,115 c -1.5,0 -2.9,-0.3 -4.2,-0.8 -1.3,-0.5 -2.4,-1.3 -3.3,-2.2 -0.9,-0.9 -1.6,-2 -2.1,-3.3 -0.5,-1.2 -0.8,-2.6 -0.8,-4 l 0,-0.1 c 0,-1.4 0.3,-2.7 0.8,-4 0.5,-1.2 1.2,-2.3 2.2,-3.3 0.9,-0.9 2,-1.7 3.3,-2.2 1.3,-0.6 2.7,-0.8 4.2,-0.8 1.5,0 2.9,0.3 4.2,0.8 1.3,0.5 2.4,1.3 3.3,2.2 0.9,0.9 1.6,2 2.1,3.3 0.5,1.2 0.8,2.6 0.8,4 l 0,0.1 c 0,1.4 -0.3,2.7 -0.8,4 -0.5,1.2 -1.2,2.3 -2.2,3.3 -0.9,0.9 -2,1.7 -3.3,2.2 -1.3,0.6 -2.7,0.8 -4.2,0.8 z m 0,-3.2 c 1,0 1.9,-0.2 2.7,-0.6 0.8,-0.4 1.5,-0.9 2.1,-1.5 0.6,-0.6 1,-1.4 1.4,-2.2 0.3,-0.9 0.5,-1.8 0.5,-2.7 l 0,-0.1 c 0,-1 -0.2,-1.9 -0.5,-2.8 -0.3,-0.9 -0.8,-1.6 -1.4,-2.3 -0.6,-0.6 -1.3,-1.1 -2.1,-1.5 -0.8,-0.4 -1.7,-0.6 -2.7,-0.6 -1,0 -1.9,0.2 -2.7,0.6 -0.8,0.4 -1.5,0.9 -2.1,1.5 -0.6,0.6 -1,1.4 -1.4,2.2 -0.3,0.9 -0.5,1.8 -0.5,2.7 l 0,0.1 c 0,1 0.2,1.9 0.5,2.8 0.3,0.9 0.8,1.6 1.4,2.3 0.6,0.6 1.3,1.1 2.1,1.5 0.8,0.4 1.8,0.6 2.7,0.6 z"
+ id="path17"
+ inkscape:connector-curvature="0"
+ style="fill:#ffffff" /><path
+ d="m 98.7,115 c -1.5,0 -2.8,-0.3 -4,-0.8 -1.2,-0.5 -2.3,-1.3 -3.2,-2.2 -0.9,-0.9 -1.6,-2 -2.1,-3.3 -0.5,-1.3 -0.8,-2.6 -0.8,-4 l 0,-0.1 c 0,-1.4 0.3,-2.8 0.8,-4 0.5,-1.2 1.2,-2.3 2.1,-3.3 0.9,-0.9 2,-1.7 3.3,-2.2 1.3,-0.5 2.6,-0.8 4.2,-0.8 0.9,0 1.7,0.1 2.5,0.2 0.8,0.2 1.4,0.4 2.1,0.6 0.6,0.3 1.2,0.6 1.7,1 0.5,0.4 1,0.8 1.5,1.3 l -2.3,2.6 c -0.8,-0.7 -1.6,-1.3 -2.5,-1.8 -0.9,-0.5 -1.9,-0.7 -3.1,-0.7 -1,0 -1.8,0.2 -2.6,0.6 -0.8,0.4 -1.5,0.9 -2.1,1.5 -0.6,0.6 -1,1.4 -1.4,2.2 -0.3,0.9 -0.5,1.8 -0.5,2.7 l 0,0.1 c 0,1 0.2,1.9 0.5,2.8 0.3,0.9 0.8,1.6 1.4,2.3 0.6,0.6 1.3,1.2 2.1,1.5 0.8,0.3 1.7,0.6 2.6,0.6 1.2,0 2.3,-0.2 3.1,-0.7 0.8,-0.5 1.7,-1.1 2.6,-1.9 l 2.3,2.3 c -0.5,0.6 -1,1 -1.6,1.5 -0.6,0.5 -1.2,0.8 -1.8,1.1 -0.6,0.3 -1.4,0.6 -2.1,0.7 -0.9,0.2 -1.8,0.2 -2.7,0.2 z"
+ id="path19"
+ inkscape:connector-curvature="0"
+ style="fill:#ffffff" /><path
+ d="m 113.9,94.7 3.5,0 0,8.3 9.6,0 0,-8.3 3.5,0 0,20 -3.5,0 0,-8.4 -9.6,0 0,8.4 -3.5,0 0,-20 z"
+ id="path21"
+ inkscape:connector-curvature="0"
+ style="fill:#ffffff" /><path
+ d="m 146,94.6 3.2,0 8.8,20.1 -3.7,0 -2,-4.8 -9.4,0 -2.1,4.8 -3.6,0 8.8,-20.1 z m 5,12.2 -3.4,-8 -3.4,8 6.8,0 z"
+ id="path23"
+ inkscape:connector-curvature="0"
+ style="fill:#ffffff" /></g><rect
+ id="XMLID_444_"
+ x="35.169365"
+ y="110.69476"
+ width="121.66127"
+ height="1.0496266"
+ style="fill:#ffffff" /><path
+ id="XMLID_446_"
+ d="m 156.83062,74.816618 -51.71797,0 c 0,0.381682 -0.0954,0.667943 -0.0954,1.049626 l 51.81338,0 0,-1.049626 z"
+ inkscape:connector-curvature="0"
+ style="fill:#ffffff" /><path
+ id="XMLID_448_"
+ d="m 35.169364,74.816618 0,1.049626 48.759928,0 c 0,-0.381683 -0.09542,-0.667944 -0.09542,-1.049626 l -48.664507,0 z"
+ inkscape:connector-curvature="0"
+ style="fill:#ffffff" /></svg> \ No newline at end of file
diff --git a/tests/lib/mocha-3.1.0/bin/.eslintrc b/tests/lib/mocha-3.1.0/bin/.eslintrc
new file mode 100644
index 0000000000..db7424631c
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/bin/.eslintrc
@@ -0,0 +1,3 @@
+---
+rules:
+ no-process-exit: 0
diff --git a/tests/lib/mocha-2.2.5/bin/_mocha b/tests/lib/mocha-3.1.0/bin/_mocha
index 5b3c0c5b29..1d3539e8f0 100755..100644
--- a/tests/lib/mocha-2.2.5/bin/_mocha
+++ b/tests/lib/mocha-3.1.0/bin/_mocha
@@ -1,30 +1,33 @@
#!/usr/bin/env node
+/* eslint no-unused-vars: off */
+
/**
* Module dependencies.
*/
-var program = require('commander'),
- path = require('path'),
- fs = require('fs'),
- resolve = path.resolve,
- exists = fs.existsSync || path.existsSync,
- Mocha = require('../'),
- utils = Mocha.utils,
- join = path.join,
- cwd = process.cwd(),
- getOptions = require('./options'),
- mocha = new Mocha;
+var program = require('commander');
+var path = require('path');
+var fs = require('fs');
+var resolve = path.resolve;
+var exists = fs.existsSync || path.existsSync;
+var Mocha = require('../');
+var utils = Mocha.utils;
+var interfaceNames = Object.keys(Mocha.interfaces);
+var join = path.join;
+var cwd = process.cwd();
+var getOptions = require('./options');
+var mocha = new Mocha();
/**
* Save timer references to avoid Sinon interfering (see GH-237).
*/
-var Date = global.Date
- , setTimeout = global.setTimeout
- , setInterval = global.setInterval
- , clearTimeout = global.clearTimeout
- , clearInterval = global.clearInterval;
+var Date = global.Date;
+var setTimeout = global.setTimeout;
+var setInterval = global.setInterval;
+var clearTimeout = global.clearTimeout;
+var clearInterval = global.clearInterval;
/**
* Files.
@@ -49,23 +52,23 @@ var requires = [];
*/
var images = {
- fail: __dirname + '/../images/error.png'
- , pass: __dirname + '/../images/ok.png'
+ fail: path.join(__dirname, '..', 'images', 'error.png'),
+ pass: path.join(__dirname, '..', 'images', 'ok.png')
};
// options
program
- .version(JSON.parse(fs.readFileSync(__dirname + '/../package.json', 'utf8')).version)
+ .version(JSON.parse(fs.readFileSync(path.join(__dirname, '..', 'package.json'), 'utf8')).version)
.usage('[debug] [options] [files]')
- .option('-A, --async-only', "force all tests to take a callback (async)")
+ .option('-A, --async-only', 'force all tests to take a callback (async) or return a promise')
.option('-c, --colors', 'force enabling of colors')
.option('-C, --no-colors', 'force disabling of colors')
.option('-G, --growl', 'enable growl notification support')
.option('-O, --reporter-options <k=v,k2=v2,...>', 'reporter-specific options')
.option('-R, --reporter <name>', 'specify the reporter to use', 'spec')
- .option('-S, --sort', "sort test files")
- .option('-b, --bail', "bail after first test failure")
+ .option('-S, --sort', 'sort test files')
+ .option('-b, --bail', 'bail after first test failure')
.option('-d, --debug', "enable node's debugger, synonym for node --debug")
.option('-g, --grep <pattern>', 'only run tests matching <pattern>')
.option('-f, --fgrep <string>', 'only run tests containing <string>')
@@ -74,45 +77,44 @@ program
.option('-r, --require <name>', 'require the given module')
.option('-s, --slow <ms>', '"slow" test threshold in milliseconds [75]')
.option('-t, --timeout <ms>', 'set test-case timeout in milliseconds [2000]')
- .option('-u, --ui <name>', 'specify user-interface (bdd|tdd|exports)', 'bdd')
+ .option('-u, --ui <name>', 'specify user-interface (' + interfaceNames.join('|') + ')', 'bdd')
.option('-w, --watch', 'watch files for changes')
.option('--check-leaks', 'check for global variable leaks')
.option('--full-trace', 'display the full stack trace')
.option('--compilers <ext>:<module>,...', 'use the given module(s) to compile files', list, [])
.option('--debug-brk', "enable node's debugger breaking on the first line")
.option('--globals <names>', 'allow the given comma-delimited global [names]', list, [])
- .option('--harmony', 'enable all harmony features (except typeof)')
.option('--es_staging', 'enable all staged features')
- .option('--harmony-collections', 'enable harmony collections (sets, maps, and weak maps)')
- .option('--harmony-generators', 'enable harmony generators')
- .option('--harmony-proxies', 'enable harmony proxies')
- .option('--harmony_shipping', 'enable all shipped harmony fetaures (iojs)')
- .option('--harmony_arrow_functions', 'enable "harmony arrow functions" (iojs)')
- .option('--harmony_proxies', 'enable "harmony proxies" (iojs)')
- .option('--harmony_classes', 'enable "harmony classes" (iojs)')
+ .option('--harmony<_classes,_generators,...>', 'all node --harmony* flags are available')
+ .option('--preserve-symlinks', 'Instructs the module loader to preserve symbolic links when resolving and caching modules')
+ .option('--icu-data-dir', 'include ICU data')
.option('--inline-diffs', 'display actual/expected differences inline within each string')
.option('--interfaces', 'display available interfaces')
.option('--no-deprecation', 'silence deprecation warnings')
.option('--no-exit', 'require a clean shutdown of the event loop: mocha will not call process.exit')
.option('--no-timeouts', 'disables timeouts, given implicitly with --debug')
.option('--opts <path>', 'specify opts path', 'test/mocha.opts')
+ .option('--perf-basic-prof', 'enable perf linux profiler (basic support)')
.option('--prof', 'log statistical profiling information')
+ .option('--log-timer-events', 'Time events including external callbacks')
.option('--recursive', 'include sub directories')
.option('--reporters', 'display available reporters')
+ .option('--retries <times>', 'set numbers of time to retry a failed test case')
.option('--throw-deprecation', 'throw an exception anytime a deprecated function is used')
.option('--trace', 'trace function calls')
.option('--trace-deprecation', 'show stack traces on deprecations')
+ .option('--use_strict', 'enforce strict mode')
.option('--watch-extensions <ext>,...', 'additional extensions to monitor with --watch', list, [])
- .option('--delay', 'wait for async suite definition')
+ .option('--delay', 'wait for async suite definition');
-program.name = 'mocha';
+program._name = 'mocha';
// init command
program
.command('init <path>')
.description('initialize a client-side mocha setup at <path>')
- .action(function(path){
+ .action(function(path) {
var mkdir = require('mkdirp');
mkdir.sync(path);
var css = fs.readFileSync(join(__dirname, '..', 'mocha.css'));
@@ -127,13 +129,13 @@ program
// --globals
-program.on('globals', function(val){
+program.on('globals', function(val) {
globals = globals.concat(list(val));
});
// --reporters
-program.on('reporters', function(){
+program.on('reporters', function() {
console.log();
console.log(' dot - dot matrix');
console.log(' doc - html documentation');
@@ -144,11 +146,9 @@ program.on('reporters', function(){
console.log(' tap - test-anything-protocol');
console.log(' landing - unicode landing strip');
console.log(' xunit - xunit reporter');
- console.log(' html-cov - HTML test coverage');
- console.log(' json-cov - JSON test coverage');
console.log(' min - minimal reporter (great with --watch)');
console.log(' json-stream - newline delimited json events');
- console.log(' markdown - markdown documentation (github flavour)');
+ console.log(' markdown - markdown documentation (GitHub flavour)');
console.log(' nyan - nyan cat!');
console.log();
process.exit();
@@ -156,12 +156,11 @@ program.on('reporters', function(){
// --interfaces
-program.on('interfaces', function(){
+program.on('interfaces', function() {
console.log('');
- console.log(' bdd');
- console.log(' tdd');
- console.log(' qunit');
- console.log(' exports');
+ interfaceNames.forEach(function(interfaceName) {
+ console.log(' ' + interfaceName);
+ });
console.log('');
process.exit();
});
@@ -170,15 +169,18 @@ program.on('interfaces', function(){
module.paths.push(cwd, join(cwd, 'node_modules'));
-program.on('require', function(mod){
+program.on('require', function(mod) {
var abs = exists(mod) || exists(mod + '.js');
- if (abs) mod = resolve(mod);
+ if (abs) {
+ mod = resolve(mod);
+ }
requires.push(mod);
});
-// load mocha.opts into process.argv
-
-getOptions();
+// If not already done, load mocha.opts
+if (!process.env.LOADED_MOCHA_OPTS) {
+ getOptions();
+}
// parse args
@@ -192,61 +194,70 @@ Error.stackTraceLimit = Infinity; // TODO: config
var reporterOptions = {};
if (program.reporterOptions !== undefined) {
- program.reporterOptions.split(",").forEach(function(opt) {
- var L = opt.split("=");
- if (L.length != 2) {
- throw new Error("invalid reporter option '" + opt + "'");
- }
- reporterOptions[L[0]] = L[1];
- });
+ program.reporterOptions.split(',').forEach(function(opt) {
+ var L = opt.split('=');
+ if (L.length > 2 || L.length === 0) {
+ throw new Error("invalid reporter option '" + opt + "'");
+ } else if (L.length === 2) {
+ reporterOptions[L[0]] = L[1];
+ } else {
+ reporterOptions[L[0]] = true;
+ }
+ });
}
// reporter
mocha.reporter(program.reporter, reporterOptions);
-// interface
-
-mocha.ui(program.ui);
-
// load reporter
+var Reporter = null;
try {
Reporter = require('../lib/reporters/' + program.reporter);
} catch (err) {
try {
Reporter = require(program.reporter);
- } catch (err) {
+ } catch (err2) {
throw new Error('reporter "' + program.reporter + '" does not exist');
}
}
// --no-colors
-if (!program.colors) mocha.useColors(false);
+if (!program.colors) {
+ mocha.useColors(false);
+}
// --colors
-if (~process.argv.indexOf('--colors') ||
- ~process.argv.indexOf('-c')) {
+if (~process.argv.indexOf('--colors') || ~process.argv.indexOf('-c')) {
mocha.useColors(true);
}
// --inline-diffs
-if (program.inlineDiffs) mocha.useInlineDiffs(true);
+if (program.inlineDiffs) {
+ mocha.useInlineDiffs(true);
+}
// --slow <ms>
-if (program.slow) mocha.suite.slow(program.slow);
+if (program.slow) {
+ mocha.suite.slow(program.slow);
+}
// --no-timeouts
-if (!program.timeouts) mocha.enableTimeouts(false);
+if (!program.timeouts) {
+ mocha.enableTimeouts(false);
+}
// --timeout
-if (program.timeout) mocha.suite.timeout(program.timeout);
+if (program.timeout) {
+ mocha.suite.timeout(program.timeout);
+}
// --bail
@@ -254,49 +265,73 @@ mocha.suite.bail(program.bail);
// --grep
-if (program.grep) mocha.grep(new RegExp(program.grep));
+if (program.grep) {
+ mocha.grep(program.grep);
+}
// --fgrep
-if (program.fgrep) mocha.grep(program.fgrep);
+if (program.fgrep) {
+ mocha.fgrep(program.fgrep);
+}
// --invert
-if (program.invert) mocha.invert();
+if (program.invert) {
+ mocha.invert();
+}
// --check-leaks
-if (program.checkLeaks) mocha.checkLeaks();
+if (program.checkLeaks) {
+ mocha.checkLeaks();
+}
// --stack-trace
-if(program.fullTrace) mocha.fullTrace();
+if (program.fullTrace) {
+ mocha.fullTrace();
+}
// --growl
-if (program.growl) mocha.growl();
+if (program.growl) {
+ mocha.growl();
+}
// --async-only
-if (program.asyncOnly) mocha.asyncOnly();
+if (program.asyncOnly) {
+ mocha.asyncOnly();
+}
// --delay
-if (program.delay) mocha.delay();
+if (program.delay) {
+ mocha.delay();
+}
// --globals
mocha.globals(globals);
+// --retries
+
+if (program.retries) {
+ mocha.suite.retries(program.retries);
+}
+
// custom compiler support
var extensions = ['js'];
program.compilers.forEach(function(c) {
- var compiler = c.split(':')
- , ext = compiler[0]
- , mod = compiler[1];
+ var idx = c.indexOf(':');
+ var ext = c.slice(0, idx);
+ var mod = c.slice(idx + 1);
- if (mod[0] == '.') mod = join(process.cwd(), mod);
+ if (mod[0] === '.') {
+ mod = join(process.cwd(), mod);
+ }
require(mod);
extensions.push(ext);
program.watchExtensions.push(ext);
@@ -308,21 +343,44 @@ requires.forEach(function(mod) {
require(mod);
});
-//args
+// interface
+
+mocha.ui(program.ui);
+
+// args
var args = program.args;
// default files to test/*.{js,coffee}
-if (!args.length) args.push('test');
+if (!args.length) {
+ args.push('test');
+}
+
+args.forEach(function(arg) {
+ var newFiles;
+ try {
+ newFiles = utils.lookupFiles(arg, extensions, program.recursive);
+ } catch (err) {
+ if (err.message.indexOf('cannot resolve path') === 0) {
+ console.error('Warning: Could not find any test files matching pattern: ' + arg);
+ return;
+ }
+
+ throw err;
+ }
-args.forEach(function(arg){
- files = files.concat(utils.lookupFiles(arg, extensions, program.recursive));
+ files = files.concat(newFiles);
});
+if (!files.length) {
+ console.error('No test files found');
+ process.exit(1);
+}
+
// resolve
-files = files.map(function(path){
+files = files.map(function(path) {
return resolve(path);
});
@@ -333,54 +391,58 @@ if (program.sort) {
// --watch
var runner;
+var loadAndRun;
+var purge;
+var rerun;
+
if (program.watch) {
console.log();
hideCursor();
- process.on('SIGINT', function(){
+ process.on('SIGINT', function() {
showCursor();
console.log('\n');
- process.exit();
+ process.exit(130);
});
-
var watchFiles = utils.files(cwd, [ 'js' ].concat(program.watchExtensions));
var runAgain = false;
- function loadAndRun() {
+ loadAndRun = function loadAndRun() {
try {
mocha.files = files;
runAgain = false;
- runner = mocha.run(function(){
+ runner = mocha.run(function() {
runner = null;
if (runAgain) {
rerun();
}
});
- } catch(e) {
+ } catch (e) {
console.log(e.stack);
}
- }
+ };
- function purge() {
- watchFiles.forEach(function(file){
+ purge = function purge() {
+ watchFiles.forEach(function(file) {
delete require.cache[file];
});
- }
+ };
loadAndRun();
- function rerun() {
+ rerun = function rerun() {
purge();
- stop()
- if (!program.grep)
+ stop();
+ if (!program.grep) {
mocha.grep(null);
+ }
mocha.suite = mocha.suite.clone();
- mocha.suite.ctx = new Mocha.Context;
+ mocha.suite.ctx = new Mocha.Context();
mocha.ui(program.ui);
loadAndRun();
- }
+ };
- utils.watch(watchFiles, function(){
+ utils.watch(watchFiles, function() {
runAgain = true;
if (runner) {
runner.abort();
@@ -388,17 +450,17 @@ if (program.watch) {
rerun();
}
});
-
- return;
-}
-
+} else {
// load
-mocha.files = files;
-runner = mocha.run(program.exit ? exit : exitLater);
+ mocha.files = files;
+ runner = mocha.run(program.exit ? exit : exitLater);
+}
function exitLater(code) {
- process.on('exit', function() { process.exit(code) })
+ process.on('exit', function() {
+ process.exit(Math.min(code, 255));
+ });
}
function exit(code) {
@@ -406,13 +468,15 @@ function exit(code) {
// https://github.com/joyent/node/issues/6247 is just one bug example
// https://github.com/visionmedia/mocha/issues/333 has a good discussion
function done() {
- if (!(draining--)) process.exit(code);
+ if (!(draining--)) {
+ process.exit(Math.min(code, 255));
+ }
}
var draining = 0;
var streams = [process.stdout, process.stderr];
- streams.forEach(function(stream){
+ streams.forEach(function(stream) {
// submit empty write request and wait for completion
draining += 1;
stream.write('', done);
@@ -421,27 +485,14 @@ function exit(code) {
done();
}
-process.on('SIGINT', function() { runner.abort(); })
+process.on('SIGINT', function() {
+ runner.abort();
-// enable growl notifications
-
-function growl(runner, reporter) {
- var notify = require('growl');
-
- runner.on('end', function(){
- var stats = reporter.stats;
- if (stats.failures) {
- var msg = stats.failures + ' of ' + runner.total + ' tests failed';
- notify(msg, { name: 'mocha', title: 'Failed', image: images.fail });
- } else {
- notify(stats.passes + ' tests passed in ' + stats.duration + 'ms', {
- name: 'mocha'
- , title: 'Passed'
- , image: images.pass
- });
- }
- });
-}
+ // This is a hack:
+ // Instead of `process.exit(130)`, set runner.failures to 130 (exit code for SIGINT)
+ // The amount of failures will be emitted as error code later
+ runner.failures = 130;
+});
/**
* Parse list.
@@ -455,7 +506,7 @@ function list(str) {
* Hide the cursor.
*/
-function hideCursor(){
+function hideCursor() {
process.stdout.write('\u001b[?25l');
}
@@ -463,7 +514,7 @@ function hideCursor(){
* Show the cursor.
*/
-function showCursor(){
+function showCursor() {
process.stdout.write('\u001b[?25h');
}
@@ -481,11 +532,11 @@ function stop() {
*/
function play(arr, interval) {
- var len = arr.length
- , interval = interval || 100
- , i = 0;
+ var len = arr.length;
+ interval = interval || 100;
+ var i = 0;
- play.timer = setInterval(function(){
+ play.timer = setInterval(function() {
var str = arr[i++ % len];
process.stdout.write('\u001b[0G' + str);
}, interval);
diff --git a/tests/lib/mocha-2.2.5/bin/mocha b/tests/lib/mocha-3.1.0/bin/mocha
index daa8fd910b..0c16f0ee94 100755..100644
--- a/tests/lib/mocha-2.2.5/bin/mocha
+++ b/tests/lib/mocha-3.1.0/bin/mocha
@@ -5,17 +5,16 @@
* when found, before invoking the "real" _mocha(1) executable.
*/
-var spawn = require('child_process').spawn,
- path = require('path'),
- fs = require('fs'),
- args = [path.join(__dirname, '_mocha')],
- getOptions = require('./options');
-
-// load mocha.opts into process.argv
+var spawn = require('child_process').spawn;
+var path = require('path');
+var getOptions = require('./options');
+var args = [path.join(__dirname, '_mocha')];
+// Load mocha.opts into process.argv
+// Must be loaded here to handle node-specific options
getOptions();
-process.argv.slice(2).forEach(function(arg){
+process.argv.slice(2).forEach(function(arg) {
var flag = arg.split('=')[0];
switch (flag) {
@@ -26,6 +25,7 @@ process.argv.slice(2).forEach(function(arg){
case 'debug':
case '--debug':
case '--debug-brk':
+ case '--inspect':
args.unshift(arg);
args.push('--no-timeouts');
break;
@@ -34,32 +34,38 @@ process.argv.slice(2).forEach(function(arg){
args.unshift('--expose-gc');
break;
case '--gc-global':
- case '--harmony':
case '--es_staging':
- case '--harmony-proxies':
- case '--harmony-collections':
- case '--harmony-generators':
- case '--harmony_shipping':
- case '--harmony_arrow_functions':
- case '--harmony_proxies':
- case '--harmony_classes':
case '--no-deprecation':
case '--prof':
+ case '--log-timer-events':
case '--throw-deprecation':
case '--trace-deprecation':
+ case '--use_strict':
case '--allow-natives-syntax':
+ case '--perf-basic-prof':
args.unshift(arg);
break;
default:
- if (0 == arg.indexOf('--trace')) args.unshift(arg);
- else args.push(arg);
+ if (arg.indexOf('--harmony') === 0) {
+ args.unshift(arg);
+ } else if (arg.indexOf('--trace') === 0) {
+ args.unshift(arg);
+ } else if (arg.indexOf('--icu-data-dir') === 0) {
+ args.unshift(arg);
+ } else if (arg.indexOf('--max-old-space-size') === 0) {
+ args.unshift(arg);
+ } else if (arg.indexOf('--preserve-symlinks') === 0) {
+ args.unshift(arg);
+ } else {
+ args.push(arg);
+ }
break;
}
});
var proc = spawn(process.execPath, args, { stdio: 'inherit' });
-proc.on('exit', function (code, signal) {
- process.on('exit', function(){
+proc.on('exit', function(code, signal) {
+ process.on('exit', function() {
if (signal) {
process.kill(process.pid, signal);
} else {
@@ -69,8 +75,7 @@ proc.on('exit', function (code, signal) {
});
// terminate children.
-process.on('SIGINT', function () {
+process.on('SIGINT', function() {
proc.kill('SIGINT'); // calls runner.abort()
proc.kill('SIGTERM'); // if that didn't work, we're probably in an infinite loop, so make it die.
- process.kill(process.pid, 'SIGINT');
});
diff --git a/tests/lib/mocha-2.2.5/bin/options.js b/tests/lib/mocha-3.1.0/bin/options.js
index 3b31798b8d..9d1a18a23e 100755..100644
--- a/tests/lib/mocha-2.2.5/bin/options.js
+++ b/tests/lib/mocha-3.1.0/bin/options.js
@@ -21,11 +21,12 @@ function getOptions() {
try {
var opts = fs.readFileSync(optsPath, 'utf8')
- .trim()
- .split(/\s+/)
- .filter(function(value) {
- return value ? true : false;
- });
+ .replace(/\\\s/g, '%20')
+ .split(/\s/)
+ .filter(Boolean)
+ .map(function(value) {
+ return value.replace(/%20/g, ' ');
+ });
process.argv = process.argv
.slice(0, 2)
@@ -33,4 +34,6 @@ function getOptions() {
} catch (err) {
// ignore
}
+
+ process.env.LOADED_MOCHA_OPTS = true;
}
diff --git a/tests/lib/mocha-3.1.0/bower.json b/tests/lib/mocha-3.1.0/bower.json
new file mode 100644
index 0000000000..e96cc9526d
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/bower.json
@@ -0,0 +1,38 @@
+{
+ "name": "mocha",
+ "homepage": "https://mochajs.org",
+ "description": "simple, flexible, fun test framework",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/mochajs/mocha.git"
+ },
+ "main": [
+ "mocha.js",
+ "mocha.css"
+ ],
+ "ignore": [
+ "bin",
+ "editors",
+ "images",
+ "lib",
+ "scripts",
+ "test",
+ "assets",
+ "media",
+ ".*",
+ "index.js",
+ "karma.conf.js",
+ "browser-entry.js",
+ "Makefile",
+ "package.json",
+ "appveyor.yml"
+ ],
+ "keywords": [
+ "mocha",
+ "test",
+ "bdd",
+ "tdd",
+ "tap"
+ ],
+ "license": "MIT"
+}
diff --git a/tests/lib/mocha-2.2.5/support/tail.js b/tests/lib/mocha-3.1.0/browser-entry.js
index 030177aad7..789e686ae6 100755..100644
--- a/tests/lib/mocha-2.2.5/support/tail.js
+++ b/tests/lib/mocha-3.1.0/browser-entry.js
@@ -1,5 +1,20 @@
-// The global object is "self" in Web Workers.
-var global = (function() { return this; })();
+/* eslint no-unused-vars: off */
+
+/**
+ * Shim process.stdout.
+ */
+
+process.stdout = require('browser-stdout')();
+
+var Mocha = require('./lib/mocha');
+
+/**
+ * Create a Mocha instance.
+ *
+ * @return {undefined}
+ */
+
+var mocha = new Mocha({ reporter: 'html' });
/**
* Save timer references to avoid Sinon interfering (see GH-237).
@@ -11,19 +26,6 @@ var setInterval = global.setInterval;
var clearTimeout = global.clearTimeout;
var clearInterval = global.clearInterval;
-/**
- * Node shims.
- *
- * These are meant only to allow
- * mocha.js to run untouched, not
- * to allow running node code in
- * the browser.
- */
-
-var process = {};
-process.exit = function(status){};
-process.stdout = {};
-
var uncaughtExceptionHandlers = [];
var originalOnerrorHandler = global.onerror;
@@ -33,15 +35,17 @@ var originalOnerrorHandler = global.onerror;
* Revert to original onerror handler if previously defined.
*/
-process.removeListener = function(e, fn){
- if ('uncaughtException' == e) {
+process.removeListener = function(e, fn) {
+ if (e === 'uncaughtException') {
if (originalOnerrorHandler) {
global.onerror = originalOnerrorHandler;
} else {
global.onerror = function() {};
}
var i = Mocha.utils.indexOf(uncaughtExceptionHandlers, fn);
- if (i != -1) { uncaughtExceptionHandlers.splice(i, 1); }
+ if (i !== -1) {
+ uncaughtExceptionHandlers.splice(i, 1);
+ }
}
};
@@ -49,30 +53,23 @@ process.removeListener = function(e, fn){
* Implements uncaughtException listener.
*/
-process.on = function(e, fn){
- if ('uncaughtException' == e) {
- global.onerror = function(err, url, line){
+process.on = function(e, fn) {
+ if (e === 'uncaughtException') {
+ global.onerror = function(err, url, line) {
fn(new Error(err + ' (' + url + ':' + line + ')'));
- return true;
+ return !mocha.allowUncaught;
};
uncaughtExceptionHandlers.push(fn);
}
};
-/**
- * Expose mocha.
- */
-
-var Mocha = global.Mocha = require('mocha'),
- mocha = global.mocha = new Mocha({ reporter: 'html' });
-
// The BDD UI is registered by default, but no UI will be functional in the
// browser without an explicit call to the overridden `mocha.ui` (see below).
// Ensure that this default UI does not expose its methods to the global scope.
mocha.suite.removeAllListeners('pre-require');
-var immediateQueue = []
- , immediateTimeout;
+var immediateQueue = [];
+var immediateTimeout;
function timeslice() {
var immediateStart = new Date().getTime();
@@ -103,7 +100,7 @@ Mocha.Runner.immediately = function(callback) {
* only receive the 'message' attribute of the Error.
*/
mocha.throwError = function(err) {
- Mocha.utils.forEach(uncaughtExceptionHandlers, function (fn) {
+ Mocha.utils.forEach(uncaughtExceptionHandlers, function(fn) {
fn(err);
});
throw err;
@@ -114,7 +111,7 @@ mocha.throwError = function(err) {
* Normally this would happen in Mocha.prototype.loadFiles.
*/
-mocha.ui = function(ui){
+mocha.ui = function(ui) {
Mocha.prototype.ui.call(this, ui);
this.suite.emit('pre-require', global, null, this);
return this;
@@ -124,9 +121,15 @@ mocha.ui = function(ui){
* Setup mocha with the given setting options.
*/
-mocha.setup = function(opts){
- if ('string' == typeof opts) opts = { ui: opts };
- for (var opt in opts) this[opt](opts[opt]);
+mocha.setup = function(opts) {
+ if (typeof opts === 'string') {
+ opts = { ui: opts };
+ }
+ for (var opt in opts) {
+ if (opts.hasOwnProperty(opt)) {
+ this[opt](opts[opt]);
+ }
+ }
return this;
};
@@ -134,27 +137,48 @@ mocha.setup = function(opts){
* Run mocha, returning the Runner.
*/
-mocha.run = function(fn){
+mocha.run = function(fn) {
var options = mocha.options;
mocha.globals('location');
var query = Mocha.utils.parseQuery(global.location.search || '');
- if (query.grep) mocha.grep(new RegExp(query.grep));
- if (query.fgrep) mocha.grep(query.fgrep);
- if (query.invert) mocha.invert();
+ if (query.grep) {
+ mocha.grep(query.grep);
+ }
+ if (query.fgrep) {
+ mocha.fgrep(query.fgrep);
+ }
+ if (query.invert) {
+ mocha.invert();
+ }
- return Mocha.prototype.run.call(mocha, function(err){
+ return Mocha.prototype.run.call(mocha, function(err) {
// The DOM Document is not available in Web Workers.
var document = global.document;
if (document && document.getElementById('mocha') && options.noHighlighting !== true) {
Mocha.utils.highlightTags('code');
}
- if (fn) fn(err);
+ if (fn) {
+ fn(err);
+ }
});
};
/**
* Expose the process shim.
+ * https://github.com/mochajs/mocha/pull/916
*/
Mocha.process = process;
+
+/**
+ * Expose mocha.
+ */
+
+global.Mocha = Mocha;
+global.mocha = mocha;
+
+// this allows test/acceptance/required-tokens.js to pass; thus,
+// you can now do `const describe = require('mocha').describe` in a
+// browser context (assuming browserification). should fix #880
+module.exports = global;
diff --git a/tests/lib/mocha-2.2.5/editors/JavaScript mocha.tmbundle/Snippets/bdd - after each.tmSnippet b/tests/lib/mocha-3.1.0/editors/JavaScript mocha.tmbundle/Snippets/bdd - after each.tmSnippet
index c722cfe8ae..c722cfe8ae 100755..100644
--- a/tests/lib/mocha-2.2.5/editors/JavaScript mocha.tmbundle/Snippets/bdd - after each.tmSnippet
+++ b/tests/lib/mocha-3.1.0/editors/JavaScript mocha.tmbundle/Snippets/bdd - after each.tmSnippet
diff --git a/tests/lib/mocha-2.2.5/editors/JavaScript mocha.tmbundle/Snippets/bdd - after.tmSnippet b/tests/lib/mocha-3.1.0/editors/JavaScript mocha.tmbundle/Snippets/bdd - after.tmSnippet
index c0b1f6bd82..c0b1f6bd82 100755..100644
--- a/tests/lib/mocha-2.2.5/editors/JavaScript mocha.tmbundle/Snippets/bdd - after.tmSnippet
+++ b/tests/lib/mocha-3.1.0/editors/JavaScript mocha.tmbundle/Snippets/bdd - after.tmSnippet
diff --git a/tests/lib/mocha-2.2.5/editors/JavaScript mocha.tmbundle/Snippets/bdd - before each.tmSnippet b/tests/lib/mocha-3.1.0/editors/JavaScript mocha.tmbundle/Snippets/bdd - before each.tmSnippet
index 14fa93b1b0..14fa93b1b0 100755..100644
--- a/tests/lib/mocha-2.2.5/editors/JavaScript mocha.tmbundle/Snippets/bdd - before each.tmSnippet
+++ b/tests/lib/mocha-3.1.0/editors/JavaScript mocha.tmbundle/Snippets/bdd - before each.tmSnippet
diff --git a/tests/lib/mocha-2.2.5/editors/JavaScript mocha.tmbundle/Snippets/bdd - before.tmSnippet b/tests/lib/mocha-3.1.0/editors/JavaScript mocha.tmbundle/Snippets/bdd - before.tmSnippet
index 18b48c0eeb..18b48c0eeb 100755..100644
--- a/tests/lib/mocha-2.2.5/editors/JavaScript mocha.tmbundle/Snippets/bdd - before.tmSnippet
+++ b/tests/lib/mocha-3.1.0/editors/JavaScript mocha.tmbundle/Snippets/bdd - before.tmSnippet
diff --git a/tests/lib/mocha-2.2.5/editors/JavaScript mocha.tmbundle/Snippets/bdd - describe.tmSnippet b/tests/lib/mocha-3.1.0/editors/JavaScript mocha.tmbundle/Snippets/bdd - describe.tmSnippet
index 041726c067..041726c067 100755..100644
--- a/tests/lib/mocha-2.2.5/editors/JavaScript mocha.tmbundle/Snippets/bdd - describe.tmSnippet
+++ b/tests/lib/mocha-3.1.0/editors/JavaScript mocha.tmbundle/Snippets/bdd - describe.tmSnippet
diff --git a/tests/lib/mocha-2.2.5/editors/JavaScript mocha.tmbundle/Snippets/bdd - it.tmSnippet b/tests/lib/mocha-3.1.0/editors/JavaScript mocha.tmbundle/Snippets/bdd - it.tmSnippet
index 72a3b0ee3a..72a3b0ee3a 100755..100644
--- a/tests/lib/mocha-2.2.5/editors/JavaScript mocha.tmbundle/Snippets/bdd - it.tmSnippet
+++ b/tests/lib/mocha-3.1.0/editors/JavaScript mocha.tmbundle/Snippets/bdd - it.tmSnippet
diff --git a/tests/lib/mocha-2.2.5/editors/JavaScript mocha.tmbundle/Snippets/tdd - assert.tmSnippet b/tests/lib/mocha-3.1.0/editors/JavaScript mocha.tmbundle/Snippets/tdd - assert.tmSnippet
index 38d78ce2ec..38d78ce2ec 100755..100644
--- a/tests/lib/mocha-2.2.5/editors/JavaScript mocha.tmbundle/Snippets/tdd - assert.tmSnippet
+++ b/tests/lib/mocha-3.1.0/editors/JavaScript mocha.tmbundle/Snippets/tdd - assert.tmSnippet
diff --git a/tests/lib/mocha-2.2.5/editors/JavaScript mocha.tmbundle/Snippets/tdd - assert_deepEqual.tmSnippet b/tests/lib/mocha-3.1.0/editors/JavaScript mocha.tmbundle/Snippets/tdd - assert_deepEqual.tmSnippet
index 4204e4c4f2..4204e4c4f2 100755..100644
--- a/tests/lib/mocha-2.2.5/editors/JavaScript mocha.tmbundle/Snippets/tdd - assert_deepEqual.tmSnippet
+++ b/tests/lib/mocha-3.1.0/editors/JavaScript mocha.tmbundle/Snippets/tdd - assert_deepEqual.tmSnippet
diff --git a/tests/lib/mocha-2.2.5/editors/JavaScript mocha.tmbundle/Snippets/tdd - assert_equal.tmSnippet b/tests/lib/mocha-3.1.0/editors/JavaScript mocha.tmbundle/Snippets/tdd - assert_equal.tmSnippet
index 8f09805968..8f09805968 100755..100644
--- a/tests/lib/mocha-2.2.5/editors/JavaScript mocha.tmbundle/Snippets/tdd - assert_equal.tmSnippet
+++ b/tests/lib/mocha-3.1.0/editors/JavaScript mocha.tmbundle/Snippets/tdd - assert_equal.tmSnippet
diff --git a/tests/lib/mocha-2.2.5/editors/JavaScript mocha.tmbundle/Snippets/tdd - assert_fail.tmSnippet b/tests/lib/mocha-3.1.0/editors/JavaScript mocha.tmbundle/Snippets/tdd - assert_fail.tmSnippet
index 3e8dbe3b9e..3e8dbe3b9e 100755..100644
--- a/tests/lib/mocha-2.2.5/editors/JavaScript mocha.tmbundle/Snippets/tdd - assert_fail.tmSnippet
+++ b/tests/lib/mocha-3.1.0/editors/JavaScript mocha.tmbundle/Snippets/tdd - assert_fail.tmSnippet
diff --git a/tests/lib/mocha-2.2.5/editors/JavaScript mocha.tmbundle/Snippets/tdd - assert_isFunction.tmSnippet b/tests/lib/mocha-3.1.0/editors/JavaScript mocha.tmbundle/Snippets/tdd - assert_isFunction.tmSnippet
index 903d7f6fdf..903d7f6fdf 100755..100644
--- a/tests/lib/mocha-2.2.5/editors/JavaScript mocha.tmbundle/Snippets/tdd - assert_isFunction.tmSnippet
+++ b/tests/lib/mocha-3.1.0/editors/JavaScript mocha.tmbundle/Snippets/tdd - assert_isFunction.tmSnippet
diff --git a/tests/lib/mocha-2.2.5/editors/JavaScript mocha.tmbundle/Snippets/tdd - setup.tmSnippet b/tests/lib/mocha-3.1.0/editors/JavaScript mocha.tmbundle/Snippets/tdd - setup.tmSnippet
index a30e650187..a30e650187 100755..100644
--- a/tests/lib/mocha-2.2.5/editors/JavaScript mocha.tmbundle/Snippets/tdd - setup.tmSnippet
+++ b/tests/lib/mocha-3.1.0/editors/JavaScript mocha.tmbundle/Snippets/tdd - setup.tmSnippet
diff --git a/tests/lib/mocha-2.2.5/editors/JavaScript mocha.tmbundle/Snippets/tdd - suite.tmSnippet b/tests/lib/mocha-3.1.0/editors/JavaScript mocha.tmbundle/Snippets/tdd - suite.tmSnippet
index 37cfd8a566..37cfd8a566 100755..100644
--- a/tests/lib/mocha-2.2.5/editors/JavaScript mocha.tmbundle/Snippets/tdd - suite.tmSnippet
+++ b/tests/lib/mocha-3.1.0/editors/JavaScript mocha.tmbundle/Snippets/tdd - suite.tmSnippet
diff --git a/tests/lib/mocha-2.2.5/editors/JavaScript mocha.tmbundle/Snippets/tdd - teardown.tmSnippet b/tests/lib/mocha-3.1.0/editors/JavaScript mocha.tmbundle/Snippets/tdd - teardown.tmSnippet
index 68fd441016..68fd441016 100755..100644
--- a/tests/lib/mocha-2.2.5/editors/JavaScript mocha.tmbundle/Snippets/tdd - teardown.tmSnippet
+++ b/tests/lib/mocha-3.1.0/editors/JavaScript mocha.tmbundle/Snippets/tdd - teardown.tmSnippet
diff --git a/tests/lib/mocha-2.2.5/editors/JavaScript mocha.tmbundle/Snippets/tdd - test.tmSnippet b/tests/lib/mocha-3.1.0/editors/JavaScript mocha.tmbundle/Snippets/tdd - test.tmSnippet
index 279da8900d..279da8900d 100755..100644
--- a/tests/lib/mocha-2.2.5/editors/JavaScript mocha.tmbundle/Snippets/tdd - test.tmSnippet
+++ b/tests/lib/mocha-3.1.0/editors/JavaScript mocha.tmbundle/Snippets/tdd - test.tmSnippet
diff --git a/tests/lib/mocha-2.2.5/editors/JavaScript mocha.tmbundle/info.plist b/tests/lib/mocha-3.1.0/editors/JavaScript mocha.tmbundle/info.plist
index 16f6587a6c..16f6587a6c 100755..100644
--- a/tests/lib/mocha-2.2.5/editors/JavaScript mocha.tmbundle/info.plist
+++ b/tests/lib/mocha-3.1.0/editors/JavaScript mocha.tmbundle/info.plist
diff --git a/tests/lib/mocha-2.2.5/images/error.png b/tests/lib/mocha-3.1.0/images/error.png
index a07a1ba5ef..a07a1ba5ef 100755..100644
--- a/tests/lib/mocha-2.2.5/images/error.png
+++ b/tests/lib/mocha-3.1.0/images/error.png
Binary files differ
diff --git a/tests/lib/mocha-2.2.5/images/ok.png b/tests/lib/mocha-3.1.0/images/ok.png
index b3623a5994..b3623a5994 100755..100644
--- a/tests/lib/mocha-2.2.5/images/ok.png
+++ b/tests/lib/mocha-3.1.0/images/ok.png
Binary files differ
diff --git a/tests/lib/mocha-3.1.0/index.js b/tests/lib/mocha-3.1.0/index.js
new file mode 100644
index 0000000000..d2b7d19609
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/index.js
@@ -0,0 +1,3 @@
+'use strict';
+
+module.exports = require('./lib/mocha');
diff --git a/tests/lib/mocha-3.1.0/karma.conf.js b/tests/lib/mocha-3.1.0/karma.conf.js
new file mode 100644
index 0000000000..4aa108b27d
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/karma.conf.js
@@ -0,0 +1,179 @@
+'use strict';
+
+var fs = require('fs');
+var path = require('path');
+var mkdirp = require('mkdirp');
+var baseBundleDirpath = path.join(__dirname, '.karma');
+
+module.exports = function(config) {
+ var bundleDirpath;
+ var cfg = {
+ frameworks: [
+ 'browserify',
+ 'expect',
+ 'mocha'
+ ],
+ files: [
+ // we use the BDD interface for all of the tests that
+ // aren't interface-specific.
+ 'test/browser-fixtures/bdd.fixture.js',
+ 'test/acceptance/*.spec.js'
+ ],
+ exclude: [
+ 'test/acceptance/http.spec.js',
+ 'test/acceptance/fs.spec.js',
+ 'test/acceptance/lookup-files.spec.js',
+ 'test/acceptance/require/**/*.js',
+ 'test/acceptance/misc/**/*.js'
+ ],
+ preprocessors: {
+ 'test/**/*.js': ['browserify']
+ },
+ browserify: {
+ debug: true,
+ configure: function configure(b) {
+ b.ignore('glob')
+ .ignore('fs')
+ .ignore('path')
+ .ignore('supports-color')
+ .on('bundled', function(err, content) {
+ if (!err && bundleDirpath) {
+ // write bundle to directory for debugging
+ fs.writeFileSync(path.join(bundleDirpath,
+ 'bundle.' + Date.now() + '.js'), content);
+ }
+ });
+ }
+ },
+ reporters: ['spec'],
+ colors: true,
+ browsers: ['PhantomJS'],
+ logLevel: config.LOG_INFO,
+ client: {
+ mocha: {
+ reporter: 'html'
+ }
+ }
+ };
+
+ // see https://github.com/saucelabs/karma-sauce-example
+ // TO RUN LOCALLY, execute:
+ // `CI=1 SAUCE_USERNAME=<user> SAUCE_ACCESS_KEY=<key> make test-browser`
+ var env = process.env;
+ var sauceConfig;
+
+ if (env.CI) {
+ console.error('CI mode enabled');
+ if (env.TRAVIS) {
+ console.error('Travis-CI detected');
+ bundleDirpath = path.join(baseBundleDirpath, process.env.TRAVIS_BUILD_ID);
+ if (env.SAUCE_USERNAME && env.SAUCE_ACCESS_KEY) {
+ // correlate build/tunnel with Travis
+ sauceConfig = {
+ build: 'TRAVIS #' + env.TRAVIS_BUILD_NUMBER
+ + ' (' + env.TRAVIS_BUILD_ID + ')',
+ tunnelIdentifier: env.TRAVIS_JOB_NUMBER
+ };
+ console.error('Configured SauceLabs');
+ } else {
+ console.error('No SauceLabs credentials present');
+ }
+ } else if (env.APPVEYOR) {
+ console.error('AppVeyor detected');
+ bundleDirpath = path.join(baseBundleDirpath, process.env.APPVEYOR_BUILD_ID);
+ } else {
+ console.error('Local/unknown environment detected');
+ bundleDirpath = path.join(baseBundleDirpath, 'local');
+ // don't need to run sauce from appveyor b/c travis does it.
+ if (!(env.SAUCE_USERNAME || env.SAUCE_ACCESS_KEY)) {
+ console.error('No SauceLabs credentials present');
+ } else {
+ sauceConfig = {
+ build: require('os').hostname() + ' (' + Date.now() + ')'
+ };
+ console.error('Configured SauceLabs');
+ }
+ }
+ mkdirp.sync(bundleDirpath);
+ } else {
+ console.error('CI mode disabled');
+ }
+
+ if (sauceConfig) {
+ cfg.sauceLabs = sauceConfig;
+ addSauceTests(cfg);
+ }
+
+ // the MOCHA_UI env var will determine if we're running interface-specific
+ // tets. since you can only load one at a time, each must be run separately.
+ // each has its own set of acceptance tests and a fixture.
+ // the "bdd" fixture is used by default.
+ var ui = env.MOCHA_UI;
+ if (ui) {
+ if (cfg.sauceLabs) {
+ cfg.sauceLabs.testName = 'Interface "' + ui + '" integration tests';
+ }
+ cfg.files = [
+ 'test/browser-fixtures/' + ui + '.fixture.js',
+ 'test/acceptance/interfaces/' + ui + '.spec.js'
+ ];
+ } else if (cfg.sauceLabs) {
+ cfg.sauceLabs.testName = 'Unit Tests';
+ }
+
+ config.set(cfg);
+};
+
+function addSauceTests(cfg) {
+ cfg.reporters.push('saucelabs');
+
+ cfg.customLaunchers = {
+ ie8: {
+ base: 'SauceLabs',
+ browserName: 'internet explorer',
+ platform: 'Windows 7',
+ version: '8.0'
+ },
+ ie7: {
+ base: 'SauceLabs',
+ browserName: 'internet explorer',
+ platform: 'Windows XP',
+ version: '7.0'
+ },
+ chrome: {
+ base: 'SauceLabs',
+ browserName: 'chrome',
+ platform: 'Windows 8',
+ version: 'latest'
+ },
+ edge: {
+ base: 'SauceLabs',
+ browserName: 'MicrosoftEdge',
+ platform: 'Windows 10',
+ version: 'latest'
+ },
+ firefox: {
+ base: 'SauceLabs',
+ browserName: 'firefox',
+ platform: 'Windows 8.1',
+ version: 'latest'
+ },
+ safari: {
+ base: 'SauceLabs',
+ browserName: 'safari',
+ platform: 'OS X 10.11',
+ version: 'latest'
+ }
+ };
+
+ cfg.browsers = cfg.browsers.concat(Object.keys(cfg.customLaunchers));
+
+ cfg.sauceLabs = {
+ public: 'public',
+ startConnect: true
+ };
+
+ // for slow browser booting, ostensibly
+ cfg.captureTimeout = 120000;
+ cfg.browserNoActivityTimeout = 20000;
+}
diff --git a/tests/lib/mocha-3.1.0/lib/browser/debug.js b/tests/lib/mocha-3.1.0/lib/browser/debug.js
new file mode 100644
index 0000000000..ba232896df
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/lib/browser/debug.js
@@ -0,0 +1,4 @@
+/* eslint-disable no-unused-vars */
+module.exports = function(type) {
+ return function() {};
+};
diff --git a/tests/lib/mocha-2.2.5/lib/browser/events.js b/tests/lib/mocha-3.1.0/lib/browser/events.js
index f708260896..b4342f6202 100755..100644
--- a/tests/lib/mocha-2.2.5/lib/browser/events.js
+++ b/tests/lib/mocha-3.1.0/lib/browser/events.js
@@ -5,11 +5,19 @@
exports.EventEmitter = EventEmitter;
/**
- * Check if `obj` is an array.
+ * Object#toString reference.
*/
+var objToString = Object.prototype.toString;
-function isArray(obj) {
- return '[object Array]' == {}.toString.call(obj);
+/**
+ * Check if a value is an array.
+ *
+ * @api private
+ * @param {*} val The value to test.
+ * @return {boolean} true if the value is an array, otherwise false.
+ */
+function isArray(val) {
+ return objToString.call(val) === '[object Array]';
}
/**
@@ -17,16 +25,17 @@ function isArray(obj) {
*
* @api public
*/
-
-function EventEmitter(){};
+function EventEmitter() {}
/**
- * Adds a listener.
+ * Add a listener.
*
* @api public
+ * @param {string} name Event name.
+ * @param {Function} fn Event handler.
+ * @return {EventEmitter} Emitter instance.
*/
-
-EventEmitter.prototype.on = function (name, fn) {
+EventEmitter.prototype.on = function(name, fn) {
if (!this.$events) {
this.$events = {};
}
@@ -48,15 +57,17 @@ EventEmitter.prototype.addListener = EventEmitter.prototype.on;
* Adds a volatile listener.
*
* @api public
+ * @param {string} name Event name.
+ * @param {Function} fn Event handler.
+ * @return {EventEmitter} Emitter instance.
*/
-
-EventEmitter.prototype.once = function (name, fn) {
+EventEmitter.prototype.once = function(name, fn) {
var self = this;
- function on () {
+ function on() {
self.removeListener(name, on);
fn.apply(this, arguments);
- };
+ }
on.listener = fn;
this.on(name, on);
@@ -65,12 +76,14 @@ EventEmitter.prototype.once = function (name, fn) {
};
/**
- * Removes a listener.
+ * Remove a listener.
*
* @api public
+ * @param {string} name Event name.
+ * @param {Function} fn Event handler.
+ * @return {EventEmitter} Emitter instance.
*/
-
-EventEmitter.prototype.removeListener = function (name, fn) {
+EventEmitter.prototype.removeListener = function(name, fn) {
if (this.$events && this.$events[name]) {
var list = this.$events[name];
@@ -102,12 +115,13 @@ EventEmitter.prototype.removeListener = function (name, fn) {
};
/**
- * Removes all listeners for an event.
+ * Remove all listeners for an event.
*
* @api public
+ * @param {string} name Event name.
+ * @return {EventEmitter} Emitter instance.
*/
-
-EventEmitter.prototype.removeAllListeners = function (name) {
+EventEmitter.prototype.removeAllListeners = function(name) {
if (name === undefined) {
this.$events = {};
return this;
@@ -121,12 +135,13 @@ EventEmitter.prototype.removeAllListeners = function (name) {
};
/**
- * Gets all listeners for a certain event.
+ * Get all listeners for a given event.
*
* @api public
+ * @param {string} name Event name.
+ * @return {EventEmitter} Emitter instance.
*/
-
-EventEmitter.prototype.listeners = function (name) {
+EventEmitter.prototype.listeners = function(name) {
if (!this.$events) {
this.$events = {};
}
@@ -143,12 +158,13 @@ EventEmitter.prototype.listeners = function (name) {
};
/**
- * Emits an event.
+ * Emit an event.
*
* @api public
+ * @param {string} name Event name.
+ * @return {boolean} true if at least one handler was invoked, else false.
*/
-
-EventEmitter.prototype.emit = function (name) {
+EventEmitter.prototype.emit = function(name) {
if (!this.$events) {
return false;
}
@@ -159,9 +175,9 @@ EventEmitter.prototype.emit = function (name) {
return false;
}
- var args = [].slice.call(arguments, 1);
+ var args = Array.prototype.slice.call(arguments, 1);
- if ('function' == typeof handler) {
+ if (typeof handler === 'function') {
handler.apply(this, args);
} else if (isArray(handler)) {
var listeners = handler.slice();
diff --git a/tests/lib/mocha-3.1.0/lib/browser/progress.js b/tests/lib/mocha-3.1.0/lib/browser/progress.js
new file mode 100644
index 0000000000..3186b6ec50
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/lib/browser/progress.js
@@ -0,0 +1,117 @@
+/**
+ * Expose `Progress`.
+ */
+
+module.exports = Progress;
+
+/**
+ * Initialize a new `Progress` indicator.
+ */
+function Progress() {
+ this.percent = 0;
+ this.size(0);
+ this.fontSize(11);
+ this.font('helvetica, arial, sans-serif');
+}
+
+/**
+ * Set progress size to `size`.
+ *
+ * @api public
+ * @param {number} size
+ * @return {Progress} Progress instance.
+ */
+Progress.prototype.size = function(size) {
+ this._size = size;
+ return this;
+};
+
+/**
+ * Set text to `text`.
+ *
+ * @api public
+ * @param {string} text
+ * @return {Progress} Progress instance.
+ */
+Progress.prototype.text = function(text) {
+ this._text = text;
+ return this;
+};
+
+/**
+ * Set font size to `size`.
+ *
+ * @api public
+ * @param {number} size
+ * @return {Progress} Progress instance.
+ */
+Progress.prototype.fontSize = function(size) {
+ this._fontSize = size;
+ return this;
+};
+
+/**
+ * Set font to `family`.
+ *
+ * @param {string} family
+ * @return {Progress} Progress instance.
+ */
+Progress.prototype.font = function(family) {
+ this._font = family;
+ return this;
+};
+
+/**
+ * Update percentage to `n`.
+ *
+ * @param {number} n
+ * @return {Progress} Progress instance.
+ */
+Progress.prototype.update = function(n) {
+ this.percent = n;
+ return this;
+};
+
+/**
+ * Draw on `ctx`.
+ *
+ * @param {CanvasRenderingContext2d} ctx
+ * @return {Progress} Progress instance.
+ */
+Progress.prototype.draw = function(ctx) {
+ try {
+ var percent = Math.min(this.percent, 100);
+ var size = this._size;
+ var half = size / 2;
+ var x = half;
+ var y = half;
+ var rad = half - 1;
+ var fontSize = this._fontSize;
+
+ ctx.font = fontSize + 'px ' + this._font;
+
+ var angle = Math.PI * 2 * (percent / 100);
+ ctx.clearRect(0, 0, size, size);
+
+ // outer circle
+ ctx.strokeStyle = '#9f9f9f';
+ ctx.beginPath();
+ ctx.arc(x, y, rad, 0, angle, false);
+ ctx.stroke();
+
+ // inner circle
+ ctx.strokeStyle = '#eee';
+ ctx.beginPath();
+ ctx.arc(x, y, rad - 1, 0, angle, true);
+ ctx.stroke();
+
+ // text
+ var text = this._text || (percent | 0) + '%';
+ var w = ctx.measureText(text).width;
+
+ ctx.fillText(text, x - w / 2 + 1, y + fontSize / 2 - 1);
+ } catch (err) {
+ // don't fail if we can't render progress
+ }
+ return this;
+};
diff --git a/tests/lib/mocha-3.1.0/lib/browser/tty.js b/tests/lib/mocha-3.1.0/lib/browser/tty.js
new file mode 100644
index 0000000000..840d6699ee
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/lib/browser/tty.js
@@ -0,0 +1,11 @@
+exports.isatty = function isatty() {
+ return true;
+};
+
+exports.getWindowSize = function getWindowSize() {
+ if ('innerHeight' in global) {
+ return [global.innerHeight, global.innerWidth];
+ }
+ // In a Web Worker, the DOM Window is not available.
+ return [640, 480];
+};
diff --git a/tests/lib/mocha-3.1.0/lib/context.js b/tests/lib/mocha-3.1.0/lib/context.js
new file mode 100644
index 0000000000..6d82fcadf4
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/lib/context.js
@@ -0,0 +1,110 @@
+/**
+ * Module dependencies.
+ */
+
+var JSON = require('json3');
+
+/**
+ * Expose `Context`.
+ */
+
+module.exports = Context;
+
+/**
+ * Initialize a new `Context`.
+ *
+ * @api private
+ */
+function Context() {}
+
+/**
+ * Set or get the context `Runnable` to `runnable`.
+ *
+ * @api private
+ * @param {Runnable} runnable
+ * @return {Context}
+ */
+Context.prototype.runnable = function(runnable) {
+ if (!arguments.length) {
+ return this._runnable;
+ }
+ this.test = this._runnable = runnable;
+ return this;
+};
+
+/**
+ * Set test timeout `ms`.
+ *
+ * @api private
+ * @param {number} ms
+ * @return {Context} self
+ */
+Context.prototype.timeout = function(ms) {
+ if (!arguments.length) {
+ return this.runnable().timeout();
+ }
+ this.runnable().timeout(ms);
+ return this;
+};
+
+/**
+ * Set test timeout `enabled`.
+ *
+ * @api private
+ * @param {boolean} enabled
+ * @return {Context} self
+ */
+Context.prototype.enableTimeouts = function(enabled) {
+ this.runnable().enableTimeouts(enabled);
+ return this;
+};
+
+/**
+ * Set test slowness threshold `ms`.
+ *
+ * @api private
+ * @param {number} ms
+ * @return {Context} self
+ */
+Context.prototype.slow = function(ms) {
+ this.runnable().slow(ms);
+ return this;
+};
+
+/**
+ * Mark a test as skipped.
+ *
+ * @api private
+ * @return {Context} self
+ */
+Context.prototype.skip = function() {
+ this.runnable().skip();
+ return this;
+};
+
+/**
+ * Allow a number of retries on failed tests
+ *
+ * @api private
+ * @param {number} n
+ * @return {Context} self
+ */
+Context.prototype.retries = function(n) {
+ if (!arguments.length) {
+ return this.runnable().retries();
+ }
+ this.runnable().retries(n);
+ return this;
+};
+
+/**
+ * Inspect the context void of `._runnable`.
+ *
+ * @api private
+ * @return {string}
+ */
+Context.prototype.inspect = function() {
+ return JSON.stringify(this, function(key, val) {
+ return key === 'runnable' || key === 'test' ? undefined : val;
+ }, 2);
+};
diff --git a/tests/lib/mocha-2.2.5/lib/hook.js b/tests/lib/mocha-3.1.0/lib/hook.js
index c2dc346b44..0417e013cd 100755..100644
--- a/tests/lib/mocha-2.2.5/lib/hook.js
+++ b/tests/lib/mocha-3.1.0/lib/hook.js
@@ -3,6 +3,7 @@
*/
var Runnable = require('./runnable');
+var inherits = require('./utils').inherits;
/**
* Expose `Hook`.
@@ -17,7 +18,6 @@ module.exports = Hook;
* @param {Function} fn
* @api private
*/
-
function Hook(title, fn) {
Runnable.call(this, title, fn);
this.type = 'hook';
@@ -26,8 +26,7 @@ function Hook(title, fn) {
/**
* Inherit from `Runnable.prototype`.
*/
-
-Hook.prototype.__proto__ = Runnable.prototype;
+inherits(Hook, Runnable);
/**
* Get or set the test `err`.
@@ -36,10 +35,9 @@ Hook.prototype.__proto__ = Runnable.prototype;
* @return {Error}
* @api public
*/
-
-Hook.prototype.error = function(err){
- if (0 == arguments.length) {
- var err = this._error;
+Hook.prototype.error = function(err) {
+ if (!arguments.length) {
+ err = this._error;
this._error = null;
return err;
}
diff --git a/tests/lib/mocha-3.1.0/lib/interfaces/bdd.js b/tests/lib/mocha-3.1.0/lib/interfaces/bdd.js
new file mode 100644
index 0000000000..830a5fe67a
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/lib/interfaces/bdd.js
@@ -0,0 +1,113 @@
+/**
+ * Module dependencies.
+ */
+
+var Test = require('../test');
+
+/**
+ * BDD-style interface:
+ *
+ * describe('Array', function() {
+ * describe('#indexOf()', function() {
+ * it('should return -1 when not present', function() {
+ * // ...
+ * });
+ *
+ * it('should return the index when present', function() {
+ * // ...
+ * });
+ * });
+ * });
+ *
+ * @param {Suite} suite Root suite.
+ */
+module.exports = function(suite) {
+ var suites = [suite];
+
+ suite.on('pre-require', function(context, file, mocha) {
+ var common = require('./common')(suites, context, mocha);
+
+ context.before = common.before;
+ context.after = common.after;
+ context.beforeEach = common.beforeEach;
+ context.afterEach = common.afterEach;
+ context.run = mocha.options.delay && common.runWithSuite(suite);
+ /**
+ * Describe a "suite" with the given `title`
+ * and callback `fn` containing nested suites
+ * and/or tests.
+ */
+
+ context.describe = context.context = function(title, fn) {
+ return common.suite.create({
+ title: title,
+ file: file,
+ fn: fn
+ });
+ };
+
+ /**
+ * Pending describe.
+ */
+
+ context.xdescribe = context.xcontext = context.describe.skip = function(title, fn) {
+ return common.suite.skip({
+ title: title,
+ file: file,
+ fn: fn
+ });
+ };
+
+ /**
+ * Exclusive suite.
+ */
+
+ context.describe.only = function(title, fn) {
+ return common.suite.only({
+ title: title,
+ file: file,
+ fn: fn
+ });
+ };
+
+ /**
+ * Describe a specification or test-case
+ * with the given `title` and callback `fn`
+ * acting as a thunk.
+ */
+
+ context.it = context.specify = function(title, fn) {
+ var suite = suites[0];
+ if (suite.isPending()) {
+ fn = null;
+ }
+ var test = new Test(title, fn);
+ test.file = file;
+ suite.addTest(test);
+ return test;
+ };
+
+ /**
+ * Exclusive test-case.
+ */
+
+ context.it.only = function(title, fn) {
+ return common.test.only(mocha, context.it(title, fn));
+ };
+
+ /**
+ * Pending test case.
+ */
+
+ context.xit = context.xspecify = context.it.skip = function(title) {
+ context.it(title);
+ };
+
+ /**
+ * Number of attempts to retry.
+ */
+ context.it.retries = function(n) {
+ context.retries(n);
+ };
+ });
+};
diff --git a/tests/lib/mocha-3.1.0/lib/interfaces/common.js b/tests/lib/mocha-3.1.0/lib/interfaces/common.js
new file mode 100644
index 0000000000..447458487b
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/lib/interfaces/common.js
@@ -0,0 +1,158 @@
+'use strict';
+
+var Suite = require('../suite');
+
+/**
+ * Functions common to more than one interface.
+ *
+ * @param {Suite[]} suites
+ * @param {Context} context
+ * @param {Mocha} mocha
+ * @return {Object} An object containing common functions.
+ */
+module.exports = function(suites, context, mocha) {
+ return {
+ /**
+ * This is only present if flag --delay is passed into Mocha. It triggers
+ * root suite execution.
+ *
+ * @param {Suite} suite The root wuite.
+ * @return {Function} A function which runs the root suite
+ */
+ runWithSuite: function runWithSuite(suite) {
+ return function run() {
+ suite.run();
+ };
+ },
+
+ /**
+ * Execute before running tests.
+ *
+ * @param {string} name
+ * @param {Function} fn
+ */
+ before: function(name, fn) {
+ suites[0].beforeAll(name, fn);
+ },
+
+ /**
+ * Execute after running tests.
+ *
+ * @param {string} name
+ * @param {Function} fn
+ */
+ after: function(name, fn) {
+ suites[0].afterAll(name, fn);
+ },
+
+ /**
+ * Execute before each test case.
+ *
+ * @param {string} name
+ * @param {Function} fn
+ */
+ beforeEach: function(name, fn) {
+ suites[0].beforeEach(name, fn);
+ },
+
+ /**
+ * Execute after each test case.
+ *
+ * @param {string} name
+ * @param {Function} fn
+ */
+ afterEach: function(name, fn) {
+ suites[0].afterEach(name, fn);
+ },
+
+ suite: {
+ /**
+ * Create an exclusive Suite; convenience function
+ * See docstring for create() below.
+ *
+ * @param {Object} opts
+ * @returns {Suite}
+ */
+ only: function only(opts) {
+ mocha.options.hasOnly = true;
+ opts.isOnly = true;
+ return this.create(opts);
+ },
+
+ /**
+ * Create a Suite, but skip it; convenience function
+ * See docstring for create() below.
+ *
+ * @param {Object} opts
+ * @returns {Suite}
+ */
+ skip: function skip(opts) {
+ opts.pending = true;
+ return this.create(opts);
+ },
+
+ /**
+ * Creates a suite.
+ * @param {Object} opts Options
+ * @param {string} opts.title Title of Suite
+ * @param {Function} [opts.fn] Suite Function (not always applicable)
+ * @param {boolean} [opts.pending] Is Suite pending?
+ * @param {string} [opts.file] Filepath where this Suite resides
+ * @param {boolean} [opts.isOnly] Is Suite exclusive?
+ * @returns {Suite}
+ */
+ create: function create(opts) {
+ var suite = Suite.create(suites[0], opts.title);
+ suite.pending = Boolean(opts.pending);
+ suite.file = opts.file;
+ suites.unshift(suite);
+ if (opts.isOnly) {
+ suite.parent._onlySuites = suite.parent._onlySuites.concat(suite);
+ mocha.options.hasOnly = true;
+ }
+ if (typeof opts.fn === 'function') {
+ opts.fn.call(suite);
+ suites.shift();
+ } else if (typeof opts.fn === 'undefined' && !suite.pending) {
+ throw new Error('Suite "' + suite.fullTitle() + '" was defined but no callback was supplied. Supply a callback or explicitly skip the suite.');
+ }
+
+ return suite;
+ }
+ },
+
+ test: {
+
+ /**
+ * Exclusive test-case.
+ *
+ * @param {Object} mocha
+ * @param {Function} test
+ * @returns {*}
+ */
+ only: function(mocha, test) {
+ test.parent._onlyTests = test.parent._onlyTests.concat(test);
+ mocha.options.hasOnly = true;
+ return test;
+ },
+
+ /**
+ * Pending test case.
+ *
+ * @param {string} title
+ */
+ skip: function(title) {
+ context.test(title);
+ },
+
+ /**
+ * Number of retry attempts
+ *
+ * @param {number} n
+ */
+ retries: function(n) {
+ context.retries(n);
+ }
+ }
+ };
+};
diff --git a/tests/lib/mocha-2.2.5/lib/interfaces/exports.js b/tests/lib/mocha-3.1.0/lib/interfaces/exports.js
index 95e8a07012..7db6e47c97 100755..100644
--- a/tests/lib/mocha-2.2.5/lib/interfaces/exports.js
+++ b/tests/lib/mocha-3.1.0/lib/interfaces/exports.js
@@ -2,27 +2,27 @@
* Module dependencies.
*/
-var Suite = require('../suite')
- , Test = require('../test');
+var Suite = require('../suite');
+var Test = require('../test');
/**
- * TDD-style interface:
+ * Exports-style (as Node.js module) interface:
*
* exports.Array = {
* '#indexOf()': {
- * 'should return -1 when the value is not present': function(){
+ * 'should return -1 when the value is not present': function() {
*
* },
*
- * 'should return the correct index when the value is present': function(){
+ * 'should return the correct index when the value is present': function() {
*
* }
* }
* };
*
+ * @param {Suite} suite Root suite.
*/
-
-module.exports = function(suite){
+module.exports = function(suite) {
var suites = [suite];
suite.on('require', visit);
@@ -30,7 +30,7 @@ module.exports = function(suite){
function visit(obj, file) {
var suite;
for (var key in obj) {
- if ('function' == typeof obj[key]) {
+ if (typeof obj[key] === 'function') {
var fn = obj[key];
switch (key) {
case 'before':
@@ -53,7 +53,7 @@ module.exports = function(suite){
} else {
suite = Suite.create(suites[0], key);
suites.unshift(suite);
- visit(obj[key]);
+ visit(obj[key], file);
suites.shift();
}
}
diff --git a/tests/lib/mocha-2.2.5/lib/interfaces/index.js b/tests/lib/mocha-3.1.0/lib/interfaces/index.js
index 4f825d15b2..4f825d15b2 100755..100644
--- a/tests/lib/mocha-2.2.5/lib/interfaces/index.js
+++ b/tests/lib/mocha-3.1.0/lib/interfaces/index.js
diff --git a/tests/lib/mocha-2.2.5/lib/interfaces/qunit.js b/tests/lib/mocha-3.1.0/lib/interfaces/qunit.js
index 6668967ca3..22e8080e2e 100755..100644
--- a/tests/lib/mocha-2.2.5/lib/interfaces/qunit.js
+++ b/tests/lib/mocha-3.1.0/lib/interfaces/qunit.js
@@ -2,22 +2,19 @@
* Module dependencies.
*/
-var Suite = require('../suite')
- , Test = require('../test')
- , escapeRe = require('escape-string-regexp')
- , utils = require('../utils');
+var Test = require('../test');
/**
* QUnit-style interface:
*
* suite('Array');
*
- * test('#length', function(){
+ * test('#length', function() {
* var arr = [1,2,3];
* ok(arr.length == 3);
* });
*
- * test('#indexOf()', function(){
+ * test('#indexOf()', function() {
* var arr = [1,2,3];
* ok(arr.indexOf(1) == 0);
* ok(arr.indexOf(2) == 1);
@@ -26,18 +23,17 @@ var Suite = require('../suite')
*
* suite('String');
*
- * test('#length', function(){
+ * test('#length', function() {
* ok('foo'.length == 3);
* });
*
+ * @param {Suite} suite Root suite.
*/
-
-module.exports = function(suite){
+module.exports = function(suite) {
var suites = [suite];
- suite.on('pre-require', function(context, file, mocha){
-
- var common = require('./common')(suites, context);
+ suite.on('pre-require', function(context, file, mocha) {
+ var common = require('./common')(suites, context, mocha);
context.before = common.before;
context.after = common.after;
@@ -48,21 +44,30 @@ module.exports = function(suite){
* Describe a "suite" with the given `title`.
*/
- context.suite = function(title){
- if (suites.length > 1) suites.shift();
- var suite = Suite.create(suites[0], title);
- suite.file = file;
- suites.unshift(suite);
- return suite;
+ context.suite = function(title) {
+ if (suites.length > 1) {
+ suites.shift();
+ }
+ return common.suite.create({
+ title: title,
+ file: file,
+ fn: false
+ });
};
/**
- * Exclusive test-case.
+ * Exclusive Suite.
*/
- context.suite.only = function(title, fn){
- var suite = context.suite(title, fn);
- mocha.grep(suite.fullTitle());
+ context.suite.only = function(title) {
+ if (suites.length > 1) {
+ suites.shift();
+ }
+ return common.suite.only({
+ title: title,
+ file: file,
+ fn: false
+ });
};
/**
@@ -71,7 +76,7 @@ module.exports = function(suite){
* acting as a thunk.
*/
- context.test = function(title, fn){
+ context.test = function(title, fn) {
var test = new Test(title, fn);
test.file = file;
suites[0].addTest(test);
@@ -82,13 +87,11 @@ module.exports = function(suite){
* Exclusive test-case.
*/
- context.test.only = function(title, fn){
- var test = context.test(title, fn);
- var reString = '^' + escapeRe(test.fullTitle()) + '$';
- mocha.grep(new RegExp(reString));
+ context.test.only = function(title, fn) {
+ return common.test.only(mocha, context.test(title, fn));
};
context.test.skip = common.test.skip;
-
+ context.test.retries = common.test.retries;
});
};
diff --git a/tests/lib/mocha-3.1.0/lib/interfaces/tdd.js b/tests/lib/mocha-3.1.0/lib/interfaces/tdd.js
new file mode 100644
index 0000000000..445e992213
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/lib/interfaces/tdd.js
@@ -0,0 +1,104 @@
+/**
+ * Module dependencies.
+ */
+
+var Test = require('../test');
+
+/**
+ * TDD-style interface:
+ *
+ * suite('Array', function() {
+ * suite('#indexOf()', function() {
+ * suiteSetup(function() {
+ *
+ * });
+ *
+ * test('should return -1 when not present', function() {
+ *
+ * });
+ *
+ * test('should return the index when present', function() {
+ *
+ * });
+ *
+ * suiteTeardown(function() {
+ *
+ * });
+ * });
+ * });
+ *
+ * @param {Suite} suite Root suite.
+ */
+module.exports = function(suite) {
+ var suites = [suite];
+
+ suite.on('pre-require', function(context, file, mocha) {
+ var common = require('./common')(suites, context, mocha);
+
+ context.setup = common.beforeEach;
+ context.teardown = common.afterEach;
+ context.suiteSetup = common.before;
+ context.suiteTeardown = common.after;
+ context.run = mocha.options.delay && common.runWithSuite(suite);
+
+ /**
+ * Describe a "suite" with the given `title` and callback `fn` containing
+ * nested suites and/or tests.
+ */
+ context.suite = function(title, fn) {
+ return common.suite.create({
+ title: title,
+ file: file,
+ fn: fn
+ });
+ };
+
+ /**
+ * Pending suite.
+ */
+ context.suite.skip = function(title, fn) {
+ return common.suite.skip({
+ title: title,
+ file: file,
+ fn: fn
+ });
+ };
+
+ /**
+ * Exclusive test-case.
+ */
+ context.suite.only = function(title, fn) {
+ return common.suite.only({
+ title: title,
+ file: file,
+ fn: fn
+ });
+ };
+
+ /**
+ * Describe a specification or test-case with the given `title` and
+ * callback `fn` acting as a thunk.
+ */
+ context.test = function(title, fn) {
+ var suite = suites[0];
+ if (suite.isPending()) {
+ fn = null;
+ }
+ var test = new Test(title, fn);
+ test.file = file;
+ suite.addTest(test);
+ return test;
+ };
+
+ /**
+ * Exclusive test-case.
+ */
+
+ context.test.only = function(title, fn) {
+ return common.test.only(mocha, context.test(title, fn));
+ };
+
+ context.test.skip = common.test.skip;
+ context.test.retries = common.test.retries;
+ });
+};
diff --git a/tests/lib/mocha-2.2.5/lib/mocha.js b/tests/lib/mocha-3.1.0/lib/mocha.js
index 8a11124cb1..a649715191 100755..100644
--- a/tests/lib/mocha-2.2.5/lib/mocha.js
+++ b/tests/lib/mocha-3.1.0/lib/mocha.js
@@ -8,9 +8,10 @@
* Module dependencies.
*/
-var path = require('path')
- , escapeRe = require('escape-string-regexp')
- , utils = require('./utils');
+var escapeRe = require('escape-string-regexp');
+var path = require('path');
+var reporters = require('./reporters');
+var utils = require('./utils');
/**
* Expose `Mocha`.
@@ -22,10 +23,9 @@ exports = module.exports = Mocha;
* To require local UIs and reporters when running in node.
*/
-if (typeof process !== 'undefined' && typeof process.cwd === 'function') {
- var join = path.join
- , cwd = process.cwd();
- module.paths.push(cwd, join(cwd, 'node_modules'));
+if (!process.browser) {
+ var cwd = process.cwd();
+ module.paths.push(cwd, path.join(cwd, 'node_modules'));
}
/**
@@ -34,7 +34,7 @@ if (typeof process !== 'undefined' && typeof process.cwd === 'function') {
exports.utils = utils;
exports.interfaces = require('./interfaces');
-exports.reporters = require('./reporters');
+exports.reporters = reporters;
exports.Runnable = require('./runnable');
exports.Context = require('./context');
exports.Runner = require('./runner');
@@ -45,17 +45,16 @@ exports.Test = require('./test');
/**
* Return image `name` path.
*
- * @param {String} name
- * @return {String}
* @api private
+ * @param {string} name
+ * @return {string}
*/
-
function image(name) {
- return __dirname + '/../images/' + name + '.png';
+ return path.join(__dirname, '../images', name + '.png');
}
/**
- * Setup mocha with `options`.
+ * Set up mocha with `options`.
*
* Options:
*
@@ -63,6 +62,7 @@ function image(name) {
* - `reporter` reporter instance, defaults to `mocha.reporters.spec`
* - `globals` array of accepted globals
* - `timeout` timeout in milliseconds
+ * - `retries` number of times to retry failed tests
* - `bail` bail on the first test failure
* - `slow` milliseconds to wait before considering a test slow
* - `ignoreLeaks` ignore global leaks
@@ -72,48 +72,45 @@ function image(name) {
* @param {Object} options
* @api public
*/
-
function Mocha(options) {
options = options || {};
this.files = [];
this.options = options;
- if (options.grep) this.grep(new RegExp(options.grep));
- if (options.fgrep) this.grep(options.fgrep);
- this.suite = new exports.Suite('', new exports.Context);
+ if (options.grep) {
+ this.grep(new RegExp(options.grep));
+ }
+ if (options.fgrep) {
+ this.fgrep(options.fgrep);
+ }
+ this.suite = new exports.Suite('', new exports.Context());
this.ui(options.ui);
this.bail(options.bail);
this.reporter(options.reporter, options.reporterOptions);
- if (null != options.timeout) this.timeout(options.timeout);
+ if (typeof options.timeout !== 'undefined' && options.timeout !== null) {
+ this.timeout(options.timeout);
+ }
+ if (typeof options.retries !== 'undefined' && options.retries !== null) {
+ this.retries(options.retries);
+ }
this.useColors(options.useColors);
- if (options.enableTimeouts !== null) this.enableTimeouts(options.enableTimeouts);
- if (options.slow) this.slow(options.slow);
-
- this.suite.on('pre-require', function (context) {
- exports.afterEach = context.afterEach || context.teardown;
- exports.after = context.after || context.suiteTeardown;
- exports.beforeEach = context.beforeEach || context.setup;
- exports.before = context.before || context.suiteSetup;
- exports.describe = context.describe || context.suite;
- exports.it = context.it || context.test;
- exports.setup = context.setup || context.beforeEach;
- exports.suiteSetup = context.suiteSetup || context.before;
- exports.suiteTeardown = context.suiteTeardown || context.after;
- exports.suite = context.suite || context.describe;
- exports.teardown = context.teardown || context.afterEach;
- exports.test = context.test || context.it;
- exports.run = context.run;
- });
+ if (options.enableTimeouts !== null) {
+ this.enableTimeouts(options.enableTimeouts);
+ }
+ if (options.slow) {
+ this.slow(options.slow);
+ }
}
/**
* Enable or disable bailing on the first failure.
*
- * @param {Boolean} [bail]
* @api public
+ * @param {boolean} [bail]
*/
-
-Mocha.prototype.bail = function(bail){
- if (0 == arguments.length) bail = true;
+Mocha.prototype.bail = function(bail) {
+ if (!arguments.length) {
+ bail = true;
+ }
this.suite.bail(bail);
return this;
};
@@ -121,11 +118,10 @@ Mocha.prototype.bail = function(bail){
/**
* Add test `file`.
*
- * @param {String} file
* @api public
+ * @param {string} file
*/
-
-Mocha.prototype.addFile = function(file){
+Mocha.prototype.addFile = function(file) {
this.files.push(file);
return this;
};
@@ -136,24 +132,37 @@ Mocha.prototype.addFile = function(file){
* @param {String|Function} reporter name or constructor
* @param {Object} reporterOptions optional options
* @api public
+ * @param {string|Function} reporter name or constructor
+ * @param {Object} reporterOptions optional options
*/
-Mocha.prototype.reporter = function(reporter, reporterOptions){
- if ('function' == typeof reporter) {
+Mocha.prototype.reporter = function(reporter, reporterOptions) {
+ if (typeof reporter === 'function') {
this._reporter = reporter;
} else {
reporter = reporter || 'spec';
var _reporter;
- try { _reporter = require('./reporters/' + reporter); } catch (err) {}
- if (!_reporter) try { _reporter = require(reporter); } catch (err) {
- err.message.indexOf('Cannot find module') !== -1
- ? console.warn('"' + reporter + '" reporter not found')
- : console.warn('"' + reporter + '" reporter blew up with error:\n' + err.stack);
+ // Try to load a built-in reporter.
+ if (reporters[reporter]) {
+ _reporter = reporters[reporter];
+ }
+ // Try to load reporters from process.cwd() and node_modules
+ if (!_reporter) {
+ try {
+ _reporter = require(reporter);
+ } catch (err) {
+ err.message.indexOf('Cannot find module') !== -1
+ ? console.warn('"' + reporter + '" reporter not found')
+ : console.warn('"' + reporter + '" reporter blew up with error:\n' + err.stack);
+ }
+ }
+ if (!_reporter && reporter === 'teamcity') {
+ console.warn('The Teamcity reporter was moved to a package named '
+ + 'mocha-teamcity-reporter '
+ + '(https://npmjs.org/package/mocha-teamcity-reporter).');
+ }
+ if (!_reporter) {
+ throw new Error('invalid reporter "' + reporter + '"');
}
- if (!_reporter && reporter === 'teamcity')
- console.warn('The Teamcity reporter was moved to a package named ' +
- 'mocha-teamcity-reporter ' +
- '(https://npmjs.org/package/mocha-teamcity-reporter).');
- if (!_reporter) throw new Error('invalid reporter "' + reporter + '"');
this._reporter = _reporter;
}
this.options.reporterOptions = reporterOptions;
@@ -163,16 +172,37 @@ Mocha.prototype.reporter = function(reporter, reporterOptions){
/**
* Set test UI `name`, defaults to "bdd".
*
- * @param {String} bdd
* @api public
+ * @param {string} bdd
*/
-
-Mocha.prototype.ui = function(name){
+Mocha.prototype.ui = function(name) {
name = name || 'bdd';
this._ui = exports.interfaces[name];
- if (!this._ui) try { this._ui = require(name); } catch (err) {}
- if (!this._ui) throw new Error('invalid interface "' + name + '"');
+ if (!this._ui) {
+ try {
+ this._ui = require(name);
+ } catch (err) {
+ throw new Error('invalid interface "' + name + '"');
+ }
+ }
this._ui = this._ui(this.suite);
+
+ this.suite.on('pre-require', function(context) {
+ exports.afterEach = context.afterEach || context.teardown;
+ exports.after = context.after || context.suiteTeardown;
+ exports.beforeEach = context.beforeEach || context.setup;
+ exports.before = context.before || context.suiteSetup;
+ exports.describe = context.describe || context.suite;
+ exports.it = context.it || context.test;
+ exports.setup = context.setup || context.beforeEach;
+ exports.suiteSetup = context.suiteSetup || context.before;
+ exports.suiteTeardown = context.suiteTeardown || context.after;
+ exports.suite = context.suite || context.describe;
+ exports.teardown = context.teardown || context.afterEach;
+ exports.test = context.test || context.it;
+ exports.run = context.run;
+ });
+
return this;
};
@@ -181,18 +211,16 @@ Mocha.prototype.ui = function(name){
*
* @api private
*/
-
-Mocha.prototype.loadFiles = function(fn){
+Mocha.prototype.loadFiles = function(fn) {
var self = this;
var suite = this.suite;
- var pending = this.files.length;
- this.files.forEach(function(file){
+ this.files.forEach(function(file) {
file = path.resolve(file);
suite.emit('pre-require', global, file, self);
suite.emit('require', require(file), file, self);
suite.emit('post-require', global, file, self);
- --pending || (fn && fn());
});
+ fn && fn();
};
/**
@@ -200,48 +228,61 @@ Mocha.prototype.loadFiles = function(fn){
*
* @api private
*/
-
Mocha.prototype._growl = function(runner, reporter) {
var notify = require('growl');
- runner.on('end', function(){
+ runner.on('end', function() {
var stats = reporter.stats;
if (stats.failures) {
var msg = stats.failures + ' of ' + runner.total + ' tests failed';
notify(msg, { name: 'mocha', title: 'Failed', image: image('error') });
} else {
notify(stats.passes + ' tests passed in ' + stats.duration + 'ms', {
- name: 'mocha'
- , title: 'Passed'
- , image: image('ok')
+ name: 'mocha',
+ title: 'Passed',
+ image: image('ok')
});
}
});
};
/**
+ * Escape string and add it to grep as a regexp.
+ *
+ * @api public
+ * @param str
+ * @returns {Mocha}
+ */
+Mocha.prototype.fgrep = function(str) {
+ return this.grep(new RegExp(escapeRe(str)));
+};
+
+/**
* Add regexp to grep, if `re` is a string it is escaped.
*
* @param {RegExp|String} re
* @return {Mocha}
* @api public
+ * @param {RegExp|string} re
+ * @return {Mocha}
*/
-
-Mocha.prototype.grep = function(re){
- this.options.grep = 'string' == typeof re
- ? new RegExp(escapeRe(re))
- : re;
+Mocha.prototype.grep = function(re) {
+ if (utils.isString(re)) {
+ // extract args if it's regex-like, i.e: [string, pattern, flag]
+ var arg = re.match(/^\/(.*)\/(g|i|)$|.*/);
+ this.options.grep = new RegExp(arg[1] || arg[0], arg[2]);
+ } else {
+ this.options.grep = re;
+ }
return this;
};
-
/**
* Invert `.grep()` matches.
*
* @return {Mocha}
* @api public
*/
-
-Mocha.prototype.invert = function(){
+Mocha.prototype.invert = function() {
this.options.invert = true;
return this;
};
@@ -252,10 +293,11 @@ Mocha.prototype.invert = function(){
* @param {Boolean} ignore
* @return {Mocha}
* @api public
+ * @param {boolean} ignore
+ * @return {Mocha}
*/
-
-Mocha.prototype.ignoreLeaks = function(ignore){
- this.options.ignoreLeaks = !!ignore;
+Mocha.prototype.ignoreLeaks = function(ignore) {
+ this.options.ignoreLeaks = Boolean(ignore);
return this;
};
@@ -265,8 +307,7 @@ Mocha.prototype.ignoreLeaks = function(ignore){
* @return {Mocha}
* @api public
*/
-
-Mocha.prototype.checkLeaks = function(){
+Mocha.prototype.checkLeaks = function() {
this.options.ignoreLeaks = false;
return this;
};
@@ -277,7 +318,6 @@ Mocha.prototype.checkLeaks = function(){
* @return {Mocha}
* @api public
*/
-
Mocha.prototype.fullTrace = function() {
this.options.fullStackTrace = true;
return this;
@@ -289,8 +329,7 @@ Mocha.prototype.fullTrace = function() {
* @return {Mocha}
* @api public
*/
-
-Mocha.prototype.growl = function(){
+Mocha.prototype.growl = function() {
this.options.growl = true;
return this;
};
@@ -301,9 +340,10 @@ Mocha.prototype.growl = function(){
* @param {Array|String} globals
* @return {Mocha}
* @api public
+ * @param {Array|string} globals
+ * @return {Mocha}
*/
-
-Mocha.prototype.globals = function(globals){
+Mocha.prototype.globals = function(globals) {
this.options.globals = (this.options.globals || []).concat(globals);
return this;
};
@@ -314,9 +354,10 @@ Mocha.prototype.globals = function(globals){
* @param {Boolean} colors
* @return {Mocha}
* @api public
+ * @param {boolean} colors
+ * @return {Mocha}
*/
-
-Mocha.prototype.useColors = function(colors){
+Mocha.prototype.useColors = function(colors) {
if (colors !== undefined) {
this.options.useColors = colors;
}
@@ -329,12 +370,11 @@ Mocha.prototype.useColors = function(colors){
* @param {Boolean} inlineDiffs
* @return {Mocha}
* @api public
+ * @param {boolean} inlineDiffs
+ * @return {Mocha}
*/
-
Mocha.prototype.useInlineDiffs = function(inlineDiffs) {
- this.options.useInlineDiffs = arguments.length && inlineDiffs != undefined
- ? inlineDiffs
- : false;
+ this.options.useInlineDiffs = inlineDiffs !== undefined && inlineDiffs;
return this;
};
@@ -344,22 +384,36 @@ Mocha.prototype.useInlineDiffs = function(inlineDiffs) {
* @param {Number} timeout
* @return {Mocha}
* @api public
+ * @param {number} timeout
+ * @return {Mocha}
*/
-
-Mocha.prototype.timeout = function(timeout){
+Mocha.prototype.timeout = function(timeout) {
this.suite.timeout(timeout);
return this;
};
/**
+ * Set the number of times to retry failed tests.
+ *
+ * @param {Number} retry times
+ * @return {Mocha}
+ * @api public
+ */
+Mocha.prototype.retries = function(n) {
+ this.suite.retries(n);
+ return this;
+};
+
+/**
* Set slowness threshold in milliseconds.
*
* @param {Number} slow
* @return {Mocha}
* @api public
+ * @param {number} slow
+ * @return {Mocha}
*/
-
-Mocha.prototype.slow = function(slow){
+Mocha.prototype.slow = function(slow) {
this.suite.slow(slow);
return this;
};
@@ -370,13 +424,12 @@ Mocha.prototype.slow = function(slow){
* @param {Boolean} enabled
* @return {Mocha}
* @api public
+ * @param {boolean} enabled
+ * @return {Mocha}
*/
-
Mocha.prototype.enableTimeouts = function(enabled) {
- this.suite.enableTimeouts(arguments.length && enabled !== undefined
- ? enabled
- : true);
- return this
+ this.suite.enableTimeouts(arguments.length && enabled !== undefined ? enabled : true);
+ return this;
};
/**
@@ -385,15 +438,14 @@ Mocha.prototype.enableTimeouts = function(enabled) {
* @return {Mocha}
* @api public
*/
-
-Mocha.prototype.asyncOnly = function(){
+Mocha.prototype.asyncOnly = function() {
this.options.asyncOnly = true;
return this;
};
/**
* Disable syntax highlighting (in browser).
- * @returns {Mocha}
+ *
* @api public
*/
Mocha.prototype.noHighlighting = function() {
@@ -402,9 +454,19 @@ Mocha.prototype.noHighlighting = function() {
};
/**
+ * Enable uncaught errors to propagate (in browser).
+ *
+ * @return {Mocha}
+ * @api public
+ */
+Mocha.prototype.allowUncaught = function() {
+ this.options.allowUncaught = true;
+ return this;
+};
+
+/**
* Delay root suite execution.
* @returns {Mocha}
- * @api public
*/
Mocha.prototype.delay = function delay() {
this.options.delay = true;
@@ -414,32 +476,44 @@ Mocha.prototype.delay = function delay() {
/**
* Run tests and invoke `fn()` when complete.
*
+ * @api public
* @param {Function} fn
* @return {Runner}
- * @api public
*/
-Mocha.prototype.run = function(fn){
- if (this.files.length) this.loadFiles();
+Mocha.prototype.run = function(fn) {
+ if (this.files.length) {
+ this.loadFiles();
+ }
var suite = this.suite;
var options = this.options;
options.files = this.files;
var runner = new exports.Runner(suite, options.delay);
var reporter = new this._reporter(runner, options);
- runner.ignoreLeaks = false !== options.ignoreLeaks;
+ runner.ignoreLeaks = options.ignoreLeaks !== false;
runner.fullStackTrace = options.fullStackTrace;
+ runner.hasOnly = options.hasOnly;
runner.asyncOnly = options.asyncOnly;
- if (options.grep) runner.grep(options.grep, options.invert);
- if (options.globals) runner.globals(options.globals);
- if (options.growl) this._growl(runner, reporter);
+ runner.allowUncaught = options.allowUncaught;
+ if (options.grep) {
+ runner.grep(options.grep, options.invert);
+ }
+ if (options.globals) {
+ runner.globals(options.globals);
+ }
+ if (options.growl) {
+ this._growl(runner, reporter);
+ }
if (options.useColors !== undefined) {
exports.reporters.Base.useColors = options.useColors;
}
exports.reporters.Base.inlineDiffs = options.useInlineDiffs;
function done(failures) {
- if (reporter.done) {
- reporter.done(failures, fn);
- } else fn && fn(failures);
+ if (reporter.done) {
+ reporter.done(failures, fn);
+ } else {
+ fn && fn(failures);
+ }
}
return runner.run(done);
diff --git a/tests/lib/mocha-2.2.5/lib/ms.js b/tests/lib/mocha-3.1.0/lib/ms.js
index ba451fab6c..12fddc18ae 100755..100644
--- a/tests/lib/mocha-2.2.5/lib/ms.js
+++ b/tests/lib/mocha-3.1.0/lib/ms.js
@@ -15,29 +15,32 @@ var y = d * 365.25;
*
* - `long` verbose formatting [false]
*
- * @param {String|Number} val
- * @param {Object} options
- * @return {String|Number}
* @api public
+ * @param {string|number} val
+ * @param {Object} options
+ * @return {string|number}
*/
-
-module.exports = function(val, options){
+module.exports = function(val, options) {
options = options || {};
- if ('string' == typeof val) return parse(val);
+ if (typeof val === 'string') {
+ return parse(val);
+ }
+ // https://github.com/mochajs/mocha/pull/1035
return options['long'] ? longFormat(val) : shortFormat(val);
};
/**
* Parse the given `str` and return milliseconds.
*
- * @param {String} str
- * @return {Number}
* @api private
+ * @param {string} str
+ * @return {number}
*/
-
function parse(str) {
- var match = /^((?:\d+)?\.?\d+) *(ms|seconds?|s|minutes?|m|hours?|h|days?|d|years?|y)?$/i.exec(str);
- if (!match) return;
+ var match = (/^((?:\d+)?\.?\d+) *(ms|seconds?|s|minutes?|m|hours?|h|days?|d|years?|y)?$/i).exec(str);
+ if (!match) {
+ return;
+ }
var n = parseFloat(match[1]);
var type = (match[2] || 'ms').toLowerCase();
switch (type) {
@@ -63,33 +66,41 @@ function parse(str) {
return n * s;
case 'ms':
return n;
+ default:
+ // No default case
}
}
/**
* Short format for `ms`.
*
- * @param {Number} ms
- * @return {String}
* @api private
+ * @param {number} ms
+ * @return {string}
*/
-
function shortFormat(ms) {
- if (ms >= d) return Math.round(ms / d) + 'd';
- if (ms >= h) return Math.round(ms / h) + 'h';
- if (ms >= m) return Math.round(ms / m) + 'm';
- if (ms >= s) return Math.round(ms / s) + 's';
+ if (ms >= d) {
+ return Math.round(ms / d) + 'd';
+ }
+ if (ms >= h) {
+ return Math.round(ms / h) + 'h';
+ }
+ if (ms >= m) {
+ return Math.round(ms / m) + 'm';
+ }
+ if (ms >= s) {
+ return Math.round(ms / s) + 's';
+ }
return ms + 'ms';
}
/**
* Long format for `ms`.
*
- * @param {Number} ms
- * @return {String}
* @api private
+ * @param {number} ms
+ * @return {string}
*/
-
function longFormat(ms) {
return plural(ms, d, 'day')
|| plural(ms, h, 'hour')
@@ -100,10 +111,18 @@ function longFormat(ms) {
/**
* Pluralization helper.
+ *
+ * @api private
+ * @param {number} ms
+ * @param {number} n
+ * @param {string} name
*/
-
function plural(ms, n, name) {
- if (ms < n) return;
- if (ms < n * 1.5) return Math.floor(ms / n) + ' ' + name;
+ if (ms < n) {
+ return;
+ }
+ if (ms < n * 1.5) {
+ return Math.floor(ms / n) + ' ' + name;
+ }
return Math.ceil(ms / n) + ' ' + name + 's';
}
diff --git a/tests/lib/mocha-2.2.5/lib/pending.js b/tests/lib/mocha-3.1.0/lib/pending.js
index 265ec73c18..c847e04e3f 100755..100644
--- a/tests/lib/mocha-2.2.5/lib/pending.js
+++ b/tests/lib/mocha-3.1.0/lib/pending.js
@@ -8,9 +8,8 @@ module.exports = Pending;
/**
* Initialize a new `Pending` error with the given message.
*
- * @param {String} message
+ * @param {string} message
*/
-
function Pending(message) {
- this.message = message;
+ this.message = message;
}
diff --git a/tests/lib/mocha-2.2.5/lib/reporters/base.js b/tests/lib/mocha-3.1.0/lib/reporters/base.js
index 9b719a80e7..c754c5231f 100755..100644
--- a/tests/lib/mocha-2.2.5/lib/reporters/base.js
+++ b/tests/lib/mocha-3.1.0/lib/reporters/base.js
@@ -2,41 +2,42 @@
* Module dependencies.
*/
-var tty = require('tty')
- , diff = require('diff')
- , ms = require('../ms')
- , utils = require('../utils')
- , supportsColor = process.env ? require('supports-color') : null;
+var tty = require('tty');
+var diff = require('diff');
+var ms = require('../ms');
+var utils = require('../utils');
+var supportsColor = process.browser ? null : require('supports-color');
/**
- * Save timer references to avoid Sinon interfering (see GH-237).
+ * Expose `Base`.
*/
-var Date = global.Date
- , setTimeout = global.setTimeout
- , setInterval = global.setInterval
- , clearTimeout = global.clearTimeout
- , clearInterval = global.clearInterval;
+exports = module.exports = Base;
/**
- * Check if both stdio streams are associated with a tty.
+ * Save timer references to avoid Sinon interfering.
+ * See: https://github.com/mochajs/mocha/issues/237
*/
-var isatty = tty.isatty(1) && tty.isatty(2);
+/* eslint-disable no-unused-vars, no-native-reassign */
+var Date = global.Date;
+var setTimeout = global.setTimeout;
+var setInterval = global.setInterval;
+var clearTimeout = global.clearTimeout;
+var clearInterval = global.clearInterval;
+/* eslint-enable no-unused-vars, no-native-reassign */
/**
- * Expose `Base`.
+ * Check if both stdio streams are associated with a tty.
*/
-exports = module.exports = Base;
+var isatty = tty.isatty(1) && tty.isatty(2);
/**
* Enable coloring by default, except in the browser interface.
*/
-exports.useColors = process.env
- ? (supportsColor || (process.env.MOCHA_COLORS !== undefined))
- : false;
+exports.useColors = !process.browser && (supportsColor || (process.env.MOCHA_COLORS !== undefined));
/**
* Inline diffs instead of +/-
@@ -49,25 +50,25 @@ exports.inlineDiffs = false;
*/
exports.colors = {
- 'pass': 90
- , 'fail': 31
- , 'bright pass': 92
- , 'bright fail': 91
- , 'bright yellow': 93
- , 'pending': 36
- , 'suite': 0
- , 'error title': 0
- , 'error message': 31
- , 'error stack': 90
- , 'checkmark': 32
- , 'fast': 90
- , 'medium': 33
- , 'slow': 31
- , 'green': 32
- , 'light': 90
- , 'diff gutter': 90
- , 'diff added': 32
- , 'diff removed': 31
+ pass: 90,
+ fail: 31,
+ 'bright pass': 92,
+ 'bright fail': 91,
+ 'bright yellow': 93,
+ pending: 36,
+ suite: 0,
+ 'error title': 0,
+ 'error message': 31,
+ 'error stack': 90,
+ checkmark: 32,
+ fast: 90,
+ medium: 33,
+ slow: 31,
+ green: 32,
+ light: 90,
+ 'diff gutter': 90,
+ 'diff added': 32,
+ 'diff removed': 31
};
/**
@@ -77,11 +78,13 @@ exports.colors = {
exports.symbols = {
ok: '✓',
err: '✖',
- dot: '․'
+ dot: '․',
+ comma: ',',
+ bang: '!'
};
// With node.js on Windows: use symbols available in terminal default fonts
-if ('win32' == process.platform) {
+if (process.platform === 'win32') {
exports.symbols.ok = '\u221A';
exports.symbols.err = '\u00D7';
exports.symbols.dot = '.';
@@ -93,53 +96,54 @@ if ('win32' == process.platform) {
* as well as user-defined color
* schemes.
*
- * @param {String} type
- * @param {String} str
- * @return {String}
+ * @param {string} type
+ * @param {string} str
+ * @return {string}
* @api private
*/
-
var color = exports.color = function(type, str) {
- if (!exports.useColors) return String(str);
+ if (!exports.useColors) {
+ return String(str);
+ }
return '\u001b[' + exports.colors[type] + 'm' + str + '\u001b[0m';
};
/**
- * Expose term window size, with some
- * defaults for when stderr is not a tty.
+ * Expose term window size, with some defaults for when stderr is not a tty.
*/
exports.window = {
- width: isatty
- ? process.stdout.getWindowSize
- ? process.stdout.getWindowSize(1)[0]
- : tty.getWindowSize()[1]
- : 75
+ width: 75
};
+if (isatty) {
+ exports.window.width = process.stdout.getWindowSize
+ ? process.stdout.getWindowSize(1)[0]
+ : tty.getWindowSize()[1];
+}
+
/**
- * Expose some basic cursor interactions
- * that are common among reporters.
+ * Expose some basic cursor interactions that are common among reporters.
*/
exports.cursor = {
- hide: function(){
+ hide: function() {
isatty && process.stdout.write('\u001b[?25l');
},
- show: function(){
+ show: function() {
isatty && process.stdout.write('\u001b[?25h');
},
- deleteLine: function(){
+ deleteLine: function() {
isatty && process.stdout.write('\u001b[2K');
},
- beginningOfLine: function(){
+ beginningOfLine: function() {
isatty && process.stdout.write('\u001b[0G');
},
- CR: function(){
+ CR: function() {
if (isatty) {
exports.cursor.deleteLine();
exports.cursor.beginningOfLine();
@@ -156,22 +160,31 @@ exports.cursor = {
* @api public
*/
-exports.list = function(failures){
+exports.list = function(failures) {
console.log();
- failures.forEach(function(test, i){
+ failures.forEach(function(test, i) {
// format
var fmt = color('error title', ' %s) %s:\n')
+ color('error message', ' %s')
+ color('error stack', '\n%s\n');
// msg
- var err = test.err
- , message = err.message || ''
- , stack = err.stack || message
- , index = stack.indexOf(message)
- , actual = err.actual
- , expected = err.expected
- , escape = true;
+ var msg;
+ var err = test.err;
+ var message;
+ if (err.message && typeof err.message.toString === 'function') {
+ message = err.message + '';
+ } else if (typeof err.inspect === 'function') {
+ message = err.inspect() + '';
+ } else {
+ message = '';
+ }
+ var stack = err.stack || message;
+ var index = message ? stack.indexOf(message) : -1;
+ var actual = err.actual;
+ var expected = err.expected;
+ var escape = true;
+
if (index === -1) {
msg = message;
} else {
@@ -186,9 +199,7 @@ exports.list = function(failures){
msg = 'Uncaught ' + msg;
}
// explicitly show diff
- if (err.showDiff !== false && sameType(actual, expected)
- && expected !== undefined) {
-
+ if (err.showDiff !== false && sameType(actual, expected) && expected !== undefined) {
escape = false;
if (!(utils.isString(actual) && utils.isString(expected))) {
err.actual = actual = utils.stringify(actual);
@@ -226,55 +237,57 @@ exports.list = function(failures){
*/
function Base(runner) {
- var self = this
- , stats = this.stats = { suites: 0, tests: 0, passes: 0, pending: 0, failures: 0 }
- , failures = this.failures = [];
+ var stats = this.stats = { suites: 0, tests: 0, passes: 0, pending: 0, failures: 0 };
+ var failures = this.failures = [];
- if (!runner) return;
+ if (!runner) {
+ return;
+ }
this.runner = runner;
runner.stats = stats;
- runner.on('start', function(){
- stats.start = new Date;
+ runner.on('start', function() {
+ stats.start = new Date();
});
- runner.on('suite', function(suite){
+ runner.on('suite', function(suite) {
stats.suites = stats.suites || 0;
suite.root || stats.suites++;
});
- runner.on('test end', function(test){
+ runner.on('test end', function() {
stats.tests = stats.tests || 0;
stats.tests++;
});
- runner.on('pass', function(test){
+ runner.on('pass', function(test) {
stats.passes = stats.passes || 0;
- var medium = test.slow() / 2;
- test.speed = test.duration > test.slow()
- ? 'slow'
- : test.duration > medium
- ? 'medium'
- : 'fast';
+ if (test.duration > test.slow()) {
+ test.speed = 'slow';
+ } else if (test.duration > test.slow() / 2) {
+ test.speed = 'medium';
+ } else {
+ test.speed = 'fast';
+ }
stats.passes++;
});
- runner.on('fail', function(test, err){
+ runner.on('fail', function(test, err) {
stats.failures = stats.failures || 0;
stats.failures++;
test.err = err;
failures.push(test);
});
- runner.on('end', function(){
- stats.end = new Date;
- stats.duration = new Date - stats.start;
+ runner.on('end', function() {
+ stats.end = new Date();
+ stats.duration = new Date() - stats.start;
});
- runner.on('pending', function(){
+ runner.on('pending', function() {
stats.pending++;
});
}
@@ -285,10 +298,8 @@ function Base(runner) {
*
* @api public
*/
-
-Base.prototype.epilogue = function(){
+Base.prototype.epilogue = function() {
var stats = this.stats;
- var tests;
var fmt;
console.log();
@@ -326,26 +337,24 @@ Base.prototype.epilogue = function(){
/**
* Pad the given `str` to `len`.
*
- * @param {String} str
- * @param {String} len
- * @return {String}
* @api private
+ * @param {string} str
+ * @param {string} len
+ * @return {string}
*/
-
function pad(str, len) {
str = String(str);
return Array(len - str.length + 1).join(' ') + str;
}
-
/**
* Returns an inline diff between 2 strings with coloured ANSI output
*
- * @param {Error} Error with actual/expected
- * @return {String} Diff
* @api private
+ * @param {Error} err with actual/expected
+ * @param {boolean} escape
+ * @return {string} Diff
*/
-
function inlineDiff(err, escape) {
var msg = errorDiff(err, 'WordsWithSpace', escape);
@@ -353,7 +362,7 @@ function inlineDiff(err, escape) {
var lines = msg.split('\n');
if (lines.length > 4) {
var width = String(lines.length).length;
- msg = lines.map(function(str, i){
+ msg = lines.map(function(str, i) {
return pad(++i, width) + ' |' + ' ' + str;
}).join('\n');
}
@@ -373,51 +382,64 @@ function inlineDiff(err, escape) {
}
/**
- * Returns a unified diff between 2 strings
+ * Returns a unified diff between two strings.
*
- * @param {Error} Error with actual/expected
- * @return {String} Diff
* @api private
+ * @param {Error} err with actual/expected
+ * @param {boolean} escape
+ * @return {string} The diff.
*/
-
function unifiedDiff(err, escape) {
var indent = ' ';
function cleanUp(line) {
if (escape) {
line = escapeInvisibles(line);
}
- if (line[0] === '+') return indent + colorLines('diff added', line);
- if (line[0] === '-') return indent + colorLines('diff removed', line);
- if (line.match(/\@\@/)) return null;
- if (line.match(/\\ No newline/)) return null;
- else return indent + line;
+ if (line[0] === '+') {
+ return indent + colorLines('diff added', line);
+ }
+ if (line[0] === '-') {
+ return indent + colorLines('diff removed', line);
+ }
+ if (line.match(/\@\@/)) {
+ return null;
+ }
+ if (line.match(/\\ No newline/)) {
+ return null;
+ }
+ return indent + line;
}
function notBlank(line) {
- return line != null;
+ return typeof line !== 'undefined' && line !== null;
}
var msg = diff.createPatch('string', err.actual, err.expected);
var lines = msg.split('\n').splice(4);
return '\n '
- + colorLines('diff added', '+ expected') + ' '
- + colorLines('diff removed', '- actual')
- + '\n\n'
- + lines.map(cleanUp).filter(notBlank).join('\n');
+ + colorLines('diff added', '+ expected') + ' '
+ + colorLines('diff removed', '- actual')
+ + '\n\n'
+ + lines.map(cleanUp).filter(notBlank).join('\n');
}
/**
* Return a character diff for `err`.
*
- * @param {Error} err
- * @return {String}
* @api private
+ * @param {Error} err
+ * @param {string} type
+ * @param {boolean} escape
+ * @return {string}
*/
-
function errorDiff(err, type, escape) {
- var actual = escape ? escapeInvisibles(err.actual) : err.actual;
+ var actual = escape ? escapeInvisibles(err.actual) : err.actual;
var expected = escape ? escapeInvisibles(err.expected) : err.expected;
- return diff['diff' + type](actual, expected).map(function(str){
- if (str.added) return colorLines('diff added', str.value);
- if (str.removed) return colorLines('diff removed', str.value);
+ return diff['diff' + type](actual, expected).map(function(str) {
+ if (str.added) {
+ return colorLines('diff added', str.value);
+ }
+ if (str.removed) {
+ return colorLines('diff removed', str.value);
+ }
return str.value;
}).join('');
}
@@ -425,42 +447,43 @@ function errorDiff(err, type, escape) {
/**
* Returns a string with all invisible characters in plain text
*
- * @param {String} line
- * @return {String}
* @api private
+ * @param {string} line
+ * @return {string}
*/
function escapeInvisibles(line) {
- return line.replace(/\t/g, '<tab>')
- .replace(/\r/g, '<CR>')
- .replace(/\n/g, '<LF>\n');
+ return line.replace(/\t/g, '<tab>')
+ .replace(/\r/g, '<CR>')
+ .replace(/\n/g, '<LF>\n');
}
/**
* Color lines for `str`, using the color `name`.
*
- * @param {String} name
- * @param {String} str
- * @return {String}
* @api private
+ * @param {string} name
+ * @param {string} str
+ * @return {string}
*/
-
function colorLines(name, str) {
- return str.split('\n').map(function(str){
+ return str.split('\n').map(function(str) {
return color(name, str);
}).join('\n');
}
/**
+ * Object#toString reference.
+ */
+var objToString = Object.prototype.toString;
+
+/**
* Check that a / b have the same type.
*
+ * @api private
* @param {Object} a
* @param {Object} b
- * @return {Boolean}
- * @api private
+ * @return {boolean}
*/
-
function sameType(a, b) {
- a = Object.prototype.toString.call(a);
- b = Object.prototype.toString.call(b);
- return a == b;
+ return objToString.call(a) === objToString.call(b);
}
diff --git a/tests/lib/mocha-2.2.5/lib/reporters/doc.js b/tests/lib/mocha-3.1.0/lib/reporters/doc.js
index d194eb0e69..9f5c3f8a37 100755..100644
--- a/tests/lib/mocha-2.2.5/lib/reporters/doc.js
+++ b/tests/lib/mocha-3.1.0/lib/reporters/doc.js
@@ -2,8 +2,8 @@
* Module dependencies.
*/
-var Base = require('./base')
- , utils = require('../utils');
+var Base = require('./base');
+var utils = require('../utils');
/**
* Expose `Doc`.
@@ -17,21 +17,19 @@ exports = module.exports = Doc;
* @param {Runner} runner
* @api public
*/
-
function Doc(runner) {
Base.call(this, runner);
- var self = this
- , stats = this.stats
- , total = runner.total
- , indents = 2;
+ var indents = 2;
function indent() {
return Array(indents).join(' ');
}
- runner.on('suite', function(suite){
- if (suite.root) return;
+ runner.on('suite', function(suite) {
+ if (suite.root) {
+ return;
+ }
++indents;
console.log('%s<section class="suite">', indent());
++indents;
@@ -39,23 +37,25 @@ function Doc(runner) {
console.log('%s<dl>', indent());
});
- runner.on('suite end', function(suite){
- if (suite.root) return;
+ runner.on('suite end', function(suite) {
+ if (suite.root) {
+ return;
+ }
console.log('%s</dl>', indent());
--indents;
console.log('%s</section>', indent());
--indents;
});
- runner.on('pass', function(test){
+ runner.on('pass', function(test) {
console.log('%s <dt>%s</dt>', indent(), utils.escape(test.title));
- var code = utils.escape(utils.clean(test.fn.toString()));
+ var code = utils.escape(utils.clean(test.body));
console.log('%s <dd><pre><code>%s</code></pre></dd>', indent(), code);
});
- runner.on('fail', function(test, err){
+ runner.on('fail', function(test, err) {
console.log('%s <dt class="error">%s</dt>', indent(), utils.escape(test.title));
- var code = utils.escape(utils.clean(test.fn.toString()));
+ var code = utils.escape(utils.clean(test.body));
console.log('%s <dd class="error"><pre><code>%s</code></pre></dd>', indent(), code);
console.log('%s <dd class="error">%s</dd>', indent(), utils.escape(err));
});
diff --git a/tests/lib/mocha-3.1.0/lib/reporters/dot.js b/tests/lib/mocha-3.1.0/lib/reporters/dot.js
new file mode 100644
index 0000000000..f8b4b41fe0
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/lib/reporters/dot.js
@@ -0,0 +1,66 @@
+/**
+ * Module dependencies.
+ */
+
+var Base = require('./base');
+var inherits = require('../utils').inherits;
+var color = Base.color;
+
+/**
+ * Expose `Dot`.
+ */
+
+exports = module.exports = Dot;
+
+/**
+ * Initialize a new `Dot` matrix test reporter.
+ *
+ * @api public
+ * @param {Runner} runner
+ */
+function Dot(runner) {
+ Base.call(this, runner);
+
+ var self = this;
+ var width = Base.window.width * .75 | 0;
+ var n = -1;
+
+ runner.on('start', function() {
+ process.stdout.write('\n');
+ });
+
+ runner.on('pending', function() {
+ if (++n % width === 0) {
+ process.stdout.write('\n ');
+ }
+ process.stdout.write(color('pending', Base.symbols.comma));
+ });
+
+ runner.on('pass', function(test) {
+ if (++n % width === 0) {
+ process.stdout.write('\n ');
+ }
+ if (test.speed === 'slow') {
+ process.stdout.write(color('bright yellow', Base.symbols.dot));
+ } else {
+ process.stdout.write(color(test.speed, Base.symbols.dot));
+ }
+ });
+
+ runner.on('fail', function() {
+ if (++n % width === 0) {
+ process.stdout.write('\n ');
+ }
+ process.stdout.write(color('fail', Base.symbols.bang));
+ });
+
+ runner.on('end', function() {
+ console.log();
+ self.epilogue();
+ });
+}
+
+/**
+ * Inherit from `Base.prototype`.
+ */
+inherits(Dot, Base);
diff --git a/tests/lib/mocha-3.1.0/lib/reporters/html.js b/tests/lib/mocha-3.1.0/lib/reporters/html.js
new file mode 100644
index 0000000000..51ba1ca722
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/lib/reporters/html.js
@@ -0,0 +1,344 @@
+/* eslint-env browser */
+
+/**
+ * Module dependencies.
+ */
+
+var Base = require('./base');
+var utils = require('../utils');
+var Progress = require('../browser/progress');
+var escapeRe = require('escape-string-regexp');
+var escape = utils.escape;
+
+/**
+ * Save timer references to avoid Sinon interfering (see GH-237).
+ */
+
+/* eslint-disable no-unused-vars, no-native-reassign */
+var Date = global.Date;
+var setTimeout = global.setTimeout;
+var setInterval = global.setInterval;
+var clearTimeout = global.clearTimeout;
+var clearInterval = global.clearInterval;
+/* eslint-enable no-unused-vars, no-native-reassign */
+
+/**
+ * Expose `HTML`.
+ */
+
+exports = module.exports = HTML;
+
+/**
+ * Stats template.
+ */
+
+var statsTemplate = '<ul id="mocha-stats">'
+ + '<li class="progress"><canvas width="40" height="40"></canvas></li>'
+ + '<li class="passes"><a href="javascript:void(0);">passes:</a> <em>0</em></li>'
+ + '<li class="failures"><a href="javascript:void(0);">failures:</a> <em>0</em></li>'
+ + '<li class="duration">duration: <em>0</em>s</li>'
+ + '</ul>';
+
+/**
+ * Initialize a new `HTML` reporter.
+ *
+ * @api public
+ * @param {Runner} runner
+ */
+function HTML(runner) {
+ Base.call(this, runner);
+
+ var self = this;
+ var stats = this.stats;
+ var stat = fragment(statsTemplate);
+ var items = stat.getElementsByTagName('li');
+ var passes = items[1].getElementsByTagName('em')[0];
+ var passesLink = items[1].getElementsByTagName('a')[0];
+ var failures = items[2].getElementsByTagName('em')[0];
+ var failuresLink = items[2].getElementsByTagName('a')[0];
+ var duration = items[3].getElementsByTagName('em')[0];
+ var canvas = stat.getElementsByTagName('canvas')[0];
+ var report = fragment('<ul id="mocha-report"></ul>');
+ var stack = [report];
+ var progress;
+ var ctx;
+ var root = document.getElementById('mocha');
+
+ if (canvas.getContext) {
+ var ratio = window.devicePixelRatio || 1;
+ canvas.style.width = canvas.width;
+ canvas.style.height = canvas.height;
+ canvas.width *= ratio;
+ canvas.height *= ratio;
+ ctx = canvas.getContext('2d');
+ ctx.scale(ratio, ratio);
+ progress = new Progress();
+ }
+
+ if (!root) {
+ return error('#mocha div missing, add it to your document');
+ }
+
+ // pass toggle
+ on(passesLink, 'click', function(evt) {
+ evt.preventDefault();
+ unhide();
+ var name = (/pass/).test(report.className) ? '' : ' pass';
+ report.className = report.className.replace(/fail|pass/g, '') + name;
+ if (report.className.trim()) {
+ hideSuitesWithout('test pass');
+ }
+ });
+
+ // failure toggle
+ on(failuresLink, 'click', function(evt) {
+ evt.preventDefault();
+ unhide();
+ var name = (/fail/).test(report.className) ? '' : ' fail';
+ report.className = report.className.replace(/fail|pass/g, '') + name;
+ if (report.className.trim()) {
+ hideSuitesWithout('test fail');
+ }
+ });
+
+ root.appendChild(stat);
+ root.appendChild(report);
+
+ if (progress) {
+ progress.size(40);
+ }
+
+ runner.on('suite', function(suite) {
+ if (suite.root) {
+ return;
+ }
+
+ // suite
+ var url = self.suiteURL(suite);
+ var el = fragment('<li class="suite"><h1><a href="%s">%s</a></h1></li>', url, escape(suite.title));
+
+ // container
+ stack[0].appendChild(el);
+ stack.unshift(document.createElement('ul'));
+ el.appendChild(stack[0]);
+ });
+
+ runner.on('suite end', function(suite) {
+ if (suite.root) {
+ updateStats();
+ return;
+ }
+ stack.shift();
+ });
+
+ runner.on('pass', function(test) {
+ var url = self.testURL(test);
+ var markup = '<li class="test pass %e"><h2>%e<span class="duration">%ems</span> '
+ + '<a href="%s" class="replay">‣</a></h2></li>';
+ var el = fragment(markup, test.speed, test.title, test.duration, url);
+ self.addCodeToggle(el, test.body);
+ appendToStack(el);
+ updateStats();
+ });
+
+ runner.on('fail', function(test) {
+ var el = fragment('<li class="test fail"><h2>%e <a href="%e" class="replay">‣</a></h2></li>',
+ test.title, self.testURL(test));
+ var stackString; // Note: Includes leading newline
+ var message = test.err.toString();
+
+ // <=IE7 stringifies to [Object Error]. Since it can be overloaded, we
+ // check for the result of the stringifying.
+ if (message === '[object Error]') {
+ message = test.err.message;
+ }
+
+ if (test.err.stack) {
+ var indexOfMessage = test.err.stack.indexOf(test.err.message);
+ if (indexOfMessage === -1) {
+ stackString = test.err.stack;
+ } else {
+ stackString = test.err.stack.substr(test.err.message.length + indexOfMessage);
+ }
+ } else if (test.err.sourceURL && test.err.line !== undefined) {
+ // Safari doesn't give you a stack. Let's at least provide a source line.
+ stackString = '\n(' + test.err.sourceURL + ':' + test.err.line + ')';
+ }
+
+ stackString = stackString || '';
+
+ if (test.err.htmlMessage && stackString) {
+ el.appendChild(fragment('<div class="html-error">%s\n<pre class="error">%e</pre></div>',
+ test.err.htmlMessage, stackString));
+ } else if (test.err.htmlMessage) {
+ el.appendChild(fragment('<div class="html-error">%s</div>', test.err.htmlMessage));
+ } else {
+ el.appendChild(fragment('<pre class="error">%e%e</pre>', message, stackString));
+ }
+
+ self.addCodeToggle(el, test.body);
+ appendToStack(el);
+ updateStats();
+ });
+
+ runner.on('pending', function(test) {
+ var el = fragment('<li class="test pass pending"><h2>%e</h2></li>', test.title);
+ appendToStack(el);
+ updateStats();
+ });
+
+ function appendToStack(el) {
+ // Don't call .appendChild if #mocha-report was already .shift()'ed off the stack.
+ if (stack[0]) {
+ stack[0].appendChild(el);
+ }
+ }
+
+ function updateStats() {
+ // TODO: add to stats
+ var percent = stats.tests / runner.total * 100 | 0;
+ if (progress) {
+ progress.update(percent).draw(ctx);
+ }
+
+ // update stats
+ var ms = new Date() - stats.start;
+ text(passes, stats.passes);
+ text(failures, stats.failures);
+ text(duration, (ms / 1000).toFixed(2));
+ }
+}
+
+/**
+ * Makes a URL, preserving querystring ("search") parameters.
+ *
+ * @param {string} s
+ * @return {string} A new URL.
+ */
+function makeUrl(s) {
+ var search = window.location.search;
+
+ // Remove previous grep query parameter if present
+ if (search) {
+ search = search.replace(/[?&]grep=[^&\s]*/g, '').replace(/^&/, '?');
+ }
+
+ return window.location.pathname + (search ? search + '&' : '?') + 'grep=' + encodeURIComponent(escapeRe(s));
+}
+
+/**
+ * Provide suite URL.
+ *
+ * @param {Object} [suite]
+ */
+HTML.prototype.suiteURL = function(suite) {
+ return makeUrl(suite.fullTitle());
+};
+
+/**
+ * Provide test URL.
+ *
+ * @param {Object} [test]
+ */
+HTML.prototype.testURL = function(test) {
+ return makeUrl(test.fullTitle());
+};
+
+/**
+ * Adds code toggle functionality for the provided test's list element.
+ *
+ * @param {HTMLLIElement} el
+ * @param {string} contents
+ */
+HTML.prototype.addCodeToggle = function(el, contents) {
+ var h2 = el.getElementsByTagName('h2')[0];
+
+ on(h2, 'click', function() {
+ pre.style.display = pre.style.display === 'none' ? 'block' : 'none';
+ });
+
+ var pre = fragment('<pre><code>%e</code></pre>', utils.clean(contents));
+ el.appendChild(pre);
+ pre.style.display = 'none';
+};
+
+/**
+ * Display error `msg`.
+ *
+ * @param {string} msg
+ */
+function error(msg) {
+ document.body.appendChild(fragment('<div id="mocha-error">%s</div>', msg));
+}
+
+/**
+ * Return a DOM fragment from `html`.
+ *
+ * @param {string} html
+ */
+function fragment(html) {
+ var args = arguments;
+ var div = document.createElement('div');
+ var i = 1;
+
+ div.innerHTML = html.replace(/%([se])/g, function(_, type) {
+ switch (type) {
+ case 's': return String(args[i++]);
+ case 'e': return escape(args[i++]);
+ // no default
+ }
+ });
+
+ return div.firstChild;
+}
+
+/**
+ * Check for suites that do not have elements
+ * with `classname`, and hide them.
+ *
+ * @param {text} classname
+ */
+function hideSuitesWithout(classname) {
+ var suites = document.getElementsByClassName('suite');
+ for (var i = 0; i < suites.length; i++) {
+ var els = suites[i].getElementsByClassName(classname);
+ if (!els.length) {
+ suites[i].className += ' hidden';
+ }
+ }
+}
+
+/**
+ * Unhide .hidden suites.
+ */
+function unhide() {
+ var els = document.getElementsByClassName('suite hidden');
+ for (var i = 0; i < els.length; ++i) {
+ els[i].className = els[i].className.replace('suite hidden', 'suite');
+ }
+}
+
+/**
+ * Set an element's text contents.
+ *
+ * @param {HTMLElement} el
+ * @param {string} contents
+ */
+function text(el, contents) {
+ if (el.textContent) {
+ el.textContent = contents;
+ } else {
+ el.innerText = contents;
+ }
+}
+
+/**
+ * Listen on `event` with callback `fn`.
+ */
+function on(el, event, fn) {
+ if (el.addEventListener) {
+ el.addEventListener(event, fn, false);
+ } else {
+ el.attachEvent('on' + event, fn);
+ }
+}
diff --git a/tests/lib/mocha-3.1.0/lib/reporters/index.js b/tests/lib/mocha-3.1.0/lib/reporters/index.js
new file mode 100644
index 0000000000..221a81d95b
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/lib/reporters/index.js
@@ -0,0 +1,17 @@
+// Alias exports to a their normalized format Mocha#reporter to prevent a need
+// for dynamic (try/catch) requires, which Browserify doesn't handle.
+exports.Base = exports.base = require('./base');
+exports.Dot = exports.dot = require('./dot');
+exports.Doc = exports.doc = require('./doc');
+exports.TAP = exports.tap = require('./tap');
+exports.JSON = exports.json = require('./json');
+exports.HTML = exports.html = require('./html');
+exports.List = exports.list = require('./list');
+exports.Min = exports.min = require('./min');
+exports.Spec = exports.spec = require('./spec');
+exports.Nyan = exports.nyan = require('./nyan');
+exports.XUnit = exports.xunit = require('./xunit');
+exports.Markdown = exports.markdown = require('./markdown');
+exports.Progress = exports.progress = require('./progress');
+exports.Landing = exports.landing = require('./landing');
+exports.JSONStream = exports['json-stream'] = require('./json-stream');
diff --git a/tests/lib/mocha-2.2.5/lib/reporters/json-stream.js b/tests/lib/mocha-3.1.0/lib/reporters/json-stream.js
index f7c05a89c2..f07f8657c0 100755..100644
--- a/tests/lib/mocha-2.2.5/lib/reporters/json-stream.js
+++ b/tests/lib/mocha-3.1.0/lib/reporters/json-stream.js
@@ -2,8 +2,8 @@
* Module dependencies.
*/
-var Base = require('./base')
- , color = Base.color;
+var Base = require('./base');
+var JSON = require('json3');
/**
* Expose `List`.
@@ -14,32 +14,31 @@ exports = module.exports = List;
/**
* Initialize a new `List` test reporter.
*
- * @param {Runner} runner
* @api public
+ * @param {Runner} runner
*/
-
function List(runner) {
Base.call(this, runner);
- var self = this
- , stats = this.stats
- , total = runner.total;
+ var self = this;
+ var total = runner.total;
- runner.on('start', function(){
+ runner.on('start', function() {
console.log(JSON.stringify(['start', { total: total }]));
});
- runner.on('pass', function(test){
+ runner.on('pass', function(test) {
console.log(JSON.stringify(['pass', clean(test)]));
});
- runner.on('fail', function(test, err){
+ runner.on('fail', function(test, err) {
test = clean(test);
test.err = err.message;
+ test.stack = err.stack || null;
console.log(JSON.stringify(['fail', test]));
});
- runner.on('end', function(){
+ runner.on('end', function() {
process.stdout.write(JSON.stringify(['end', self.stats]));
});
}
@@ -48,15 +47,15 @@ function List(runner) {
* Return a plain-object representation of `test`
* free of cyclic properties etc.
*
+ * @api private
* @param {Object} test
* @return {Object}
- * @api private
*/
-
function clean(test) {
return {
- title: test.title
- , fullTitle: test.fullTitle()
- , duration: test.duration
- }
+ title: test.title,
+ fullTitle: test.fullTitle(),
+ duration: test.duration,
+ currentRetry: test.currentRetry()
+ };
}
diff --git a/tests/lib/mocha-2.2.5/lib/reporters/json.js b/tests/lib/mocha-3.1.0/lib/reporters/json.js
index f565506c6e..cd9ec286b7 100755..100644
--- a/tests/lib/mocha-2.2.5/lib/reporters/json.js
+++ b/tests/lib/mocha-3.1.0/lib/reporters/json.js
@@ -2,9 +2,7 @@
* Module dependencies.
*/
-var Base = require('./base')
- , cursor = Base.cursor
- , color = Base.color;
+var Base = require('./base');
/**
* Expose `JSON`.
@@ -15,36 +13,35 @@ exports = module.exports = JSONReporter;
/**
* Initialize a new `JSON` reporter.
*
- * @param {Runner} runner
* @api public
+ * @param {Runner} runner
*/
-
function JSONReporter(runner) {
- var self = this;
Base.call(this, runner);
- var tests = []
- , pending = []
- , failures = []
- , passes = [];
+ var self = this;
+ var tests = [];
+ var pending = [];
+ var failures = [];
+ var passes = [];
- runner.on('test end', function(test){
+ runner.on('test end', function(test) {
tests.push(test);
});
- runner.on('pass', function(test){
+ runner.on('pass', function(test) {
passes.push(test);
});
- runner.on('fail', function(test){
+ runner.on('fail', function(test) {
failures.push(test);
});
- runner.on('pending', function(test){
+ runner.on('pending', function(test) {
pending.push(test);
});
- runner.on('end', function(){
+ runner.on('end', function() {
var obj = {
stats: self.stats,
tests: tests.map(clean),
@@ -63,26 +60,27 @@ function JSONReporter(runner) {
* Return a plain-object representation of `test`
* free of cyclic properties etc.
*
+ * @api private
* @param {Object} test
* @return {Object}
- * @api private
*/
-
function clean(test) {
return {
title: test.title,
fullTitle: test.fullTitle(),
duration: test.duration,
+ currentRetry: test.currentRetry(),
err: errorJSON(test.err || {})
- }
+ };
}
/**
* Transform `error` into a JSON object.
+ *
+ * @api private
* @param {Error} err
* @return {Object}
*/
-
function errorJSON(err) {
var res = {};
Object.getOwnPropertyNames(err).forEach(function(key) {
diff --git a/tests/lib/mocha-2.2.5/lib/reporters/landing.js b/tests/lib/mocha-3.1.0/lib/reporters/landing.js
index ee004a20aa..b66b2000c1 100755..100644
--- a/tests/lib/mocha-2.2.5/lib/reporters/landing.js
+++ b/tests/lib/mocha-3.1.0/lib/reporters/landing.js
@@ -2,9 +2,10 @@
* Module dependencies.
*/
-var Base = require('./base')
- , cursor = Base.cursor
- , color = Base.color;
+var Base = require('./base');
+var inherits = require('../utils').inherits;
+var cursor = Base.cursor;
+var color = Base.color;
/**
* Expose `Landing`.
@@ -33,56 +34,52 @@ Base.colors.runway = 90;
/**
* Initialize a new `Landing` reporter.
*
- * @param {Runner} runner
* @api public
+ * @param {Runner} runner
*/
-
function Landing(runner) {
Base.call(this, runner);
- var self = this
- , stats = this.stats
- , width = Base.window.width * .75 | 0
- , total = runner.total
- , stream = process.stdout
- , plane = color('plane', '✈')
- , crashed = -1
- , n = 0;
+ var self = this;
+ var width = Base.window.width * .75 | 0;
+ var total = runner.total;
+ var stream = process.stdout;
+ var plane = color('plane', '✈');
+ var crashed = -1;
+ var n = 0;
function runway() {
var buf = Array(width).join('-');
return ' ' + color('runway', buf);
}
- runner.on('start', function(){
+ runner.on('start', function() {
stream.write('\n\n\n ');
cursor.hide();
});
- runner.on('test end', function(test){
+ runner.on('test end', function(test) {
// check if the plane crashed
- var col = -1 == crashed
- ? width * ++n / total | 0
- : crashed;
+ var col = crashed === -1 ? width * ++n / total | 0 : crashed;
// show the crash
- if ('failed' == test.state) {
+ if (test.state === 'failed') {
plane = color('plane crash', '✈');
crashed = col;
}
// render landing strip
- stream.write('\u001b['+(width+1)+'D\u001b[2A');
+ stream.write('\u001b[' + (width + 1) + 'D\u001b[2A');
stream.write(runway());
stream.write('\n ');
stream.write(color('runway', Array(col).join('⋅')));
- stream.write(plane)
+ stream.write(plane);
stream.write(color('runway', Array(width - col).join('⋅') + '\n'));
stream.write(runway());
stream.write('\u001b[0m');
});
- runner.on('end', function(){
+ runner.on('end', function() {
cursor.show();
console.log();
self.epilogue();
@@ -92,5 +89,4 @@ function Landing(runner) {
/**
* Inherit from `Base.prototype`.
*/
-
-Landing.prototype.__proto__ = Base.prototype;
+inherits(Landing, Base);
diff --git a/tests/lib/mocha-2.2.5/lib/reporters/list.js b/tests/lib/mocha-3.1.0/lib/reporters/list.js
index f64367a410..0e5f910d1f 100755..100644
--- a/tests/lib/mocha-2.2.5/lib/reporters/list.js
+++ b/tests/lib/mocha-3.1.0/lib/reporters/list.js
@@ -2,9 +2,10 @@
* Module dependencies.
*/
-var Base = require('./base')
- , cursor = Base.cursor
- , color = Base.color;
+var Base = require('./base');
+var inherits = require('../utils').inherits;
+var color = Base.color;
+var cursor = Base.cursor;
/**
* Expose `List`.
@@ -15,40 +16,38 @@ exports = module.exports = List;
/**
* Initialize a new `List` test reporter.
*
- * @param {Runner} runner
* @api public
+ * @param {Runner} runner
*/
-
function List(runner) {
Base.call(this, runner);
- var self = this
- , stats = this.stats
- , n = 0;
+ var self = this;
+ var n = 0;
- runner.on('start', function(){
+ runner.on('start', function() {
console.log();
});
- runner.on('test', function(test){
+ runner.on('test', function(test) {
process.stdout.write(color('pass', ' ' + test.fullTitle() + ': '));
});
- runner.on('pending', function(test){
+ runner.on('pending', function(test) {
var fmt = color('checkmark', ' -')
+ color('pending', ' %s');
console.log(fmt, test.fullTitle());
});
- runner.on('pass', function(test){
- var fmt = color('checkmark', ' '+Base.symbols.dot)
+ runner.on('pass', function(test) {
+ var fmt = color('checkmark', ' ' + Base.symbols.dot)
+ color('pass', ' %s: ')
+ color(test.speed, '%dms');
cursor.CR();
console.log(fmt, test.fullTitle(), test.duration);
});
- runner.on('fail', function(test, err){
+ runner.on('fail', function(test) {
cursor.CR();
console.log(color('fail', ' %d) %s'), ++n, test.fullTitle());
});
@@ -59,5 +58,4 @@ function List(runner) {
/**
* Inherit from `Base.prototype`.
*/
-
-List.prototype.__proto__ = Base.prototype;
+inherits(List, Base);
diff --git a/tests/lib/mocha-2.2.5/lib/reporters/markdown.js b/tests/lib/mocha-3.1.0/lib/reporters/markdown.js
index e14174c30e..680c55d709 100755..100644
--- a/tests/lib/mocha-2.2.5/lib/reporters/markdown.js
+++ b/tests/lib/mocha-3.1.0/lib/reporters/markdown.js
@@ -2,8 +2,8 @@
* Module dependencies.
*/
-var Base = require('./base')
- , utils = require('../utils');
+var Base = require('./base');
+var utils = require('../utils');
/**
* Constants
@@ -20,33 +20,28 @@ exports = module.exports = Markdown;
/**
* Initialize a new `Markdown` reporter.
*
- * @param {Runner} runner
* @api public
+ * @param {Runner} runner
*/
-
function Markdown(runner) {
Base.call(this, runner);
- var self = this
- , stats = this.stats
- , level = 0
- , buf = '';
+ var level = 0;
+ var buf = '';
function title(str) {
return Array(level).join('#') + ' ' + str;
}
- function indent() {
- return Array(level).join(' ');
- }
-
function mapTOC(suite, obj) {
- var ret = obj,
- key = SUITE_PREFIX + suite.title;
+ var ret = obj;
+ var key = SUITE_PREFIX + suite.title;
+
obj = obj[key] = obj[key] || { suite: suite };
- suite.suites.forEach(function(suite){
+ suite.suites.forEach(function(suite) {
mapTOC(suite, obj);
});
+
return ret;
}
@@ -55,7 +50,9 @@ function Markdown(runner) {
var buf = '';
var link;
for (var key in obj) {
- if ('suite' == key) continue;
+ if (key === 'suite') {
+ continue;
+ }
if (key !== SUITE_PREFIX) {
link = ' - [' + key.substring(1) + ']';
link += '(#' + utils.slug(obj[key].suite.fullTitle()) + ')\n';
@@ -73,26 +70,26 @@ function Markdown(runner) {
generateTOC(runner.suite);
- runner.on('suite', function(suite){
+ runner.on('suite', function(suite) {
++level;
var slug = utils.slug(suite.fullTitle());
buf += '<a name="' + slug + '"></a>' + '\n';
buf += title(suite.title) + '\n';
});
- runner.on('suite end', function(suite){
+ runner.on('suite end', function() {
--level;
});
- runner.on('pass', function(test){
- var code = utils.clean(test.fn.toString());
+ runner.on('pass', function(test) {
+ var code = utils.clean(test.body);
buf += test.title + '.\n';
buf += '\n```js\n';
buf += code + '\n';
buf += '```\n\n';
});
- runner.on('end', function(){
+ runner.on('end', function() {
process.stdout.write('# TOC\n');
process.stdout.write(generateTOC(runner.suite));
process.stdout.write(buf);
diff --git a/tests/lib/mocha-2.2.5/lib/reporters/min.js b/tests/lib/mocha-3.1.0/lib/reporters/min.js
index ce1a3fef12..2b48212ca8 100755..100644
--- a/tests/lib/mocha-2.2.5/lib/reporters/min.js
+++ b/tests/lib/mocha-3.1.0/lib/reporters/min.js
@@ -3,6 +3,7 @@
*/
var Base = require('./base');
+var inherits = require('../utils').inherits;
/**
* Expose `Min`.
@@ -13,14 +14,13 @@ exports = module.exports = Min;
/**
* Initialize a new `Min` minimal test reporter (best used with --watch).
*
- * @param {Runner} runner
* @api public
+ * @param {Runner} runner
*/
-
function Min(runner) {
Base.call(this, runner);
- runner.on('start', function(){
+ runner.on('start', function() {
// clear screen
process.stdout.write('\u001b[2J');
// set cursor position
@@ -33,5 +33,4 @@ function Min(runner) {
/**
* Inherit from `Base.prototype`.
*/
-
-Min.prototype.__proto__ = Base.prototype;
+inherits(Min, Base);
diff --git a/tests/lib/mocha-2.2.5/lib/reporters/nyan.js b/tests/lib/mocha-3.1.0/lib/reporters/nyan.js
index 63056b1777..ba1b0509d9 100755..100644
--- a/tests/lib/mocha-2.2.5/lib/reporters/nyan.js
+++ b/tests/lib/mocha-3.1.0/lib/reporters/nyan.js
@@ -3,6 +3,7 @@
*/
var Base = require('./base');
+var inherits = require('../utils').inherits;
/**
* Expose `Dot`.
@@ -19,50 +20,57 @@ exports = module.exports = NyanCat;
function NyanCat(runner) {
Base.call(this, runner);
- var self = this
- , stats = this.stats
- , width = Base.window.width * .75 | 0
- , rainbowColors = this.rainbowColors = self.generateColors()
- , colorIndex = this.colorIndex = 0
- , numerOfLines = this.numberOfLines = 4
- , trajectories = this.trajectories = [[], [], [], []]
- , nyanCatWidth = this.nyanCatWidth = 11
- , trajectoryWidthMax = this.trajectoryWidthMax = (width - nyanCatWidth)
- , scoreboardWidth = this.scoreboardWidth = 5
- , tick = this.tick = 0
- , n = 0;
-
- runner.on('start', function(){
+
+ var self = this;
+ var width = Base.window.width * .75 | 0;
+ var nyanCatWidth = this.nyanCatWidth = 11;
+
+ this.colorIndex = 0;
+ this.numberOfLines = 4;
+ this.rainbowColors = self.generateColors();
+ this.scoreboardWidth = 5;
+ this.tick = 0;
+ this.trajectories = [[], [], [], []];
+ this.trajectoryWidthMax = (width - nyanCatWidth);
+
+ runner.on('start', function() {
Base.cursor.hide();
self.draw();
});
- runner.on('pending', function(test){
+ runner.on('pending', function() {
self.draw();
});
- runner.on('pass', function(test){
+ runner.on('pass', function() {
self.draw();
});
- runner.on('fail', function(test, err){
+ runner.on('fail', function() {
self.draw();
});
- runner.on('end', function(){
+ runner.on('end', function() {
Base.cursor.show();
- for (var i = 0; i < self.numberOfLines; i++) write('\n');
+ for (var i = 0; i < self.numberOfLines; i++) {
+ write('\n');
+ }
self.epilogue();
});
}
/**
+ * Inherit from `Base.prototype`.
+ */
+inherits(NyanCat, Base);
+
+/**
* Draw the nyan cat
*
* @api private
*/
-NyanCat.prototype.draw = function(){
+NyanCat.prototype.draw = function() {
this.appendRainbow();
this.drawScoreboard();
this.drawRainbow();
@@ -77,7 +85,7 @@ NyanCat.prototype.draw = function(){
* @api private
*/
-NyanCat.prototype.drawScoreboard = function(){
+NyanCat.prototype.drawScoreboard = function() {
var stats = this.stats;
function draw(type, n) {
@@ -100,13 +108,15 @@ NyanCat.prototype.drawScoreboard = function(){
* @api private
*/
-NyanCat.prototype.appendRainbow = function(){
+NyanCat.prototype.appendRainbow = function() {
var segment = this.tick ? '_' : '-';
var rainbowified = this.rainbowify(segment);
for (var index = 0; index < this.numberOfLines; index++) {
var trajectory = this.trajectories[index];
- if (trajectory.length >= this.trajectoryWidthMax) trajectory.shift();
+ if (trajectory.length >= this.trajectoryWidthMax) {
+ trajectory.shift();
+ }
trajectory.push(rainbowified);
}
};
@@ -117,10 +127,10 @@ NyanCat.prototype.appendRainbow = function(){
* @api private
*/
-NyanCat.prototype.drawRainbow = function(){
+NyanCat.prototype.drawRainbow = function() {
var self = this;
- this.trajectories.forEach(function(line, index) {
+ this.trajectories.forEach(function(line) {
write('\u001b[' + self.scoreboardWidth + 'C');
write(line.join(''));
write('\n');
@@ -134,7 +144,6 @@ NyanCat.prototype.drawRainbow = function(){
*
* @api private
*/
-
NyanCat.prototype.drawNyanCat = function() {
var self = this;
var startWidth = this.scoreboardWidth + this.trajectories[0].length;
@@ -153,7 +162,6 @@ NyanCat.prototype.drawNyanCat = function() {
write(dist);
padding = self.tick ? '_' : '__';
var tail = self.tick ? '~' : '^';
- var face;
write(tail + '|' + padding + this.face() + ' ');
write('\n');
@@ -168,8 +176,8 @@ NyanCat.prototype.drawNyanCat = function() {
/**
* Draw nyan cat face.
*
- * @return {String}
* @api private
+ * @return {string}
*/
NyanCat.prototype.face = function() {
@@ -178,18 +186,17 @@ NyanCat.prototype.face = function() {
return '( x .x)';
} else if (stats.pending) {
return '( o .o)';
- } else if(stats.passes) {
+ } else if (stats.passes) {
return '( ^ .^)';
- } else {
- return '( - .-)';
}
+ return '( - .-)';
};
/**
* Move cursor up `n`.
*
- * @param {Number} n
* @api private
+ * @param {number} n
*/
NyanCat.prototype.cursorUp = function(n) {
@@ -199,8 +206,8 @@ NyanCat.prototype.cursorUp = function(n) {
/**
* Move cursor down `n`.
*
- * @param {Number} n
* @api private
+ * @param {number} n
*/
NyanCat.prototype.cursorDown = function(n) {
@@ -210,11 +217,10 @@ NyanCat.prototype.cursorDown = function(n) {
/**
* Generate rainbow colors.
*
- * @return {Array}
* @api private
+ * @return {Array}
*/
-
-NyanCat.prototype.generateColors = function(){
+NyanCat.prototype.generateColors = function() {
var colors = [];
for (var i = 0; i < (6 * 7); i++) {
@@ -232,14 +238,14 @@ NyanCat.prototype.generateColors = function(){
/**
* Apply rainbow to the given `str`.
*
- * @param {String} str
- * @return {String}
* @api private
+ * @param {string} str
+ * @return {string}
*/
-
-NyanCat.prototype.rainbowify = function(str){
- if (!Base.useColors)
+NyanCat.prototype.rainbowify = function(str) {
+ if (!Base.useColors) {
return str;
+ }
var color = this.rainbowColors[this.colorIndex % this.rainbowColors.length];
this.colorIndex += 1;
return '\u001b[38;5;' + color + 'm' + str + '\u001b[0m';
@@ -247,14 +253,9 @@ NyanCat.prototype.rainbowify = function(str){
/**
* Stdout helper.
+ *
+ * @param {string} string A message to write to stdout.
*/
-
function write(string) {
process.stdout.write(string);
}
-
-/**
- * Inherit from `Base.prototype`.
- */
-
-NyanCat.prototype.__proto__ = Base.prototype;
diff --git a/tests/lib/mocha-2.2.5/lib/reporters/progress.js b/tests/lib/mocha-3.1.0/lib/reporters/progress.js
index 2debb94541..5349ca8936 100755..100644
--- a/tests/lib/mocha-2.2.5/lib/reporters/progress.js
+++ b/tests/lib/mocha-3.1.0/lib/reporters/progress.js
@@ -2,9 +2,10 @@
* Module dependencies.
*/
-var Base = require('./base')
- , cursor = Base.cursor
- , color = Base.color;
+var Base = require('./base');
+var inherits = require('../utils').inherits;
+var color = Base.color;
+var cursor = Base.cursor;
/**
* Expose `Progress`.
@@ -21,24 +22,21 @@ Base.colors.progress = 90;
/**
* Initialize a new `Progress` bar test reporter.
*
+ * @api public
* @param {Runner} runner
* @param {Object} options
- * @api public
*/
-
function Progress(runner, options) {
Base.call(this, runner);
- var self = this
- , options = options || {}
- , stats = this.stats
- , width = Base.window.width * .50 | 0
- , total = runner.total
- , complete = 0
- , max = Math.max
- , lastN = -1;
+ var self = this;
+ var width = Base.window.width * .50 | 0;
+ var total = runner.total;
+ var complete = 0;
+ var lastN = -1;
// default chars
+ options = options || {};
options.open = options.open || '[';
options.complete = options.complete || '▬';
options.incomplete = options.incomplete || Base.symbols.dot;
@@ -46,20 +44,20 @@ function Progress(runner, options) {
options.verbose = false;
// tests started
- runner.on('start', function(){
+ runner.on('start', function() {
console.log();
cursor.hide();
});
// tests complete
- runner.on('test end', function(){
+ runner.on('test end', function() {
complete++;
- var incomplete = total - complete
- , percent = complete / total
- , n = width * percent | 0
- , i = width - n;
- if (lastN === n && !options.verbose) {
+ var percent = complete / total;
+ var n = width * percent | 0;
+ var i = width - n;
+
+ if (n === lastN && !options.verbose) {
// Don't re-render the line if it hasn't changed
return;
}
@@ -78,7 +76,7 @@ function Progress(runner, options) {
// tests are complete, output some stats
// and the failures if any
- runner.on('end', function(){
+ runner.on('end', function() {
cursor.show();
console.log();
self.epilogue();
@@ -88,5 +86,4 @@ function Progress(runner, options) {
/**
* Inherit from `Base.prototype`.
*/
-
-Progress.prototype.__proto__ = Base.prototype;
+inherits(Progress, Base);
diff --git a/tests/lib/mocha-2.2.5/lib/reporters/spec.js b/tests/lib/mocha-3.1.0/lib/reporters/spec.js
index 3debffe26f..28993a8f32 100755..100644
--- a/tests/lib/mocha-2.2.5/lib/reporters/spec.js
+++ b/tests/lib/mocha-3.1.0/lib/reporters/spec.js
@@ -2,9 +2,9 @@
* Module dependencies.
*/
-var Base = require('./base')
- , cursor = Base.cursor
- , color = Base.color;
+var Base = require('./base');
+var inherits = require('../utils').inherits;
+var color = Base.color;
/**
* Expose `Spec`.
@@ -15,60 +15,58 @@ exports = module.exports = Spec;
/**
* Initialize a new `Spec` test reporter.
*
- * @param {Runner} runner
* @api public
+ * @param {Runner} runner
*/
-
function Spec(runner) {
Base.call(this, runner);
- var self = this
- , stats = this.stats
- , indents = 0
- , n = 0;
+ var self = this;
+ var indents = 0;
+ var n = 0;
function indent() {
- return Array(indents).join(' ')
+ return Array(indents).join(' ');
}
- runner.on('start', function(){
+ runner.on('start', function() {
console.log();
});
- runner.on('suite', function(suite){
+ runner.on('suite', function(suite) {
++indents;
console.log(color('suite', '%s%s'), indent(), suite.title);
});
- runner.on('suite end', function(suite){
+ runner.on('suite end', function() {
--indents;
- if (1 == indents) console.log();
+ if (indents === 1) {
+ console.log();
+ }
});
- runner.on('pending', function(test){
+ runner.on('pending', function(test) {
var fmt = indent() + color('pending', ' - %s');
console.log(fmt, test.title);
});
- runner.on('pass', function(test){
- if ('fast' == test.speed) {
- var fmt = indent()
+ runner.on('pass', function(test) {
+ var fmt;
+ if (test.speed === 'fast') {
+ fmt = indent()
+ color('checkmark', ' ' + Base.symbols.ok)
+ color('pass', ' %s');
- cursor.CR();
console.log(fmt, test.title);
} else {
- var fmt = indent()
+ fmt = indent()
+ color('checkmark', ' ' + Base.symbols.ok)
+ color('pass', ' %s')
+ color(test.speed, ' (%dms)');
- cursor.CR();
console.log(fmt, test.title, test.duration);
}
});
- runner.on('fail', function(test, err){
- cursor.CR();
+ runner.on('fail', function(test) {
console.log(indent() + color('fail', ' %d) %s'), ++n, test.title);
});
@@ -78,5 +76,4 @@ function Spec(runner) {
/**
* Inherit from `Base.prototype`.
*/
-
-Spec.prototype.__proto__ = Base.prototype;
+inherits(Spec, Base);
diff --git a/tests/lib/mocha-2.2.5/lib/reporters/tap.js b/tests/lib/mocha-3.1.0/lib/reporters/tap.js
index 01a92eb076..d9b1b953aa 100755..100644
--- a/tests/lib/mocha-2.2.5/lib/reporters/tap.js
+++ b/tests/lib/mocha-3.1.0/lib/reporters/tap.js
@@ -2,9 +2,7 @@
* Module dependencies.
*/
-var Base = require('./base')
- , cursor = Base.cursor
- , color = Base.color;
+var Base = require('./base');
/**
* Expose `TAP`.
@@ -15,44 +13,43 @@ exports = module.exports = TAP;
/**
* Initialize a new `TAP` reporter.
*
- * @param {Runner} runner
* @api public
+ * @param {Runner} runner
*/
-
function TAP(runner) {
Base.call(this, runner);
- var self = this
- , stats = this.stats
- , n = 1
- , passes = 0
- , failures = 0;
+ var n = 1;
+ var passes = 0;
+ var failures = 0;
- runner.on('start', function(){
+ runner.on('start', function() {
var total = runner.grepTotal(runner.suite);
console.log('%d..%d', 1, total);
});
- runner.on('test end', function(){
+ runner.on('test end', function() {
++n;
});
- runner.on('pending', function(test){
+ runner.on('pending', function(test) {
console.log('ok %d %s # SKIP -', n, title(test));
});
- runner.on('pass', function(test){
+ runner.on('pass', function(test) {
passes++;
console.log('ok %d %s', n, title(test));
});
- runner.on('fail', function(test, err){
+ runner.on('fail', function(test, err) {
failures++;
console.log('not ok %d %s', n, title(test));
- if (err.stack) console.log(err.stack.replace(/^/gm, ' '));
+ if (err.stack) {
+ console.log(err.stack.replace(/^/gm, ' '));
+ }
});
- runner.on('end', function(){
+ runner.on('end', function() {
console.log('# tests ' + (passes + failures));
console.log('# pass ' + passes);
console.log('# fail ' + failures);
@@ -62,11 +59,10 @@ function TAP(runner) {
/**
* Return a TAP-safe title of `test`
*
+ * @api private
* @param {Object} test
* @return {String}
- * @api private
*/
-
function title(test) {
return test.fullTitle().replace(/#/g, '');
}
diff --git a/tests/lib/mocha-3.1.0/lib/reporters/xunit.js b/tests/lib/mocha-3.1.0/lib/reporters/xunit.js
new file mode 100644
index 0000000000..1cfd8f4f51
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/lib/reporters/xunit.js
@@ -0,0 +1,166 @@
+/**
+ * Module dependencies.
+ */
+
+var Base = require('./base');
+var utils = require('../utils');
+var inherits = utils.inherits;
+var fs = require('fs');
+var escape = utils.escape;
+var mkdirp = require('mkdirp');
+var path = require('path');
+
+/**
+ * Save timer references to avoid Sinon interfering (see GH-237).
+ */
+
+/* eslint-disable no-unused-vars, no-native-reassign */
+var Date = global.Date;
+var setTimeout = global.setTimeout;
+var setInterval = global.setInterval;
+var clearTimeout = global.clearTimeout;
+var clearInterval = global.clearInterval;
+/* eslint-enable no-unused-vars, no-native-reassign */
+
+/**
+ * Expose `XUnit`.
+ */
+
+exports = module.exports = XUnit;
+
+/**
+ * Initialize a new `XUnit` reporter.
+ *
+ * @api public
+ * @param {Runner} runner
+ */
+function XUnit(runner, options) {
+ Base.call(this, runner);
+
+ var stats = this.stats;
+ var tests = [];
+ var self = this;
+
+ if (options.reporterOptions && options.reporterOptions.output) {
+ if (!fs.createWriteStream) {
+ throw new Error('file output not supported in browser');
+ }
+ mkdirp.sync(path.dirname(options.reporterOptions.output));
+ self.fileStream = fs.createWriteStream(options.reporterOptions.output);
+ }
+
+ runner.on('pending', function(test) {
+ tests.push(test);
+ });
+
+ runner.on('pass', function(test) {
+ tests.push(test);
+ });
+
+ runner.on('fail', function(test) {
+ tests.push(test);
+ });
+
+ runner.on('end', function() {
+ self.write(tag('testsuite', {
+ name: 'Mocha Tests',
+ tests: stats.tests,
+ failures: stats.failures,
+ errors: stats.failures,
+ skipped: stats.tests - stats.failures - stats.passes,
+ timestamp: (new Date()).toUTCString(),
+ time: (stats.duration / 1000) || 0
+ }, false));
+
+ tests.forEach(function(t) {
+ self.test(t);
+ });
+
+ self.write('</testsuite>');
+ });
+}
+
+/**
+ * Inherit from `Base.prototype`.
+ */
+inherits(XUnit, Base);
+
+/**
+ * Override done to close the stream (if it's a file).
+ *
+ * @param failures
+ * @param {Function} fn
+ */
+XUnit.prototype.done = function(failures, fn) {
+ if (this.fileStream) {
+ this.fileStream.end(function() {
+ fn(failures);
+ });
+ } else {
+ fn(failures);
+ }
+};
+
+/**
+ * Write out the given line.
+ *
+ * @param {string} line
+ */
+XUnit.prototype.write = function(line) {
+ if (this.fileStream) {
+ this.fileStream.write(line + '\n');
+ } else if (typeof process === 'object' && process.stdout) {
+ process.stdout.write(line + '\n');
+ } else {
+ console.log(line);
+ }
+};
+
+/**
+ * Output tag for the given `test.`
+ *
+ * @param {Test} test
+ */
+XUnit.prototype.test = function(test) {
+ var attrs = {
+ classname: test.parent.fullTitle(),
+ name: test.title,
+ time: (test.duration / 1000) || 0
+ };
+
+ if (test.state === 'failed') {
+ var err = test.err;
+ this.write(tag('testcase', attrs, false, tag('failure', {}, false, escape(err.message) + '\n' + escape(err.stack))));
+ } else if (test.isPending()) {
+ this.write(tag('testcase', attrs, false, tag('skipped', {}, true)));
+ } else {
+ this.write(tag('testcase', attrs, true));
+ }
+};
+
+/**
+ * HTML tag helper.
+ *
+ * @param name
+ * @param attrs
+ * @param close
+ * @param content
+ * @return {string}
+ */
+function tag(name, attrs, close, content) {
+ var end = close ? '/>' : '>';
+ var pairs = [];
+ var tag;
+
+ for (var key in attrs) {
+ if (Object.prototype.hasOwnProperty.call(attrs, key)) {
+ pairs.push(key + '="' + escape(attrs[key]) + '"');
+ }
+ }
+
+ tag = '<' + name + (pairs.length ? ' ' + pairs.join(' ') : '') + end;
+ if (content) {
+ tag += content + '</' + name + end;
+ }
+ return tag;
+}
diff --git a/tests/lib/mocha-3.1.0/lib/runnable.js b/tests/lib/mocha-3.1.0/lib/runnable.js
new file mode 100644
index 0000000000..52ee900b22
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/lib/runnable.js
@@ -0,0 +1,380 @@
+/**
+ * Module dependencies.
+ */
+
+var EventEmitter = require('events').EventEmitter;
+var JSON = require('json3');
+var Pending = require('./pending');
+var debug = require('debug')('mocha:runnable');
+var milliseconds = require('./ms');
+var utils = require('./utils');
+var create = require('lodash.create');
+
+/**
+ * Save timer references to avoid Sinon interfering (see GH-237).
+ */
+
+/* eslint-disable no-unused-vars, no-native-reassign */
+var Date = global.Date;
+var setTimeout = global.setTimeout;
+var setInterval = global.setInterval;
+var clearTimeout = global.clearTimeout;
+var clearInterval = global.clearInterval;
+/* eslint-enable no-unused-vars, no-native-reassign */
+
+/**
+ * Object#toString().
+ */
+
+var toString = Object.prototype.toString;
+
+/**
+ * Expose `Runnable`.
+ */
+
+module.exports = Runnable;
+
+/**
+ * Initialize a new `Runnable` with the given `title` and callback `fn`.
+ *
+ * @param {String} title
+ * @param {Function} fn
+ * @api private
+ * @param {string} title
+ * @param {Function} fn
+ */
+function Runnable(title, fn) {
+ this.title = title;
+ this.fn = fn;
+ this.body = (fn || '').toString();
+ this.async = fn && fn.length;
+ this.sync = !this.async;
+ this._timeout = 2000;
+ this._slow = 75;
+ this._enableTimeouts = true;
+ this.timedOut = false;
+ this._trace = new Error('done() called multiple times');
+ this._retries = -1;
+ this._currentRetry = 0;
+ this.pending = false;
+}
+
+/**
+ * Inherit from `EventEmitter.prototype`.
+ */
+Runnable.prototype = create(EventEmitter.prototype, {
+ constructor: Runnable
+});
+
+/**
+ * Set & get timeout `ms`.
+ *
+ * @api private
+ * @param {number|string} ms
+ * @return {Runnable|number} ms or Runnable instance.
+ */
+Runnable.prototype.timeout = function(ms) {
+ if (!arguments.length) {
+ return this._timeout;
+ }
+ // see #1652 for reasoning
+ if (ms === 0 || ms > Math.pow(2, 31)) {
+ this._enableTimeouts = false;
+ }
+ if (typeof ms === 'string') {
+ ms = milliseconds(ms);
+ }
+ debug('timeout %d', ms);
+ this._timeout = ms;
+ if (this.timer) {
+ this.resetTimeout();
+ }
+ return this;
+};
+
+/**
+ * Set & get slow `ms`.
+ *
+ * @api private
+ * @param {number|string} ms
+ * @return {Runnable|number} ms or Runnable instance.
+ */
+Runnable.prototype.slow = function(ms) {
+ if (typeof ms === 'undefined') {
+ return this._slow;
+ }
+ if (typeof ms === 'string') {
+ ms = milliseconds(ms);
+ }
+ debug('timeout %d', ms);
+ this._slow = ms;
+ return this;
+};
+
+/**
+ * Set and get whether timeout is `enabled`.
+ *
+ * @api private
+ * @param {boolean} enabled
+ * @return {Runnable|boolean} enabled or Runnable instance.
+ */
+Runnable.prototype.enableTimeouts = function(enabled) {
+ if (!arguments.length) {
+ return this._enableTimeouts;
+ }
+ debug('enableTimeouts %s', enabled);
+ this._enableTimeouts = enabled;
+ return this;
+};
+
+/**
+ * Halt and mark as pending.
+ *
+ * @api public
+ */
+Runnable.prototype.skip = function() {
+ throw new Pending('sync skip');
+};
+
+/**
+ * Check if this runnable or its parent suite is marked as pending.
+ *
+ * @api private
+ */
+Runnable.prototype.isPending = function() {
+ return this.pending || (this.parent && this.parent.isPending());
+};
+
+/**
+ * Set number of retries.
+ *
+ * @api private
+ */
+Runnable.prototype.retries = function(n) {
+ if (!arguments.length) {
+ return this._retries;
+ }
+ this._retries = n;
+};
+
+/**
+ * Get current retry
+ *
+ * @api private
+ */
+Runnable.prototype.currentRetry = function(n) {
+ if (!arguments.length) {
+ return this._currentRetry;
+ }
+ this._currentRetry = n;
+};
+
+/**
+ * Return the full title generated by recursively concatenating the parent's
+ * full title.
+ *
+ * @api public
+ * @return {string}
+ */
+Runnable.prototype.fullTitle = function() {
+ return this.parent.fullTitle() + ' ' + this.title;
+};
+
+/**
+ * Clear the timeout.
+ *
+ * @api private
+ */
+Runnable.prototype.clearTimeout = function() {
+ clearTimeout(this.timer);
+};
+
+/**
+ * Inspect the runnable void of private properties.
+ *
+ * @api private
+ * @return {string}
+ */
+Runnable.prototype.inspect = function() {
+ return JSON.stringify(this, function(key, val) {
+ if (key[0] === '_') {
+ return;
+ }
+ if (key === 'parent') {
+ return '#<Suite>';
+ }
+ if (key === 'ctx') {
+ return '#<Context>';
+ }
+ return val;
+ }, 2);
+};
+
+/**
+ * Reset the timeout.
+ *
+ * @api private
+ */
+Runnable.prototype.resetTimeout = function() {
+ var self = this;
+ var ms = this.timeout() || 1e9;
+
+ if (!this._enableTimeouts) {
+ return;
+ }
+ this.clearTimeout();
+ this.timer = setTimeout(function() {
+ if (!self._enableTimeouts) {
+ return;
+ }
+ self.callback(new Error('timeout of ' + ms + 'ms exceeded. Ensure the done() callback is being called in this test.'));
+ self.timedOut = true;
+ }, ms);
+};
+
+/**
+ * Whitelist a list of globals for this test run.
+ *
+ * @api private
+ * @param {string[]} globals
+ */
+Runnable.prototype.globals = function(globals) {
+ if (!arguments.length) {
+ return this._allowedGlobals;
+ }
+ this._allowedGlobals = globals;
+};
+
+/**
+ * Run the test and invoke `fn(err)`.
+ *
+ * @param {Function} fn
+ * @api private
+ */
+Runnable.prototype.run = function(fn) {
+ var self = this;
+ var start = new Date();
+ var ctx = this.ctx;
+ var finished;
+ var emitted;
+
+ // Sometimes the ctx exists, but it is not runnable
+ if (ctx && ctx.runnable) {
+ ctx.runnable(this);
+ }
+
+ // called multiple times
+ function multiple(err) {
+ if (emitted) {
+ return;
+ }
+ emitted = true;
+ self.emit('error', err || new Error('done() called multiple times; stacktrace may be inaccurate'));
+ }
+
+ // finished
+ function done(err) {
+ var ms = self.timeout();
+ if (self.timedOut) {
+ return;
+ }
+ if (finished) {
+ return multiple(err || self._trace);
+ }
+
+ self.clearTimeout();
+ self.duration = new Date() - start;
+ finished = true;
+ if (!err && self.duration > ms && self._enableTimeouts) {
+ err = new Error('timeout of ' + ms + 'ms exceeded. Ensure the done() callback is being called in this test.');
+ }
+ fn(err);
+ }
+
+ // for .resetTimeout()
+ this.callback = done;
+
+ // explicit async with `done` argument
+ if (this.async) {
+ this.resetTimeout();
+
+ // allows skip() to be used in an explicit async context
+ this.skip = function asyncSkip() {
+ done(new Pending('async skip call'));
+ // halt execution. the Runnable will be marked pending
+ // by the previous call, and the uncaught handler will ignore
+ // the failure.
+ throw new Pending('async skip; aborting execution');
+ };
+
+ if (this.allowUncaught) {
+ return callFnAsync(this.fn);
+ }
+ try {
+ callFnAsync(this.fn);
+ } catch (err) {
+ done(utils.getError(err));
+ }
+ return;
+ }
+
+ if (this.allowUncaught) {
+ callFn(this.fn);
+ done();
+ return;
+ }
+
+ // sync or promise-returning
+ try {
+ if (this.isPending()) {
+ done();
+ } else {
+ callFn(this.fn);
+ }
+ } catch (err) {
+ done(utils.getError(err));
+ }
+
+ function callFn(fn) {
+ var result = fn.call(ctx);
+ if (result && typeof result.then === 'function') {
+ self.resetTimeout();
+ result
+ .then(function() {
+ done();
+ // Return null so libraries like bluebird do not warn about
+ // subsequently constructed Promises.
+ return null;
+ },
+ function(reason) {
+ done(reason || new Error('Promise rejected with no or falsy reason'));
+ });
+ } else {
+ if (self.asyncOnly) {
+ return done(new Error('--async-only option in use without declaring `done()` or returning a promise'));
+ }
+
+ done();
+ }
+ }
+
+ function callFnAsync(fn) {
+ var result = fn.call(ctx, function(err) {
+ if (err instanceof Error || toString.call(err) === '[object Error]') {
+ return done(err);
+ }
+ if (err) {
+ if (Object.prototype.toString.call(err) === '[object Object]') {
+ return done(new Error('done() invoked with non-Error: '
+ + JSON.stringify(err)));
+ }
+ return done(new Error('done() invoked with non-Error: ' + err));
+ }
+ if (result && utils.isPromise(result)) {
+ return done(new Error('Resolution method is overspecified. Specify a callback *or* return a Promise; not both.'));
+ }
+
+ done();
+ });
+ }
+};
diff --git a/tests/lib/mocha-3.1.0/lib/runner.js b/tests/lib/mocha-3.1.0/lib/runner.js
new file mode 100644
index 0000000000..dc03ec451a
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/lib/runner.js
@@ -0,0 +1,957 @@
+/**
+ * Module dependencies.
+ */
+
+var EventEmitter = require('events').EventEmitter;
+var Pending = require('./pending');
+var utils = require('./utils');
+var inherits = utils.inherits;
+var debug = require('debug')('mocha:runner');
+var Runnable = require('./runnable');
+var filter = utils.filter;
+var indexOf = utils.indexOf;
+var some = utils.some;
+var keys = utils.keys;
+var stackFilter = utils.stackTraceFilter();
+var stringify = utils.stringify;
+var type = utils.type;
+var undefinedError = utils.undefinedError;
+var isArray = utils.isArray;
+
+/**
+ * Non-enumerable globals.
+ */
+
+var globals = [
+ 'setTimeout',
+ 'clearTimeout',
+ 'setInterval',
+ 'clearInterval',
+ 'XMLHttpRequest',
+ 'Date',
+ 'setImmediate',
+ 'clearImmediate'
+];
+
+/**
+ * Expose `Runner`.
+ */
+
+module.exports = Runner;
+
+/**
+ * Initialize a `Runner` for the given `suite`.
+ *
+ * Events:
+ *
+ * - `start` execution started
+ * - `end` execution complete
+ * - `suite` (suite) test suite execution started
+ * - `suite end` (suite) all tests (and sub-suites) have finished
+ * - `test` (test) test execution started
+ * - `test end` (test) test completed
+ * - `hook` (hook) hook execution started
+ * - `hook end` (hook) hook complete
+ * - `pass` (test) test passed
+ * - `fail` (test, err) test failed
+ * - `pending` (test) test pending
+ *
+ * @api public
+ * @param {Suite} suite Root suite
+ * @param {boolean} [delay] Whether or not to delay execution of root suite
+ * until ready.
+ */
+function Runner(suite, delay) {
+ var self = this;
+ this._globals = [];
+ this._abort = false;
+ this._delay = delay;
+ this.suite = suite;
+ this.started = false;
+ this.total = suite.total();
+ this.failures = 0;
+ this.on('test end', function(test) {
+ self.checkGlobals(test);
+ });
+ this.on('hook end', function(hook) {
+ self.checkGlobals(hook);
+ });
+ this._defaultGrep = /.*/;
+ this.grep(this._defaultGrep);
+ this.globals(this.globalProps().concat(extraGlobals()));
+}
+
+/**
+ * Wrapper for setImmediate, process.nextTick, or browser polyfill.
+ *
+ * @param {Function} fn
+ * @api private
+ */
+Runner.immediately = global.setImmediate || process.nextTick;
+
+/**
+ * Inherit from `EventEmitter.prototype`.
+ */
+inherits(Runner, EventEmitter);
+
+/**
+ * Run tests with full titles matching `re`. Updates runner.total
+ * with number of tests matched.
+ *
+ * @param {RegExp} re
+ * @param {Boolean} invert
+ * @return {Runner} for chaining
+ * @api public
+ * @param {RegExp} re
+ * @param {boolean} invert
+ * @return {Runner} Runner instance.
+ */
+Runner.prototype.grep = function(re, invert) {
+ debug('grep %s', re);
+ this._grep = re;
+ this._invert = invert;
+ this.total = this.grepTotal(this.suite);
+ return this;
+};
+
+/**
+ * Returns the number of tests matching the grep search for the
+ * given suite.
+ *
+ * @param {Suite} suite
+ * @return {Number}
+ * @api public
+ * @param {Suite} suite
+ * @return {number}
+ */
+Runner.prototype.grepTotal = function(suite) {
+ var self = this;
+ var total = 0;
+
+ suite.eachTest(function(test) {
+ var match = self._grep.test(test.fullTitle());
+ if (self._invert) {
+ match = !match;
+ }
+ if (match) {
+ total++;
+ }
+ });
+
+ return total;
+};
+
+/**
+ * Return a list of global properties.
+ *
+ * @return {Array}
+ * @api private
+ */
+Runner.prototype.globalProps = function() {
+ var props = keys(global);
+
+ // non-enumerables
+ for (var i = 0; i < globals.length; ++i) {
+ if (~indexOf(props, globals[i])) {
+ continue;
+ }
+ props.push(globals[i]);
+ }
+
+ return props;
+};
+
+/**
+ * Allow the given `arr` of globals.
+ *
+ * @param {Array} arr
+ * @return {Runner} for chaining
+ * @api public
+ * @param {Array} arr
+ * @return {Runner} Runner instance.
+ */
+Runner.prototype.globals = function(arr) {
+ if (!arguments.length) {
+ return this._globals;
+ }
+ debug('globals %j', arr);
+ this._globals = this._globals.concat(arr);
+ return this;
+};
+
+/**
+ * Check for global variable leaks.
+ *
+ * @api private
+ */
+Runner.prototype.checkGlobals = function(test) {
+ if (this.ignoreLeaks) {
+ return;
+ }
+ var ok = this._globals;
+
+ var globals = this.globalProps();
+ var leaks;
+
+ if (test) {
+ ok = ok.concat(test._allowedGlobals || []);
+ }
+
+ if (this.prevGlobalsLength === globals.length) {
+ return;
+ }
+ this.prevGlobalsLength = globals.length;
+
+ leaks = filterLeaks(ok, globals);
+ this._globals = this._globals.concat(leaks);
+
+ if (leaks.length > 1) {
+ this.fail(test, new Error('global leaks detected: ' + leaks.join(', ') + ''));
+ } else if (leaks.length) {
+ this.fail(test, new Error('global leak detected: ' + leaks[0]));
+ }
+};
+
+/**
+ * Fail the given `test`.
+ *
+ * @api private
+ * @param {Test} test
+ * @param {Error} err
+ */
+Runner.prototype.fail = function(test, err) {
+ if (test.isPending()) {
+ return;
+ }
+
+ ++this.failures;
+ test.state = 'failed';
+
+ if (!(err instanceof Error || err && typeof err.message === 'string')) {
+ err = new Error('the ' + type(err) + ' ' + stringify(err) + ' was thrown, throw an Error :)');
+ }
+
+ err.stack = (this.fullStackTrace || !err.stack)
+ ? err.stack
+ : stackFilter(err.stack);
+
+ this.emit('fail', test, err);
+};
+
+/**
+ * Fail the given `hook` with `err`.
+ *
+ * Hook failures work in the following pattern:
+ * - If bail, then exit
+ * - Failed `before` hook skips all tests in a suite and subsuites,
+ * but jumps to corresponding `after` hook
+ * - Failed `before each` hook skips remaining tests in a
+ * suite and jumps to corresponding `after each` hook,
+ * which is run only once
+ * - Failed `after` hook does not alter
+ * execution order
+ * - Failed `after each` hook skips remaining tests in a
+ * suite and subsuites, but executes other `after each`
+ * hooks
+ *
+ * @api private
+ * @param {Hook} hook
+ * @param {Error} err
+ */
+Runner.prototype.failHook = function(hook, err) {
+ if (hook.ctx && hook.ctx.currentTest) {
+ hook.originalTitle = hook.originalTitle || hook.title;
+ hook.title = hook.originalTitle + ' for "' + hook.ctx.currentTest.title + '"';
+ }
+
+ this.fail(hook, err);
+ if (this.suite.bail()) {
+ this.emit('end');
+ }
+};
+
+/**
+ * Run hook `name` callbacks and then invoke `fn()`.
+ *
+ * @api private
+ * @param {string} name
+ * @param {Function} fn
+ */
+
+Runner.prototype.hook = function(name, fn) {
+ var suite = this.suite;
+ var hooks = suite['_' + name];
+ var self = this;
+
+ function next(i) {
+ var hook = hooks[i];
+ if (!hook) {
+ return fn();
+ }
+ self.currentRunnable = hook;
+
+ hook.ctx.currentTest = self.test;
+
+ self.emit('hook', hook);
+
+ if (!hook.listeners('error').length) {
+ hook.on('error', function(err) {
+ self.failHook(hook, err);
+ });
+ }
+
+ hook.run(function(err) {
+ var testError = hook.error();
+ if (testError) {
+ self.fail(self.test, testError);
+ }
+ if (err) {
+ if (err instanceof Pending) {
+ if (name === 'beforeEach' || name === 'afterEach') {
+ self.test.pending = true;
+ } else {
+ utils.forEach(suite.tests, function(test) {
+ test.pending = true;
+ });
+ // a pending hook won't be executed twice.
+ hook.pending = true;
+ }
+ } else {
+ self.failHook(hook, err);
+
+ // stop executing hooks, notify callee of hook err
+ return fn(err);
+ }
+ }
+ self.emit('hook end', hook);
+ delete hook.ctx.currentTest;
+ next(++i);
+ });
+ }
+
+ Runner.immediately(function() {
+ next(0);
+ });
+};
+
+/**
+ * Run hook `name` for the given array of `suites`
+ * in order, and callback `fn(err, errSuite)`.
+ *
+ * @api private
+ * @param {string} name
+ * @param {Array} suites
+ * @param {Function} fn
+ */
+Runner.prototype.hooks = function(name, suites, fn) {
+ var self = this;
+ var orig = this.suite;
+
+ function next(suite) {
+ self.suite = suite;
+
+ if (!suite) {
+ self.suite = orig;
+ return fn();
+ }
+
+ self.hook(name, function(err) {
+ if (err) {
+ var errSuite = self.suite;
+ self.suite = orig;
+ return fn(err, errSuite);
+ }
+
+ next(suites.pop());
+ });
+ }
+
+ next(suites.pop());
+};
+
+/**
+ * Run hooks from the top level down.
+ *
+ * @param {String} name
+ * @param {Function} fn
+ * @api private
+ */
+Runner.prototype.hookUp = function(name, fn) {
+ var suites = [this.suite].concat(this.parents()).reverse();
+ this.hooks(name, suites, fn);
+};
+
+/**
+ * Run hooks from the bottom up.
+ *
+ * @param {String} name
+ * @param {Function} fn
+ * @api private
+ */
+Runner.prototype.hookDown = function(name, fn) {
+ var suites = [this.suite].concat(this.parents());
+ this.hooks(name, suites, fn);
+};
+
+/**
+ * Return an array of parent Suites from
+ * closest to furthest.
+ *
+ * @return {Array}
+ * @api private
+ */
+Runner.prototype.parents = function() {
+ var suite = this.suite;
+ var suites = [];
+ while (suite.parent) {
+ suite = suite.parent;
+ suites.push(suite);
+ }
+ return suites;
+};
+
+/**
+ * Run the current test and callback `fn(err)`.
+ *
+ * @param {Function} fn
+ * @api private
+ */
+Runner.prototype.runTest = function(fn) {
+ var self = this;
+ var test = this.test;
+
+ if (!test) {
+ return;
+ }
+ if (this.asyncOnly) {
+ test.asyncOnly = true;
+ }
+
+ if (this.allowUncaught) {
+ test.allowUncaught = true;
+ return test.run(fn);
+ }
+ try {
+ test.on('error', function(err) {
+ self.fail(test, err);
+ });
+ test.run(fn);
+ } catch (err) {
+ fn(err);
+ }
+};
+
+/**
+ * Run tests in the given `suite` and invoke the callback `fn()` when complete.
+ *
+ * @api private
+ * @param {Suite} suite
+ * @param {Function} fn
+ */
+Runner.prototype.runTests = function(suite, fn) {
+ var self = this;
+ var tests = suite.tests.slice();
+ var test;
+
+ function hookErr(_, errSuite, after) {
+ // before/after Each hook for errSuite failed:
+ var orig = self.suite;
+
+ // for failed 'after each' hook start from errSuite parent,
+ // otherwise start from errSuite itself
+ self.suite = after ? errSuite.parent : errSuite;
+
+ if (self.suite) {
+ // call hookUp afterEach
+ self.hookUp('afterEach', function(err2, errSuite2) {
+ self.suite = orig;
+ // some hooks may fail even now
+ if (err2) {
+ return hookErr(err2, errSuite2, true);
+ }
+ // report error suite
+ fn(errSuite);
+ });
+ } else {
+ // there is no need calling other 'after each' hooks
+ self.suite = orig;
+ fn(errSuite);
+ }
+ }
+
+ function next(err, errSuite) {
+ // if we bail after first err
+ if (self.failures && suite._bail) {
+ return fn();
+ }
+
+ if (self._abort) {
+ return fn();
+ }
+
+ if (err) {
+ return hookErr(err, errSuite, true);
+ }
+
+ // next test
+ test = tests.shift();
+
+ // all done
+ if (!test) {
+ return fn();
+ }
+
+ // grep
+ var match = self._grep.test(test.fullTitle());
+ if (self._invert) {
+ match = !match;
+ }
+ if (!match) {
+ // Run immediately only if we have defined a grep. When we
+ // define a grep — It can cause maximum callstack error if
+ // the grep is doing a large recursive loop by neglecting
+ // all tests. The run immediately function also comes with
+ // a performance cost. So we don't want to run immediately
+ // if we run the whole test suite, because running the whole
+ // test suite don't do any immediate recursive loops. Thus,
+ // allowing a JS runtime to breathe.
+ if (self._grep !== self._defaultGrep) {
+ Runner.immediately(next);
+ } else {
+ next();
+ }
+ return;
+ }
+
+ if (test.isPending()) {
+ self.emit('pending', test);
+ self.emit('test end', test);
+ return next();
+ }
+
+ // execute test and hook(s)
+ self.emit('test', self.test = test);
+ self.hookDown('beforeEach', function(err, errSuite) {
+ if (test.isPending()) {
+ self.emit('pending', test);
+ self.emit('test end', test);
+ return next();
+ }
+ if (err) {
+ return hookErr(err, errSuite, false);
+ }
+ self.currentRunnable = self.test;
+ self.runTest(function(err) {
+ test = self.test;
+ if (err) {
+ var retry = test.currentRetry();
+ if (err instanceof Pending) {
+ test.pending = true;
+ self.emit('pending', test);
+ } else if (retry < test.retries()) {
+ var clonedTest = test.clone();
+ clonedTest.currentRetry(retry + 1);
+ tests.unshift(clonedTest);
+
+ // Early return + hook trigger so that it doesn't
+ // increment the count wrong
+ return self.hookUp('afterEach', next);
+ } else {
+ self.fail(test, err);
+ }
+ self.emit('test end', test);
+
+ if (err instanceof Pending) {
+ return next();
+ }
+
+ return self.hookUp('afterEach', next);
+ }
+
+ test.state = 'passed';
+ self.emit('pass', test);
+ self.emit('test end', test);
+ self.hookUp('afterEach', next);
+ });
+ });
+ }
+
+ this.next = next;
+ this.hookErr = hookErr;
+ next();
+};
+
+/**
+ * Run the given `suite` and invoke the callback `fn()` when complete.
+ *
+ * @api private
+ * @param {Suite} suite
+ * @param {Function} fn
+ */
+Runner.prototype.runSuite = function(suite, fn) {
+ var i = 0;
+ var self = this;
+ var total = this.grepTotal(suite);
+ var afterAllHookCalled = false;
+
+ debug('run suite %s', suite.fullTitle());
+
+ if (!total || (self.failures && suite._bail)) {
+ return fn();
+ }
+
+ this.emit('suite', this.suite = suite);
+
+ function next(errSuite) {
+ if (errSuite) {
+ // current suite failed on a hook from errSuite
+ if (errSuite === suite) {
+ // if errSuite is current suite
+ // continue to the next sibling suite
+ return done();
+ }
+ // errSuite is among the parents of current suite
+ // stop execution of errSuite and all sub-suites
+ return done(errSuite);
+ }
+
+ if (self._abort) {
+ return done();
+ }
+
+ var curr = suite.suites[i++];
+ if (!curr) {
+ return done();
+ }
+
+ // Avoid grep neglecting large number of tests causing a
+ // huge recursive loop and thus a maximum call stack error.
+ // See comment in `this.runTests()` for more information.
+ if (self._grep !== self._defaultGrep) {
+ Runner.immediately(function() {
+ self.runSuite(curr, next);
+ });
+ } else {
+ self.runSuite(curr, next);
+ }
+ }
+
+ function done(errSuite) {
+ self.suite = suite;
+ self.nextSuite = next;
+
+ if (afterAllHookCalled) {
+ fn(errSuite);
+ } else {
+ // mark that the afterAll block has been called once
+ // and so can be skipped if there is an error in it.
+ afterAllHookCalled = true;
+
+ // remove reference to test
+ delete self.test;
+
+ self.hook('afterAll', function() {
+ self.emit('suite end', suite);
+ fn(errSuite);
+ });
+ }
+ }
+
+ this.nextSuite = next;
+
+ this.hook('beforeAll', function(err) {
+ if (err) {
+ return done();
+ }
+ self.runTests(suite, next);
+ });
+};
+
+/**
+ * Handle uncaught exceptions.
+ *
+ * @param {Error} err
+ * @api private
+ */
+Runner.prototype.uncaught = function(err) {
+ if (err) {
+ debug('uncaught exception %s', err !== function() {
+ return this;
+ }.call(err) ? err : (err.message || err));
+ } else {
+ debug('uncaught undefined exception');
+ err = undefinedError();
+ }
+ err.uncaught = true;
+
+ var runnable = this.currentRunnable;
+
+ if (!runnable) {
+ runnable = new Runnable('Uncaught error outside test suite');
+ runnable.parent = this.suite;
+
+ if (this.started) {
+ this.fail(runnable, err);
+ } else {
+ // Can't recover from this failure
+ this.emit('start');
+ this.fail(runnable, err);
+ this.emit('end');
+ }
+
+ return;
+ }
+
+ runnable.clearTimeout();
+
+ // Ignore errors if complete or pending
+ if (runnable.state || runnable.isPending()) {
+ return;
+ }
+ this.fail(runnable, err);
+
+ // recover from test
+ if (runnable.type === 'test') {
+ this.emit('test end', runnable);
+ this.hookUp('afterEach', this.next);
+ return;
+ }
+
+ // recover from hooks
+ if (runnable.type === 'hook') {
+ var errSuite = this.suite;
+ // if hook failure is in afterEach block
+ if (runnable.fullTitle().indexOf('after each') > -1) {
+ return this.hookErr(err, errSuite, true);
+ }
+ // if hook failure is in beforeEach block
+ if (runnable.fullTitle().indexOf('before each') > -1) {
+ return this.hookErr(err, errSuite, false);
+ }
+ // if hook failure is in after or before blocks
+ return this.nextSuite(errSuite);
+ }
+
+ // bail
+ this.emit('end');
+};
+
+/**
+ * Cleans up the references to all the deferred functions
+ * (before/after/beforeEach/afterEach) and tests of a Suite.
+ * These must be deleted otherwise a memory leak can happen,
+ * as those functions may reference variables from closures,
+ * thus those variables can never be garbage collected as long
+ * as the deferred functions exist.
+ *
+ * @param {Suite} suite
+ */
+function cleanSuiteReferences(suite) {
+ function cleanArrReferences(arr) {
+ for (var i = 0; i < arr.length; i++) {
+ delete arr[i].fn;
+ }
+ }
+
+ if (isArray(suite._beforeAll)) {
+ cleanArrReferences(suite._beforeAll);
+ }
+
+ if (isArray(suite._beforeEach)) {
+ cleanArrReferences(suite._beforeEach);
+ }
+
+ if (isArray(suite._afterAll)) {
+ cleanArrReferences(suite._afterAll);
+ }
+
+ if (isArray(suite._afterEach)) {
+ cleanArrReferences(suite._afterEach);
+ }
+
+ for (var i = 0; i < suite.tests.length; i++) {
+ delete suite.tests[i].fn;
+ }
+}
+
+/**
+ * Run the root suite and invoke `fn(failures)`
+ * on completion.
+ *
+ * @param {Function} fn
+ * @return {Runner} for chaining
+ * @api public
+ * @param {Function} fn
+ * @return {Runner} Runner instance.
+ */
+Runner.prototype.run = function(fn) {
+ var self = this;
+ var rootSuite = this.suite;
+
+ // If there is an `only` filter
+ if (this.hasOnly) {
+ filterOnly(rootSuite);
+ }
+
+ fn = fn || function() {};
+
+ function uncaught(err) {
+ self.uncaught(err);
+ }
+
+ function start() {
+ self.started = true;
+ self.emit('start');
+ self.runSuite(rootSuite, function() {
+ debug('finished running');
+ self.emit('end');
+ });
+ }
+
+ debug('start');
+
+ // references cleanup to avoid memory leaks
+ this.on('suite end', cleanSuiteReferences);
+
+ // callback
+ this.on('end', function() {
+ debug('end');
+ process.removeListener('uncaughtException', uncaught);
+ fn(self.failures);
+ });
+
+ // uncaught exception
+ process.on('uncaughtException', uncaught);
+
+ if (this._delay) {
+ // for reporters, I guess.
+ // might be nice to debounce some dots while we wait.
+ this.emit('waiting', rootSuite);
+ rootSuite.once('run', start);
+ } else {
+ start();
+ }
+
+ return this;
+};
+
+/**
+ * Cleanly abort execution.
+ *
+ * @api public
+ * @return {Runner} Runner instance.
+ */
+Runner.prototype.abort = function() {
+ debug('aborting');
+ this._abort = true;
+
+ return this;
+};
+
+/**
+ * Filter suites based on `isOnly` logic.
+ *
+ * @param {Array} suite
+ * @returns {Boolean}
+ * @api private
+ */
+function filterOnly(suite) {
+ if (suite._onlyTests.length) {
+ // If the suite contains `only` tests, run those and ignore any nested suites.
+ suite.tests = suite._onlyTests;
+ suite.suites = [];
+ } else {
+ // Otherwise, do not run any of the tests in this suite.
+ suite.tests = [];
+ utils.forEach(suite._onlySuites, function(onlySuite) {
+ // If there are other `only` tests/suites nested in the current `only` suite, then filter that `only` suite.
+ // Otherwise, all of the tests on this `only` suite should be run, so don't filter it.
+ if (hasOnly(onlySuite)) {
+ filterOnly(onlySuite);
+ }
+ });
+ // Run the `only` suites, as well as any other suites that have `only` tests/suites as descendants.
+ suite.suites = filter(suite.suites, function(childSuite) {
+ return indexOf(suite._onlySuites, childSuite) !== -1 || filterOnly(childSuite);
+ });
+ }
+ // Keep the suite only if there is something to run
+ return suite.tests.length || suite.suites.length;
+}
+
+/**
+ * Determines whether a suite has an `only` test or suite as a descendant.
+ *
+ * @param {Array} suite
+ * @returns {Boolean}
+ * @api private
+ */
+function hasOnly(suite) {
+ return suite._onlyTests.length || suite._onlySuites.length || some(suite.suites, hasOnly);
+}
+
+/**
+ * Filter leaks with the given globals flagged as `ok`.
+ *
+ * @api private
+ * @param {Array} ok
+ * @param {Array} globals
+ * @return {Array}
+ */
+function filterLeaks(ok, globals) {
+ return filter(globals, function(key) {
+ // Firefox and Chrome exposes iframes as index inside the window object
+ if (/^\d+/.test(key)) {
+ return false;
+ }
+
+ // in firefox
+ // if runner runs in an iframe, this iframe's window.getInterface method
+ // not init at first it is assigned in some seconds
+ if (global.navigator && (/^getInterface/).test(key)) {
+ return false;
+ }
+
+ // an iframe could be approached by window[iframeIndex]
+ // in ie6,7,8 and opera, iframeIndex is enumerable, this could cause leak
+ if (global.navigator && (/^\d+/).test(key)) {
+ return false;
+ }
+
+ // Opera and IE expose global variables for HTML element IDs (issue #243)
+ if (/^mocha-/.test(key)) {
+ return false;
+ }
+
+ var matched = filter(ok, function(ok) {
+ if (~ok.indexOf('*')) {
+ return key.indexOf(ok.split('*')[0]) === 0;
+ }
+ return key === ok;
+ });
+ return !matched.length && (!global.navigator || key !== 'onerror');
+ });
+}
+
+/**
+ * Array of globals dependent on the environment.
+ *
+ * @return {Array}
+ * @api private
+ */
+function extraGlobals() {
+ if (typeof process === 'object' && typeof process.version === 'string') {
+ var parts = process.version.split('.');
+ var nodeVersion = utils.reduce(parts, function(a, v) {
+ return a << 8 | v;
+ });
+
+ // 'errno' was renamed to process._errno in v0.9.11.
+
+ if (nodeVersion < 0x00090B) {
+ return ['errno'];
+ }
+ }
+
+ return [];
+}
diff --git a/tests/lib/mocha-2.2.5/lib/suite.js b/tests/lib/mocha-3.1.0/lib/suite.js
index edc820e23a..bf3e4e9fef 100755..100644
--- a/tests/lib/mocha-2.2.5/lib/suite.js
+++ b/tests/lib/mocha-3.1.0/lib/suite.js
@@ -2,11 +2,12 @@
* Module dependencies.
*/
-var EventEmitter = require('events').EventEmitter
- , debug = require('debug')('mocha:suite')
- , milliseconds = require('./ms')
- , utils = require('./utils')
- , Hook = require('./hook');
+var EventEmitter = require('events').EventEmitter;
+var Hook = require('./hook');
+var utils = require('./utils');
+var inherits = utils.inherits;
+var debug = require('debug')('mocha:suite');
+var milliseconds = require('./ms');
/**
* Expose `Suite`.
@@ -15,41 +16,38 @@ var EventEmitter = require('events').EventEmitter
exports = module.exports = Suite;
/**
- * Create a new `Suite` with the given `title`
- * and parent `Suite`. When a suite with the
- * same title is already present, that suite
- * is returned to provide nicer reporter
- * and more flexible meta-testing.
+ * Create a new `Suite` with the given `title` and parent `Suite`. When a suite
+ * with the same title is already present, that suite is returned to provide
+ * nicer reporter and more flexible meta-testing.
*
+ * @api public
* @param {Suite} parent
- * @param {String} title
+ * @param {string} title
* @return {Suite}
- * @api public
*/
-
-exports.create = function(parent, title){
+exports.create = function(parent, title) {
var suite = new Suite(title, parent.ctx);
suite.parent = parent;
- if (parent.pending) suite.pending = true;
title = suite.fullTitle();
parent.addSuite(suite);
return suite;
};
/**
- * Initialize a new `Suite` with the given
- * `title` and `ctx`.
+ * Initialize a new `Suite` with the given `title` and `ctx`.
*
- * @param {String} title
- * @param {Context} ctx
* @api private
+ * @param {string} title
+ * @param {Context} parentContext
*/
-
function Suite(title, parentContext) {
+ if (!utils.isString(title)) {
+ throw new Error('Suite `title` should be a "string" but "' + typeof title + '" was given instead.');
+ }
this.title = title;
- var context = function() {};
- context.prototype = parentContext;
- this.ctx = new context();
+ function Context() {}
+ Context.prototype = parentContext;
+ this.ctx = new Context();
this.suites = [];
this.tests = [];
this.pending = false;
@@ -62,27 +60,29 @@ function Suite(title, parentContext) {
this._enableTimeouts = true;
this._slow = 75;
this._bail = false;
+ this._retries = -1;
+ this._onlyTests = [];
+ this._onlySuites = [];
this.delayed = false;
}
/**
* Inherit from `EventEmitter.prototype`.
*/
-
-Suite.prototype.__proto__ = EventEmitter.prototype;
+inherits(Suite, EventEmitter);
/**
* Return a clone of this `Suite`.
*
- * @return {Suite}
* @api private
+ * @return {Suite}
*/
-
-Suite.prototype.clone = function(){
+Suite.prototype.clone = function() {
var suite = new Suite(this.title);
debug('clone');
suite.ctx = this.ctx;
suite.timeout(this.timeout());
+ suite.retries(this.retries());
suite.enableTimeouts(this.enableTimeouts());
suite.slow(this.slow());
suite.bail(this.bail());
@@ -92,30 +92,52 @@ Suite.prototype.clone = function(){
/**
* Set timeout `ms` or short-hand such as "2s".
*
- * @param {Number|String} ms
- * @return {Suite|Number} for chaining
* @api private
+ * @param {number|string} ms
+ * @return {Suite|number} for chaining
*/
-
-Suite.prototype.timeout = function(ms){
- if (0 == arguments.length) return this._timeout;
- if (ms.toString() === '0') this._enableTimeouts = false;
- if ('string' == typeof ms) ms = milliseconds(ms);
+Suite.prototype.timeout = function(ms) {
+ if (!arguments.length) {
+ return this._timeout;
+ }
+ if (ms.toString() === '0') {
+ this._enableTimeouts = false;
+ }
+ if (typeof ms === 'string') {
+ ms = milliseconds(ms);
+ }
debug('timeout %d', ms);
this._timeout = parseInt(ms, 10);
return this;
};
/**
- * Set timeout `enabled`.
+ * Set number of times to retry a failed test.
+ *
+ * @api private
+ * @param {number|string} n
+ * @return {Suite|number} for chaining
+ */
+Suite.prototype.retries = function(n) {
+ if (!arguments.length) {
+ return this._retries;
+ }
+ debug('retries %d', n);
+ this._retries = parseInt(n, 10) || 0;
+ return this;
+};
+
+/**
+ * Set timeout to `enabled`.
*
- * @param {Boolean} enabled
- * @return {Suite|Boolean} self or enabled
* @api private
+ * @param {boolean} enabled
+ * @return {Suite|boolean} self or enabled
*/
-
-Suite.prototype.enableTimeouts = function(enabled){
- if (arguments.length === 0) return this._enableTimeouts;
+Suite.prototype.enableTimeouts = function(enabled) {
+ if (!arguments.length) {
+ return this._enableTimeouts;
+ }
debug('enableTimeouts %s', enabled);
this._enableTimeouts = enabled;
return this;
@@ -124,14 +146,17 @@ Suite.prototype.enableTimeouts = function(enabled){
/**
* Set slow `ms` or short-hand such as "2s".
*
- * @param {Number|String} ms
- * @return {Suite|Number} for chaining
* @api private
+ * @param {number|string} ms
+ * @return {Suite|number} for chaining
*/
-
-Suite.prototype.slow = function(ms){
- if (0 === arguments.length) return this._slow;
- if ('string' == typeof ms) ms = milliseconds(ms);
+Suite.prototype.slow = function(ms) {
+ if (!arguments.length) {
+ return this._slow;
+ }
+ if (typeof ms === 'string') {
+ ms = milliseconds(ms);
+ }
debug('slow %d', ms);
this._slow = ms;
return this;
@@ -140,29 +165,41 @@ Suite.prototype.slow = function(ms){
/**
* Sets whether to bail after first error.
*
- * @param {Boolean} bail
- * @return {Suite|Number} for chaining
* @api private
+ * @param {boolean} bail
+ * @return {Suite|number} for chaining
*/
-
-Suite.prototype.bail = function(bail){
- if (0 == arguments.length) return this._bail;
+Suite.prototype.bail = function(bail) {
+ if (!arguments.length) {
+ return this._bail;
+ }
debug('bail %s', bail);
this._bail = bail;
return this;
};
/**
+ * Check if this suite or its parent suite is marked as pending.
+ *
+ * @api private
+ */
+Suite.prototype.isPending = function() {
+ return this.pending || (this.parent && this.parent.isPending());
+};
+
+/**
* Run `fn(test[, done])` before running tests.
*
+ * @api private
+ * @param {string} title
* @param {Function} fn
* @return {Suite} for chaining
- * @api private
*/
-
-Suite.prototype.beforeAll = function(title, fn){
- if (this.pending) return this;
- if ('function' === typeof title) {
+Suite.prototype.beforeAll = function(title, fn) {
+ if (this.isPending()) {
+ return this;
+ }
+ if (typeof title === 'function') {
fn = title;
title = fn.name;
}
@@ -171,6 +208,7 @@ Suite.prototype.beforeAll = function(title, fn){
var hook = new Hook(title, fn);
hook.parent = this;
hook.timeout(this.timeout());
+ hook.retries(this.retries());
hook.enableTimeouts(this.enableTimeouts());
hook.slow(this.slow());
hook.ctx = this.ctx;
@@ -182,14 +220,16 @@ Suite.prototype.beforeAll = function(title, fn){
/**
* Run `fn(test[, done])` after running tests.
*
+ * @api private
+ * @param {string} title
* @param {Function} fn
* @return {Suite} for chaining
- * @api private
*/
-
-Suite.prototype.afterAll = function(title, fn){
- if (this.pending) return this;
- if ('function' === typeof title) {
+Suite.prototype.afterAll = function(title, fn) {
+ if (this.isPending()) {
+ return this;
+ }
+ if (typeof title === 'function') {
fn = title;
title = fn.name;
}
@@ -198,6 +238,7 @@ Suite.prototype.afterAll = function(title, fn){
var hook = new Hook(title, fn);
hook.parent = this;
hook.timeout(this.timeout());
+ hook.retries(this.retries());
hook.enableTimeouts(this.enableTimeouts());
hook.slow(this.slow());
hook.ctx = this.ctx;
@@ -209,14 +250,16 @@ Suite.prototype.afterAll = function(title, fn){
/**
* Run `fn(test[, done])` before each test case.
*
+ * @api private
+ * @param {string} title
* @param {Function} fn
* @return {Suite} for chaining
- * @api private
*/
-
-Suite.prototype.beforeEach = function(title, fn){
- if (this.pending) return this;
- if ('function' === typeof title) {
+Suite.prototype.beforeEach = function(title, fn) {
+ if (this.isPending()) {
+ return this;
+ }
+ if (typeof title === 'function') {
fn = title;
title = fn.name;
}
@@ -225,6 +268,7 @@ Suite.prototype.beforeEach = function(title, fn){
var hook = new Hook(title, fn);
hook.parent = this;
hook.timeout(this.timeout());
+ hook.retries(this.retries());
hook.enableTimeouts(this.enableTimeouts());
hook.slow(this.slow());
hook.ctx = this.ctx;
@@ -236,14 +280,16 @@ Suite.prototype.beforeEach = function(title, fn){
/**
* Run `fn(test[, done])` after each test case.
*
+ * @api private
+ * @param {string} title
* @param {Function} fn
* @return {Suite} for chaining
- * @api private
*/
-
-Suite.prototype.afterEach = function(title, fn){
- if (this.pending) return this;
- if ('function' === typeof title) {
+Suite.prototype.afterEach = function(title, fn) {
+ if (this.isPending()) {
+ return this;
+ }
+ if (typeof title === 'function') {
fn = title;
title = fn.name;
}
@@ -252,6 +298,7 @@ Suite.prototype.afterEach = function(title, fn){
var hook = new Hook(title, fn);
hook.parent = this;
hook.timeout(this.timeout());
+ hook.retries(this.retries());
hook.enableTimeouts(this.enableTimeouts());
hook.slow(this.slow());
hook.ctx = this.ctx;
@@ -263,14 +310,14 @@ Suite.prototype.afterEach = function(title, fn){
/**
* Add a test `suite`.
*
+ * @api private
* @param {Suite} suite
* @return {Suite} for chaining
- * @api private
*/
-
-Suite.prototype.addSuite = function(suite){
+Suite.prototype.addSuite = function(suite) {
suite.parent = this;
suite.timeout(this.timeout());
+ suite.retries(this.retries());
suite.enableTimeouts(this.enableTimeouts());
suite.slow(this.slow());
suite.bail(this.bail());
@@ -282,14 +329,14 @@ Suite.prototype.addSuite = function(suite){
/**
* Add a `test` to this suite.
*
+ * @api private
* @param {Test} test
* @return {Suite} for chaining
- * @api private
*/
-
-Suite.prototype.addTest = function(test){
+Suite.prototype.addTest = function(test) {
test.parent = this;
test.timeout(this.timeout());
+ test.retries(this.retries());
test.enableTimeouts(this.enableTimeouts());
test.slow(this.slow());
test.ctx = this.ctx;
@@ -299,17 +346,18 @@ Suite.prototype.addTest = function(test){
};
/**
- * Return the full title generated by recursively
- * concatenating the parent's full title.
+ * Return the full title generated by recursively concatenating the parent's
+ * full title.
*
- * @return {String}
* @api public
+ * @return {string}
*/
-
-Suite.prototype.fullTitle = function(){
+Suite.prototype.fullTitle = function() {
if (this.parent) {
var full = this.parent.fullTitle();
- if (full) return full + ' ' + this.title;
+ if (full) {
+ return full + ' ' + this.title;
+ }
}
return this.title;
};
@@ -317,29 +365,26 @@ Suite.prototype.fullTitle = function(){
/**
* Return the total number of tests.
*
- * @return {Number}
* @api public
+ * @return {number}
*/
-
-Suite.prototype.total = function(){
- return utils.reduce(this.suites, function(sum, suite){
+Suite.prototype.total = function() {
+ return utils.reduce(this.suites, function(sum, suite) {
return sum + suite.total();
}, 0) + this.tests.length;
};
/**
- * Iterates through each suite recursively to find
- * all tests. Applies a function in the format
- * `fn(test)`.
+ * Iterates through each suite recursively to find all tests. Applies a
+ * function in the format `fn(test)`.
*
+ * @api private
* @param {Function} fn
* @return {Suite}
- * @api private
*/
-
-Suite.prototype.eachTest = function(fn){
+Suite.prototype.eachTest = function(fn) {
utils.forEach(this.tests, fn);
- utils.forEach(this.suites, function(suite){
+ utils.forEach(this.suites, function(suite) {
suite.eachTest(fn);
});
return this;
diff --git a/tests/lib/mocha-2.2.5/lib/template.html b/tests/lib/mocha-3.1.0/lib/template.html
index 0590d4aac2..36c5e0b694 100755..100644
--- a/tests/lib/mocha-2.2.5/lib/template.html
+++ b/tests/lib/mocha-3.1.0/lib/template.html
@@ -9,7 +9,7 @@
<body>
<div id="mocha"></div>
<script src="mocha.js"></script>
- <script>mocha.setup('bdd')</script>
+ <script>mocha.setup('bdd');</script>
<script src="tests.js"></script>
<script>
mocha.run();
diff --git a/tests/lib/mocha-3.1.0/lib/test.js b/tests/lib/mocha-3.1.0/lib/test.js
new file mode 100644
index 0000000000..05d4ed86d5
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/lib/test.js
@@ -0,0 +1,50 @@
+/**
+ * Module dependencies.
+ */
+
+var Runnable = require('./runnable');
+var create = require('lodash.create');
+var isString = require('./utils').isString;
+
+/**
+ * Expose `Test`.
+ */
+
+module.exports = Test;
+
+/**
+ * Initialize a new `Test` with the given `title` and callback `fn`.
+ *
+ * @api private
+ * @param {String} title
+ * @param {Function} fn
+ */
+function Test(title, fn) {
+ if (!isString(title)) {
+ throw new Error('Test `title` should be a "string" but "' + typeof title + '" was given instead.');
+ }
+ Runnable.call(this, title, fn);
+ this.pending = !fn;
+ this.type = 'test';
+}
+
+/**
+ * Inherit from `Runnable.prototype`.
+ */
+Test.prototype = create(Runnable.prototype, {
+ constructor: Test
+});
+
+Test.prototype.clone = function() {
+ var test = new Test(this.title, this.fn);
+ test.timeout(this.timeout());
+ test.slow(this.slow());
+ test.enableTimeouts(this.enableTimeouts());
+ test.retries(this.retries());
+ test.currentRetry(this.currentRetry());
+ test.globals(this.globals());
+ test.parent = this.parent;
+ test.file = this.file;
+ test.ctx = this.ctx;
+ return test;
+};
diff --git a/tests/lib/mocha-3.1.0/lib/to-iso-string/LICENSE b/tests/lib/mocha-3.1.0/lib/to-iso-string/LICENSE
new file mode 100644
index 0000000000..c25db56595
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/lib/to-iso-string/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2016 Segment.io, Inc. (friends@segment.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/tests/lib/mocha-3.1.0/lib/to-iso-string/index.js b/tests/lib/mocha-3.1.0/lib/to-iso-string/index.js
new file mode 100644
index 0000000000..cd28d7be71
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/lib/to-iso-string/index.js
@@ -0,0 +1,37 @@
+'use strict';
+
+/**
+ * Pad a `number` with a ten's place zero.
+ *
+ * @param {number} number
+ * @return {string}
+ */
+function pad(number) {
+ var n = number.toString();
+ return n.length === 1 ? '0' + n : n;
+}
+
+/**
+ * Turn a `date` into an ISO string.
+ *
+ * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString
+ *
+ * @param {Date} date
+ * @return {string}
+ */
+function toISOString(date) {
+ return date.getUTCFullYear()
+ + '-' + pad(date.getUTCMonth() + 1)
+ + '-' + pad(date.getUTCDate())
+ + 'T' + pad(date.getUTCHours())
+ + ':' + pad(date.getUTCMinutes())
+ + ':' + pad(date.getUTCSeconds())
+ + '.' + String((date.getUTCMilliseconds()/1000).toFixed(3)).slice(2, 5)
+ + 'Z';
+}
+
+/*
+ * Exports.
+ */
+
+module.exports = toISOString;
diff --git a/tests/lib/mocha-2.2.5/lib/utils.js b/tests/lib/mocha-3.1.0/lib/utils.js
index 845f84c25d..c7947cb05d 100755..100644
--- a/tests/lib/mocha-2.2.5/lib/utils.js
+++ b/tests/lib/mocha-3.1.0/lib/utils.js
@@ -1,14 +1,20 @@
+/* eslint-env browser */
+
/**
* Module dependencies.
*/
-var fs = require('fs')
- , path = require('path')
- , basename = path.basename
- , exists = fs.existsSync || path.existsSync
- , glob = require('glob')
- , join = path.join
- , debug = require('debug')('mocha:watch');
+var JSON = require('json3');
+var basename = require('path').basename;
+var debug = require('debug')('mocha:watch');
+var exists = require('fs').existsSync || require('path').existsSync;
+var glob = require('glob');
+var path = require('path');
+var join = path.join;
+var readdirSync = require('fs').readdirSync;
+var statSync = require('fs').statSync;
+var watchFile = require('fs').watchFile;
+var toISOString = require('./to-iso-string');
/**
* Ignored directories.
@@ -16,15 +22,16 @@ var fs = require('fs')
var ignore = ['node_modules', '.git'];
+exports.inherits = require('util').inherits;
+
/**
* Escape special characters in the given string of html.
*
- * @param {String} html
- * @return {String}
* @api private
+ * @param {string} html
+ * @return {string}
*/
-
-exports.escape = function(html){
+exports.escape = function(html) {
return String(html)
.replace(/&/g, '&amp;')
.replace(/"/g, '&quot;')
@@ -35,57 +42,59 @@ exports.escape = function(html){
/**
* Array#forEach (<=IE8)
*
- * @param {Array} array
+ * @api private
+ * @param {Array} arr
* @param {Function} fn
* @param {Object} scope
- * @api private
*/
-
-exports.forEach = function(arr, fn, scope){
- for (var i = 0, l = arr.length; i < l; i++)
+exports.forEach = function(arr, fn, scope) {
+ for (var i = 0, l = arr.length; i < l; i++) {
fn.call(scope, arr[i], i);
+ }
};
/**
- * Test if the given obj is type of string
+ * Test if the given obj is type of string.
*
+ * @api private
* @param {Object} obj
- * @returns Boolean
+ * @return {boolean}
*/
-
exports.isString = function(obj) {
- return 'string' === typeof obj;
+ return typeof obj === 'string';
};
/**
* Array#map (<=IE8)
*
- * @param {Array} array
+ * @api private
+ * @param {Array} arr
* @param {Function} fn
* @param {Object} scope
- * @api private
+ * @return {Array}
*/
-
-exports.map = function(arr, fn, scope){
+exports.map = function(arr, fn, scope) {
var result = [];
- for (var i = 0, l = arr.length; i < l; i++)
+ for (var i = 0, l = arr.length; i < l; i++) {
result.push(fn.call(scope, arr[i], i, arr));
+ }
return result;
};
/**
* Array#indexOf (<=IE8)
*
- * @parma {Array} arr
- * @param {Object} obj to find index of
- * @param {Number} start
* @api private
+ * @param {Array} arr
+ * @param {Object} obj to find index of
+ * @param {number} start
+ * @return {number}
*/
-
-exports.indexOf = function(arr, obj, start){
+var indexOf = exports.indexOf = function(arr, obj, start) {
for (var i = start || 0, l = arr.length; i < l; i++) {
- if (arr[i] === obj)
+ if (arr[i] === obj) {
return i;
+ }
}
return -1;
};
@@ -93,13 +102,13 @@ exports.indexOf = function(arr, obj, start){
/**
* Array#reduce (<=IE8)
*
- * @param {Array} array
- * @param {Function} fn
- * @param {Object} initial value
* @api private
+ * @param {Array} arr
+ * @param {Function} fn
+ * @param {Object} val Initial value.
+ * @return {*}
*/
-
-exports.reduce = function(arr, fn, val){
+var reduce = exports.reduce = function(arr, fn, val) {
var rval = val;
for (var i = 0, l = arr.length; i < l; i++) {
@@ -112,33 +121,51 @@ exports.reduce = function(arr, fn, val){
/**
* Array#filter (<=IE8)
*
- * @param {Array} array
- * @param {Function} fn
* @api private
+ * @param {Array} arr
+ * @param {Function} fn
+ * @return {Array}
*/
-
-exports.filter = function(arr, fn){
+exports.filter = function(arr, fn) {
var ret = [];
for (var i = 0, l = arr.length; i < l; i++) {
var val = arr[i];
- if (fn(val, i, arr)) ret.push(val);
+ if (fn(val, i, arr)) {
+ ret.push(val);
+ }
}
return ret;
};
/**
+ * Array#some (<=IE8)
+ *
+ * @api private
+ * @param {Array} arr
+ * @param {Function} fn
+ * @return {Array}
+ */
+exports.some = function(arr, fn) {
+ for (var i = 0, l = arr.length; i < l; i++) {
+ if (fn(arr[i])) {
+ return true;
+ }
+ }
+ return false;
+};
+
+/**
* Object.keys (<=IE8)
*
+ * @api private
* @param {Object} obj
* @return {Array} keys
- * @api private
*/
-
-exports.keys = Object.keys || function(obj) {
- var keys = []
- , has = Object.prototype.hasOwnProperty; // for `window` on <=IE8
+exports.keys = typeof Object.keys === 'function' ? Object.keys : function(obj) {
+ var keys = [];
+ var has = Object.prototype.hasOwnProperty; // for `window` on <=IE8
for (var key in obj) {
if (has.call(obj, key)) {
@@ -153,17 +180,18 @@ exports.keys = Object.keys || function(obj) {
* Watch the given `files` for changes
* and invoke `fn(file)` on modification.
*
+ * @api private
* @param {Array} files
* @param {Function} fn
- * @api private
*/
-
-exports.watch = function(files, fn){
+exports.watch = function(files, fn) {
var options = { interval: 100 };
- files.forEach(function(file){
+ files.forEach(function(file) {
debug('file %s', file);
- fs.watchFile(file, options, function(curr, prev){
- if (prev.mtime < curr.mtime) fn(file);
+ watchFile(file, options, function(curr, prev) {
+ if (prev.mtime < curr.mtime) {
+ fn(file);
+ }
});
});
};
@@ -171,51 +199,58 @@ exports.watch = function(files, fn){
/**
* Array.isArray (<=IE8)
*
+ * @api private
* @param {Object} obj
* @return {Boolean}
- * @api private
*/
-var isArray = Array.isArray || function (obj) {
- return '[object Array]' == {}.toString.call(obj);
+var isArray = typeof Array.isArray === 'function' ? Array.isArray : function(obj) {
+ return Object.prototype.toString.call(obj) === '[object Array]';
};
+exports.isArray = isArray;
+
/**
- * @description
- * Buffer.prototype.toJSON polyfill
+ * Buffer.prototype.toJSON polyfill.
+ *
* @type {Function}
*/
-if(typeof Buffer !== 'undefined' && Buffer.prototype) {
- Buffer.prototype.toJSON = Buffer.prototype.toJSON || function () {
+if (typeof Buffer !== 'undefined' && Buffer.prototype) {
+ Buffer.prototype.toJSON = Buffer.prototype.toJSON || function() {
return Array.prototype.slice.call(this, 0);
};
}
/**
* Ignored files.
+ *
+ * @api private
+ * @param {string} path
+ * @return {boolean}
*/
-
-function ignored(path){
+function ignored(path) {
return !~ignore.indexOf(path);
}
/**
* Lookup files in the given `dir`.
*
- * @return {Array}
* @api private
+ * @param {string} dir
+ * @param {string[]} [ext=['.js']]
+ * @param {Array} [ret=[]]
+ * @return {Array}
*/
-
-exports.files = function(dir, ext, ret){
+exports.files = function(dir, ext, ret) {
ret = ret || [];
ext = ext || ['js'];
var re = new RegExp('\\.(' + ext.join('|') + ')$');
- fs.readdirSync(dir)
+ readdirSync(dir)
.filter(ignored)
- .forEach(function(path){
+ .forEach(function(path) {
path = join(dir, path);
- if (fs.statSync(path).isDirectory()) {
+ if (statSync(path).isDirectory()) {
exports.files(path, ext, ret);
} else if (path.match(re)) {
ret.push(path);
@@ -228,12 +263,11 @@ exports.files = function(dir, ext, ret){
/**
* Compute a slug from the given `str`.
*
- * @param {String} str
- * @return {String}
* @api private
+ * @param {string} str
+ * @return {string}
*/
-
-exports.slug = function(str){
+exports.slug = function(str) {
return str
.toLowerCase()
.replace(/ +/g, '-')
@@ -241,19 +275,20 @@ exports.slug = function(str){
};
/**
- * Strip the function definition from `str`,
- * and re-indent for pre whitespace.
+ * Strip the function definition from `str`, and re-indent for pre whitespace.
+ *
+ * @param {string} str
+ * @return {string}
*/
-
exports.clean = function(str) {
str = str
- .replace(/\r\n?|[\n\u2028\u2029]/g, "\n").replace(/^\uFEFF/, '')
- .replace(/^function *\(.*\)\s*{|\(.*\) *=> *{?/, '')
- .replace(/\s+\}$/, '');
+ .replace(/\r\n?|[\n\u2028\u2029]/g, '\n').replace(/^\uFEFF/, '')
+ // (traditional)-> space/name parameters body (lambda)-> parameters body multi-statement/single keep body content
+ .replace(/^function(?:\s*|\s+[^(]*)\([^)]*\)\s*\{((?:.|\n)*?)\s*\}$|^\([^)]*\)\s*=>\s*(?:\{((?:.|\n)*?)\s*\}|((?:.|\n)*))$/, '$1$2$3');
- var spaces = str.match(/^\n?( *)/)[1].length
- , tabs = str.match(/^\n?(\t*)/)[1].length
- , re = new RegExp('^\n?' + (tabs ? '\t' : ' ') + '{' + (tabs ? tabs : spaces) + '}', 'gm');
+ var spaces = str.match(/^\n?( *)/)[1].length;
+ var tabs = str.match(/^\n?(\t*)/)[1].length;
+ var re = new RegExp('^\n?' + (tabs ? '\t' : ' ') + '{' + (tabs ? tabs : spaces) + '}', 'gm');
str = str.replace(re, '');
@@ -263,28 +298,26 @@ exports.clean = function(str) {
/**
* Trim the given `str`.
*
- * @param {String} str
- * @return {String}
* @api private
+ * @param {string} str
+ * @return {string}
*/
-
-exports.trim = function(str){
+exports.trim = function(str) {
return str.replace(/^\s+|\s+$/g, '');
};
/**
* Parse the given `qs`.
*
- * @param {String} qs
- * @return {Object}
* @api private
+ * @param {string} qs
+ * @return {Object}
*/
-
-exports.parseQuery = function(qs){
- return exports.reduce(qs.replace('?', '').split('&'), function(obj, pair){
- var i = pair.indexOf('=')
- , key = pair.slice(0, i)
- , val = pair.slice(++i);
+exports.parseQuery = function(qs) {
+ return reduce(qs.replace('?', '').split('&'), function(obj, pair) {
+ var i = pair.indexOf('=');
+ var key = pair.slice(0, i);
+ var val = pair.slice(++i);
obj[key] = decodeURIComponent(val);
return obj;
@@ -294,11 +327,10 @@ exports.parseQuery = function(qs){
/**
* Highlight the given string of `js`.
*
- * @param {String} js
- * @return {String}
* @api private
+ * @param {string} js
+ * @return {string}
*/
-
function highlight(js) {
return js
.replace(/</g, '&lt;')
@@ -308,16 +340,15 @@ function highlight(js) {
.replace(/(\d+\.\d+)/gm, '<span class="number">$1</span>')
.replace(/(\d+)/gm, '<span class="number">$1</span>')
.replace(/\bnew[ \t]+(\w+)/gm, '<span class="keyword">new</span> <span class="init">$1</span>')
- .replace(/\b(function|new|throw|return|var|if|else)\b/gm, '<span class="keyword">$1</span>')
+ .replace(/\b(function|new|throw|return|var|if|else)\b/gm, '<span class="keyword">$1</span>');
}
/**
* Highlight the contents of tag `name`.
*
- * @param {String} name
* @api private
+ * @param {string} name
*/
-
exports.highlightTags = function(name) {
var code = document.getElementById('mocha').getElementsByTagName(name);
for (var i = 0, len = code.length; i < len; ++i) {
@@ -326,22 +357,21 @@ exports.highlightTags = function(name) {
};
/**
- * If a value could have properties, and has none, this function is called, which returns
- * a string representation of the empty value.
+ * If a value could have properties, and has none, this function is called,
+ * which returns a string representation of the empty value.
*
* Functions w/ no properties return `'[Function]'`
* Arrays w/ length === 0 return `'[]'`
* Objects w/ no properties return `'{}'`
* All else: return result of `value.toString()`
*
- * @param {*} value Value to inspect
- * @param {string} [type] The type of the value, if known.
+ * @api private
+ * @param {*} value The value to inspect.
+ * @param {string} typeHint The type of the value
* @returns {string}
*/
-var emptyRepresentation = function emptyRepresentation(value, type) {
- type = type || exports.type(value);
-
- switch(type) {
+function emptyRepresentation(value, typeHint) {
+ switch (typeHint) {
case 'function':
return '[Function]';
case 'object':
@@ -351,11 +381,16 @@ var emptyRepresentation = function emptyRepresentation(value, type) {
default:
return value.toString();
}
-};
+}
/**
- * Takes some variable and asks `{}.toString()` what it thinks it is.
- * @param {*} value Anything
+ * Takes some variable and asks `Object.prototype.toString()` what it thinks it
+ * is.
+ *
+ * @api private
+ * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/toString
+ * @param {*} value The value to test.
+ * @returns {string} Computed type
* @example
* type({}) // 'object'
* type([]) // 'array'
@@ -367,12 +402,14 @@ var emptyRepresentation = function emptyRepresentation(value, type) {
* type(/foo/) // 'regexp'
* type('type') // 'string'
* type(global) // 'global'
- * @api private
- * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/toString
- * @returns {string}
+ * type(new String('foo') // 'object'
*/
-exports.type = function type(value) {
- if (typeof Buffer !== 'undefined' && Buffer.isBuffer(value)) {
+var type = exports.type = function type(value) {
+ if (value === undefined) {
+ return 'undefined';
+ } else if (value === null) {
+ return 'null';
+ } else if (typeof Buffer !== 'undefined' && Buffer.isBuffer(value)) {
return 'buffer';
}
return Object.prototype.toString.call(value)
@@ -381,8 +418,8 @@ exports.type = function type(value) {
};
/**
- * @summary Stringify `value`.
- * @description Different behavior depending on type of value.
+ * Stringify `value`. Different behavior depending on type of value:
+ *
* - If `value` is undefined or null, return `'[undefined]'` or `'[null]'`, respectively.
* - If `value` is not an object, function or array, return result of `value.toString()` wrapped in double-quotes.
* - If `value` is an *empty* object, function, or array, return result of function
@@ -390,55 +427,71 @@ exports.type = function type(value) {
* - If `value` has properties, call {@link exports.canonicalize} on it, then return result of
* JSON.stringify().
*
+ * @api private
* @see exports.type
* @param {*} value
* @return {string}
- * @api private
*/
-
exports.stringify = function(value) {
- var type = exports.type(value);
+ var typeHint = type(value);
+
+ if (!~indexOf(['object', 'array', 'function'], typeHint)) {
+ if (typeHint === 'buffer') {
+ var json = value.toJSON();
+ // Based on the toJSON result
+ return jsonStringify(json.data && json.type ? json.data : json, 2)
+ .replace(/,(\n|$)/g, '$1');
+ }
- if (!~exports.indexOf(['object', 'array', 'function'], type)) {
- if(type != 'buffer') {
+ // IE7/IE8 has a bizarre String constructor; needs to be coerced
+ // into an array and back to obj.
+ if (typeHint === 'string' && typeof value === 'object') {
+ value = reduce(value.split(''), function(acc, char, idx) {
+ acc[idx] = char;
+ return acc;
+ }, {});
+ typeHint = 'object';
+ } else {
return jsonStringify(value);
}
- var json = value.toJSON();
- // Based on the toJSON result
- return jsonStringify(json.data && json.type ? json.data : json, 2)
- .replace(/,(\n|$)/g, '$1');
}
for (var prop in value) {
if (Object.prototype.hasOwnProperty.call(value, prop)) {
- return jsonStringify(exports.canonicalize(value), 2).replace(/,(\n|$)/g, '$1');
+ return jsonStringify(exports.canonicalize(value, null, typeHint), 2).replace(/,(\n|$)/g, '$1');
}
}
- return emptyRepresentation(value, type);
+ return emptyRepresentation(value, typeHint);
};
/**
- * @description
* like JSON.stringify but more sense.
+ *
+ * @api private
* @param {Object} object
- * @param {Number=} spaces
+ * @param {number=} spaces
* @param {number=} depth
* @returns {*}
- * @private
*/
function jsonStringify(object, spaces, depth) {
- if(typeof spaces == 'undefined') return _stringify(object); // primitive types
+ if (typeof spaces === 'undefined') {
+ // primitive types
+ return _stringify(object);
+ }
depth = depth || 1;
- var space = spaces * depth
- , str = isArray(object) ? '[' : '{'
- , end = isArray(object) ? ']' : '}'
- , length = object.length || exports.keys(object).length
- , repeat = function(s, n) { return new Array(n).join(s); }; // `.repeat()` polyfill
+ var space = spaces * depth;
+ var str = isArray(object) ? '[' : '{';
+ var end = isArray(object) ? ']' : '}';
+ var length = typeof object.length === 'number' ? object.length : exports.keys(object).length;
+ // `.repeat()` polyfill
+ function repeat(s, n) {
+ return new Array(n).join(s);
+ }
function _stringify(val) {
- switch (exports.type(val)) {
+ switch (type(val)) {
case 'null':
case 'undefined':
val = '[' + val + ']';
@@ -449,15 +502,19 @@ function jsonStringify(object, spaces, depth) {
break;
case 'boolean':
case 'regexp':
+ case 'symbol':
case 'number':
- val = val === 0 && (1/val) === -Infinity // `-0`
+ val = val === 0 && (1 / val) === -Infinity // `-0`
? '-0'
: val.toString();
break;
case 'date':
- var sDate = isNaN(val.getTime()) // Invalid date
- ? val.toString()
- : val.toISOString();
+ var sDate;
+ if (isNaN(val.getTime())) { // Invalid date
+ sDate = val.toString();
+ } else {
+ sDate = val.toISOString ? val.toISOString() : toISOString(val);
+ }
val = '[Date: ' + sDate + ']';
break;
case 'buffer':
@@ -467,40 +524,44 @@ function jsonStringify(object, spaces, depth) {
val = '[Buffer: ' + jsonStringify(json, 2, depth + 1) + ']';
break;
default:
- val = (val == '[Function]' || val == '[Circular]')
+ val = (val === '[Function]' || val === '[Circular]')
? val
- : JSON.stringify(val); //string
+ : JSON.stringify(val); // string
}
return val;
}
- for(var i in object) {
- if(!object.hasOwnProperty(i)) continue; // not my business
+ for (var i in object) {
+ if (!Object.prototype.hasOwnProperty.call(object, i)) {
+ continue; // not my business
+ }
--length;
str += '\n ' + repeat(' ', space)
+ (isArray(object) ? '' : '"' + i + '": ') // key
- + _stringify(object[i]) // value
+ + _stringify(object[i]) // value
+ (length ? ',' : ''); // comma
}
- return str + (str.length != 1 // [], {}
- ? '\n' + repeat(' ', --space) + end
- : end);
+ return str
+ // [], {}
+ + (str.length !== 1 ? '\n' + repeat(' ', --space) + end : end);
}
/**
- * Return if obj is a Buffer
- * @param {Object} arg
- * @return {Boolean}
+ * Test if a value is a buffer.
+ *
* @api private
+ * @param {*} value The value to test.
+ * @return {boolean} True if `value` is a buffer, otherwise false
*/
-exports.isBuffer = function (arg) {
- return typeof Buffer !== 'undefined' && Buffer.isBuffer(arg);
+exports.isBuffer = function(value) {
+ return typeof Buffer !== 'undefined' && Buffer.isBuffer(value);
};
/**
- * @summary Return a new Thing that has the keys in sorted order. Recursive.
- * @description If the Thing...
+ * Return a new Thing that has the keys in sorted order. Recursive.
+ *
+ * If the Thing...
* - has already been seen, return string `'[Circular]'`
* - is `undefined`, return string `'[undefined]'`
* - is `null`, return value `null`
@@ -509,56 +570,60 @@ exports.isBuffer = function (arg) {
* - is a non-empty `Array`, `Object`, or `Function`, return the result of calling this function again.
* - is an empty `Array`, `Object`, or `Function`, return the result of calling `emptyRepresentation()`
*
+ * @api private
+ * @see {@link exports.stringify}
* @param {*} value Thing to inspect. May or may not have properties.
* @param {Array} [stack=[]] Stack of seen values
+ * @param {string} [typeHint] Type hint
* @return {(Object|Array|Function|string|undefined)}
- * @see {@link exports.stringify}
- * @api private
*/
-
-exports.canonicalize = function(value, stack) {
- var canonicalizedObj,
- type = exports.type(value),
- prop,
- withStack = function withStack(value, fn) {
- stack.push(value);
- fn();
- stack.pop();
- };
+exports.canonicalize = function canonicalize(value, stack, typeHint) {
+ var canonicalizedObj;
+ /* eslint-disable no-unused-vars */
+ var prop;
+ /* eslint-enable no-unused-vars */
+ typeHint = typeHint || type(value);
+ function withStack(value, fn) {
+ stack.push(value);
+ fn();
+ stack.pop();
+ }
stack = stack || [];
- if (exports.indexOf(stack, value) !== -1) {
+ if (indexOf(stack, value) !== -1) {
return '[Circular]';
}
- switch(type) {
+ switch (typeHint) {
case 'undefined':
case 'buffer':
case 'null':
canonicalizedObj = value;
break;
case 'array':
- withStack(value, function () {
- canonicalizedObj = exports.map(value, function (item) {
+ withStack(value, function() {
+ canonicalizedObj = exports.map(value, function(item) {
return exports.canonicalize(item, stack);
});
});
break;
case 'function':
+ /* eslint-disable guard-for-in */
for (prop in value) {
canonicalizedObj = {};
break;
}
+ /* eslint-enable guard-for-in */
if (!canonicalizedObj) {
- canonicalizedObj = emptyRepresentation(value, type);
+ canonicalizedObj = emptyRepresentation(value, typeHint);
break;
}
/* falls through */
case 'object':
canonicalizedObj = canonicalizedObj || {};
- withStack(value, function () {
- exports.forEach(exports.keys(value).sort(), function (key) {
+ withStack(value, function() {
+ exports.forEach(exports.keys(value).sort(), function(key) {
canonicalizedObj[key] = exports.canonicalize(value[key], stack);
});
});
@@ -567,10 +632,11 @@ exports.canonicalize = function(value, stack) {
case 'number':
case 'regexp':
case 'boolean':
+ case 'symbol':
canonicalizedObj = value;
break;
default:
- canonicalizedObj = value.toString();
+ canonicalizedObj = value + '';
}
return canonicalizedObj;
@@ -578,6 +644,12 @@ exports.canonicalize = function(value, stack) {
/**
* Lookup file names at the given `path`.
+ *
+ * @api public
+ * @param {string} path Base path to start searching from.
+ * @param {string[]} extensions File extensions to look for.
+ * @param {boolean} recursive Whether or not to recurse into subdirectories.
+ * @return {string[]} An array of paths.
*/
exports.lookupFiles = function lookupFiles(path, extensions, recursive) {
var files = [];
@@ -588,34 +660,40 @@ exports.lookupFiles = function lookupFiles(path, extensions, recursive) {
path += '.js';
} else {
files = glob.sync(path);
- if (!files.length) throw new Error("cannot resolve path (or pattern) '" + path + "'");
+ if (!files.length) {
+ throw new Error("cannot resolve path (or pattern) '" + path + "'");
+ }
return files;
}
}
try {
- var stat = fs.statSync(path);
- if (stat.isFile()) return path;
- }
- catch (ignored) {
+ var stat = statSync(path);
+ if (stat.isFile()) {
+ return path;
+ }
+ } catch (err) {
+ // ignore error
return;
}
- fs.readdirSync(path).forEach(function(file) {
+ readdirSync(path).forEach(function(file) {
file = join(path, file);
try {
- var stat = fs.statSync(file);
+ var stat = statSync(file);
if (stat.isDirectory()) {
if (recursive) {
files = files.concat(lookupFiles(file, extensions, recursive));
}
return;
}
+ } catch (err) {
+ // ignore error
+ return;
}
- catch (ignored) {
+ if (!stat.isFile() || !re.test(file) || basename(file)[0] === '.') {
return;
}
- if (!stat.isFile() || !re.test(file) || basename(file)[0] === '.') return;
files.push(file);
});
@@ -643,68 +721,74 @@ exports.getError = function(err) {
return err || exports.undefinedError();
};
-
/**
* @summary
* This Filter based on `mocha-clean` module.(see: `github.com/rstacruz/mocha-clean`)
* @description
* When invoking this function you get a filter function that get the Error.stack as an input,
* and return a prettify output.
- * (i.e: strip Mocha, node_modules, bower and componentJS from stack trace).
+ * (i.e: strip Mocha and internal node functions from stack trace).
* @returns {Function}
*/
-
exports.stackTraceFilter = function() {
- var slash = '/'
- , is = typeof document === 'undefined'
- ? { node: true }
- : { browser: true }
- , cwd = is.node
- ? process.cwd() + slash
- : location.href.replace(/\/[^\/]*$/, '/');
-
- function isNodeModule (line) {
- return (~line.indexOf('node_modules'));
- }
-
- function isMochaInternal (line) {
- return (~line.indexOf('node_modules' + slash + 'mocha')) ||
- (~line.indexOf('components' + slash + 'mochajs')) ||
- (~line.indexOf('components' + slash + 'mocha'));
+ // TODO: Replace with `process.browser`
+ var is = typeof document === 'undefined' ? { node: true } : { browser: true };
+ var slash = path.sep;
+ var cwd;
+ if (is.node) {
+ cwd = process.cwd() + slash;
+ } else {
+ cwd = (typeof location === 'undefined' ? window.location : location).href.replace(/\/[^\/]*$/, '/');
+ slash = '/';
}
- // node_modules, bower, componentJS
- function isBrowserModule(line) {
- return (~line.indexOf('node_modules')) ||
- (~line.indexOf('components'));
+ function isMochaInternal(line) {
+ return (~line.indexOf('node_modules' + slash + 'mocha' + slash))
+ || (~line.indexOf('node_modules' + slash + 'mocha.js'))
+ || (~line.indexOf('bower_components' + slash + 'mocha.js'))
+ || (~line.indexOf(slash + 'mocha.js'));
}
- function isNodeInternal (line) {
- return (~line.indexOf('(timers.js:')) ||
- (~line.indexOf('(events.js:')) ||
- (~line.indexOf('(node.js:')) ||
- (~line.indexOf('(module.js:')) ||
- (~line.indexOf('GeneratorFunctionPrototype.next (native)')) ||
- false
+ function isNodeInternal(line) {
+ return (~line.indexOf('(timers.js:'))
+ || (~line.indexOf('(events.js:'))
+ || (~line.indexOf('(node.js:'))
+ || (~line.indexOf('(module.js:'))
+ || (~line.indexOf('GeneratorFunctionPrototype.next (native)'))
+ || false;
}
return function(stack) {
stack = stack.split('\n');
- stack = exports.reduce(stack, function(list, line) {
- if (is.node && (isNodeModule(line) ||
- isMochaInternal(line) ||
- isNodeInternal(line)))
+ stack = reduce(stack, function(list, line) {
+ if (isMochaInternal(line)) {
return list;
+ }
- if (is.browser && (isBrowserModule(line)))
+ if (is.node && isNodeInternal(line)) {
return list;
+ }
// Clean up cwd(absolute)
- list.push(line.replace(cwd, ''));
+ if (/\(?.+:\d+:\d+\)?$/.test(line)) {
+ line = line.replace(cwd, '');
+ }
+
+ list.push(line);
return list;
}, []);
return stack.join('\n');
- }
-}; \ No newline at end of file
+ };
+};
+
+/**
+ * Crude, but effective.
+ * @api
+ * @param {*} value
+ * @returns {boolean} Whether or not `value` is a Promise
+ */
+exports.isPromise = function isPromise(value) {
+ return typeof value === 'object' && typeof value.then === 'function';
+};
diff --git a/tests/lib/mocha-3.1.0/media/logo.svg b/tests/lib/mocha-3.1.0/media/logo.svg
new file mode 100644
index 0000000000..bc3cb4b5df
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/media/logo.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 17.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="612px" height="792px" viewBox="0 0 612 792" enable-background="new 0 0 612 792" xml:space="preserve">
+<circle fill="#8A6343" cx="306" cy="396" r="306"/>
+<text transform="matrix(1 0 0 1 72.1431 424.7633)" fill="#FFFFFF" font-family="'HelveticaNeue'" font-size="153">mocha</text>
+</svg>
diff --git a/tests/lib/mocha-2.2.5/mocha.css b/tests/lib/mocha-3.1.0/mocha.css
index 42b9798fa4..ec96b003c9 100755..100644
--- a/tests/lib/mocha-2.2.5/mocha.css
+++ b/tests/lib/mocha-3.1.0/mocha.css
@@ -136,6 +136,46 @@ body {
overflow: auto;
}
+#mocha .test .html-error {
+ overflow: auto;
+ color: black;
+ line-height: 1.5;
+ display: block;
+ float: left;
+ clear: left;
+ font: 12px/1.5 monaco, monospace;
+ margin: 5px;
+ padding: 15px;
+ border: 1px solid #eee;
+ max-width: 85%; /*(1)*/
+ max-width: -webkit-calc(100% - 42px);
+ max-width: -moz-calc(100% - 42px);
+ max-width: calc(100% - 42px); /*(2)*/
+ max-height: 300px;
+ word-wrap: break-word;
+ border-bottom-color: #ddd;
+ -webkit-box-shadow: 0 1px 3px #eee;
+ -moz-box-shadow: 0 1px 3px #eee;
+ box-shadow: 0 1px 3px #eee;
+ -webkit-border-radius: 3px;
+ -moz-border-radius: 3px;
+ border-radius: 3px;
+}
+
+#mocha .test .html-error pre.error {
+ border: none;
+ -webkit-border-radius: 0;
+ -moz-border-radius: 0;
+ border-radius: 0;
+ -webkit-box-shadow: 0;
+ -moz-box-shadow: 0;
+ box-shadow: 0;
+ padding: 0;
+ margin: 0;
+ margin-top: 18px;
+ max-height: none;
+}
+
/**
* (1): approximate for browsers not supporting calc
* (2): 42 = 2*15 + 2*10 + 2*1 (padding + margin + border)
@@ -150,13 +190,16 @@ body {
padding: 15px;
border: 1px solid #eee;
max-width: 85%; /*(1)*/
+ max-width: -webkit-calc(100% - 42px);
+ max-width: -moz-calc(100% - 42px);
max-width: calc(100% - 42px); /*(2)*/
word-wrap: break-word;
border-bottom-color: #ddd;
- -webkit-border-radius: 3px;
-webkit-box-shadow: 0 1px 3px #eee;
- -moz-border-radius: 3px;
-moz-box-shadow: 0 1px 3px #eee;
+ box-shadow: 0 1px 3px #eee;
+ -webkit-border-radius: 3px;
+ -moz-border-radius: 3px;
border-radius: 3px;
}
@@ -177,10 +220,12 @@ body {
text-align: center;
background: #eee;
font-size: 15px;
+ -webkit-border-radius: 15px;
-moz-border-radius: 15px;
border-radius: 15px;
- -webkit-transition: opacity 200ms;
- -moz-transition: opacity 200ms;
+ -webkit-transition:opacity 200ms;
+ -moz-transition:opacity 200ms;
+ -o-transition:opacity 200ms;
transition: opacity 200ms;
opacity: 0.3;
color: #888;
@@ -226,6 +271,17 @@ body {
#mocha-stats .progress {
float: right;
padding-top: 0;
+
+ /**
+ * Set safe initial values, so mochas .progress does not inherit these
+ * properties from Bootstrap .progress (which causes .progress height to
+ * equal line height set in Bootstrap).
+ */
+ height: auto;
+ -webkit-box-shadow: none;
+ -moz-box-shadow: none;
+ box-shadow: none;
+ background-color: initial;
}
#mocha-stats em {
diff --git a/tests/lib/mocha-3.1.0/mocha.js b/tests/lib/mocha-3.1.0/mocha.js
new file mode 100644
index 0000000000..1d5b072aca
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/mocha.js
@@ -0,0 +1,15466 @@
+(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
+(function (process,global){
+/* eslint no-unused-vars: off */
+
+/**
+ * Shim process.stdout.
+ */
+
+process.stdout = require('browser-stdout')();
+
+var Mocha = require('./lib/mocha');
+
+/**
+ * Create a Mocha instance.
+ *
+ * @return {undefined}
+ */
+
+var mocha = new Mocha({ reporter: 'html' });
+
+/**
+ * Save timer references to avoid Sinon interfering (see GH-237).
+ */
+
+var Date = global.Date;
+var setTimeout = global.setTimeout;
+var setInterval = global.setInterval;
+var clearTimeout = global.clearTimeout;
+var clearInterval = global.clearInterval;
+
+var uncaughtExceptionHandlers = [];
+
+var originalOnerrorHandler = global.onerror;
+
+/**
+ * Remove uncaughtException listener.
+ * Revert to original onerror handler if previously defined.
+ */
+
+process.removeListener = function(e, fn) {
+ if (e === 'uncaughtException') {
+ if (originalOnerrorHandler) {
+ global.onerror = originalOnerrorHandler;
+ } else {
+ global.onerror = function() {};
+ }
+ var i = Mocha.utils.indexOf(uncaughtExceptionHandlers, fn);
+ if (i !== -1) {
+ uncaughtExceptionHandlers.splice(i, 1);
+ }
+ }
+};
+
+/**
+ * Implements uncaughtException listener.
+ */
+
+process.on = function(e, fn) {
+ if (e === 'uncaughtException') {
+ global.onerror = function(err, url, line) {
+ fn(new Error(err + ' (' + url + ':' + line + ')'));
+ return !mocha.allowUncaught;
+ };
+ uncaughtExceptionHandlers.push(fn);
+ }
+};
+
+// The BDD UI is registered by default, but no UI will be functional in the
+// browser without an explicit call to the overridden `mocha.ui` (see below).
+// Ensure that this default UI does not expose its methods to the global scope.
+mocha.suite.removeAllListeners('pre-require');
+
+var immediateQueue = [];
+var immediateTimeout;
+
+function timeslice() {
+ var immediateStart = new Date().getTime();
+ while (immediateQueue.length && (new Date().getTime() - immediateStart) < 100) {
+ immediateQueue.shift()();
+ }
+ if (immediateQueue.length) {
+ immediateTimeout = setTimeout(timeslice, 0);
+ } else {
+ immediateTimeout = null;
+ }
+}
+
+/**
+ * High-performance override of Runner.immediately.
+ */
+
+Mocha.Runner.immediately = function(callback) {
+ immediateQueue.push(callback);
+ if (!immediateTimeout) {
+ immediateTimeout = setTimeout(timeslice, 0);
+ }
+};
+
+/**
+ * Function to allow assertion libraries to throw errors directly into mocha.
+ * This is useful when running tests in a browser because window.onerror will
+ * only receive the 'message' attribute of the Error.
+ */
+mocha.throwError = function(err) {
+ Mocha.utils.forEach(uncaughtExceptionHandlers, function(fn) {
+ fn(err);
+ });
+ throw err;
+};
+
+/**
+ * Override ui to ensure that the ui functions are initialized.
+ * Normally this would happen in Mocha.prototype.loadFiles.
+ */
+
+mocha.ui = function(ui) {
+ Mocha.prototype.ui.call(this, ui);
+ this.suite.emit('pre-require', global, null, this);
+ return this;
+};
+
+/**
+ * Setup mocha with the given setting options.
+ */
+
+mocha.setup = function(opts) {
+ if (typeof opts === 'string') {
+ opts = { ui: opts };
+ }
+ for (var opt in opts) {
+ if (opts.hasOwnProperty(opt)) {
+ this[opt](opts[opt]);
+ }
+ }
+ return this;
+};
+
+/**
+ * Run mocha, returning the Runner.
+ */
+
+mocha.run = function(fn) {
+ var options = mocha.options;
+ mocha.globals('location');
+
+ var query = Mocha.utils.parseQuery(global.location.search || '');
+ if (query.grep) {
+ mocha.grep(query.grep);
+ }
+ if (query.fgrep) {
+ mocha.fgrep(query.fgrep);
+ }
+ if (query.invert) {
+ mocha.invert();
+ }
+
+ return Mocha.prototype.run.call(mocha, function(err) {
+ // The DOM Document is not available in Web Workers.
+ var document = global.document;
+ if (document && document.getElementById('mocha') && options.noHighlighting !== true) {
+ Mocha.utils.highlightTags('code');
+ }
+ if (fn) {
+ fn(err);
+ }
+ });
+};
+
+/**
+ * Expose the process shim.
+ * https://github.com/mochajs/mocha/pull/916
+ */
+
+Mocha.process = process;
+
+/**
+ * Expose mocha.
+ */
+
+global.Mocha = Mocha;
+global.mocha = mocha;
+
+// this allows test/acceptance/required-tokens.js to pass; thus,
+// you can now do `const describe = require('mocha').describe` in a
+// browser context (assuming browserification). should fix #880
+module.exports = global;
+
+}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+},{"./lib/mocha":14,"_process":67,"browser-stdout":41}],2:[function(require,module,exports){
+/* eslint-disable no-unused-vars */
+module.exports = function(type) {
+ return function() {};
+};
+
+},{}],3:[function(require,module,exports){
+/**
+ * Module exports.
+ */
+
+exports.EventEmitter = EventEmitter;
+
+/**
+ * Object#toString reference.
+ */
+var objToString = Object.prototype.toString;
+
+/**
+ * Check if a value is an array.
+ *
+ * @api private
+ * @param {*} val The value to test.
+ * @return {boolean} true if the value is an array, otherwise false.
+ */
+function isArray(val) {
+ return objToString.call(val) === '[object Array]';
+}
+
+/**
+ * Event emitter constructor.
+ *
+ * @api public
+ */
+function EventEmitter() {}
+
+/**
+ * Add a listener.
+ *
+ * @api public
+ * @param {string} name Event name.
+ * @param {Function} fn Event handler.
+ * @return {EventEmitter} Emitter instance.
+ */
+EventEmitter.prototype.on = function(name, fn) {
+ if (!this.$events) {
+ this.$events = {};
+ }
+
+ if (!this.$events[name]) {
+ this.$events[name] = fn;
+ } else if (isArray(this.$events[name])) {
+ this.$events[name].push(fn);
+ } else {
+ this.$events[name] = [this.$events[name], fn];
+ }
+
+ return this;
+};
+
+EventEmitter.prototype.addListener = EventEmitter.prototype.on;
+
+/**
+ * Adds a volatile listener.
+ *
+ * @api public
+ * @param {string} name Event name.
+ * @param {Function} fn Event handler.
+ * @return {EventEmitter} Emitter instance.
+ */
+EventEmitter.prototype.once = function(name, fn) {
+ var self = this;
+
+ function on() {
+ self.removeListener(name, on);
+ fn.apply(this, arguments);
+ }
+
+ on.listener = fn;
+ this.on(name, on);
+
+ return this;
+};
+
+/**
+ * Remove a listener.
+ *
+ * @api public
+ * @param {string} name Event name.
+ * @param {Function} fn Event handler.
+ * @return {EventEmitter} Emitter instance.
+ */
+EventEmitter.prototype.removeListener = function(name, fn) {
+ if (this.$events && this.$events[name]) {
+ var list = this.$events[name];
+
+ if (isArray(list)) {
+ var pos = -1;
+
+ for (var i = 0, l = list.length; i < l; i++) {
+ if (list[i] === fn || (list[i].listener && list[i].listener === fn)) {
+ pos = i;
+ break;
+ }
+ }
+
+ if (pos < 0) {
+ return this;
+ }
+
+ list.splice(pos, 1);
+
+ if (!list.length) {
+ delete this.$events[name];
+ }
+ } else if (list === fn || (list.listener && list.listener === fn)) {
+ delete this.$events[name];
+ }
+ }
+
+ return this;
+};
+
+/**
+ * Remove all listeners for an event.
+ *
+ * @api public
+ * @param {string} name Event name.
+ * @return {EventEmitter} Emitter instance.
+ */
+EventEmitter.prototype.removeAllListeners = function(name) {
+ if (name === undefined) {
+ this.$events = {};
+ return this;
+ }
+
+ if (this.$events && this.$events[name]) {
+ this.$events[name] = null;
+ }
+
+ return this;
+};
+
+/**
+ * Get all listeners for a given event.
+ *
+ * @api public
+ * @param {string} name Event name.
+ * @return {EventEmitter} Emitter instance.
+ */
+EventEmitter.prototype.listeners = function(name) {
+ if (!this.$events) {
+ this.$events = {};
+ }
+
+ if (!this.$events[name]) {
+ this.$events[name] = [];
+ }
+
+ if (!isArray(this.$events[name])) {
+ this.$events[name] = [this.$events[name]];
+ }
+
+ return this.$events[name];
+};
+
+/**
+ * Emit an event.
+ *
+ * @api public
+ * @param {string} name Event name.
+ * @return {boolean} true if at least one handler was invoked, else false.
+ */
+EventEmitter.prototype.emit = function(name) {
+ if (!this.$events) {
+ return false;
+ }
+
+ var handler = this.$events[name];
+
+ if (!handler) {
+ return false;
+ }
+
+ var args = Array.prototype.slice.call(arguments, 1);
+
+ if (typeof handler === 'function') {
+ handler.apply(this, args);
+ } else if (isArray(handler)) {
+ var listeners = handler.slice();
+
+ for (var i = 0, l = listeners.length; i < l; i++) {
+ listeners[i].apply(this, args);
+ }
+ } else {
+ return false;
+ }
+
+ return true;
+};
+
+},{}],4:[function(require,module,exports){
+/**
+ * Expose `Progress`.
+ */
+
+module.exports = Progress;
+
+/**
+ * Initialize a new `Progress` indicator.
+ */
+function Progress() {
+ this.percent = 0;
+ this.size(0);
+ this.fontSize(11);
+ this.font('helvetica, arial, sans-serif');
+}
+
+/**
+ * Set progress size to `size`.
+ *
+ * @api public
+ * @param {number} size
+ * @return {Progress} Progress instance.
+ */
+Progress.prototype.size = function(size) {
+ this._size = size;
+ return this;
+};
+
+/**
+ * Set text to `text`.
+ *
+ * @api public
+ * @param {string} text
+ * @return {Progress} Progress instance.
+ */
+Progress.prototype.text = function(text) {
+ this._text = text;
+ return this;
+};
+
+/**
+ * Set font size to `size`.
+ *
+ * @api public
+ * @param {number} size
+ * @return {Progress} Progress instance.
+ */
+Progress.prototype.fontSize = function(size) {
+ this._fontSize = size;
+ return this;
+};
+
+/**
+ * Set font to `family`.
+ *
+ * @param {string} family
+ * @return {Progress} Progress instance.
+ */
+Progress.prototype.font = function(family) {
+ this._font = family;
+ return this;
+};
+
+/**
+ * Update percentage to `n`.
+ *
+ * @param {number} n
+ * @return {Progress} Progress instance.
+ */
+Progress.prototype.update = function(n) {
+ this.percent = n;
+ return this;
+};
+
+/**
+ * Draw on `ctx`.
+ *
+ * @param {CanvasRenderingContext2d} ctx
+ * @return {Progress} Progress instance.
+ */
+Progress.prototype.draw = function(ctx) {
+ try {
+ var percent = Math.min(this.percent, 100);
+ var size = this._size;
+ var half = size / 2;
+ var x = half;
+ var y = half;
+ var rad = half - 1;
+ var fontSize = this._fontSize;
+
+ ctx.font = fontSize + 'px ' + this._font;
+
+ var angle = Math.PI * 2 * (percent / 100);
+ ctx.clearRect(0, 0, size, size);
+
+ // outer circle
+ ctx.strokeStyle = '#9f9f9f';
+ ctx.beginPath();
+ ctx.arc(x, y, rad, 0, angle, false);
+ ctx.stroke();
+
+ // inner circle
+ ctx.strokeStyle = '#eee';
+ ctx.beginPath();
+ ctx.arc(x, y, rad - 1, 0, angle, true);
+ ctx.stroke();
+
+ // text
+ var text = this._text || (percent | 0) + '%';
+ var w = ctx.measureText(text).width;
+
+ ctx.fillText(text, x - w / 2 + 1, y + fontSize / 2 - 1);
+ } catch (err) {
+ // don't fail if we can't render progress
+ }
+ return this;
+};
+
+},{}],5:[function(require,module,exports){
+(function (global){
+exports.isatty = function isatty() {
+ return true;
+};
+
+exports.getWindowSize = function getWindowSize() {
+ if ('innerHeight' in global) {
+ return [global.innerHeight, global.innerWidth];
+ }
+ // In a Web Worker, the DOM Window is not available.
+ return [640, 480];
+};
+
+}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+},{}],6:[function(require,module,exports){
+/**
+ * Module dependencies.
+ */
+
+var JSON = require('json3');
+
+/**
+ * Expose `Context`.
+ */
+
+module.exports = Context;
+
+/**
+ * Initialize a new `Context`.
+ *
+ * @api private
+ */
+function Context() {}
+
+/**
+ * Set or get the context `Runnable` to `runnable`.
+ *
+ * @api private
+ * @param {Runnable} runnable
+ * @return {Context}
+ */
+Context.prototype.runnable = function(runnable) {
+ if (!arguments.length) {
+ return this._runnable;
+ }
+ this.test = this._runnable = runnable;
+ return this;
+};
+
+/**
+ * Set test timeout `ms`.
+ *
+ * @api private
+ * @param {number} ms
+ * @return {Context} self
+ */
+Context.prototype.timeout = function(ms) {
+ if (!arguments.length) {
+ return this.runnable().timeout();
+ }
+ this.runnable().timeout(ms);
+ return this;
+};
+
+/**
+ * Set test timeout `enabled`.
+ *
+ * @api private
+ * @param {boolean} enabled
+ * @return {Context} self
+ */
+Context.prototype.enableTimeouts = function(enabled) {
+ this.runnable().enableTimeouts(enabled);
+ return this;
+};
+
+/**
+ * Set test slowness threshold `ms`.
+ *
+ * @api private
+ * @param {number} ms
+ * @return {Context} self
+ */
+Context.prototype.slow = function(ms) {
+ this.runnable().slow(ms);
+ return this;
+};
+
+/**
+ * Mark a test as skipped.
+ *
+ * @api private
+ * @return {Context} self
+ */
+Context.prototype.skip = function() {
+ this.runnable().skip();
+ return this;
+};
+
+/**
+ * Allow a number of retries on failed tests
+ *
+ * @api private
+ * @param {number} n
+ * @return {Context} self
+ */
+Context.prototype.retries = function(n) {
+ if (!arguments.length) {
+ return this.runnable().retries();
+ }
+ this.runnable().retries(n);
+ return this;
+};
+
+/**
+ * Inspect the context void of `._runnable`.
+ *
+ * @api private
+ * @return {string}
+ */
+Context.prototype.inspect = function() {
+ return JSON.stringify(this, function(key, val) {
+ return key === 'runnable' || key === 'test' ? undefined : val;
+ }, 2);
+};
+
+},{"json3":54}],7:[function(require,module,exports){
+/**
+ * Module dependencies.
+ */
+
+var Runnable = require('./runnable');
+var inherits = require('./utils').inherits;
+
+/**
+ * Expose `Hook`.
+ */
+
+module.exports = Hook;
+
+/**
+ * Initialize a new `Hook` with the given `title` and callback `fn`.
+ *
+ * @param {String} title
+ * @param {Function} fn
+ * @api private
+ */
+function Hook(title, fn) {
+ Runnable.call(this, title, fn);
+ this.type = 'hook';
+}
+
+/**
+ * Inherit from `Runnable.prototype`.
+ */
+inherits(Hook, Runnable);
+
+/**
+ * Get or set the test `err`.
+ *
+ * @param {Error} err
+ * @return {Error}
+ * @api public
+ */
+Hook.prototype.error = function(err) {
+ if (!arguments.length) {
+ err = this._error;
+ this._error = null;
+ return err;
+ }
+
+ this._error = err;
+};
+
+},{"./runnable":33,"./utils":38}],8:[function(require,module,exports){
+/**
+ * Module dependencies.
+ */
+
+var Test = require('../test');
+
+/**
+ * BDD-style interface:
+ *
+ * describe('Array', function() {
+ * describe('#indexOf()', function() {
+ * it('should return -1 when not present', function() {
+ * // ...
+ * });
+ *
+ * it('should return the index when present', function() {
+ * // ...
+ * });
+ * });
+ * });
+ *
+ * @param {Suite} suite Root suite.
+ */
+module.exports = function(suite) {
+ var suites = [suite];
+
+ suite.on('pre-require', function(context, file, mocha) {
+ var common = require('./common')(suites, context, mocha);
+
+ context.before = common.before;
+ context.after = common.after;
+ context.beforeEach = common.beforeEach;
+ context.afterEach = common.afterEach;
+ context.run = mocha.options.delay && common.runWithSuite(suite);
+ /**
+ * Describe a "suite" with the given `title`
+ * and callback `fn` containing nested suites
+ * and/or tests.
+ */
+
+ context.describe = context.context = function(title, fn) {
+ return common.suite.create({
+ title: title,
+ file: file,
+ fn: fn
+ });
+ };
+
+ /**
+ * Pending describe.
+ */
+
+ context.xdescribe = context.xcontext = context.describe.skip = function(title, fn) {
+ return common.suite.skip({
+ title: title,
+ file: file,
+ fn: fn
+ });
+ };
+
+ /**
+ * Exclusive suite.
+ */
+
+ context.describe.only = function(title, fn) {
+ return common.suite.only({
+ title: title,
+ file: file,
+ fn: fn
+ });
+ };
+
+ /**
+ * Describe a specification or test-case
+ * with the given `title` and callback `fn`
+ * acting as a thunk.
+ */
+
+ context.it = context.specify = function(title, fn) {
+ var suite = suites[0];
+ if (suite.isPending()) {
+ fn = null;
+ }
+ var test = new Test(title, fn);
+ test.file = file;
+ suite.addTest(test);
+ return test;
+ };
+
+ /**
+ * Exclusive test-case.
+ */
+
+ context.it.only = function(title, fn) {
+ return common.test.only(mocha, context.it(title, fn));
+ };
+
+ /**
+ * Pending test case.
+ */
+
+ context.xit = context.xspecify = context.it.skip = function(title) {
+ context.it(title);
+ };
+
+ /**
+ * Number of attempts to retry.
+ */
+ context.it.retries = function(n) {
+ context.retries(n);
+ };
+ });
+};
+
+},{"../test":36,"./common":9}],9:[function(require,module,exports){
+'use strict';
+
+var Suite = require('../suite');
+
+/**
+ * Functions common to more than one interface.
+ *
+ * @param {Suite[]} suites
+ * @param {Context} context
+ * @param {Mocha} mocha
+ * @return {Object} An object containing common functions.
+ */
+module.exports = function(suites, context, mocha) {
+ return {
+ /**
+ * This is only present if flag --delay is passed into Mocha. It triggers
+ * root suite execution.
+ *
+ * @param {Suite} suite The root wuite.
+ * @return {Function} A function which runs the root suite
+ */
+ runWithSuite: function runWithSuite(suite) {
+ return function run() {
+ suite.run();
+ };
+ },
+
+ /**
+ * Execute before running tests.
+ *
+ * @param {string} name
+ * @param {Function} fn
+ */
+ before: function(name, fn) {
+ suites[0].beforeAll(name, fn);
+ },
+
+ /**
+ * Execute after running tests.
+ *
+ * @param {string} name
+ * @param {Function} fn
+ */
+ after: function(name, fn) {
+ suites[0].afterAll(name, fn);
+ },
+
+ /**
+ * Execute before each test case.
+ *
+ * @param {string} name
+ * @param {Function} fn
+ */
+ beforeEach: function(name, fn) {
+ suites[0].beforeEach(name, fn);
+ },
+
+ /**
+ * Execute after each test case.
+ *
+ * @param {string} name
+ * @param {Function} fn
+ */
+ afterEach: function(name, fn) {
+ suites[0].afterEach(name, fn);
+ },
+
+ suite: {
+ /**
+ * Create an exclusive Suite; convenience function
+ * See docstring for create() below.
+ *
+ * @param {Object} opts
+ * @returns {Suite}
+ */
+ only: function only(opts) {
+ mocha.options.hasOnly = true;
+ opts.isOnly = true;
+ return this.create(opts);
+ },
+
+ /**
+ * Create a Suite, but skip it; convenience function
+ * See docstring for create() below.
+ *
+ * @param {Object} opts
+ * @returns {Suite}
+ */
+ skip: function skip(opts) {
+ opts.pending = true;
+ return this.create(opts);
+ },
+
+ /**
+ * Creates a suite.
+ * @param {Object} opts Options
+ * @param {string} opts.title Title of Suite
+ * @param {Function} [opts.fn] Suite Function (not always applicable)
+ * @param {boolean} [opts.pending] Is Suite pending?
+ * @param {string} [opts.file] Filepath where this Suite resides
+ * @param {boolean} [opts.isOnly] Is Suite exclusive?
+ * @returns {Suite}
+ */
+ create: function create(opts) {
+ var suite = Suite.create(suites[0], opts.title);
+ suite.pending = Boolean(opts.pending);
+ suite.file = opts.file;
+ suites.unshift(suite);
+ if (opts.isOnly) {
+ suite.parent._onlySuites = suite.parent._onlySuites.concat(suite);
+ mocha.options.hasOnly = true;
+ }
+ if (typeof opts.fn === 'function') {
+ opts.fn.call(suite);
+ suites.shift();
+ } else if (typeof opts.fn === 'undefined' && !suite.pending) {
+ throw new Error('Suite "' + suite.fullTitle() + '" was defined but no callback was supplied. Supply a callback or explicitly skip the suite.');
+ }
+
+ return suite;
+ }
+ },
+
+ test: {
+
+ /**
+ * Exclusive test-case.
+ *
+ * @param {Object} mocha
+ * @param {Function} test
+ * @returns {*}
+ */
+ only: function(mocha, test) {
+ test.parent._onlyTests = test.parent._onlyTests.concat(test);
+ mocha.options.hasOnly = true;
+ return test;
+ },
+
+ /**
+ * Pending test case.
+ *
+ * @param {string} title
+ */
+ skip: function(title) {
+ context.test(title);
+ },
+
+ /**
+ * Number of retry attempts
+ *
+ * @param {number} n
+ */
+ retries: function(n) {
+ context.retries(n);
+ }
+ }
+ };
+};
+
+},{"../suite":35}],10:[function(require,module,exports){
+/**
+ * Module dependencies.
+ */
+
+var Suite = require('../suite');
+var Test = require('../test');
+
+/**
+ * Exports-style (as Node.js module) interface:
+ *
+ * exports.Array = {
+ * '#indexOf()': {
+ * 'should return -1 when the value is not present': function() {
+ *
+ * },
+ *
+ * 'should return the correct index when the value is present': function() {
+ *
+ * }
+ * }
+ * };
+ *
+ * @param {Suite} suite Root suite.
+ */
+module.exports = function(suite) {
+ var suites = [suite];
+
+ suite.on('require', visit);
+
+ function visit(obj, file) {
+ var suite;
+ for (var key in obj) {
+ if (typeof obj[key] === 'function') {
+ var fn = obj[key];
+ switch (key) {
+ case 'before':
+ suites[0].beforeAll(fn);
+ break;
+ case 'after':
+ suites[0].afterAll(fn);
+ break;
+ case 'beforeEach':
+ suites[0].beforeEach(fn);
+ break;
+ case 'afterEach':
+ suites[0].afterEach(fn);
+ break;
+ default:
+ var test = new Test(key, fn);
+ test.file = file;
+ suites[0].addTest(test);
+ }
+ } else {
+ suite = Suite.create(suites[0], key);
+ suites.unshift(suite);
+ visit(obj[key], file);
+ suites.shift();
+ }
+ }
+ }
+};
+
+},{"../suite":35,"../test":36}],11:[function(require,module,exports){
+exports.bdd = require('./bdd');
+exports.tdd = require('./tdd');
+exports.qunit = require('./qunit');
+exports.exports = require('./exports');
+
+},{"./bdd":8,"./exports":10,"./qunit":12,"./tdd":13}],12:[function(require,module,exports){
+/**
+ * Module dependencies.
+ */
+
+var Test = require('../test');
+
+/**
+ * QUnit-style interface:
+ *
+ * suite('Array');
+ *
+ * test('#length', function() {
+ * var arr = [1,2,3];
+ * ok(arr.length == 3);
+ * });
+ *
+ * test('#indexOf()', function() {
+ * var arr = [1,2,3];
+ * ok(arr.indexOf(1) == 0);
+ * ok(arr.indexOf(2) == 1);
+ * ok(arr.indexOf(3) == 2);
+ * });
+ *
+ * suite('String');
+ *
+ * test('#length', function() {
+ * ok('foo'.length == 3);
+ * });
+ *
+ * @param {Suite} suite Root suite.
+ */
+module.exports = function(suite) {
+ var suites = [suite];
+
+ suite.on('pre-require', function(context, file, mocha) {
+ var common = require('./common')(suites, context, mocha);
+
+ context.before = common.before;
+ context.after = common.after;
+ context.beforeEach = common.beforeEach;
+ context.afterEach = common.afterEach;
+ context.run = mocha.options.delay && common.runWithSuite(suite);
+ /**
+ * Describe a "suite" with the given `title`.
+ */
+
+ context.suite = function(title) {
+ if (suites.length > 1) {
+ suites.shift();
+ }
+ return common.suite.create({
+ title: title,
+ file: file,
+ fn: false
+ });
+ };
+
+ /**
+ * Exclusive Suite.
+ */
+
+ context.suite.only = function(title) {
+ if (suites.length > 1) {
+ suites.shift();
+ }
+ return common.suite.only({
+ title: title,
+ file: file,
+ fn: false
+ });
+ };
+
+ /**
+ * Describe a specification or test-case
+ * with the given `title` and callback `fn`
+ * acting as a thunk.
+ */
+
+ context.test = function(title, fn) {
+ var test = new Test(title, fn);
+ test.file = file;
+ suites[0].addTest(test);
+ return test;
+ };
+
+ /**
+ * Exclusive test-case.
+ */
+
+ context.test.only = function(title, fn) {
+ return common.test.only(mocha, context.test(title, fn));
+ };
+
+ context.test.skip = common.test.skip;
+ context.test.retries = common.test.retries;
+ });
+};
+
+},{"../test":36,"./common":9}],13:[function(require,module,exports){
+/**
+ * Module dependencies.
+ */
+
+var Test = require('../test');
+
+/**
+ * TDD-style interface:
+ *
+ * suite('Array', function() {
+ * suite('#indexOf()', function() {
+ * suiteSetup(function() {
+ *
+ * });
+ *
+ * test('should return -1 when not present', function() {
+ *
+ * });
+ *
+ * test('should return the index when present', function() {
+ *
+ * });
+ *
+ * suiteTeardown(function() {
+ *
+ * });
+ * });
+ * });
+ *
+ * @param {Suite} suite Root suite.
+ */
+module.exports = function(suite) {
+ var suites = [suite];
+
+ suite.on('pre-require', function(context, file, mocha) {
+ var common = require('./common')(suites, context, mocha);
+
+ context.setup = common.beforeEach;
+ context.teardown = common.afterEach;
+ context.suiteSetup = common.before;
+ context.suiteTeardown = common.after;
+ context.run = mocha.options.delay && common.runWithSuite(suite);
+
+ /**
+ * Describe a "suite" with the given `title` and callback `fn` containing
+ * nested suites and/or tests.
+ */
+ context.suite = function(title, fn) {
+ return common.suite.create({
+ title: title,
+ file: file,
+ fn: fn
+ });
+ };
+
+ /**
+ * Pending suite.
+ */
+ context.suite.skip = function(title, fn) {
+ return common.suite.skip({
+ title: title,
+ file: file,
+ fn: fn
+ });
+ };
+
+ /**
+ * Exclusive test-case.
+ */
+ context.suite.only = function(title, fn) {
+ return common.suite.only({
+ title: title,
+ file: file,
+ fn: fn
+ });
+ };
+
+ /**
+ * Describe a specification or test-case with the given `title` and
+ * callback `fn` acting as a thunk.
+ */
+ context.test = function(title, fn) {
+ var suite = suites[0];
+ if (suite.isPending()) {
+ fn = null;
+ }
+ var test = new Test(title, fn);
+ test.file = file;
+ suite.addTest(test);
+ return test;
+ };
+
+ /**
+ * Exclusive test-case.
+ */
+
+ context.test.only = function(title, fn) {
+ return common.test.only(mocha, context.test(title, fn));
+ };
+
+ context.test.skip = common.test.skip;
+ context.test.retries = common.test.retries;
+ });
+};
+
+},{"../test":36,"./common":9}],14:[function(require,module,exports){
+(function (process,global,__dirname){
+/*!
+ * mocha
+ * Copyright(c) 2011 TJ Holowaychuk <tj@vision-media.ca>
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var escapeRe = require('escape-string-regexp');
+var path = require('path');
+var reporters = require('./reporters');
+var utils = require('./utils');
+
+/**
+ * Expose `Mocha`.
+ */
+
+exports = module.exports = Mocha;
+
+/**
+ * To require local UIs and reporters when running in node.
+ */
+
+if (!process.browser) {
+ var cwd = process.cwd();
+ module.paths.push(cwd, path.join(cwd, 'node_modules'));
+}
+
+/**
+ * Expose internals.
+ */
+
+exports.utils = utils;
+exports.interfaces = require('./interfaces');
+exports.reporters = reporters;
+exports.Runnable = require('./runnable');
+exports.Context = require('./context');
+exports.Runner = require('./runner');
+exports.Suite = require('./suite');
+exports.Hook = require('./hook');
+exports.Test = require('./test');
+
+/**
+ * Return image `name` path.
+ *
+ * @api private
+ * @param {string} name
+ * @return {string}
+ */
+function image(name) {
+ return path.join(__dirname, '../images', name + '.png');
+}
+
+/**
+ * Set up mocha with `options`.
+ *
+ * Options:
+ *
+ * - `ui` name "bdd", "tdd", "exports" etc
+ * - `reporter` reporter instance, defaults to `mocha.reporters.spec`
+ * - `globals` array of accepted globals
+ * - `timeout` timeout in milliseconds
+ * - `retries` number of times to retry failed tests
+ * - `bail` bail on the first test failure
+ * - `slow` milliseconds to wait before considering a test slow
+ * - `ignoreLeaks` ignore global leaks
+ * - `fullTrace` display the full stack-trace on failing
+ * - `grep` string or regexp to filter tests with
+ *
+ * @param {Object} options
+ * @api public
+ */
+function Mocha(options) {
+ options = options || {};
+ this.files = [];
+ this.options = options;
+ if (options.grep) {
+ this.grep(new RegExp(options.grep));
+ }
+ if (options.fgrep) {
+ this.fgrep(options.fgrep);
+ }
+ this.suite = new exports.Suite('', new exports.Context());
+ this.ui(options.ui);
+ this.bail(options.bail);
+ this.reporter(options.reporter, options.reporterOptions);
+ if (typeof options.timeout !== 'undefined' && options.timeout !== null) {
+ this.timeout(options.timeout);
+ }
+ if (typeof options.retries !== 'undefined' && options.retries !== null) {
+ this.retries(options.retries);
+ }
+ this.useColors(options.useColors);
+ if (options.enableTimeouts !== null) {
+ this.enableTimeouts(options.enableTimeouts);
+ }
+ if (options.slow) {
+ this.slow(options.slow);
+ }
+}
+
+/**
+ * Enable or disable bailing on the first failure.
+ *
+ * @api public
+ * @param {boolean} [bail]
+ */
+Mocha.prototype.bail = function(bail) {
+ if (!arguments.length) {
+ bail = true;
+ }
+ this.suite.bail(bail);
+ return this;
+};
+
+/**
+ * Add test `file`.
+ *
+ * @api public
+ * @param {string} file
+ */
+Mocha.prototype.addFile = function(file) {
+ this.files.push(file);
+ return this;
+};
+
+/**
+ * Set reporter to `reporter`, defaults to "spec".
+ *
+ * @param {String|Function} reporter name or constructor
+ * @param {Object} reporterOptions optional options
+ * @api public
+ * @param {string|Function} reporter name or constructor
+ * @param {Object} reporterOptions optional options
+ */
+Mocha.prototype.reporter = function(reporter, reporterOptions) {
+ if (typeof reporter === 'function') {
+ this._reporter = reporter;
+ } else {
+ reporter = reporter || 'spec';
+ var _reporter;
+ // Try to load a built-in reporter.
+ if (reporters[reporter]) {
+ _reporter = reporters[reporter];
+ }
+ // Try to load reporters from process.cwd() and node_modules
+ if (!_reporter) {
+ try {
+ _reporter = require(reporter);
+ } catch (err) {
+ err.message.indexOf('Cannot find module') !== -1
+ ? console.warn('"' + reporter + '" reporter not found')
+ : console.warn('"' + reporter + '" reporter blew up with error:\n' + err.stack);
+ }
+ }
+ if (!_reporter && reporter === 'teamcity') {
+ console.warn('The Teamcity reporter was moved to a package named '
+ + 'mocha-teamcity-reporter '
+ + '(https://npmjs.org/package/mocha-teamcity-reporter).');
+ }
+ if (!_reporter) {
+ throw new Error('invalid reporter "' + reporter + '"');
+ }
+ this._reporter = _reporter;
+ }
+ this.options.reporterOptions = reporterOptions;
+ return this;
+};
+
+/**
+ * Set test UI `name`, defaults to "bdd".
+ *
+ * @api public
+ * @param {string} bdd
+ */
+Mocha.prototype.ui = function(name) {
+ name = name || 'bdd';
+ this._ui = exports.interfaces[name];
+ if (!this._ui) {
+ try {
+ this._ui = require(name);
+ } catch (err) {
+ throw new Error('invalid interface "' + name + '"');
+ }
+ }
+ this._ui = this._ui(this.suite);
+
+ this.suite.on('pre-require', function(context) {
+ exports.afterEach = context.afterEach || context.teardown;
+ exports.after = context.after || context.suiteTeardown;
+ exports.beforeEach = context.beforeEach || context.setup;
+ exports.before = context.before || context.suiteSetup;
+ exports.describe = context.describe || context.suite;
+ exports.it = context.it || context.test;
+ exports.setup = context.setup || context.beforeEach;
+ exports.suiteSetup = context.suiteSetup || context.before;
+ exports.suiteTeardown = context.suiteTeardown || context.after;
+ exports.suite = context.suite || context.describe;
+ exports.teardown = context.teardown || context.afterEach;
+ exports.test = context.test || context.it;
+ exports.run = context.run;
+ });
+
+ return this;
+};
+
+/**
+ * Load registered files.
+ *
+ * @api private
+ */
+Mocha.prototype.loadFiles = function(fn) {
+ var self = this;
+ var suite = this.suite;
+ this.files.forEach(function(file) {
+ file = path.resolve(file);
+ suite.emit('pre-require', global, file, self);
+ suite.emit('require', require(file), file, self);
+ suite.emit('post-require', global, file, self);
+ });
+ fn && fn();
+};
+
+/**
+ * Enable growl support.
+ *
+ * @api private
+ */
+Mocha.prototype._growl = function(runner, reporter) {
+ var notify = require('growl');
+
+ runner.on('end', function() {
+ var stats = reporter.stats;
+ if (stats.failures) {
+ var msg = stats.failures + ' of ' + runner.total + ' tests failed';
+ notify(msg, { name: 'mocha', title: 'Failed', image: image('error') });
+ } else {
+ notify(stats.passes + ' tests passed in ' + stats.duration + 'ms', {
+ name: 'mocha',
+ title: 'Passed',
+ image: image('ok')
+ });
+ }
+ });
+};
+
+/**
+ * Escape string and add it to grep as a regexp.
+ *
+ * @api public
+ * @param str
+ * @returns {Mocha}
+ */
+Mocha.prototype.fgrep = function(str) {
+ return this.grep(new RegExp(escapeRe(str)));
+};
+
+/**
+ * Add regexp to grep, if `re` is a string it is escaped.
+ *
+ * @param {RegExp|String} re
+ * @return {Mocha}
+ * @api public
+ * @param {RegExp|string} re
+ * @return {Mocha}
+ */
+Mocha.prototype.grep = function(re) {
+ if (utils.isString(re)) {
+ // extract args if it's regex-like, i.e: [string, pattern, flag]
+ var arg = re.match(/^\/(.*)\/(g|i|)$|.*/);
+ this.options.grep = new RegExp(arg[1] || arg[0], arg[2]);
+ } else {
+ this.options.grep = re;
+ }
+ return this;
+};
+/**
+ * Invert `.grep()` matches.
+ *
+ * @return {Mocha}
+ * @api public
+ */
+Mocha.prototype.invert = function() {
+ this.options.invert = true;
+ return this;
+};
+
+/**
+ * Ignore global leaks.
+ *
+ * @param {Boolean} ignore
+ * @return {Mocha}
+ * @api public
+ * @param {boolean} ignore
+ * @return {Mocha}
+ */
+Mocha.prototype.ignoreLeaks = function(ignore) {
+ this.options.ignoreLeaks = Boolean(ignore);
+ return this;
+};
+
+/**
+ * Enable global leak checking.
+ *
+ * @return {Mocha}
+ * @api public
+ */
+Mocha.prototype.checkLeaks = function() {
+ this.options.ignoreLeaks = false;
+ return this;
+};
+
+/**
+ * Display long stack-trace on failing
+ *
+ * @return {Mocha}
+ * @api public
+ */
+Mocha.prototype.fullTrace = function() {
+ this.options.fullStackTrace = true;
+ return this;
+};
+
+/**
+ * Enable growl support.
+ *
+ * @return {Mocha}
+ * @api public
+ */
+Mocha.prototype.growl = function() {
+ this.options.growl = true;
+ return this;
+};
+
+/**
+ * Ignore `globals` array or string.
+ *
+ * @param {Array|String} globals
+ * @return {Mocha}
+ * @api public
+ * @param {Array|string} globals
+ * @return {Mocha}
+ */
+Mocha.prototype.globals = function(globals) {
+ this.options.globals = (this.options.globals || []).concat(globals);
+ return this;
+};
+
+/**
+ * Emit color output.
+ *
+ * @param {Boolean} colors
+ * @return {Mocha}
+ * @api public
+ * @param {boolean} colors
+ * @return {Mocha}
+ */
+Mocha.prototype.useColors = function(colors) {
+ if (colors !== undefined) {
+ this.options.useColors = colors;
+ }
+ return this;
+};
+
+/**
+ * Use inline diffs rather than +/-.
+ *
+ * @param {Boolean} inlineDiffs
+ * @return {Mocha}
+ * @api public
+ * @param {boolean} inlineDiffs
+ * @return {Mocha}
+ */
+Mocha.prototype.useInlineDiffs = function(inlineDiffs) {
+ this.options.useInlineDiffs = inlineDiffs !== undefined && inlineDiffs;
+ return this;
+};
+
+/**
+ * Set the timeout in milliseconds.
+ *
+ * @param {Number} timeout
+ * @return {Mocha}
+ * @api public
+ * @param {number} timeout
+ * @return {Mocha}
+ */
+Mocha.prototype.timeout = function(timeout) {
+ this.suite.timeout(timeout);
+ return this;
+};
+
+/**
+ * Set the number of times to retry failed tests.
+ *
+ * @param {Number} retry times
+ * @return {Mocha}
+ * @api public
+ */
+Mocha.prototype.retries = function(n) {
+ this.suite.retries(n);
+ return this;
+};
+
+/**
+ * Set slowness threshold in milliseconds.
+ *
+ * @param {Number} slow
+ * @return {Mocha}
+ * @api public
+ * @param {number} slow
+ * @return {Mocha}
+ */
+Mocha.prototype.slow = function(slow) {
+ this.suite.slow(slow);
+ return this;
+};
+
+/**
+ * Enable timeouts.
+ *
+ * @param {Boolean} enabled
+ * @return {Mocha}
+ * @api public
+ * @param {boolean} enabled
+ * @return {Mocha}
+ */
+Mocha.prototype.enableTimeouts = function(enabled) {
+ this.suite.enableTimeouts(arguments.length && enabled !== undefined ? enabled : true);
+ return this;
+};
+
+/**
+ * Makes all tests async (accepting a callback)
+ *
+ * @return {Mocha}
+ * @api public
+ */
+Mocha.prototype.asyncOnly = function() {
+ this.options.asyncOnly = true;
+ return this;
+};
+
+/**
+ * Disable syntax highlighting (in browser).
+ *
+ * @api public
+ */
+Mocha.prototype.noHighlighting = function() {
+ this.options.noHighlighting = true;
+ return this;
+};
+
+/**
+ * Enable uncaught errors to propagate (in browser).
+ *
+ * @return {Mocha}
+ * @api public
+ */
+Mocha.prototype.allowUncaught = function() {
+ this.options.allowUncaught = true;
+ return this;
+};
+
+/**
+ * Delay root suite execution.
+ * @returns {Mocha}
+ */
+Mocha.prototype.delay = function delay() {
+ this.options.delay = true;
+ return this;
+};
+
+/**
+ * Run tests and invoke `fn()` when complete.
+ *
+ * @api public
+ * @param {Function} fn
+ * @return {Runner}
+ */
+Mocha.prototype.run = function(fn) {
+ if (this.files.length) {
+ this.loadFiles();
+ }
+ var suite = this.suite;
+ var options = this.options;
+ options.files = this.files;
+ var runner = new exports.Runner(suite, options.delay);
+ var reporter = new this._reporter(runner, options);
+ runner.ignoreLeaks = options.ignoreLeaks !== false;
+ runner.fullStackTrace = options.fullStackTrace;
+ runner.hasOnly = options.hasOnly;
+ runner.asyncOnly = options.asyncOnly;
+ runner.allowUncaught = options.allowUncaught;
+ if (options.grep) {
+ runner.grep(options.grep, options.invert);
+ }
+ if (options.globals) {
+ runner.globals(options.globals);
+ }
+ if (options.growl) {
+ this._growl(runner, reporter);
+ }
+ if (options.useColors !== undefined) {
+ exports.reporters.Base.useColors = options.useColors;
+ }
+ exports.reporters.Base.inlineDiffs = options.useInlineDiffs;
+
+ function done(failures) {
+ if (reporter.done) {
+ reporter.done(failures, fn);
+ } else {
+ fn && fn(failures);
+ }
+ }
+
+ return runner.run(done);
+};
+
+}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {},"/lib")
+},{"./context":6,"./hook":7,"./interfaces":11,"./reporters":21,"./runnable":33,"./runner":34,"./suite":35,"./test":36,"./utils":38,"_process":67,"escape-string-regexp":47,"growl":49,"path":42}],15:[function(require,module,exports){
+/**
+ * Helpers.
+ */
+
+var s = 1000;
+var m = s * 60;
+var h = m * 60;
+var d = h * 24;
+var y = d * 365.25;
+
+/**
+ * Parse or format the given `val`.
+ *
+ * Options:
+ *
+ * - `long` verbose formatting [false]
+ *
+ * @api public
+ * @param {string|number} val
+ * @param {Object} options
+ * @return {string|number}
+ */
+module.exports = function(val, options) {
+ options = options || {};
+ if (typeof val === 'string') {
+ return parse(val);
+ }
+ // https://github.com/mochajs/mocha/pull/1035
+ return options['long'] ? longFormat(val) : shortFormat(val);
+};
+
+/**
+ * Parse the given `str` and return milliseconds.
+ *
+ * @api private
+ * @param {string} str
+ * @return {number}
+ */
+function parse(str) {
+ var match = (/^((?:\d+)?\.?\d+) *(ms|seconds?|s|minutes?|m|hours?|h|days?|d|years?|y)?$/i).exec(str);
+ if (!match) {
+ return;
+ }
+ var n = parseFloat(match[1]);
+ var type = (match[2] || 'ms').toLowerCase();
+ switch (type) {
+ case 'years':
+ case 'year':
+ case 'y':
+ return n * y;
+ case 'days':
+ case 'day':
+ case 'd':
+ return n * d;
+ case 'hours':
+ case 'hour':
+ case 'h':
+ return n * h;
+ case 'minutes':
+ case 'minute':
+ case 'm':
+ return n * m;
+ case 'seconds':
+ case 'second':
+ case 's':
+ return n * s;
+ case 'ms':
+ return n;
+ default:
+ // No default case
+ }
+}
+
+/**
+ * Short format for `ms`.
+ *
+ * @api private
+ * @param {number} ms
+ * @return {string}
+ */
+function shortFormat(ms) {
+ if (ms >= d) {
+ return Math.round(ms / d) + 'd';
+ }
+ if (ms >= h) {
+ return Math.round(ms / h) + 'h';
+ }
+ if (ms >= m) {
+ return Math.round(ms / m) + 'm';
+ }
+ if (ms >= s) {
+ return Math.round(ms / s) + 's';
+ }
+ return ms + 'ms';
+}
+
+/**
+ * Long format for `ms`.
+ *
+ * @api private
+ * @param {number} ms
+ * @return {string}
+ */
+function longFormat(ms) {
+ return plural(ms, d, 'day')
+ || plural(ms, h, 'hour')
+ || plural(ms, m, 'minute')
+ || plural(ms, s, 'second')
+ || ms + ' ms';
+}
+
+/**
+ * Pluralization helper.
+ *
+ * @api private
+ * @param {number} ms
+ * @param {number} n
+ * @param {string} name
+ */
+function plural(ms, n, name) {
+ if (ms < n) {
+ return;
+ }
+ if (ms < n * 1.5) {
+ return Math.floor(ms / n) + ' ' + name;
+ }
+ return Math.ceil(ms / n) + ' ' + name + 's';
+}
+
+},{}],16:[function(require,module,exports){
+
+/**
+ * Expose `Pending`.
+ */
+
+module.exports = Pending;
+
+/**
+ * Initialize a new `Pending` error with the given message.
+ *
+ * @param {string} message
+ */
+function Pending(message) {
+ this.message = message;
+}
+
+},{}],17:[function(require,module,exports){
+(function (process,global){
+/**
+ * Module dependencies.
+ */
+
+var tty = require('tty');
+var diff = require('diff');
+var ms = require('../ms');
+var utils = require('../utils');
+var supportsColor = process.browser ? null : require('supports-color');
+
+/**
+ * Expose `Base`.
+ */
+
+exports = module.exports = Base;
+
+/**
+ * Save timer references to avoid Sinon interfering.
+ * See: https://github.com/mochajs/mocha/issues/237
+ */
+
+/* eslint-disable no-unused-vars, no-native-reassign */
+var Date = global.Date;
+var setTimeout = global.setTimeout;
+var setInterval = global.setInterval;
+var clearTimeout = global.clearTimeout;
+var clearInterval = global.clearInterval;
+/* eslint-enable no-unused-vars, no-native-reassign */
+
+/**
+ * Check if both stdio streams are associated with a tty.
+ */
+
+var isatty = tty.isatty(1) && tty.isatty(2);
+
+/**
+ * Enable coloring by default, except in the browser interface.
+ */
+
+exports.useColors = !process.browser && (supportsColor || (process.env.MOCHA_COLORS !== undefined));
+
+/**
+ * Inline diffs instead of +/-
+ */
+
+exports.inlineDiffs = false;
+
+/**
+ * Default color map.
+ */
+
+exports.colors = {
+ pass: 90,
+ fail: 31,
+ 'bright pass': 92,
+ 'bright fail': 91,
+ 'bright yellow': 93,
+ pending: 36,
+ suite: 0,
+ 'error title': 0,
+ 'error message': 31,
+ 'error stack': 90,
+ checkmark: 32,
+ fast: 90,
+ medium: 33,
+ slow: 31,
+ green: 32,
+ light: 90,
+ 'diff gutter': 90,
+ 'diff added': 32,
+ 'diff removed': 31
+};
+
+/**
+ * Default symbol map.
+ */
+
+exports.symbols = {
+ ok: '✓',
+ err: '✖',
+ dot: '․',
+ comma: ',',
+ bang: '!'
+};
+
+// With node.js on Windows: use symbols available in terminal default fonts
+if (process.platform === 'win32') {
+ exports.symbols.ok = '\u221A';
+ exports.symbols.err = '\u00D7';
+ exports.symbols.dot = '.';
+}
+
+/**
+ * Color `str` with the given `type`,
+ * allowing colors to be disabled,
+ * as well as user-defined color
+ * schemes.
+ *
+ * @param {string} type
+ * @param {string} str
+ * @return {string}
+ * @api private
+ */
+var color = exports.color = function(type, str) {
+ if (!exports.useColors) {
+ return String(str);
+ }
+ return '\u001b[' + exports.colors[type] + 'm' + str + '\u001b[0m';
+};
+
+/**
+ * Expose term window size, with some defaults for when stderr is not a tty.
+ */
+
+exports.window = {
+ width: 75
+};
+
+if (isatty) {
+ exports.window.width = process.stdout.getWindowSize
+ ? process.stdout.getWindowSize(1)[0]
+ : tty.getWindowSize()[1];
+}
+
+/**
+ * Expose some basic cursor interactions that are common among reporters.
+ */
+
+exports.cursor = {
+ hide: function() {
+ isatty && process.stdout.write('\u001b[?25l');
+ },
+
+ show: function() {
+ isatty && process.stdout.write('\u001b[?25h');
+ },
+
+ deleteLine: function() {
+ isatty && process.stdout.write('\u001b[2K');
+ },
+
+ beginningOfLine: function() {
+ isatty && process.stdout.write('\u001b[0G');
+ },
+
+ CR: function() {
+ if (isatty) {
+ exports.cursor.deleteLine();
+ exports.cursor.beginningOfLine();
+ } else {
+ process.stdout.write('\r');
+ }
+ }
+};
+
+/**
+ * Outut the given `failures` as a list.
+ *
+ * @param {Array} failures
+ * @api public
+ */
+
+exports.list = function(failures) {
+ console.log();
+ failures.forEach(function(test, i) {
+ // format
+ var fmt = color('error title', ' %s) %s:\n')
+ + color('error message', ' %s')
+ + color('error stack', '\n%s\n');
+
+ // msg
+ var msg;
+ var err = test.err;
+ var message;
+ if (err.message && typeof err.message.toString === 'function') {
+ message = err.message + '';
+ } else if (typeof err.inspect === 'function') {
+ message = err.inspect() + '';
+ } else {
+ message = '';
+ }
+ var stack = err.stack || message;
+ var index = message ? stack.indexOf(message) : -1;
+ var actual = err.actual;
+ var expected = err.expected;
+ var escape = true;
+
+ if (index === -1) {
+ msg = message;
+ } else {
+ index += message.length;
+ msg = stack.slice(0, index);
+ // remove msg from stack
+ stack = stack.slice(index + 1);
+ }
+
+ // uncaught
+ if (err.uncaught) {
+ msg = 'Uncaught ' + msg;
+ }
+ // explicitly show diff
+ if (err.showDiff !== false && sameType(actual, expected) && expected !== undefined) {
+ escape = false;
+ if (!(utils.isString(actual) && utils.isString(expected))) {
+ err.actual = actual = utils.stringify(actual);
+ err.expected = expected = utils.stringify(expected);
+ }
+
+ fmt = color('error title', ' %s) %s:\n%s') + color('error stack', '\n%s\n');
+ var match = message.match(/^([^:]+): expected/);
+ msg = '\n ' + color('error message', match ? match[1] : msg);
+
+ if (exports.inlineDiffs) {
+ msg += inlineDiff(err, escape);
+ } else {
+ msg += unifiedDiff(err, escape);
+ }
+ }
+
+ // indent stack trace
+ stack = stack.replace(/^/gm, ' ');
+
+ console.log(fmt, (i + 1), test.fullTitle(), msg, stack);
+ });
+};
+
+/**
+ * Initialize a new `Base` reporter.
+ *
+ * All other reporters generally
+ * inherit from this reporter, providing
+ * stats such as test duration, number
+ * of tests passed / failed etc.
+ *
+ * @param {Runner} runner
+ * @api public
+ */
+
+function Base(runner) {
+ var stats = this.stats = { suites: 0, tests: 0, passes: 0, pending: 0, failures: 0 };
+ var failures = this.failures = [];
+
+ if (!runner) {
+ return;
+ }
+ this.runner = runner;
+
+ runner.stats = stats;
+
+ runner.on('start', function() {
+ stats.start = new Date();
+ });
+
+ runner.on('suite', function(suite) {
+ stats.suites = stats.suites || 0;
+ suite.root || stats.suites++;
+ });
+
+ runner.on('test end', function() {
+ stats.tests = stats.tests || 0;
+ stats.tests++;
+ });
+
+ runner.on('pass', function(test) {
+ stats.passes = stats.passes || 0;
+
+ if (test.duration > test.slow()) {
+ test.speed = 'slow';
+ } else if (test.duration > test.slow() / 2) {
+ test.speed = 'medium';
+ } else {
+ test.speed = 'fast';
+ }
+
+ stats.passes++;
+ });
+
+ runner.on('fail', function(test, err) {
+ stats.failures = stats.failures || 0;
+ stats.failures++;
+ test.err = err;
+ failures.push(test);
+ });
+
+ runner.on('end', function() {
+ stats.end = new Date();
+ stats.duration = new Date() - stats.start;
+ });
+
+ runner.on('pending', function() {
+ stats.pending++;
+ });
+}
+
+/**
+ * Output common epilogue used by many of
+ * the bundled reporters.
+ *
+ * @api public
+ */
+Base.prototype.epilogue = function() {
+ var stats = this.stats;
+ var fmt;
+
+ console.log();
+
+ // passes
+ fmt = color('bright pass', ' ')
+ + color('green', ' %d passing')
+ + color('light', ' (%s)');
+
+ console.log(fmt,
+ stats.passes || 0,
+ ms(stats.duration));
+
+ // pending
+ if (stats.pending) {
+ fmt = color('pending', ' ')
+ + color('pending', ' %d pending');
+
+ console.log(fmt, stats.pending);
+ }
+
+ // failures
+ if (stats.failures) {
+ fmt = color('fail', ' %d failing');
+
+ console.log(fmt, stats.failures);
+
+ Base.list(this.failures);
+ console.log();
+ }
+
+ console.log();
+};
+
+/**
+ * Pad the given `str` to `len`.
+ *
+ * @api private
+ * @param {string} str
+ * @param {string} len
+ * @return {string}
+ */
+function pad(str, len) {
+ str = String(str);
+ return Array(len - str.length + 1).join(' ') + str;
+}
+
+/**
+ * Returns an inline diff between 2 strings with coloured ANSI output
+ *
+ * @api private
+ * @param {Error} err with actual/expected
+ * @param {boolean} escape
+ * @return {string} Diff
+ */
+function inlineDiff(err, escape) {
+ var msg = errorDiff(err, 'WordsWithSpace', escape);
+
+ // linenos
+ var lines = msg.split('\n');
+ if (lines.length > 4) {
+ var width = String(lines.length).length;
+ msg = lines.map(function(str, i) {
+ return pad(++i, width) + ' |' + ' ' + str;
+ }).join('\n');
+ }
+
+ // legend
+ msg = '\n'
+ + color('diff removed', 'actual')
+ + ' '
+ + color('diff added', 'expected')
+ + '\n\n'
+ + msg
+ + '\n';
+
+ // indent
+ msg = msg.replace(/^/gm, ' ');
+ return msg;
+}
+
+/**
+ * Returns a unified diff between two strings.
+ *
+ * @api private
+ * @param {Error} err with actual/expected
+ * @param {boolean} escape
+ * @return {string} The diff.
+ */
+function unifiedDiff(err, escape) {
+ var indent = ' ';
+ function cleanUp(line) {
+ if (escape) {
+ line = escapeInvisibles(line);
+ }
+ if (line[0] === '+') {
+ return indent + colorLines('diff added', line);
+ }
+ if (line[0] === '-') {
+ return indent + colorLines('diff removed', line);
+ }
+ if (line.match(/\@\@/)) {
+ return null;
+ }
+ if (line.match(/\\ No newline/)) {
+ return null;
+ }
+ return indent + line;
+ }
+ function notBlank(line) {
+ return typeof line !== 'undefined' && line !== null;
+ }
+ var msg = diff.createPatch('string', err.actual, err.expected);
+ var lines = msg.split('\n').splice(4);
+ return '\n '
+ + colorLines('diff added', '+ expected') + ' '
+ + colorLines('diff removed', '- actual')
+ + '\n\n'
+ + lines.map(cleanUp).filter(notBlank).join('\n');
+}
+
+/**
+ * Return a character diff for `err`.
+ *
+ * @api private
+ * @param {Error} err
+ * @param {string} type
+ * @param {boolean} escape
+ * @return {string}
+ */
+function errorDiff(err, type, escape) {
+ var actual = escape ? escapeInvisibles(err.actual) : err.actual;
+ var expected = escape ? escapeInvisibles(err.expected) : err.expected;
+ return diff['diff' + type](actual, expected).map(function(str) {
+ if (str.added) {
+ return colorLines('diff added', str.value);
+ }
+ if (str.removed) {
+ return colorLines('diff removed', str.value);
+ }
+ return str.value;
+ }).join('');
+}
+
+/**
+ * Returns a string with all invisible characters in plain text
+ *
+ * @api private
+ * @param {string} line
+ * @return {string}
+ */
+function escapeInvisibles(line) {
+ return line.replace(/\t/g, '<tab>')
+ .replace(/\r/g, '<CR>')
+ .replace(/\n/g, '<LF>\n');
+}
+
+/**
+ * Color lines for `str`, using the color `name`.
+ *
+ * @api private
+ * @param {string} name
+ * @param {string} str
+ * @return {string}
+ */
+function colorLines(name, str) {
+ return str.split('\n').map(function(str) {
+ return color(name, str);
+ }).join('\n');
+}
+
+/**
+ * Object#toString reference.
+ */
+var objToString = Object.prototype.toString;
+
+/**
+ * Check that a / b have the same type.
+ *
+ * @api private
+ * @param {Object} a
+ * @param {Object} b
+ * @return {boolean}
+ */
+function sameType(a, b) {
+ return objToString.call(a) === objToString.call(b);
+}
+
+}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+},{"../ms":15,"../utils":38,"_process":67,"diff":46,"supports-color":42,"tty":5}],18:[function(require,module,exports){
+/**
+ * Module dependencies.
+ */
+
+var Base = require('./base');
+var utils = require('../utils');
+
+/**
+ * Expose `Doc`.
+ */
+
+exports = module.exports = Doc;
+
+/**
+ * Initialize a new `Doc` reporter.
+ *
+ * @param {Runner} runner
+ * @api public
+ */
+function Doc(runner) {
+ Base.call(this, runner);
+
+ var indents = 2;
+
+ function indent() {
+ return Array(indents).join(' ');
+ }
+
+ runner.on('suite', function(suite) {
+ if (suite.root) {
+ return;
+ }
+ ++indents;
+ console.log('%s<section class="suite">', indent());
+ ++indents;
+ console.log('%s<h1>%s</h1>', indent(), utils.escape(suite.title));
+ console.log('%s<dl>', indent());
+ });
+
+ runner.on('suite end', function(suite) {
+ if (suite.root) {
+ return;
+ }
+ console.log('%s</dl>', indent());
+ --indents;
+ console.log('%s</section>', indent());
+ --indents;
+ });
+
+ runner.on('pass', function(test) {
+ console.log('%s <dt>%s</dt>', indent(), utils.escape(test.title));
+ var code = utils.escape(utils.clean(test.body));
+ console.log('%s <dd><pre><code>%s</code></pre></dd>', indent(), code);
+ });
+
+ runner.on('fail', function(test, err) {
+ console.log('%s <dt class="error">%s</dt>', indent(), utils.escape(test.title));
+ var code = utils.escape(utils.clean(test.body));
+ console.log('%s <dd class="error"><pre><code>%s</code></pre></dd>', indent(), code);
+ console.log('%s <dd class="error">%s</dd>', indent(), utils.escape(err));
+ });
+}
+
+},{"../utils":38,"./base":17}],19:[function(require,module,exports){
+(function (process){
+/**
+ * Module dependencies.
+ */
+
+var Base = require('./base');
+var inherits = require('../utils').inherits;
+var color = Base.color;
+
+/**
+ * Expose `Dot`.
+ */
+
+exports = module.exports = Dot;
+
+/**
+ * Initialize a new `Dot` matrix test reporter.
+ *
+ * @api public
+ * @param {Runner} runner
+ */
+function Dot(runner) {
+ Base.call(this, runner);
+
+ var self = this;
+ var width = Base.window.width * .75 | 0;
+ var n = -1;
+
+ runner.on('start', function() {
+ process.stdout.write('\n');
+ });
+
+ runner.on('pending', function() {
+ if (++n % width === 0) {
+ process.stdout.write('\n ');
+ }
+ process.stdout.write(color('pending', Base.symbols.comma));
+ });
+
+ runner.on('pass', function(test) {
+ if (++n % width === 0) {
+ process.stdout.write('\n ');
+ }
+ if (test.speed === 'slow') {
+ process.stdout.write(color('bright yellow', Base.symbols.dot));
+ } else {
+ process.stdout.write(color(test.speed, Base.symbols.dot));
+ }
+ });
+
+ runner.on('fail', function() {
+ if (++n % width === 0) {
+ process.stdout.write('\n ');
+ }
+ process.stdout.write(color('fail', Base.symbols.bang));
+ });
+
+ runner.on('end', function() {
+ console.log();
+ self.epilogue();
+ });
+}
+
+/**
+ * Inherit from `Base.prototype`.
+ */
+inherits(Dot, Base);
+
+}).call(this,require('_process'))
+},{"../utils":38,"./base":17,"_process":67}],20:[function(require,module,exports){
+(function (global){
+/* eslint-env browser */
+
+/**
+ * Module dependencies.
+ */
+
+var Base = require('./base');
+var utils = require('../utils');
+var Progress = require('../browser/progress');
+var escapeRe = require('escape-string-regexp');
+var escape = utils.escape;
+
+/**
+ * Save timer references to avoid Sinon interfering (see GH-237).
+ */
+
+/* eslint-disable no-unused-vars, no-native-reassign */
+var Date = global.Date;
+var setTimeout = global.setTimeout;
+var setInterval = global.setInterval;
+var clearTimeout = global.clearTimeout;
+var clearInterval = global.clearInterval;
+/* eslint-enable no-unused-vars, no-native-reassign */
+
+/**
+ * Expose `HTML`.
+ */
+
+exports = module.exports = HTML;
+
+/**
+ * Stats template.
+ */
+
+var statsTemplate = '<ul id="mocha-stats">'
+ + '<li class="progress"><canvas width="40" height="40"></canvas></li>'
+ + '<li class="passes"><a href="javascript:void(0);">passes:</a> <em>0</em></li>'
+ + '<li class="failures"><a href="javascript:void(0);">failures:</a> <em>0</em></li>'
+ + '<li class="duration">duration: <em>0</em>s</li>'
+ + '</ul>';
+
+/**
+ * Initialize a new `HTML` reporter.
+ *
+ * @api public
+ * @param {Runner} runner
+ */
+function HTML(runner) {
+ Base.call(this, runner);
+
+ var self = this;
+ var stats = this.stats;
+ var stat = fragment(statsTemplate);
+ var items = stat.getElementsByTagName('li');
+ var passes = items[1].getElementsByTagName('em')[0];
+ var passesLink = items[1].getElementsByTagName('a')[0];
+ var failures = items[2].getElementsByTagName('em')[0];
+ var failuresLink = items[2].getElementsByTagName('a')[0];
+ var duration = items[3].getElementsByTagName('em')[0];
+ var canvas = stat.getElementsByTagName('canvas')[0];
+ var report = fragment('<ul id="mocha-report"></ul>');
+ var stack = [report];
+ var progress;
+ var ctx;
+ var root = document.getElementById('mocha');
+
+ if (canvas.getContext) {
+ var ratio = window.devicePixelRatio || 1;
+ canvas.style.width = canvas.width;
+ canvas.style.height = canvas.height;
+ canvas.width *= ratio;
+ canvas.height *= ratio;
+ ctx = canvas.getContext('2d');
+ ctx.scale(ratio, ratio);
+ progress = new Progress();
+ }
+
+ if (!root) {
+ return error('#mocha div missing, add it to your document');
+ }
+
+ // pass toggle
+ on(passesLink, 'click', function(evt) {
+ evt.preventDefault();
+ unhide();
+ var name = (/pass/).test(report.className) ? '' : ' pass';
+ report.className = report.className.replace(/fail|pass/g, '') + name;
+ if (report.className.trim()) {
+ hideSuitesWithout('test pass');
+ }
+ });
+
+ // failure toggle
+ on(failuresLink, 'click', function(evt) {
+ evt.preventDefault();
+ unhide();
+ var name = (/fail/).test(report.className) ? '' : ' fail';
+ report.className = report.className.replace(/fail|pass/g, '') + name;
+ if (report.className.trim()) {
+ hideSuitesWithout('test fail');
+ }
+ });
+
+ root.appendChild(stat);
+ root.appendChild(report);
+
+ if (progress) {
+ progress.size(40);
+ }
+
+ runner.on('suite', function(suite) {
+ if (suite.root) {
+ return;
+ }
+
+ // suite
+ var url = self.suiteURL(suite);
+ var el = fragment('<li class="suite"><h1><a href="%s">%s</a></h1></li>', url, escape(suite.title));
+
+ // container
+ stack[0].appendChild(el);
+ stack.unshift(document.createElement('ul'));
+ el.appendChild(stack[0]);
+ });
+
+ runner.on('suite end', function(suite) {
+ if (suite.root) {
+ updateStats();
+ return;
+ }
+ stack.shift();
+ });
+
+ runner.on('pass', function(test) {
+ var url = self.testURL(test);
+ var markup = '<li class="test pass %e"><h2>%e<span class="duration">%ems</span> '
+ + '<a href="%s" class="replay">‣</a></h2></li>';
+ var el = fragment(markup, test.speed, test.title, test.duration, url);
+ self.addCodeToggle(el, test.body);
+ appendToStack(el);
+ updateStats();
+ });
+
+ runner.on('fail', function(test) {
+ var el = fragment('<li class="test fail"><h2>%e <a href="%e" class="replay">‣</a></h2></li>',
+ test.title, self.testURL(test));
+ var stackString; // Note: Includes leading newline
+ var message = test.err.toString();
+
+ // <=IE7 stringifies to [Object Error]. Since it can be overloaded, we
+ // check for the result of the stringifying.
+ if (message === '[object Error]') {
+ message = test.err.message;
+ }
+
+ if (test.err.stack) {
+ var indexOfMessage = test.err.stack.indexOf(test.err.message);
+ if (indexOfMessage === -1) {
+ stackString = test.err.stack;
+ } else {
+ stackString = test.err.stack.substr(test.err.message.length + indexOfMessage);
+ }
+ } else if (test.err.sourceURL && test.err.line !== undefined) {
+ // Safari doesn't give you a stack. Let's at least provide a source line.
+ stackString = '\n(' + test.err.sourceURL + ':' + test.err.line + ')';
+ }
+
+ stackString = stackString || '';
+
+ if (test.err.htmlMessage && stackString) {
+ el.appendChild(fragment('<div class="html-error">%s\n<pre class="error">%e</pre></div>',
+ test.err.htmlMessage, stackString));
+ } else if (test.err.htmlMessage) {
+ el.appendChild(fragment('<div class="html-error">%s</div>', test.err.htmlMessage));
+ } else {
+ el.appendChild(fragment('<pre class="error">%e%e</pre>', message, stackString));
+ }
+
+ self.addCodeToggle(el, test.body);
+ appendToStack(el);
+ updateStats();
+ });
+
+ runner.on('pending', function(test) {
+ var el = fragment('<li class="test pass pending"><h2>%e</h2></li>', test.title);
+ appendToStack(el);
+ updateStats();
+ });
+
+ function appendToStack(el) {
+ // Don't call .appendChild if #mocha-report was already .shift()'ed off the stack.
+ if (stack[0]) {
+ stack[0].appendChild(el);
+ }
+ }
+
+ function updateStats() {
+ // TODO: add to stats
+ var percent = stats.tests / runner.total * 100 | 0;
+ if (progress) {
+ progress.update(percent).draw(ctx);
+ }
+
+ // update stats
+ var ms = new Date() - stats.start;
+ text(passes, stats.passes);
+ text(failures, stats.failures);
+ text(duration, (ms / 1000).toFixed(2));
+ }
+}
+
+/**
+ * Makes a URL, preserving querystring ("search") parameters.
+ *
+ * @param {string} s
+ * @return {string} A new URL.
+ */
+function makeUrl(s) {
+ var search = window.location.search;
+
+ // Remove previous grep query parameter if present
+ if (search) {
+ search = search.replace(/[?&]grep=[^&\s]*/g, '').replace(/^&/, '?');
+ }
+
+ return window.location.pathname + (search ? search + '&' : '?') + 'grep=' + encodeURIComponent(escapeRe(s));
+}
+
+/**
+ * Provide suite URL.
+ *
+ * @param {Object} [suite]
+ */
+HTML.prototype.suiteURL = function(suite) {
+ return makeUrl(suite.fullTitle());
+};
+
+/**
+ * Provide test URL.
+ *
+ * @param {Object} [test]
+ */
+HTML.prototype.testURL = function(test) {
+ return makeUrl(test.fullTitle());
+};
+
+/**
+ * Adds code toggle functionality for the provided test's list element.
+ *
+ * @param {HTMLLIElement} el
+ * @param {string} contents
+ */
+HTML.prototype.addCodeToggle = function(el, contents) {
+ var h2 = el.getElementsByTagName('h2')[0];
+
+ on(h2, 'click', function() {
+ pre.style.display = pre.style.display === 'none' ? 'block' : 'none';
+ });
+
+ var pre = fragment('<pre><code>%e</code></pre>', utils.clean(contents));
+ el.appendChild(pre);
+ pre.style.display = 'none';
+};
+
+/**
+ * Display error `msg`.
+ *
+ * @param {string} msg
+ */
+function error(msg) {
+ document.body.appendChild(fragment('<div id="mocha-error">%s</div>', msg));
+}
+
+/**
+ * Return a DOM fragment from `html`.
+ *
+ * @param {string} html
+ */
+function fragment(html) {
+ var args = arguments;
+ var div = document.createElement('div');
+ var i = 1;
+
+ div.innerHTML = html.replace(/%([se])/g, function(_, type) {
+ switch (type) {
+ case 's': return String(args[i++]);
+ case 'e': return escape(args[i++]);
+ // no default
+ }
+ });
+
+ return div.firstChild;
+}
+
+/**
+ * Check for suites that do not have elements
+ * with `classname`, and hide them.
+ *
+ * @param {text} classname
+ */
+function hideSuitesWithout(classname) {
+ var suites = document.getElementsByClassName('suite');
+ for (var i = 0; i < suites.length; i++) {
+ var els = suites[i].getElementsByClassName(classname);
+ if (!els.length) {
+ suites[i].className += ' hidden';
+ }
+ }
+}
+
+/**
+ * Unhide .hidden suites.
+ */
+function unhide() {
+ var els = document.getElementsByClassName('suite hidden');
+ for (var i = 0; i < els.length; ++i) {
+ els[i].className = els[i].className.replace('suite hidden', 'suite');
+ }
+}
+
+/**
+ * Set an element's text contents.
+ *
+ * @param {HTMLElement} el
+ * @param {string} contents
+ */
+function text(el, contents) {
+ if (el.textContent) {
+ el.textContent = contents;
+ } else {
+ el.innerText = contents;
+ }
+}
+
+/**
+ * Listen on `event` with callback `fn`.
+ */
+function on(el, event, fn) {
+ if (el.addEventListener) {
+ el.addEventListener(event, fn, false);
+ } else {
+ el.attachEvent('on' + event, fn);
+ }
+}
+
+}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+},{"../browser/progress":4,"../utils":38,"./base":17,"escape-string-regexp":47}],21:[function(require,module,exports){
+// Alias exports to a their normalized format Mocha#reporter to prevent a need
+// for dynamic (try/catch) requires, which Browserify doesn't handle.
+exports.Base = exports.base = require('./base');
+exports.Dot = exports.dot = require('./dot');
+exports.Doc = exports.doc = require('./doc');
+exports.TAP = exports.tap = require('./tap');
+exports.JSON = exports.json = require('./json');
+exports.HTML = exports.html = require('./html');
+exports.List = exports.list = require('./list');
+exports.Min = exports.min = require('./min');
+exports.Spec = exports.spec = require('./spec');
+exports.Nyan = exports.nyan = require('./nyan');
+exports.XUnit = exports.xunit = require('./xunit');
+exports.Markdown = exports.markdown = require('./markdown');
+exports.Progress = exports.progress = require('./progress');
+exports.Landing = exports.landing = require('./landing');
+exports.JSONStream = exports['json-stream'] = require('./json-stream');
+
+},{"./base":17,"./doc":18,"./dot":19,"./html":20,"./json":23,"./json-stream":22,"./landing":24,"./list":25,"./markdown":26,"./min":27,"./nyan":28,"./progress":29,"./spec":30,"./tap":31,"./xunit":32}],22:[function(require,module,exports){
+(function (process){
+/**
+ * Module dependencies.
+ */
+
+var Base = require('./base');
+var JSON = require('json3');
+
+/**
+ * Expose `List`.
+ */
+
+exports = module.exports = List;
+
+/**
+ * Initialize a new `List` test reporter.
+ *
+ * @api public
+ * @param {Runner} runner
+ */
+function List(runner) {
+ Base.call(this, runner);
+
+ var self = this;
+ var total = runner.total;
+
+ runner.on('start', function() {
+ console.log(JSON.stringify(['start', { total: total }]));
+ });
+
+ runner.on('pass', function(test) {
+ console.log(JSON.stringify(['pass', clean(test)]));
+ });
+
+ runner.on('fail', function(test, err) {
+ test = clean(test);
+ test.err = err.message;
+ test.stack = err.stack || null;
+ console.log(JSON.stringify(['fail', test]));
+ });
+
+ runner.on('end', function() {
+ process.stdout.write(JSON.stringify(['end', self.stats]));
+ });
+}
+
+/**
+ * Return a plain-object representation of `test`
+ * free of cyclic properties etc.
+ *
+ * @api private
+ * @param {Object} test
+ * @return {Object}
+ */
+function clean(test) {
+ return {
+ title: test.title,
+ fullTitle: test.fullTitle(),
+ duration: test.duration,
+ currentRetry: test.currentRetry()
+ };
+}
+
+}).call(this,require('_process'))
+},{"./base":17,"_process":67,"json3":54}],23:[function(require,module,exports){
+(function (process){
+/**
+ * Module dependencies.
+ */
+
+var Base = require('./base');
+
+/**
+ * Expose `JSON`.
+ */
+
+exports = module.exports = JSONReporter;
+
+/**
+ * Initialize a new `JSON` reporter.
+ *
+ * @api public
+ * @param {Runner} runner
+ */
+function JSONReporter(runner) {
+ Base.call(this, runner);
+
+ var self = this;
+ var tests = [];
+ var pending = [];
+ var failures = [];
+ var passes = [];
+
+ runner.on('test end', function(test) {
+ tests.push(test);
+ });
+
+ runner.on('pass', function(test) {
+ passes.push(test);
+ });
+
+ runner.on('fail', function(test) {
+ failures.push(test);
+ });
+
+ runner.on('pending', function(test) {
+ pending.push(test);
+ });
+
+ runner.on('end', function() {
+ var obj = {
+ stats: self.stats,
+ tests: tests.map(clean),
+ pending: pending.map(clean),
+ failures: failures.map(clean),
+ passes: passes.map(clean)
+ };
+
+ runner.testResults = obj;
+
+ process.stdout.write(JSON.stringify(obj, null, 2));
+ });
+}
+
+/**
+ * Return a plain-object representation of `test`
+ * free of cyclic properties etc.
+ *
+ * @api private
+ * @param {Object} test
+ * @return {Object}
+ */
+function clean(test) {
+ return {
+ title: test.title,
+ fullTitle: test.fullTitle(),
+ duration: test.duration,
+ currentRetry: test.currentRetry(),
+ err: errorJSON(test.err || {})
+ };
+}
+
+/**
+ * Transform `error` into a JSON object.
+ *
+ * @api private
+ * @param {Error} err
+ * @return {Object}
+ */
+function errorJSON(err) {
+ var res = {};
+ Object.getOwnPropertyNames(err).forEach(function(key) {
+ res[key] = err[key];
+ }, err);
+ return res;
+}
+
+}).call(this,require('_process'))
+},{"./base":17,"_process":67}],24:[function(require,module,exports){
+(function (process){
+/**
+ * Module dependencies.
+ */
+
+var Base = require('./base');
+var inherits = require('../utils').inherits;
+var cursor = Base.cursor;
+var color = Base.color;
+
+/**
+ * Expose `Landing`.
+ */
+
+exports = module.exports = Landing;
+
+/**
+ * Airplane color.
+ */
+
+Base.colors.plane = 0;
+
+/**
+ * Airplane crash color.
+ */
+
+Base.colors['plane crash'] = 31;
+
+/**
+ * Runway color.
+ */
+
+Base.colors.runway = 90;
+
+/**
+ * Initialize a new `Landing` reporter.
+ *
+ * @api public
+ * @param {Runner} runner
+ */
+function Landing(runner) {
+ Base.call(this, runner);
+
+ var self = this;
+ var width = Base.window.width * .75 | 0;
+ var total = runner.total;
+ var stream = process.stdout;
+ var plane = color('plane', '✈');
+ var crashed = -1;
+ var n = 0;
+
+ function runway() {
+ var buf = Array(width).join('-');
+ return ' ' + color('runway', buf);
+ }
+
+ runner.on('start', function() {
+ stream.write('\n\n\n ');
+ cursor.hide();
+ });
+
+ runner.on('test end', function(test) {
+ // check if the plane crashed
+ var col = crashed === -1 ? width * ++n / total | 0 : crashed;
+
+ // show the crash
+ if (test.state === 'failed') {
+ plane = color('plane crash', '✈');
+ crashed = col;
+ }
+
+ // render landing strip
+ stream.write('\u001b[' + (width + 1) + 'D\u001b[2A');
+ stream.write(runway());
+ stream.write('\n ');
+ stream.write(color('runway', Array(col).join('⋅')));
+ stream.write(plane);
+ stream.write(color('runway', Array(width - col).join('⋅') + '\n'));
+ stream.write(runway());
+ stream.write('\u001b[0m');
+ });
+
+ runner.on('end', function() {
+ cursor.show();
+ console.log();
+ self.epilogue();
+ });
+}
+
+/**
+ * Inherit from `Base.prototype`.
+ */
+inherits(Landing, Base);
+
+}).call(this,require('_process'))
+},{"../utils":38,"./base":17,"_process":67}],25:[function(require,module,exports){
+(function (process){
+/**
+ * Module dependencies.
+ */
+
+var Base = require('./base');
+var inherits = require('../utils').inherits;
+var color = Base.color;
+var cursor = Base.cursor;
+
+/**
+ * Expose `List`.
+ */
+
+exports = module.exports = List;
+
+/**
+ * Initialize a new `List` test reporter.
+ *
+ * @api public
+ * @param {Runner} runner
+ */
+function List(runner) {
+ Base.call(this, runner);
+
+ var self = this;
+ var n = 0;
+
+ runner.on('start', function() {
+ console.log();
+ });
+
+ runner.on('test', function(test) {
+ process.stdout.write(color('pass', ' ' + test.fullTitle() + ': '));
+ });
+
+ runner.on('pending', function(test) {
+ var fmt = color('checkmark', ' -')
+ + color('pending', ' %s');
+ console.log(fmt, test.fullTitle());
+ });
+
+ runner.on('pass', function(test) {
+ var fmt = color('checkmark', ' ' + Base.symbols.dot)
+ + color('pass', ' %s: ')
+ + color(test.speed, '%dms');
+ cursor.CR();
+ console.log(fmt, test.fullTitle(), test.duration);
+ });
+
+ runner.on('fail', function(test) {
+ cursor.CR();
+ console.log(color('fail', ' %d) %s'), ++n, test.fullTitle());
+ });
+
+ runner.on('end', self.epilogue.bind(self));
+}
+
+/**
+ * Inherit from `Base.prototype`.
+ */
+inherits(List, Base);
+
+}).call(this,require('_process'))
+},{"../utils":38,"./base":17,"_process":67}],26:[function(require,module,exports){
+(function (process){
+/**
+ * Module dependencies.
+ */
+
+var Base = require('./base');
+var utils = require('../utils');
+
+/**
+ * Constants
+ */
+
+var SUITE_PREFIX = '$';
+
+/**
+ * Expose `Markdown`.
+ */
+
+exports = module.exports = Markdown;
+
+/**
+ * Initialize a new `Markdown` reporter.
+ *
+ * @api public
+ * @param {Runner} runner
+ */
+function Markdown(runner) {
+ Base.call(this, runner);
+
+ var level = 0;
+ var buf = '';
+
+ function title(str) {
+ return Array(level).join('#') + ' ' + str;
+ }
+
+ function mapTOC(suite, obj) {
+ var ret = obj;
+ var key = SUITE_PREFIX + suite.title;
+
+ obj = obj[key] = obj[key] || { suite: suite };
+ suite.suites.forEach(function(suite) {
+ mapTOC(suite, obj);
+ });
+
+ return ret;
+ }
+
+ function stringifyTOC(obj, level) {
+ ++level;
+ var buf = '';
+ var link;
+ for (var key in obj) {
+ if (key === 'suite') {
+ continue;
+ }
+ if (key !== SUITE_PREFIX) {
+ link = ' - [' + key.substring(1) + ']';
+ link += '(#' + utils.slug(obj[key].suite.fullTitle()) + ')\n';
+ buf += Array(level).join(' ') + link;
+ }
+ buf += stringifyTOC(obj[key], level);
+ }
+ return buf;
+ }
+
+ function generateTOC(suite) {
+ var obj = mapTOC(suite, {});
+ return stringifyTOC(obj, 0);
+ }
+
+ generateTOC(runner.suite);
+
+ runner.on('suite', function(suite) {
+ ++level;
+ var slug = utils.slug(suite.fullTitle());
+ buf += '<a name="' + slug + '"></a>' + '\n';
+ buf += title(suite.title) + '\n';
+ });
+
+ runner.on('suite end', function() {
+ --level;
+ });
+
+ runner.on('pass', function(test) {
+ var code = utils.clean(test.body);
+ buf += test.title + '.\n';
+ buf += '\n```js\n';
+ buf += code + '\n';
+ buf += '```\n\n';
+ });
+
+ runner.on('end', function() {
+ process.stdout.write('# TOC\n');
+ process.stdout.write(generateTOC(runner.suite));
+ process.stdout.write(buf);
+ });
+}
+
+}).call(this,require('_process'))
+},{"../utils":38,"./base":17,"_process":67}],27:[function(require,module,exports){
+(function (process){
+/**
+ * Module dependencies.
+ */
+
+var Base = require('./base');
+var inherits = require('../utils').inherits;
+
+/**
+ * Expose `Min`.
+ */
+
+exports = module.exports = Min;
+
+/**
+ * Initialize a new `Min` minimal test reporter (best used with --watch).
+ *
+ * @api public
+ * @param {Runner} runner
+ */
+function Min(runner) {
+ Base.call(this, runner);
+
+ runner.on('start', function() {
+ // clear screen
+ process.stdout.write('\u001b[2J');
+ // set cursor position
+ process.stdout.write('\u001b[1;3H');
+ });
+
+ runner.on('end', this.epilogue.bind(this));
+}
+
+/**
+ * Inherit from `Base.prototype`.
+ */
+inherits(Min, Base);
+
+}).call(this,require('_process'))
+},{"../utils":38,"./base":17,"_process":67}],28:[function(require,module,exports){
+(function (process){
+/**
+ * Module dependencies.
+ */
+
+var Base = require('./base');
+var inherits = require('../utils').inherits;
+
+/**
+ * Expose `Dot`.
+ */
+
+exports = module.exports = NyanCat;
+
+/**
+ * Initialize a new `Dot` matrix test reporter.
+ *
+ * @param {Runner} runner
+ * @api public
+ */
+
+function NyanCat(runner) {
+ Base.call(this, runner);
+
+ var self = this;
+ var width = Base.window.width * .75 | 0;
+ var nyanCatWidth = this.nyanCatWidth = 11;
+
+ this.colorIndex = 0;
+ this.numberOfLines = 4;
+ this.rainbowColors = self.generateColors();
+ this.scoreboardWidth = 5;
+ this.tick = 0;
+ this.trajectories = [[], [], [], []];
+ this.trajectoryWidthMax = (width - nyanCatWidth);
+
+ runner.on('start', function() {
+ Base.cursor.hide();
+ self.draw();
+ });
+
+ runner.on('pending', function() {
+ self.draw();
+ });
+
+ runner.on('pass', function() {
+ self.draw();
+ });
+
+ runner.on('fail', function() {
+ self.draw();
+ });
+
+ runner.on('end', function() {
+ Base.cursor.show();
+ for (var i = 0; i < self.numberOfLines; i++) {
+ write('\n');
+ }
+ self.epilogue();
+ });
+}
+
+/**
+ * Inherit from `Base.prototype`.
+ */
+inherits(NyanCat, Base);
+
+/**
+ * Draw the nyan cat
+ *
+ * @api private
+ */
+
+NyanCat.prototype.draw = function() {
+ this.appendRainbow();
+ this.drawScoreboard();
+ this.drawRainbow();
+ this.drawNyanCat();
+ this.tick = !this.tick;
+};
+
+/**
+ * Draw the "scoreboard" showing the number
+ * of passes, failures and pending tests.
+ *
+ * @api private
+ */
+
+NyanCat.prototype.drawScoreboard = function() {
+ var stats = this.stats;
+
+ function draw(type, n) {
+ write(' ');
+ write(Base.color(type, n));
+ write('\n');
+ }
+
+ draw('green', stats.passes);
+ draw('fail', stats.failures);
+ draw('pending', stats.pending);
+ write('\n');
+
+ this.cursorUp(this.numberOfLines);
+};
+
+/**
+ * Append the rainbow.
+ *
+ * @api private
+ */
+
+NyanCat.prototype.appendRainbow = function() {
+ var segment = this.tick ? '_' : '-';
+ var rainbowified = this.rainbowify(segment);
+
+ for (var index = 0; index < this.numberOfLines; index++) {
+ var trajectory = this.trajectories[index];
+ if (trajectory.length >= this.trajectoryWidthMax) {
+ trajectory.shift();
+ }
+ trajectory.push(rainbowified);
+ }
+};
+
+/**
+ * Draw the rainbow.
+ *
+ * @api private
+ */
+
+NyanCat.prototype.drawRainbow = function() {
+ var self = this;
+
+ this.trajectories.forEach(function(line) {
+ write('\u001b[' + self.scoreboardWidth + 'C');
+ write(line.join(''));
+ write('\n');
+ });
+
+ this.cursorUp(this.numberOfLines);
+};
+
+/**
+ * Draw the nyan cat
+ *
+ * @api private
+ */
+NyanCat.prototype.drawNyanCat = function() {
+ var self = this;
+ var startWidth = this.scoreboardWidth + this.trajectories[0].length;
+ var dist = '\u001b[' + startWidth + 'C';
+ var padding = '';
+
+ write(dist);
+ write('_,------,');
+ write('\n');
+
+ write(dist);
+ padding = self.tick ? ' ' : ' ';
+ write('_|' + padding + '/\\_/\\ ');
+ write('\n');
+
+ write(dist);
+ padding = self.tick ? '_' : '__';
+ var tail = self.tick ? '~' : '^';
+ write(tail + '|' + padding + this.face() + ' ');
+ write('\n');
+
+ write(dist);
+ padding = self.tick ? ' ' : ' ';
+ write(padding + '"" "" ');
+ write('\n');
+
+ this.cursorUp(this.numberOfLines);
+};
+
+/**
+ * Draw nyan cat face.
+ *
+ * @api private
+ * @return {string}
+ */
+
+NyanCat.prototype.face = function() {
+ var stats = this.stats;
+ if (stats.failures) {
+ return '( x .x)';
+ } else if (stats.pending) {
+ return '( o .o)';
+ } else if (stats.passes) {
+ return '( ^ .^)';
+ }
+ return '( - .-)';
+};
+
+/**
+ * Move cursor up `n`.
+ *
+ * @api private
+ * @param {number} n
+ */
+
+NyanCat.prototype.cursorUp = function(n) {
+ write('\u001b[' + n + 'A');
+};
+
+/**
+ * Move cursor down `n`.
+ *
+ * @api private
+ * @param {number} n
+ */
+
+NyanCat.prototype.cursorDown = function(n) {
+ write('\u001b[' + n + 'B');
+};
+
+/**
+ * Generate rainbow colors.
+ *
+ * @api private
+ * @return {Array}
+ */
+NyanCat.prototype.generateColors = function() {
+ var colors = [];
+
+ for (var i = 0; i < (6 * 7); i++) {
+ var pi3 = Math.floor(Math.PI / 3);
+ var n = (i * (1.0 / 6));
+ var r = Math.floor(3 * Math.sin(n) + 3);
+ var g = Math.floor(3 * Math.sin(n + 2 * pi3) + 3);
+ var b = Math.floor(3 * Math.sin(n + 4 * pi3) + 3);
+ colors.push(36 * r + 6 * g + b + 16);
+ }
+
+ return colors;
+};
+
+/**
+ * Apply rainbow to the given `str`.
+ *
+ * @api private
+ * @param {string} str
+ * @return {string}
+ */
+NyanCat.prototype.rainbowify = function(str) {
+ if (!Base.useColors) {
+ return str;
+ }
+ var color = this.rainbowColors[this.colorIndex % this.rainbowColors.length];
+ this.colorIndex += 1;
+ return '\u001b[38;5;' + color + 'm' + str + '\u001b[0m';
+};
+
+/**
+ * Stdout helper.
+ *
+ * @param {string} string A message to write to stdout.
+ */
+function write(string) {
+ process.stdout.write(string);
+}
+
+}).call(this,require('_process'))
+},{"../utils":38,"./base":17,"_process":67}],29:[function(require,module,exports){
+(function (process){
+/**
+ * Module dependencies.
+ */
+
+var Base = require('./base');
+var inherits = require('../utils').inherits;
+var color = Base.color;
+var cursor = Base.cursor;
+
+/**
+ * Expose `Progress`.
+ */
+
+exports = module.exports = Progress;
+
+/**
+ * General progress bar color.
+ */
+
+Base.colors.progress = 90;
+
+/**
+ * Initialize a new `Progress` bar test reporter.
+ *
+ * @api public
+ * @param {Runner} runner
+ * @param {Object} options
+ */
+function Progress(runner, options) {
+ Base.call(this, runner);
+
+ var self = this;
+ var width = Base.window.width * .50 | 0;
+ var total = runner.total;
+ var complete = 0;
+ var lastN = -1;
+
+ // default chars
+ options = options || {};
+ options.open = options.open || '[';
+ options.complete = options.complete || '▬';
+ options.incomplete = options.incomplete || Base.symbols.dot;
+ options.close = options.close || ']';
+ options.verbose = false;
+
+ // tests started
+ runner.on('start', function() {
+ console.log();
+ cursor.hide();
+ });
+
+ // tests complete
+ runner.on('test end', function() {
+ complete++;
+
+ var percent = complete / total;
+ var n = width * percent | 0;
+ var i = width - n;
+
+ if (n === lastN && !options.verbose) {
+ // Don't re-render the line if it hasn't changed
+ return;
+ }
+ lastN = n;
+
+ cursor.CR();
+ process.stdout.write('\u001b[J');
+ process.stdout.write(color('progress', ' ' + options.open));
+ process.stdout.write(Array(n).join(options.complete));
+ process.stdout.write(Array(i).join(options.incomplete));
+ process.stdout.write(color('progress', options.close));
+ if (options.verbose) {
+ process.stdout.write(color('progress', ' ' + complete + ' of ' + total));
+ }
+ });
+
+ // tests are complete, output some stats
+ // and the failures if any
+ runner.on('end', function() {
+ cursor.show();
+ console.log();
+ self.epilogue();
+ });
+}
+
+/**
+ * Inherit from `Base.prototype`.
+ */
+inherits(Progress, Base);
+
+}).call(this,require('_process'))
+},{"../utils":38,"./base":17,"_process":67}],30:[function(require,module,exports){
+/**
+ * Module dependencies.
+ */
+
+var Base = require('./base');
+var inherits = require('../utils').inherits;
+var color = Base.color;
+
+/**
+ * Expose `Spec`.
+ */
+
+exports = module.exports = Spec;
+
+/**
+ * Initialize a new `Spec` test reporter.
+ *
+ * @api public
+ * @param {Runner} runner
+ */
+function Spec(runner) {
+ Base.call(this, runner);
+
+ var self = this;
+ var indents = 0;
+ var n = 0;
+
+ function indent() {
+ return Array(indents).join(' ');
+ }
+
+ runner.on('start', function() {
+ console.log();
+ });
+
+ runner.on('suite', function(suite) {
+ ++indents;
+ console.log(color('suite', '%s%s'), indent(), suite.title);
+ });
+
+ runner.on('suite end', function() {
+ --indents;
+ if (indents === 1) {
+ console.log();
+ }
+ });
+
+ runner.on('pending', function(test) {
+ var fmt = indent() + color('pending', ' - %s');
+ console.log(fmt, test.title);
+ });
+
+ runner.on('pass', function(test) {
+ var fmt;
+ if (test.speed === 'fast') {
+ fmt = indent()
+ + color('checkmark', ' ' + Base.symbols.ok)
+ + color('pass', ' %s');
+ console.log(fmt, test.title);
+ } else {
+ fmt = indent()
+ + color('checkmark', ' ' + Base.symbols.ok)
+ + color('pass', ' %s')
+ + color(test.speed, ' (%dms)');
+ console.log(fmt, test.title, test.duration);
+ }
+ });
+
+ runner.on('fail', function(test) {
+ console.log(indent() + color('fail', ' %d) %s'), ++n, test.title);
+ });
+
+ runner.on('end', self.epilogue.bind(self));
+}
+
+/**
+ * Inherit from `Base.prototype`.
+ */
+inherits(Spec, Base);
+
+},{"../utils":38,"./base":17}],31:[function(require,module,exports){
+/**
+ * Module dependencies.
+ */
+
+var Base = require('./base');
+
+/**
+ * Expose `TAP`.
+ */
+
+exports = module.exports = TAP;
+
+/**
+ * Initialize a new `TAP` reporter.
+ *
+ * @api public
+ * @param {Runner} runner
+ */
+function TAP(runner) {
+ Base.call(this, runner);
+
+ var n = 1;
+ var passes = 0;
+ var failures = 0;
+
+ runner.on('start', function() {
+ var total = runner.grepTotal(runner.suite);
+ console.log('%d..%d', 1, total);
+ });
+
+ runner.on('test end', function() {
+ ++n;
+ });
+
+ runner.on('pending', function(test) {
+ console.log('ok %d %s # SKIP -', n, title(test));
+ });
+
+ runner.on('pass', function(test) {
+ passes++;
+ console.log('ok %d %s', n, title(test));
+ });
+
+ runner.on('fail', function(test, err) {
+ failures++;
+ console.log('not ok %d %s', n, title(test));
+ if (err.stack) {
+ console.log(err.stack.replace(/^/gm, ' '));
+ }
+ });
+
+ runner.on('end', function() {
+ console.log('# tests ' + (passes + failures));
+ console.log('# pass ' + passes);
+ console.log('# fail ' + failures);
+ });
+}
+
+/**
+ * Return a TAP-safe title of `test`
+ *
+ * @api private
+ * @param {Object} test
+ * @return {String}
+ */
+function title(test) {
+ return test.fullTitle().replace(/#/g, '');
+}
+
+},{"./base":17}],32:[function(require,module,exports){
+(function (process,global){
+/**
+ * Module dependencies.
+ */
+
+var Base = require('./base');
+var utils = require('../utils');
+var inherits = utils.inherits;
+var fs = require('fs');
+var escape = utils.escape;
+var mkdirp = require('mkdirp');
+var path = require('path');
+
+/**
+ * Save timer references to avoid Sinon interfering (see GH-237).
+ */
+
+/* eslint-disable no-unused-vars, no-native-reassign */
+var Date = global.Date;
+var setTimeout = global.setTimeout;
+var setInterval = global.setInterval;
+var clearTimeout = global.clearTimeout;
+var clearInterval = global.clearInterval;
+/* eslint-enable no-unused-vars, no-native-reassign */
+
+/**
+ * Expose `XUnit`.
+ */
+
+exports = module.exports = XUnit;
+
+/**
+ * Initialize a new `XUnit` reporter.
+ *
+ * @api public
+ * @param {Runner} runner
+ */
+function XUnit(runner, options) {
+ Base.call(this, runner);
+
+ var stats = this.stats;
+ var tests = [];
+ var self = this;
+
+ if (options.reporterOptions && options.reporterOptions.output) {
+ if (!fs.createWriteStream) {
+ throw new Error('file output not supported in browser');
+ }
+ mkdirp.sync(path.dirname(options.reporterOptions.output));
+ self.fileStream = fs.createWriteStream(options.reporterOptions.output);
+ }
+
+ runner.on('pending', function(test) {
+ tests.push(test);
+ });
+
+ runner.on('pass', function(test) {
+ tests.push(test);
+ });
+
+ runner.on('fail', function(test) {
+ tests.push(test);
+ });
+
+ runner.on('end', function() {
+ self.write(tag('testsuite', {
+ name: 'Mocha Tests',
+ tests: stats.tests,
+ failures: stats.failures,
+ errors: stats.failures,
+ skipped: stats.tests - stats.failures - stats.passes,
+ timestamp: (new Date()).toUTCString(),
+ time: (stats.duration / 1000) || 0
+ }, false));
+
+ tests.forEach(function(t) {
+ self.test(t);
+ });
+
+ self.write('</testsuite>');
+ });
+}
+
+/**
+ * Inherit from `Base.prototype`.
+ */
+inherits(XUnit, Base);
+
+/**
+ * Override done to close the stream (if it's a file).
+ *
+ * @param failures
+ * @param {Function} fn
+ */
+XUnit.prototype.done = function(failures, fn) {
+ if (this.fileStream) {
+ this.fileStream.end(function() {
+ fn(failures);
+ });
+ } else {
+ fn(failures);
+ }
+};
+
+/**
+ * Write out the given line.
+ *
+ * @param {string} line
+ */
+XUnit.prototype.write = function(line) {
+ if (this.fileStream) {
+ this.fileStream.write(line + '\n');
+ } else if (typeof process === 'object' && process.stdout) {
+ process.stdout.write(line + '\n');
+ } else {
+ console.log(line);
+ }
+};
+
+/**
+ * Output tag for the given `test.`
+ *
+ * @param {Test} test
+ */
+XUnit.prototype.test = function(test) {
+ var attrs = {
+ classname: test.parent.fullTitle(),
+ name: test.title,
+ time: (test.duration / 1000) || 0
+ };
+
+ if (test.state === 'failed') {
+ var err = test.err;
+ this.write(tag('testcase', attrs, false, tag('failure', {}, false, escape(err.message) + '\n' + escape(err.stack))));
+ } else if (test.isPending()) {
+ this.write(tag('testcase', attrs, false, tag('skipped', {}, true)));
+ } else {
+ this.write(tag('testcase', attrs, true));
+ }
+};
+
+/**
+ * HTML tag helper.
+ *
+ * @param name
+ * @param attrs
+ * @param close
+ * @param content
+ * @return {string}
+ */
+function tag(name, attrs, close, content) {
+ var end = close ? '/>' : '>';
+ var pairs = [];
+ var tag;
+
+ for (var key in attrs) {
+ if (Object.prototype.hasOwnProperty.call(attrs, key)) {
+ pairs.push(key + '="' + escape(attrs[key]) + '"');
+ }
+ }
+
+ tag = '<' + name + (pairs.length ? ' ' + pairs.join(' ') : '') + end;
+ if (content) {
+ tag += content + '</' + name + end;
+ }
+ return tag;
+}
+
+}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+},{"../utils":38,"./base":17,"_process":67,"fs":42,"mkdirp":64,"path":42}],33:[function(require,module,exports){
+(function (global){
+/**
+ * Module dependencies.
+ */
+
+var EventEmitter = require('events').EventEmitter;
+var JSON = require('json3');
+var Pending = require('./pending');
+var debug = require('debug')('mocha:runnable');
+var milliseconds = require('./ms');
+var utils = require('./utils');
+var create = require('lodash.create');
+
+/**
+ * Save timer references to avoid Sinon interfering (see GH-237).
+ */
+
+/* eslint-disable no-unused-vars, no-native-reassign */
+var Date = global.Date;
+var setTimeout = global.setTimeout;
+var setInterval = global.setInterval;
+var clearTimeout = global.clearTimeout;
+var clearInterval = global.clearInterval;
+/* eslint-enable no-unused-vars, no-native-reassign */
+
+/**
+ * Object#toString().
+ */
+
+var toString = Object.prototype.toString;
+
+/**
+ * Expose `Runnable`.
+ */
+
+module.exports = Runnable;
+
+/**
+ * Initialize a new `Runnable` with the given `title` and callback `fn`.
+ *
+ * @param {String} title
+ * @param {Function} fn
+ * @api private
+ * @param {string} title
+ * @param {Function} fn
+ */
+function Runnable(title, fn) {
+ this.title = title;
+ this.fn = fn;
+ this.body = (fn || '').toString();
+ this.async = fn && fn.length;
+ this.sync = !this.async;
+ this._timeout = 2000;
+ this._slow = 75;
+ this._enableTimeouts = true;
+ this.timedOut = false;
+ this._trace = new Error('done() called multiple times');
+ this._retries = -1;
+ this._currentRetry = 0;
+ this.pending = false;
+}
+
+/**
+ * Inherit from `EventEmitter.prototype`.
+ */
+Runnable.prototype = create(EventEmitter.prototype, {
+ constructor: Runnable
+});
+
+/**
+ * Set & get timeout `ms`.
+ *
+ * @api private
+ * @param {number|string} ms
+ * @return {Runnable|number} ms or Runnable instance.
+ */
+Runnable.prototype.timeout = function(ms) {
+ if (!arguments.length) {
+ return this._timeout;
+ }
+ // see #1652 for reasoning
+ if (ms === 0 || ms > Math.pow(2, 31)) {
+ this._enableTimeouts = false;
+ }
+ if (typeof ms === 'string') {
+ ms = milliseconds(ms);
+ }
+ debug('timeout %d', ms);
+ this._timeout = ms;
+ if (this.timer) {
+ this.resetTimeout();
+ }
+ return this;
+};
+
+/**
+ * Set & get slow `ms`.
+ *
+ * @api private
+ * @param {number|string} ms
+ * @return {Runnable|number} ms or Runnable instance.
+ */
+Runnable.prototype.slow = function(ms) {
+ if (typeof ms === 'undefined') {
+ return this._slow;
+ }
+ if (typeof ms === 'string') {
+ ms = milliseconds(ms);
+ }
+ debug('timeout %d', ms);
+ this._slow = ms;
+ return this;
+};
+
+/**
+ * Set and get whether timeout is `enabled`.
+ *
+ * @api private
+ * @param {boolean} enabled
+ * @return {Runnable|boolean} enabled or Runnable instance.
+ */
+Runnable.prototype.enableTimeouts = function(enabled) {
+ if (!arguments.length) {
+ return this._enableTimeouts;
+ }
+ debug('enableTimeouts %s', enabled);
+ this._enableTimeouts = enabled;
+ return this;
+};
+
+/**
+ * Halt and mark as pending.
+ *
+ * @api public
+ */
+Runnable.prototype.skip = function() {
+ throw new Pending('sync skip');
+};
+
+/**
+ * Check if this runnable or its parent suite is marked as pending.
+ *
+ * @api private
+ */
+Runnable.prototype.isPending = function() {
+ return this.pending || (this.parent && this.parent.isPending());
+};
+
+/**
+ * Set number of retries.
+ *
+ * @api private
+ */
+Runnable.prototype.retries = function(n) {
+ if (!arguments.length) {
+ return this._retries;
+ }
+ this._retries = n;
+};
+
+/**
+ * Get current retry
+ *
+ * @api private
+ */
+Runnable.prototype.currentRetry = function(n) {
+ if (!arguments.length) {
+ return this._currentRetry;
+ }
+ this._currentRetry = n;
+};
+
+/**
+ * Return the full title generated by recursively concatenating the parent's
+ * full title.
+ *
+ * @api public
+ * @return {string}
+ */
+Runnable.prototype.fullTitle = function() {
+ return this.parent.fullTitle() + ' ' + this.title;
+};
+
+/**
+ * Clear the timeout.
+ *
+ * @api private
+ */
+Runnable.prototype.clearTimeout = function() {
+ clearTimeout(this.timer);
+};
+
+/**
+ * Inspect the runnable void of private properties.
+ *
+ * @api private
+ * @return {string}
+ */
+Runnable.prototype.inspect = function() {
+ return JSON.stringify(this, function(key, val) {
+ if (key[0] === '_') {
+ return;
+ }
+ if (key === 'parent') {
+ return '#<Suite>';
+ }
+ if (key === 'ctx') {
+ return '#<Context>';
+ }
+ return val;
+ }, 2);
+};
+
+/**
+ * Reset the timeout.
+ *
+ * @api private
+ */
+Runnable.prototype.resetTimeout = function() {
+ var self = this;
+ var ms = this.timeout() || 1e9;
+
+ if (!this._enableTimeouts) {
+ return;
+ }
+ this.clearTimeout();
+ this.timer = setTimeout(function() {
+ if (!self._enableTimeouts) {
+ return;
+ }
+ self.callback(new Error('timeout of ' + ms + 'ms exceeded. Ensure the done() callback is being called in this test.'));
+ self.timedOut = true;
+ }, ms);
+};
+
+/**
+ * Whitelist a list of globals for this test run.
+ *
+ * @api private
+ * @param {string[]} globals
+ */
+Runnable.prototype.globals = function(globals) {
+ if (!arguments.length) {
+ return this._allowedGlobals;
+ }
+ this._allowedGlobals = globals;
+};
+
+/**
+ * Run the test and invoke `fn(err)`.
+ *
+ * @param {Function} fn
+ * @api private
+ */
+Runnable.prototype.run = function(fn) {
+ var self = this;
+ var start = new Date();
+ var ctx = this.ctx;
+ var finished;
+ var emitted;
+
+ // Sometimes the ctx exists, but it is not runnable
+ if (ctx && ctx.runnable) {
+ ctx.runnable(this);
+ }
+
+ // called multiple times
+ function multiple(err) {
+ if (emitted) {
+ return;
+ }
+ emitted = true;
+ self.emit('error', err || new Error('done() called multiple times; stacktrace may be inaccurate'));
+ }
+
+ // finished
+ function done(err) {
+ var ms = self.timeout();
+ if (self.timedOut) {
+ return;
+ }
+ if (finished) {
+ return multiple(err || self._trace);
+ }
+
+ self.clearTimeout();
+ self.duration = new Date() - start;
+ finished = true;
+ if (!err && self.duration > ms && self._enableTimeouts) {
+ err = new Error('timeout of ' + ms + 'ms exceeded. Ensure the done() callback is being called in this test.');
+ }
+ fn(err);
+ }
+
+ // for .resetTimeout()
+ this.callback = done;
+
+ // explicit async with `done` argument
+ if (this.async) {
+ this.resetTimeout();
+
+ // allows skip() to be used in an explicit async context
+ this.skip = function asyncSkip() {
+ done(new Pending('async skip call'));
+ // halt execution. the Runnable will be marked pending
+ // by the previous call, and the uncaught handler will ignore
+ // the failure.
+ throw new Pending('async skip; aborting execution');
+ };
+
+ if (this.allowUncaught) {
+ return callFnAsync(this.fn);
+ }
+ try {
+ callFnAsync(this.fn);
+ } catch (err) {
+ done(utils.getError(err));
+ }
+ return;
+ }
+
+ if (this.allowUncaught) {
+ callFn(this.fn);
+ done();
+ return;
+ }
+
+ // sync or promise-returning
+ try {
+ if (this.isPending()) {
+ done();
+ } else {
+ callFn(this.fn);
+ }
+ } catch (err) {
+ done(utils.getError(err));
+ }
+
+ function callFn(fn) {
+ var result = fn.call(ctx);
+ if (result && typeof result.then === 'function') {
+ self.resetTimeout();
+ result
+ .then(function() {
+ done();
+ // Return null so libraries like bluebird do not warn about
+ // subsequently constructed Promises.
+ return null;
+ },
+ function(reason) {
+ done(reason || new Error('Promise rejected with no or falsy reason'));
+ });
+ } else {
+ if (self.asyncOnly) {
+ return done(new Error('--async-only option in use without declaring `done()` or returning a promise'));
+ }
+
+ done();
+ }
+ }
+
+ function callFnAsync(fn) {
+ var result = fn.call(ctx, function(err) {
+ if (err instanceof Error || toString.call(err) === '[object Error]') {
+ return done(err);
+ }
+ if (err) {
+ if (Object.prototype.toString.call(err) === '[object Object]') {
+ return done(new Error('done() invoked with non-Error: '
+ + JSON.stringify(err)));
+ }
+ return done(new Error('done() invoked with non-Error: ' + err));
+ }
+ if (result && utils.isPromise(result)) {
+ return done(new Error('Resolution method is overspecified. Specify a callback *or* return a Promise; not both.'));
+ }
+
+ done();
+ });
+ }
+};
+
+}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+},{"./ms":15,"./pending":16,"./utils":38,"debug":2,"events":3,"json3":54,"lodash.create":60}],34:[function(require,module,exports){
+(function (process,global){
+/**
+ * Module dependencies.
+ */
+
+var EventEmitter = require('events').EventEmitter;
+var Pending = require('./pending');
+var utils = require('./utils');
+var inherits = utils.inherits;
+var debug = require('debug')('mocha:runner');
+var Runnable = require('./runnable');
+var filter = utils.filter;
+var indexOf = utils.indexOf;
+var some = utils.some;
+var keys = utils.keys;
+var stackFilter = utils.stackTraceFilter();
+var stringify = utils.stringify;
+var type = utils.type;
+var undefinedError = utils.undefinedError;
+var isArray = utils.isArray;
+
+/**
+ * Non-enumerable globals.
+ */
+
+var globals = [
+ 'setTimeout',
+ 'clearTimeout',
+ 'setInterval',
+ 'clearInterval',
+ 'XMLHttpRequest',
+ 'Date',
+ 'setImmediate',
+ 'clearImmediate'
+];
+
+/**
+ * Expose `Runner`.
+ */
+
+module.exports = Runner;
+
+/**
+ * Initialize a `Runner` for the given `suite`.
+ *
+ * Events:
+ *
+ * - `start` execution started
+ * - `end` execution complete
+ * - `suite` (suite) test suite execution started
+ * - `suite end` (suite) all tests (and sub-suites) have finished
+ * - `test` (test) test execution started
+ * - `test end` (test) test completed
+ * - `hook` (hook) hook execution started
+ * - `hook end` (hook) hook complete
+ * - `pass` (test) test passed
+ * - `fail` (test, err) test failed
+ * - `pending` (test) test pending
+ *
+ * @api public
+ * @param {Suite} suite Root suite
+ * @param {boolean} [delay] Whether or not to delay execution of root suite
+ * until ready.
+ */
+function Runner(suite, delay) {
+ var self = this;
+ this._globals = [];
+ this._abort = false;
+ this._delay = delay;
+ this.suite = suite;
+ this.started = false;
+ this.total = suite.total();
+ this.failures = 0;
+ this.on('test end', function(test) {
+ self.checkGlobals(test);
+ });
+ this.on('hook end', function(hook) {
+ self.checkGlobals(hook);
+ });
+ this._defaultGrep = /.*/;
+ this.grep(this._defaultGrep);
+ this.globals(this.globalProps().concat(extraGlobals()));
+}
+
+/**
+ * Wrapper for setImmediate, process.nextTick, or browser polyfill.
+ *
+ * @param {Function} fn
+ * @api private
+ */
+Runner.immediately = global.setImmediate || process.nextTick;
+
+/**
+ * Inherit from `EventEmitter.prototype`.
+ */
+inherits(Runner, EventEmitter);
+
+/**
+ * Run tests with full titles matching `re`. Updates runner.total
+ * with number of tests matched.
+ *
+ * @param {RegExp} re
+ * @param {Boolean} invert
+ * @return {Runner} for chaining
+ * @api public
+ * @param {RegExp} re
+ * @param {boolean} invert
+ * @return {Runner} Runner instance.
+ */
+Runner.prototype.grep = function(re, invert) {
+ debug('grep %s', re);
+ this._grep = re;
+ this._invert = invert;
+ this.total = this.grepTotal(this.suite);
+ return this;
+};
+
+/**
+ * Returns the number of tests matching the grep search for the
+ * given suite.
+ *
+ * @param {Suite} suite
+ * @return {Number}
+ * @api public
+ * @param {Suite} suite
+ * @return {number}
+ */
+Runner.prototype.grepTotal = function(suite) {
+ var self = this;
+ var total = 0;
+
+ suite.eachTest(function(test) {
+ var match = self._grep.test(test.fullTitle());
+ if (self._invert) {
+ match = !match;
+ }
+ if (match) {
+ total++;
+ }
+ });
+
+ return total;
+};
+
+/**
+ * Return a list of global properties.
+ *
+ * @return {Array}
+ * @api private
+ */
+Runner.prototype.globalProps = function() {
+ var props = keys(global);
+
+ // non-enumerables
+ for (var i = 0; i < globals.length; ++i) {
+ if (~indexOf(props, globals[i])) {
+ continue;
+ }
+ props.push(globals[i]);
+ }
+
+ return props;
+};
+
+/**
+ * Allow the given `arr` of globals.
+ *
+ * @param {Array} arr
+ * @return {Runner} for chaining
+ * @api public
+ * @param {Array} arr
+ * @return {Runner} Runner instance.
+ */
+Runner.prototype.globals = function(arr) {
+ if (!arguments.length) {
+ return this._globals;
+ }
+ debug('globals %j', arr);
+ this._globals = this._globals.concat(arr);
+ return this;
+};
+
+/**
+ * Check for global variable leaks.
+ *
+ * @api private
+ */
+Runner.prototype.checkGlobals = function(test) {
+ if (this.ignoreLeaks) {
+ return;
+ }
+ var ok = this._globals;
+
+ var globals = this.globalProps();
+ var leaks;
+
+ if (test) {
+ ok = ok.concat(test._allowedGlobals || []);
+ }
+
+ if (this.prevGlobalsLength === globals.length) {
+ return;
+ }
+ this.prevGlobalsLength = globals.length;
+
+ leaks = filterLeaks(ok, globals);
+ this._globals = this._globals.concat(leaks);
+
+ if (leaks.length > 1) {
+ this.fail(test, new Error('global leaks detected: ' + leaks.join(', ') + ''));
+ } else if (leaks.length) {
+ this.fail(test, new Error('global leak detected: ' + leaks[0]));
+ }
+};
+
+/**
+ * Fail the given `test`.
+ *
+ * @api private
+ * @param {Test} test
+ * @param {Error} err
+ */
+Runner.prototype.fail = function(test, err) {
+ if (test.isPending()) {
+ return;
+ }
+
+ ++this.failures;
+ test.state = 'failed';
+
+ if (!(err instanceof Error || err && typeof err.message === 'string')) {
+ err = new Error('the ' + type(err) + ' ' + stringify(err) + ' was thrown, throw an Error :)');
+ }
+
+ err.stack = (this.fullStackTrace || !err.stack)
+ ? err.stack
+ : stackFilter(err.stack);
+
+ this.emit('fail', test, err);
+};
+
+/**
+ * Fail the given `hook` with `err`.
+ *
+ * Hook failures work in the following pattern:
+ * - If bail, then exit
+ * - Failed `before` hook skips all tests in a suite and subsuites,
+ * but jumps to corresponding `after` hook
+ * - Failed `before each` hook skips remaining tests in a
+ * suite and jumps to corresponding `after each` hook,
+ * which is run only once
+ * - Failed `after` hook does not alter
+ * execution order
+ * - Failed `after each` hook skips remaining tests in a
+ * suite and subsuites, but executes other `after each`
+ * hooks
+ *
+ * @api private
+ * @param {Hook} hook
+ * @param {Error} err
+ */
+Runner.prototype.failHook = function(hook, err) {
+ if (hook.ctx && hook.ctx.currentTest) {
+ hook.originalTitle = hook.originalTitle || hook.title;
+ hook.title = hook.originalTitle + ' for "' + hook.ctx.currentTest.title + '"';
+ }
+
+ this.fail(hook, err);
+ if (this.suite.bail()) {
+ this.emit('end');
+ }
+};
+
+/**
+ * Run hook `name` callbacks and then invoke `fn()`.
+ *
+ * @api private
+ * @param {string} name
+ * @param {Function} fn
+ */
+
+Runner.prototype.hook = function(name, fn) {
+ var suite = this.suite;
+ var hooks = suite['_' + name];
+ var self = this;
+
+ function next(i) {
+ var hook = hooks[i];
+ if (!hook) {
+ return fn();
+ }
+ self.currentRunnable = hook;
+
+ hook.ctx.currentTest = self.test;
+
+ self.emit('hook', hook);
+
+ if (!hook.listeners('error').length) {
+ hook.on('error', function(err) {
+ self.failHook(hook, err);
+ });
+ }
+
+ hook.run(function(err) {
+ var testError = hook.error();
+ if (testError) {
+ self.fail(self.test, testError);
+ }
+ if (err) {
+ if (err instanceof Pending) {
+ if (name === 'beforeEach' || name === 'afterEach') {
+ self.test.pending = true;
+ } else {
+ utils.forEach(suite.tests, function(test) {
+ test.pending = true;
+ });
+ // a pending hook won't be executed twice.
+ hook.pending = true;
+ }
+ } else {
+ self.failHook(hook, err);
+
+ // stop executing hooks, notify callee of hook err
+ return fn(err);
+ }
+ }
+ self.emit('hook end', hook);
+ delete hook.ctx.currentTest;
+ next(++i);
+ });
+ }
+
+ Runner.immediately(function() {
+ next(0);
+ });
+};
+
+/**
+ * Run hook `name` for the given array of `suites`
+ * in order, and callback `fn(err, errSuite)`.
+ *
+ * @api private
+ * @param {string} name
+ * @param {Array} suites
+ * @param {Function} fn
+ */
+Runner.prototype.hooks = function(name, suites, fn) {
+ var self = this;
+ var orig = this.suite;
+
+ function next(suite) {
+ self.suite = suite;
+
+ if (!suite) {
+ self.suite = orig;
+ return fn();
+ }
+
+ self.hook(name, function(err) {
+ if (err) {
+ var errSuite = self.suite;
+ self.suite = orig;
+ return fn(err, errSuite);
+ }
+
+ next(suites.pop());
+ });
+ }
+
+ next(suites.pop());
+};
+
+/**
+ * Run hooks from the top level down.
+ *
+ * @param {String} name
+ * @param {Function} fn
+ * @api private
+ */
+Runner.prototype.hookUp = function(name, fn) {
+ var suites = [this.suite].concat(this.parents()).reverse();
+ this.hooks(name, suites, fn);
+};
+
+/**
+ * Run hooks from the bottom up.
+ *
+ * @param {String} name
+ * @param {Function} fn
+ * @api private
+ */
+Runner.prototype.hookDown = function(name, fn) {
+ var suites = [this.suite].concat(this.parents());
+ this.hooks(name, suites, fn);
+};
+
+/**
+ * Return an array of parent Suites from
+ * closest to furthest.
+ *
+ * @return {Array}
+ * @api private
+ */
+Runner.prototype.parents = function() {
+ var suite = this.suite;
+ var suites = [];
+ while (suite.parent) {
+ suite = suite.parent;
+ suites.push(suite);
+ }
+ return suites;
+};
+
+/**
+ * Run the current test and callback `fn(err)`.
+ *
+ * @param {Function} fn
+ * @api private
+ */
+Runner.prototype.runTest = function(fn) {
+ var self = this;
+ var test = this.test;
+
+ if (!test) {
+ return;
+ }
+ if (this.asyncOnly) {
+ test.asyncOnly = true;
+ }
+
+ if (this.allowUncaught) {
+ test.allowUncaught = true;
+ return test.run(fn);
+ }
+ try {
+ test.on('error', function(err) {
+ self.fail(test, err);
+ });
+ test.run(fn);
+ } catch (err) {
+ fn(err);
+ }
+};
+
+/**
+ * Run tests in the given `suite` and invoke the callback `fn()` when complete.
+ *
+ * @api private
+ * @param {Suite} suite
+ * @param {Function} fn
+ */
+Runner.prototype.runTests = function(suite, fn) {
+ var self = this;
+ var tests = suite.tests.slice();
+ var test;
+
+ function hookErr(_, errSuite, after) {
+ // before/after Each hook for errSuite failed:
+ var orig = self.suite;
+
+ // for failed 'after each' hook start from errSuite parent,
+ // otherwise start from errSuite itself
+ self.suite = after ? errSuite.parent : errSuite;
+
+ if (self.suite) {
+ // call hookUp afterEach
+ self.hookUp('afterEach', function(err2, errSuite2) {
+ self.suite = orig;
+ // some hooks may fail even now
+ if (err2) {
+ return hookErr(err2, errSuite2, true);
+ }
+ // report error suite
+ fn(errSuite);
+ });
+ } else {
+ // there is no need calling other 'after each' hooks
+ self.suite = orig;
+ fn(errSuite);
+ }
+ }
+
+ function next(err, errSuite) {
+ // if we bail after first err
+ if (self.failures && suite._bail) {
+ return fn();
+ }
+
+ if (self._abort) {
+ return fn();
+ }
+
+ if (err) {
+ return hookErr(err, errSuite, true);
+ }
+
+ // next test
+ test = tests.shift();
+
+ // all done
+ if (!test) {
+ return fn();
+ }
+
+ // grep
+ var match = self._grep.test(test.fullTitle());
+ if (self._invert) {
+ match = !match;
+ }
+ if (!match) {
+ // Run immediately only if we have defined a grep. When we
+ // define a grep — It can cause maximum callstack error if
+ // the grep is doing a large recursive loop by neglecting
+ // all tests. The run immediately function also comes with
+ // a performance cost. So we don't want to run immediately
+ // if we run the whole test suite, because running the whole
+ // test suite don't do any immediate recursive loops. Thus,
+ // allowing a JS runtime to breathe.
+ if (self._grep !== self._defaultGrep) {
+ Runner.immediately(next);
+ } else {
+ next();
+ }
+ return;
+ }
+
+ if (test.isPending()) {
+ self.emit('pending', test);
+ self.emit('test end', test);
+ return next();
+ }
+
+ // execute test and hook(s)
+ self.emit('test', self.test = test);
+ self.hookDown('beforeEach', function(err, errSuite) {
+ if (test.isPending()) {
+ self.emit('pending', test);
+ self.emit('test end', test);
+ return next();
+ }
+ if (err) {
+ return hookErr(err, errSuite, false);
+ }
+ self.currentRunnable = self.test;
+ self.runTest(function(err) {
+ test = self.test;
+ if (err) {
+ var retry = test.currentRetry();
+ if (err instanceof Pending) {
+ test.pending = true;
+ self.emit('pending', test);
+ } else if (retry < test.retries()) {
+ var clonedTest = test.clone();
+ clonedTest.currentRetry(retry + 1);
+ tests.unshift(clonedTest);
+
+ // Early return + hook trigger so that it doesn't
+ // increment the count wrong
+ return self.hookUp('afterEach', next);
+ } else {
+ self.fail(test, err);
+ }
+ self.emit('test end', test);
+
+ if (err instanceof Pending) {
+ return next();
+ }
+
+ return self.hookUp('afterEach', next);
+ }
+
+ test.state = 'passed';
+ self.emit('pass', test);
+ self.emit('test end', test);
+ self.hookUp('afterEach', next);
+ });
+ });
+ }
+
+ this.next = next;
+ this.hookErr = hookErr;
+ next();
+};
+
+/**
+ * Run the given `suite` and invoke the callback `fn()` when complete.
+ *
+ * @api private
+ * @param {Suite} suite
+ * @param {Function} fn
+ */
+Runner.prototype.runSuite = function(suite, fn) {
+ var i = 0;
+ var self = this;
+ var total = this.grepTotal(suite);
+ var afterAllHookCalled = false;
+
+ debug('run suite %s', suite.fullTitle());
+
+ if (!total || (self.failures && suite._bail)) {
+ return fn();
+ }
+
+ this.emit('suite', this.suite = suite);
+
+ function next(errSuite) {
+ if (errSuite) {
+ // current suite failed on a hook from errSuite
+ if (errSuite === suite) {
+ // if errSuite is current suite
+ // continue to the next sibling suite
+ return done();
+ }
+ // errSuite is among the parents of current suite
+ // stop execution of errSuite and all sub-suites
+ return done(errSuite);
+ }
+
+ if (self._abort) {
+ return done();
+ }
+
+ var curr = suite.suites[i++];
+ if (!curr) {
+ return done();
+ }
+
+ // Avoid grep neglecting large number of tests causing a
+ // huge recursive loop and thus a maximum call stack error.
+ // See comment in `this.runTests()` for more information.
+ if (self._grep !== self._defaultGrep) {
+ Runner.immediately(function() {
+ self.runSuite(curr, next);
+ });
+ } else {
+ self.runSuite(curr, next);
+ }
+ }
+
+ function done(errSuite) {
+ self.suite = suite;
+ self.nextSuite = next;
+
+ if (afterAllHookCalled) {
+ fn(errSuite);
+ } else {
+ // mark that the afterAll block has been called once
+ // and so can be skipped if there is an error in it.
+ afterAllHookCalled = true;
+
+ // remove reference to test
+ delete self.test;
+
+ self.hook('afterAll', function() {
+ self.emit('suite end', suite);
+ fn(errSuite);
+ });
+ }
+ }
+
+ this.nextSuite = next;
+
+ this.hook('beforeAll', function(err) {
+ if (err) {
+ return done();
+ }
+ self.runTests(suite, next);
+ });
+};
+
+/**
+ * Handle uncaught exceptions.
+ *
+ * @param {Error} err
+ * @api private
+ */
+Runner.prototype.uncaught = function(err) {
+ if (err) {
+ debug('uncaught exception %s', err !== function() {
+ return this;
+ }.call(err) ? err : (err.message || err));
+ } else {
+ debug('uncaught undefined exception');
+ err = undefinedError();
+ }
+ err.uncaught = true;
+
+ var runnable = this.currentRunnable;
+
+ if (!runnable) {
+ runnable = new Runnable('Uncaught error outside test suite');
+ runnable.parent = this.suite;
+
+ if (this.started) {
+ this.fail(runnable, err);
+ } else {
+ // Can't recover from this failure
+ this.emit('start');
+ this.fail(runnable, err);
+ this.emit('end');
+ }
+
+ return;
+ }
+
+ runnable.clearTimeout();
+
+ // Ignore errors if complete or pending
+ if (runnable.state || runnable.isPending()) {
+ return;
+ }
+ this.fail(runnable, err);
+
+ // recover from test
+ if (runnable.type === 'test') {
+ this.emit('test end', runnable);
+ this.hookUp('afterEach', this.next);
+ return;
+ }
+
+ // recover from hooks
+ if (runnable.type === 'hook') {
+ var errSuite = this.suite;
+ // if hook failure is in afterEach block
+ if (runnable.fullTitle().indexOf('after each') > -1) {
+ return this.hookErr(err, errSuite, true);
+ }
+ // if hook failure is in beforeEach block
+ if (runnable.fullTitle().indexOf('before each') > -1) {
+ return this.hookErr(err, errSuite, false);
+ }
+ // if hook failure is in after or before blocks
+ return this.nextSuite(errSuite);
+ }
+
+ // bail
+ this.emit('end');
+};
+
+/**
+ * Cleans up the references to all the deferred functions
+ * (before/after/beforeEach/afterEach) and tests of a Suite.
+ * These must be deleted otherwise a memory leak can happen,
+ * as those functions may reference variables from closures,
+ * thus those variables can never be garbage collected as long
+ * as the deferred functions exist.
+ *
+ * @param {Suite} suite
+ */
+function cleanSuiteReferences(suite) {
+ function cleanArrReferences(arr) {
+ for (var i = 0; i < arr.length; i++) {
+ delete arr[i].fn;
+ }
+ }
+
+ if (isArray(suite._beforeAll)) {
+ cleanArrReferences(suite._beforeAll);
+ }
+
+ if (isArray(suite._beforeEach)) {
+ cleanArrReferences(suite._beforeEach);
+ }
+
+ if (isArray(suite._afterAll)) {
+ cleanArrReferences(suite._afterAll);
+ }
+
+ if (isArray(suite._afterEach)) {
+ cleanArrReferences(suite._afterEach);
+ }
+
+ for (var i = 0; i < suite.tests.length; i++) {
+ delete suite.tests[i].fn;
+ }
+}
+
+/**
+ * Run the root suite and invoke `fn(failures)`
+ * on completion.
+ *
+ * @param {Function} fn
+ * @return {Runner} for chaining
+ * @api public
+ * @param {Function} fn
+ * @return {Runner} Runner instance.
+ */
+Runner.prototype.run = function(fn) {
+ var self = this;
+ var rootSuite = this.suite;
+
+ // If there is an `only` filter
+ if (this.hasOnly) {
+ filterOnly(rootSuite);
+ }
+
+ fn = fn || function() {};
+
+ function uncaught(err) {
+ self.uncaught(err);
+ }
+
+ function start() {
+ self.started = true;
+ self.emit('start');
+ self.runSuite(rootSuite, function() {
+ debug('finished running');
+ self.emit('end');
+ });
+ }
+
+ debug('start');
+
+ // references cleanup to avoid memory leaks
+ this.on('suite end', cleanSuiteReferences);
+
+ // callback
+ this.on('end', function() {
+ debug('end');
+ process.removeListener('uncaughtException', uncaught);
+ fn(self.failures);
+ });
+
+ // uncaught exception
+ process.on('uncaughtException', uncaught);
+
+ if (this._delay) {
+ // for reporters, I guess.
+ // might be nice to debounce some dots while we wait.
+ this.emit('waiting', rootSuite);
+ rootSuite.once('run', start);
+ } else {
+ start();
+ }
+
+ return this;
+};
+
+/**
+ * Cleanly abort execution.
+ *
+ * @api public
+ * @return {Runner} Runner instance.
+ */
+Runner.prototype.abort = function() {
+ debug('aborting');
+ this._abort = true;
+
+ return this;
+};
+
+/**
+ * Filter suites based on `isOnly` logic.
+ *
+ * @param {Array} suite
+ * @returns {Boolean}
+ * @api private
+ */
+function filterOnly(suite) {
+ if (suite._onlyTests.length) {
+ // If the suite contains `only` tests, run those and ignore any nested suites.
+ suite.tests = suite._onlyTests;
+ suite.suites = [];
+ } else {
+ // Otherwise, do not run any of the tests in this suite.
+ suite.tests = [];
+ utils.forEach(suite._onlySuites, function(onlySuite) {
+ // If there are other `only` tests/suites nested in the current `only` suite, then filter that `only` suite.
+ // Otherwise, all of the tests on this `only` suite should be run, so don't filter it.
+ if (hasOnly(onlySuite)) {
+ filterOnly(onlySuite);
+ }
+ });
+ // Run the `only` suites, as well as any other suites that have `only` tests/suites as descendants.
+ suite.suites = filter(suite.suites, function(childSuite) {
+ return indexOf(suite._onlySuites, childSuite) !== -1 || filterOnly(childSuite);
+ });
+ }
+ // Keep the suite only if there is something to run
+ return suite.tests.length || suite.suites.length;
+}
+
+/**
+ * Determines whether a suite has an `only` test or suite as a descendant.
+ *
+ * @param {Array} suite
+ * @returns {Boolean}
+ * @api private
+ */
+function hasOnly(suite) {
+ return suite._onlyTests.length || suite._onlySuites.length || some(suite.suites, hasOnly);
+}
+
+/**
+ * Filter leaks with the given globals flagged as `ok`.
+ *
+ * @api private
+ * @param {Array} ok
+ * @param {Array} globals
+ * @return {Array}
+ */
+function filterLeaks(ok, globals) {
+ return filter(globals, function(key) {
+ // Firefox and Chrome exposes iframes as index inside the window object
+ if (/^\d+/.test(key)) {
+ return false;
+ }
+
+ // in firefox
+ // if runner runs in an iframe, this iframe's window.getInterface method
+ // not init at first it is assigned in some seconds
+ if (global.navigator && (/^getInterface/).test(key)) {
+ return false;
+ }
+
+ // an iframe could be approached by window[iframeIndex]
+ // in ie6,7,8 and opera, iframeIndex is enumerable, this could cause leak
+ if (global.navigator && (/^\d+/).test(key)) {
+ return false;
+ }
+
+ // Opera and IE expose global variables for HTML element IDs (issue #243)
+ if (/^mocha-/.test(key)) {
+ return false;
+ }
+
+ var matched = filter(ok, function(ok) {
+ if (~ok.indexOf('*')) {
+ return key.indexOf(ok.split('*')[0]) === 0;
+ }
+ return key === ok;
+ });
+ return !matched.length && (!global.navigator || key !== 'onerror');
+ });
+}
+
+/**
+ * Array of globals dependent on the environment.
+ *
+ * @return {Array}
+ * @api private
+ */
+function extraGlobals() {
+ if (typeof process === 'object' && typeof process.version === 'string') {
+ var parts = process.version.split('.');
+ var nodeVersion = utils.reduce(parts, function(a, v) {
+ return a << 8 | v;
+ });
+
+ // 'errno' was renamed to process._errno in v0.9.11.
+
+ if (nodeVersion < 0x00090B) {
+ return ['errno'];
+ }
+ }
+
+ return [];
+}
+
+}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+},{"./pending":16,"./runnable":33,"./utils":38,"_process":67,"debug":2,"events":3}],35:[function(require,module,exports){
+/**
+ * Module dependencies.
+ */
+
+var EventEmitter = require('events').EventEmitter;
+var Hook = require('./hook');
+var utils = require('./utils');
+var inherits = utils.inherits;
+var debug = require('debug')('mocha:suite');
+var milliseconds = require('./ms');
+
+/**
+ * Expose `Suite`.
+ */
+
+exports = module.exports = Suite;
+
+/**
+ * Create a new `Suite` with the given `title` and parent `Suite`. When a suite
+ * with the same title is already present, that suite is returned to provide
+ * nicer reporter and more flexible meta-testing.
+ *
+ * @api public
+ * @param {Suite} parent
+ * @param {string} title
+ * @return {Suite}
+ */
+exports.create = function(parent, title) {
+ var suite = new Suite(title, parent.ctx);
+ suite.parent = parent;
+ title = suite.fullTitle();
+ parent.addSuite(suite);
+ return suite;
+};
+
+/**
+ * Initialize a new `Suite` with the given `title` and `ctx`.
+ *
+ * @api private
+ * @param {string} title
+ * @param {Context} parentContext
+ */
+function Suite(title, parentContext) {
+ if (!utils.isString(title)) {
+ throw new Error('Suite `title` should be a "string" but "' + typeof title + '" was given instead.');
+ }
+ this.title = title;
+ function Context() {}
+ Context.prototype = parentContext;
+ this.ctx = new Context();
+ this.suites = [];
+ this.tests = [];
+ this.pending = false;
+ this._beforeEach = [];
+ this._beforeAll = [];
+ this._afterEach = [];
+ this._afterAll = [];
+ this.root = !title;
+ this._timeout = 2000;
+ this._enableTimeouts = true;
+ this._slow = 75;
+ this._bail = false;
+ this._retries = -1;
+ this._onlyTests = [];
+ this._onlySuites = [];
+ this.delayed = false;
+}
+
+/**
+ * Inherit from `EventEmitter.prototype`.
+ */
+inherits(Suite, EventEmitter);
+
+/**
+ * Return a clone of this `Suite`.
+ *
+ * @api private
+ * @return {Suite}
+ */
+Suite.prototype.clone = function() {
+ var suite = new Suite(this.title);
+ debug('clone');
+ suite.ctx = this.ctx;
+ suite.timeout(this.timeout());
+ suite.retries(this.retries());
+ suite.enableTimeouts(this.enableTimeouts());
+ suite.slow(this.slow());
+ suite.bail(this.bail());
+ return suite;
+};
+
+/**
+ * Set timeout `ms` or short-hand such as "2s".
+ *
+ * @api private
+ * @param {number|string} ms
+ * @return {Suite|number} for chaining
+ */
+Suite.prototype.timeout = function(ms) {
+ if (!arguments.length) {
+ return this._timeout;
+ }
+ if (ms.toString() === '0') {
+ this._enableTimeouts = false;
+ }
+ if (typeof ms === 'string') {
+ ms = milliseconds(ms);
+ }
+ debug('timeout %d', ms);
+ this._timeout = parseInt(ms, 10);
+ return this;
+};
+
+/**
+ * Set number of times to retry a failed test.
+ *
+ * @api private
+ * @param {number|string} n
+ * @return {Suite|number} for chaining
+ */
+Suite.prototype.retries = function(n) {
+ if (!arguments.length) {
+ return this._retries;
+ }
+ debug('retries %d', n);
+ this._retries = parseInt(n, 10) || 0;
+ return this;
+};
+
+/**
+ * Set timeout to `enabled`.
+ *
+ * @api private
+ * @param {boolean} enabled
+ * @return {Suite|boolean} self or enabled
+ */
+Suite.prototype.enableTimeouts = function(enabled) {
+ if (!arguments.length) {
+ return this._enableTimeouts;
+ }
+ debug('enableTimeouts %s', enabled);
+ this._enableTimeouts = enabled;
+ return this;
+};
+
+/**
+ * Set slow `ms` or short-hand such as "2s".
+ *
+ * @api private
+ * @param {number|string} ms
+ * @return {Suite|number} for chaining
+ */
+Suite.prototype.slow = function(ms) {
+ if (!arguments.length) {
+ return this._slow;
+ }
+ if (typeof ms === 'string') {
+ ms = milliseconds(ms);
+ }
+ debug('slow %d', ms);
+ this._slow = ms;
+ return this;
+};
+
+/**
+ * Sets whether to bail after first error.
+ *
+ * @api private
+ * @param {boolean} bail
+ * @return {Suite|number} for chaining
+ */
+Suite.prototype.bail = function(bail) {
+ if (!arguments.length) {
+ return this._bail;
+ }
+ debug('bail %s', bail);
+ this._bail = bail;
+ return this;
+};
+
+/**
+ * Check if this suite or its parent suite is marked as pending.
+ *
+ * @api private
+ */
+Suite.prototype.isPending = function() {
+ return this.pending || (this.parent && this.parent.isPending());
+};
+
+/**
+ * Run `fn(test[, done])` before running tests.
+ *
+ * @api private
+ * @param {string} title
+ * @param {Function} fn
+ * @return {Suite} for chaining
+ */
+Suite.prototype.beforeAll = function(title, fn) {
+ if (this.isPending()) {
+ return this;
+ }
+ if (typeof title === 'function') {
+ fn = title;
+ title = fn.name;
+ }
+ title = '"before all" hook' + (title ? ': ' + title : '');
+
+ var hook = new Hook(title, fn);
+ hook.parent = this;
+ hook.timeout(this.timeout());
+ hook.retries(this.retries());
+ hook.enableTimeouts(this.enableTimeouts());
+ hook.slow(this.slow());
+ hook.ctx = this.ctx;
+ this._beforeAll.push(hook);
+ this.emit('beforeAll', hook);
+ return this;
+};
+
+/**
+ * Run `fn(test[, done])` after running tests.
+ *
+ * @api private
+ * @param {string} title
+ * @param {Function} fn
+ * @return {Suite} for chaining
+ */
+Suite.prototype.afterAll = function(title, fn) {
+ if (this.isPending()) {
+ return this;
+ }
+ if (typeof title === 'function') {
+ fn = title;
+ title = fn.name;
+ }
+ title = '"after all" hook' + (title ? ': ' + title : '');
+
+ var hook = new Hook(title, fn);
+ hook.parent = this;
+ hook.timeout(this.timeout());
+ hook.retries(this.retries());
+ hook.enableTimeouts(this.enableTimeouts());
+ hook.slow(this.slow());
+ hook.ctx = this.ctx;
+ this._afterAll.push(hook);
+ this.emit('afterAll', hook);
+ return this;
+};
+
+/**
+ * Run `fn(test[, done])` before each test case.
+ *
+ * @api private
+ * @param {string} title
+ * @param {Function} fn
+ * @return {Suite} for chaining
+ */
+Suite.prototype.beforeEach = function(title, fn) {
+ if (this.isPending()) {
+ return this;
+ }
+ if (typeof title === 'function') {
+ fn = title;
+ title = fn.name;
+ }
+ title = '"before each" hook' + (title ? ': ' + title : '');
+
+ var hook = new Hook(title, fn);
+ hook.parent = this;
+ hook.timeout(this.timeout());
+ hook.retries(this.retries());
+ hook.enableTimeouts(this.enableTimeouts());
+ hook.slow(this.slow());
+ hook.ctx = this.ctx;
+ this._beforeEach.push(hook);
+ this.emit('beforeEach', hook);
+ return this;
+};
+
+/**
+ * Run `fn(test[, done])` after each test case.
+ *
+ * @api private
+ * @param {string} title
+ * @param {Function} fn
+ * @return {Suite} for chaining
+ */
+Suite.prototype.afterEach = function(title, fn) {
+ if (this.isPending()) {
+ return this;
+ }
+ if (typeof title === 'function') {
+ fn = title;
+ title = fn.name;
+ }
+ title = '"after each" hook' + (title ? ': ' + title : '');
+
+ var hook = new Hook(title, fn);
+ hook.parent = this;
+ hook.timeout(this.timeout());
+ hook.retries(this.retries());
+ hook.enableTimeouts(this.enableTimeouts());
+ hook.slow(this.slow());
+ hook.ctx = this.ctx;
+ this._afterEach.push(hook);
+ this.emit('afterEach', hook);
+ return this;
+};
+
+/**
+ * Add a test `suite`.
+ *
+ * @api private
+ * @param {Suite} suite
+ * @return {Suite} for chaining
+ */
+Suite.prototype.addSuite = function(suite) {
+ suite.parent = this;
+ suite.timeout(this.timeout());
+ suite.retries(this.retries());
+ suite.enableTimeouts(this.enableTimeouts());
+ suite.slow(this.slow());
+ suite.bail(this.bail());
+ this.suites.push(suite);
+ this.emit('suite', suite);
+ return this;
+};
+
+/**
+ * Add a `test` to this suite.
+ *
+ * @api private
+ * @param {Test} test
+ * @return {Suite} for chaining
+ */
+Suite.prototype.addTest = function(test) {
+ test.parent = this;
+ test.timeout(this.timeout());
+ test.retries(this.retries());
+ test.enableTimeouts(this.enableTimeouts());
+ test.slow(this.slow());
+ test.ctx = this.ctx;
+ this.tests.push(test);
+ this.emit('test', test);
+ return this;
+};
+
+/**
+ * Return the full title generated by recursively concatenating the parent's
+ * full title.
+ *
+ * @api public
+ * @return {string}
+ */
+Suite.prototype.fullTitle = function() {
+ if (this.parent) {
+ var full = this.parent.fullTitle();
+ if (full) {
+ return full + ' ' + this.title;
+ }
+ }
+ return this.title;
+};
+
+/**
+ * Return the total number of tests.
+ *
+ * @api public
+ * @return {number}
+ */
+Suite.prototype.total = function() {
+ return utils.reduce(this.suites, function(sum, suite) {
+ return sum + suite.total();
+ }, 0) + this.tests.length;
+};
+
+/**
+ * Iterates through each suite recursively to find all tests. Applies a
+ * function in the format `fn(test)`.
+ *
+ * @api private
+ * @param {Function} fn
+ * @return {Suite}
+ */
+Suite.prototype.eachTest = function(fn) {
+ utils.forEach(this.tests, fn);
+ utils.forEach(this.suites, function(suite) {
+ suite.eachTest(fn);
+ });
+ return this;
+};
+
+/**
+ * This will run the root suite if we happen to be running in delayed mode.
+ */
+Suite.prototype.run = function run() {
+ if (this.root) {
+ this.emit('run');
+ }
+};
+
+},{"./hook":7,"./ms":15,"./utils":38,"debug":2,"events":3}],36:[function(require,module,exports){
+/**
+ * Module dependencies.
+ */
+
+var Runnable = require('./runnable');
+var create = require('lodash.create');
+var isString = require('./utils').isString;
+
+/**
+ * Expose `Test`.
+ */
+
+module.exports = Test;
+
+/**
+ * Initialize a new `Test` with the given `title` and callback `fn`.
+ *
+ * @api private
+ * @param {String} title
+ * @param {Function} fn
+ */
+function Test(title, fn) {
+ if (!isString(title)) {
+ throw new Error('Test `title` should be a "string" but "' + typeof title + '" was given instead.');
+ }
+ Runnable.call(this, title, fn);
+ this.pending = !fn;
+ this.type = 'test';
+}
+
+/**
+ * Inherit from `Runnable.prototype`.
+ */
+Test.prototype = create(Runnable.prototype, {
+ constructor: Test
+});
+
+Test.prototype.clone = function() {
+ var test = new Test(this.title, this.fn);
+ test.timeout(this.timeout());
+ test.slow(this.slow());
+ test.enableTimeouts(this.enableTimeouts());
+ test.retries(this.retries());
+ test.currentRetry(this.currentRetry());
+ test.globals(this.globals());
+ test.parent = this.parent;
+ test.file = this.file;
+ test.ctx = this.ctx;
+ return test;
+};
+
+},{"./runnable":33,"./utils":38,"lodash.create":60}],37:[function(require,module,exports){
+'use strict';
+
+/**
+ * Pad a `number` with a ten's place zero.
+ *
+ * @param {number} number
+ * @return {string}
+ */
+function pad(number) {
+ var n = number.toString();
+ return n.length === 1 ? '0' + n : n;
+}
+
+/**
+ * Turn a `date` into an ISO string.
+ *
+ * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString
+ *
+ * @param {Date} date
+ * @return {string}
+ */
+function toISOString(date) {
+ return date.getUTCFullYear()
+ + '-' + pad(date.getUTCMonth() + 1)
+ + '-' + pad(date.getUTCDate())
+ + 'T' + pad(date.getUTCHours())
+ + ':' + pad(date.getUTCMinutes())
+ + ':' + pad(date.getUTCSeconds())
+ + '.' + String((date.getUTCMilliseconds()/1000).toFixed(3)).slice(2, 5)
+ + 'Z';
+}
+
+/*
+ * Exports.
+ */
+
+module.exports = toISOString;
+
+},{}],38:[function(require,module,exports){
+(function (process,Buffer){
+/* eslint-env browser */
+
+/**
+ * Module dependencies.
+ */
+
+var JSON = require('json3');
+var basename = require('path').basename;
+var debug = require('debug')('mocha:watch');
+var exists = require('fs').existsSync || require('path').existsSync;
+var glob = require('glob');
+var path = require('path');
+var join = path.join;
+var readdirSync = require('fs').readdirSync;
+var statSync = require('fs').statSync;
+var watchFile = require('fs').watchFile;
+var toISOString = require('./to-iso-string');
+
+/**
+ * Ignored directories.
+ */
+
+var ignore = ['node_modules', '.git'];
+
+exports.inherits = require('util').inherits;
+
+/**
+ * Escape special characters in the given string of html.
+ *
+ * @api private
+ * @param {string} html
+ * @return {string}
+ */
+exports.escape = function(html) {
+ return String(html)
+ .replace(/&/g, '&amp;')
+ .replace(/"/g, '&quot;')
+ .replace(/</g, '&lt;')
+ .replace(/>/g, '&gt;');
+};
+
+/**
+ * Array#forEach (<=IE8)
+ *
+ * @api private
+ * @param {Array} arr
+ * @param {Function} fn
+ * @param {Object} scope
+ */
+exports.forEach = function(arr, fn, scope) {
+ for (var i = 0, l = arr.length; i < l; i++) {
+ fn.call(scope, arr[i], i);
+ }
+};
+
+/**
+ * Test if the given obj is type of string.
+ *
+ * @api private
+ * @param {Object} obj
+ * @return {boolean}
+ */
+exports.isString = function(obj) {
+ return typeof obj === 'string';
+};
+
+/**
+ * Array#map (<=IE8)
+ *
+ * @api private
+ * @param {Array} arr
+ * @param {Function} fn
+ * @param {Object} scope
+ * @return {Array}
+ */
+exports.map = function(arr, fn, scope) {
+ var result = [];
+ for (var i = 0, l = arr.length; i < l; i++) {
+ result.push(fn.call(scope, arr[i], i, arr));
+ }
+ return result;
+};
+
+/**
+ * Array#indexOf (<=IE8)
+ *
+ * @api private
+ * @param {Array} arr
+ * @param {Object} obj to find index of
+ * @param {number} start
+ * @return {number}
+ */
+var indexOf = exports.indexOf = function(arr, obj, start) {
+ for (var i = start || 0, l = arr.length; i < l; i++) {
+ if (arr[i] === obj) {
+ return i;
+ }
+ }
+ return -1;
+};
+
+/**
+ * Array#reduce (<=IE8)
+ *
+ * @api private
+ * @param {Array} arr
+ * @param {Function} fn
+ * @param {Object} val Initial value.
+ * @return {*}
+ */
+var reduce = exports.reduce = function(arr, fn, val) {
+ var rval = val;
+
+ for (var i = 0, l = arr.length; i < l; i++) {
+ rval = fn(rval, arr[i], i, arr);
+ }
+
+ return rval;
+};
+
+/**
+ * Array#filter (<=IE8)
+ *
+ * @api private
+ * @param {Array} arr
+ * @param {Function} fn
+ * @return {Array}
+ */
+exports.filter = function(arr, fn) {
+ var ret = [];
+
+ for (var i = 0, l = arr.length; i < l; i++) {
+ var val = arr[i];
+ if (fn(val, i, arr)) {
+ ret.push(val);
+ }
+ }
+
+ return ret;
+};
+
+/**
+ * Array#some (<=IE8)
+ *
+ * @api private
+ * @param {Array} arr
+ * @param {Function} fn
+ * @return {Array}
+ */
+exports.some = function(arr, fn) {
+ for (var i = 0, l = arr.length; i < l; i++) {
+ if (fn(arr[i])) {
+ return true;
+ }
+ }
+ return false;
+};
+
+/**
+ * Object.keys (<=IE8)
+ *
+ * @api private
+ * @param {Object} obj
+ * @return {Array} keys
+ */
+exports.keys = typeof Object.keys === 'function' ? Object.keys : function(obj) {
+ var keys = [];
+ var has = Object.prototype.hasOwnProperty; // for `window` on <=IE8
+
+ for (var key in obj) {
+ if (has.call(obj, key)) {
+ keys.push(key);
+ }
+ }
+
+ return keys;
+};
+
+/**
+ * Watch the given `files` for changes
+ * and invoke `fn(file)` on modification.
+ *
+ * @api private
+ * @param {Array} files
+ * @param {Function} fn
+ */
+exports.watch = function(files, fn) {
+ var options = { interval: 100 };
+ files.forEach(function(file) {
+ debug('file %s', file);
+ watchFile(file, options, function(curr, prev) {
+ if (prev.mtime < curr.mtime) {
+ fn(file);
+ }
+ });
+ });
+};
+
+/**
+ * Array.isArray (<=IE8)
+ *
+ * @api private
+ * @param {Object} obj
+ * @return {Boolean}
+ */
+var isArray = typeof Array.isArray === 'function' ? Array.isArray : function(obj) {
+ return Object.prototype.toString.call(obj) === '[object Array]';
+};
+
+exports.isArray = isArray;
+
+/**
+ * Buffer.prototype.toJSON polyfill.
+ *
+ * @type {Function}
+ */
+if (typeof Buffer !== 'undefined' && Buffer.prototype) {
+ Buffer.prototype.toJSON = Buffer.prototype.toJSON || function() {
+ return Array.prototype.slice.call(this, 0);
+ };
+}
+
+/**
+ * Ignored files.
+ *
+ * @api private
+ * @param {string} path
+ * @return {boolean}
+ */
+function ignored(path) {
+ return !~ignore.indexOf(path);
+}
+
+/**
+ * Lookup files in the given `dir`.
+ *
+ * @api private
+ * @param {string} dir
+ * @param {string[]} [ext=['.js']]
+ * @param {Array} [ret=[]]
+ * @return {Array}
+ */
+exports.files = function(dir, ext, ret) {
+ ret = ret || [];
+ ext = ext || ['js'];
+
+ var re = new RegExp('\\.(' + ext.join('|') + ')$');
+
+ readdirSync(dir)
+ .filter(ignored)
+ .forEach(function(path) {
+ path = join(dir, path);
+ if (statSync(path).isDirectory()) {
+ exports.files(path, ext, ret);
+ } else if (path.match(re)) {
+ ret.push(path);
+ }
+ });
+
+ return ret;
+};
+
+/**
+ * Compute a slug from the given `str`.
+ *
+ * @api private
+ * @param {string} str
+ * @return {string}
+ */
+exports.slug = function(str) {
+ return str
+ .toLowerCase()
+ .replace(/ +/g, '-')
+ .replace(/[^-\w]/g, '');
+};
+
+/**
+ * Strip the function definition from `str`, and re-indent for pre whitespace.
+ *
+ * @param {string} str
+ * @return {string}
+ */
+exports.clean = function(str) {
+ str = str
+ .replace(/\r\n?|[\n\u2028\u2029]/g, '\n').replace(/^\uFEFF/, '')
+ // (traditional)-> space/name parameters body (lambda)-> parameters body multi-statement/single keep body content
+ .replace(/^function(?:\s*|\s+[^(]*)\([^)]*\)\s*\{((?:.|\n)*?)\s*\}$|^\([^)]*\)\s*=>\s*(?:\{((?:.|\n)*?)\s*\}|((?:.|\n)*))$/, '$1$2$3');
+
+ var spaces = str.match(/^\n?( *)/)[1].length;
+ var tabs = str.match(/^\n?(\t*)/)[1].length;
+ var re = new RegExp('^\n?' + (tabs ? '\t' : ' ') + '{' + (tabs ? tabs : spaces) + '}', 'gm');
+
+ str = str.replace(re, '');
+
+ return exports.trim(str);
+};
+
+/**
+ * Trim the given `str`.
+ *
+ * @api private
+ * @param {string} str
+ * @return {string}
+ */
+exports.trim = function(str) {
+ return str.replace(/^\s+|\s+$/g, '');
+};
+
+/**
+ * Parse the given `qs`.
+ *
+ * @api private
+ * @param {string} qs
+ * @return {Object}
+ */
+exports.parseQuery = function(qs) {
+ return reduce(qs.replace('?', '').split('&'), function(obj, pair) {
+ var i = pair.indexOf('=');
+ var key = pair.slice(0, i);
+ var val = pair.slice(++i);
+
+ obj[key] = decodeURIComponent(val);
+ return obj;
+ }, {});
+};
+
+/**
+ * Highlight the given string of `js`.
+ *
+ * @api private
+ * @param {string} js
+ * @return {string}
+ */
+function highlight(js) {
+ return js
+ .replace(/</g, '&lt;')
+ .replace(/>/g, '&gt;')
+ .replace(/\/\/(.*)/gm, '<span class="comment">//$1</span>')
+ .replace(/('.*?')/gm, '<span class="string">$1</span>')
+ .replace(/(\d+\.\d+)/gm, '<span class="number">$1</span>')
+ .replace(/(\d+)/gm, '<span class="number">$1</span>')
+ .replace(/\bnew[ \t]+(\w+)/gm, '<span class="keyword">new</span> <span class="init">$1</span>')
+ .replace(/\b(function|new|throw|return|var|if|else)\b/gm, '<span class="keyword">$1</span>');
+}
+
+/**
+ * Highlight the contents of tag `name`.
+ *
+ * @api private
+ * @param {string} name
+ */
+exports.highlightTags = function(name) {
+ var code = document.getElementById('mocha').getElementsByTagName(name);
+ for (var i = 0, len = code.length; i < len; ++i) {
+ code[i].innerHTML = highlight(code[i].innerHTML);
+ }
+};
+
+/**
+ * If a value could have properties, and has none, this function is called,
+ * which returns a string representation of the empty value.
+ *
+ * Functions w/ no properties return `'[Function]'`
+ * Arrays w/ length === 0 return `'[]'`
+ * Objects w/ no properties return `'{}'`
+ * All else: return result of `value.toString()`
+ *
+ * @api private
+ * @param {*} value The value to inspect.
+ * @param {string} typeHint The type of the value
+ * @returns {string}
+ */
+function emptyRepresentation(value, typeHint) {
+ switch (typeHint) {
+ case 'function':
+ return '[Function]';
+ case 'object':
+ return '{}';
+ case 'array':
+ return '[]';
+ default:
+ return value.toString();
+ }
+}
+
+/**
+ * Takes some variable and asks `Object.prototype.toString()` what it thinks it
+ * is.
+ *
+ * @api private
+ * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/toString
+ * @param {*} value The value to test.
+ * @returns {string} Computed type
+ * @example
+ * type({}) // 'object'
+ * type([]) // 'array'
+ * type(1) // 'number'
+ * type(false) // 'boolean'
+ * type(Infinity) // 'number'
+ * type(null) // 'null'
+ * type(new Date()) // 'date'
+ * type(/foo/) // 'regexp'
+ * type('type') // 'string'
+ * type(global) // 'global'
+ * type(new String('foo') // 'object'
+ */
+var type = exports.type = function type(value) {
+ if (value === undefined) {
+ return 'undefined';
+ } else if (value === null) {
+ return 'null';
+ } else if (typeof Buffer !== 'undefined' && Buffer.isBuffer(value)) {
+ return 'buffer';
+ }
+ return Object.prototype.toString.call(value)
+ .replace(/^\[.+\s(.+?)\]$/, '$1')
+ .toLowerCase();
+};
+
+/**
+ * Stringify `value`. Different behavior depending on type of value:
+ *
+ * - If `value` is undefined or null, return `'[undefined]'` or `'[null]'`, respectively.
+ * - If `value` is not an object, function or array, return result of `value.toString()` wrapped in double-quotes.
+ * - If `value` is an *empty* object, function, or array, return result of function
+ * {@link emptyRepresentation}.
+ * - If `value` has properties, call {@link exports.canonicalize} on it, then return result of
+ * JSON.stringify().
+ *
+ * @api private
+ * @see exports.type
+ * @param {*} value
+ * @return {string}
+ */
+exports.stringify = function(value) {
+ var typeHint = type(value);
+
+ if (!~indexOf(['object', 'array', 'function'], typeHint)) {
+ if (typeHint === 'buffer') {
+ var json = value.toJSON();
+ // Based on the toJSON result
+ return jsonStringify(json.data && json.type ? json.data : json, 2)
+ .replace(/,(\n|$)/g, '$1');
+ }
+
+ // IE7/IE8 has a bizarre String constructor; needs to be coerced
+ // into an array and back to obj.
+ if (typeHint === 'string' && typeof value === 'object') {
+ value = reduce(value.split(''), function(acc, char, idx) {
+ acc[idx] = char;
+ return acc;
+ }, {});
+ typeHint = 'object';
+ } else {
+ return jsonStringify(value);
+ }
+ }
+
+ for (var prop in value) {
+ if (Object.prototype.hasOwnProperty.call(value, prop)) {
+ return jsonStringify(exports.canonicalize(value, null, typeHint), 2).replace(/,(\n|$)/g, '$1');
+ }
+ }
+
+ return emptyRepresentation(value, typeHint);
+};
+
+/**
+ * like JSON.stringify but more sense.
+ *
+ * @api private
+ * @param {Object} object
+ * @param {number=} spaces
+ * @param {number=} depth
+ * @returns {*}
+ */
+function jsonStringify(object, spaces, depth) {
+ if (typeof spaces === 'undefined') {
+ // primitive types
+ return _stringify(object);
+ }
+
+ depth = depth || 1;
+ var space = spaces * depth;
+ var str = isArray(object) ? '[' : '{';
+ var end = isArray(object) ? ']' : '}';
+ var length = typeof object.length === 'number' ? object.length : exports.keys(object).length;
+ // `.repeat()` polyfill
+ function repeat(s, n) {
+ return new Array(n).join(s);
+ }
+
+ function _stringify(val) {
+ switch (type(val)) {
+ case 'null':
+ case 'undefined':
+ val = '[' + val + ']';
+ break;
+ case 'array':
+ case 'object':
+ val = jsonStringify(val, spaces, depth + 1);
+ break;
+ case 'boolean':
+ case 'regexp':
+ case 'symbol':
+ case 'number':
+ val = val === 0 && (1 / val) === -Infinity // `-0`
+ ? '-0'
+ : val.toString();
+ break;
+ case 'date':
+ var sDate;
+ if (isNaN(val.getTime())) { // Invalid date
+ sDate = val.toString();
+ } else {
+ sDate = val.toISOString ? val.toISOString() : toISOString(val);
+ }
+ val = '[Date: ' + sDate + ']';
+ break;
+ case 'buffer':
+ var json = val.toJSON();
+ // Based on the toJSON result
+ json = json.data && json.type ? json.data : json;
+ val = '[Buffer: ' + jsonStringify(json, 2, depth + 1) + ']';
+ break;
+ default:
+ val = (val === '[Function]' || val === '[Circular]')
+ ? val
+ : JSON.stringify(val); // string
+ }
+ return val;
+ }
+
+ for (var i in object) {
+ if (!Object.prototype.hasOwnProperty.call(object, i)) {
+ continue; // not my business
+ }
+ --length;
+ str += '\n ' + repeat(' ', space)
+ + (isArray(object) ? '' : '"' + i + '": ') // key
+ + _stringify(object[i]) // value
+ + (length ? ',' : ''); // comma
+ }
+
+ return str
+ // [], {}
+ + (str.length !== 1 ? '\n' + repeat(' ', --space) + end : end);
+}
+
+/**
+ * Test if a value is a buffer.
+ *
+ * @api private
+ * @param {*} value The value to test.
+ * @return {boolean} True if `value` is a buffer, otherwise false
+ */
+exports.isBuffer = function(value) {
+ return typeof Buffer !== 'undefined' && Buffer.isBuffer(value);
+};
+
+/**
+ * Return a new Thing that has the keys in sorted order. Recursive.
+ *
+ * If the Thing...
+ * - has already been seen, return string `'[Circular]'`
+ * - is `undefined`, return string `'[undefined]'`
+ * - is `null`, return value `null`
+ * - is some other primitive, return the value
+ * - is not a primitive or an `Array`, `Object`, or `Function`, return the value of the Thing's `toString()` method
+ * - is a non-empty `Array`, `Object`, or `Function`, return the result of calling this function again.
+ * - is an empty `Array`, `Object`, or `Function`, return the result of calling `emptyRepresentation()`
+ *
+ * @api private
+ * @see {@link exports.stringify}
+ * @param {*} value Thing to inspect. May or may not have properties.
+ * @param {Array} [stack=[]] Stack of seen values
+ * @param {string} [typeHint] Type hint
+ * @return {(Object|Array|Function|string|undefined)}
+ */
+exports.canonicalize = function canonicalize(value, stack, typeHint) {
+ var canonicalizedObj;
+ /* eslint-disable no-unused-vars */
+ var prop;
+ /* eslint-enable no-unused-vars */
+ typeHint = typeHint || type(value);
+ function withStack(value, fn) {
+ stack.push(value);
+ fn();
+ stack.pop();
+ }
+
+ stack = stack || [];
+
+ if (indexOf(stack, value) !== -1) {
+ return '[Circular]';
+ }
+
+ switch (typeHint) {
+ case 'undefined':
+ case 'buffer':
+ case 'null':
+ canonicalizedObj = value;
+ break;
+ case 'array':
+ withStack(value, function() {
+ canonicalizedObj = exports.map(value, function(item) {
+ return exports.canonicalize(item, stack);
+ });
+ });
+ break;
+ case 'function':
+ /* eslint-disable guard-for-in */
+ for (prop in value) {
+ canonicalizedObj = {};
+ break;
+ }
+ /* eslint-enable guard-for-in */
+ if (!canonicalizedObj) {
+ canonicalizedObj = emptyRepresentation(value, typeHint);
+ break;
+ }
+ /* falls through */
+ case 'object':
+ canonicalizedObj = canonicalizedObj || {};
+ withStack(value, function() {
+ exports.forEach(exports.keys(value).sort(), function(key) {
+ canonicalizedObj[key] = exports.canonicalize(value[key], stack);
+ });
+ });
+ break;
+ case 'date':
+ case 'number':
+ case 'regexp':
+ case 'boolean':
+ case 'symbol':
+ canonicalizedObj = value;
+ break;
+ default:
+ canonicalizedObj = value + '';
+ }
+
+ return canonicalizedObj;
+};
+
+/**
+ * Lookup file names at the given `path`.
+ *
+ * @api public
+ * @param {string} path Base path to start searching from.
+ * @param {string[]} extensions File extensions to look for.
+ * @param {boolean} recursive Whether or not to recurse into subdirectories.
+ * @return {string[]} An array of paths.
+ */
+exports.lookupFiles = function lookupFiles(path, extensions, recursive) {
+ var files = [];
+ var re = new RegExp('\\.(' + extensions.join('|') + ')$');
+
+ if (!exists(path)) {
+ if (exists(path + '.js')) {
+ path += '.js';
+ } else {
+ files = glob.sync(path);
+ if (!files.length) {
+ throw new Error("cannot resolve path (or pattern) '" + path + "'");
+ }
+ return files;
+ }
+ }
+
+ try {
+ var stat = statSync(path);
+ if (stat.isFile()) {
+ return path;
+ }
+ } catch (err) {
+ // ignore error
+ return;
+ }
+
+ readdirSync(path).forEach(function(file) {
+ file = join(path, file);
+ try {
+ var stat = statSync(file);
+ if (stat.isDirectory()) {
+ if (recursive) {
+ files = files.concat(lookupFiles(file, extensions, recursive));
+ }
+ return;
+ }
+ } catch (err) {
+ // ignore error
+ return;
+ }
+ if (!stat.isFile() || !re.test(file) || basename(file)[0] === '.') {
+ return;
+ }
+ files.push(file);
+ });
+
+ return files;
+};
+
+/**
+ * Generate an undefined error with a message warning the user.
+ *
+ * @return {Error}
+ */
+
+exports.undefinedError = function() {
+ return new Error('Caught undefined error, did you throw without specifying what?');
+};
+
+/**
+ * Generate an undefined error if `err` is not defined.
+ *
+ * @param {Error} err
+ * @return {Error}
+ */
+
+exports.getError = function(err) {
+ return err || exports.undefinedError();
+};
+
+/**
+ * @summary
+ * This Filter based on `mocha-clean` module.(see: `github.com/rstacruz/mocha-clean`)
+ * @description
+ * When invoking this function you get a filter function that get the Error.stack as an input,
+ * and return a prettify output.
+ * (i.e: strip Mocha and internal node functions from stack trace).
+ * @returns {Function}
+ */
+exports.stackTraceFilter = function() {
+ // TODO: Replace with `process.browser`
+ var is = typeof document === 'undefined' ? { node: true } : { browser: true };
+ var slash = path.sep;
+ var cwd;
+ if (is.node) {
+ cwd = process.cwd() + slash;
+ } else {
+ cwd = (typeof location === 'undefined' ? window.location : location).href.replace(/\/[^\/]*$/, '/');
+ slash = '/';
+ }
+
+ function isMochaInternal(line) {
+ return (~line.indexOf('node_modules' + slash + 'mocha' + slash))
+ || (~line.indexOf('node_modules' + slash + 'mocha.js'))
+ || (~line.indexOf('bower_components' + slash + 'mocha.js'))
+ || (~line.indexOf(slash + 'mocha.js'));
+ }
+
+ function isNodeInternal(line) {
+ return (~line.indexOf('(timers.js:'))
+ || (~line.indexOf('(events.js:'))
+ || (~line.indexOf('(node.js:'))
+ || (~line.indexOf('(module.js:'))
+ || (~line.indexOf('GeneratorFunctionPrototype.next (native)'))
+ || false;
+ }
+
+ return function(stack) {
+ stack = stack.split('\n');
+
+ stack = reduce(stack, function(list, line) {
+ if (isMochaInternal(line)) {
+ return list;
+ }
+
+ if (is.node && isNodeInternal(line)) {
+ return list;
+ }
+
+ // Clean up cwd(absolute)
+ if (/\(?.+:\d+:\d+\)?$/.test(line)) {
+ line = line.replace(cwd, '');
+ }
+
+ list.push(line);
+ return list;
+ }, []);
+
+ return stack.join('\n');
+ };
+};
+
+/**
+ * Crude, but effective.
+ * @api
+ * @param {*} value
+ * @returns {boolean} Whether or not `value` is a Promise
+ */
+exports.isPromise = function isPromise(value) {
+ return typeof value === 'object' && typeof value.then === 'function';
+};
+
+}).call(this,require('_process'),require("buffer").Buffer)
+},{"./to-iso-string":37,"_process":67,"buffer":44,"debug":2,"fs":42,"glob":42,"json3":54,"path":42,"util":84}],39:[function(require,module,exports){
+'use strict'
+
+exports.toByteArray = toByteArray
+exports.fromByteArray = fromByteArray
+
+var lookup = []
+var revLookup = []
+var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array
+
+function init () {
+ var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
+ for (var i = 0, len = code.length; i < len; ++i) {
+ lookup[i] = code[i]
+ revLookup[code.charCodeAt(i)] = i
+ }
+
+ revLookup['-'.charCodeAt(0)] = 62
+ revLookup['_'.charCodeAt(0)] = 63
+}
+
+init()
+
+function toByteArray (b64) {
+ var i, j, l, tmp, placeHolders, arr
+ var len = b64.length
+
+ if (len % 4 > 0) {
+ throw new Error('Invalid string. Length must be a multiple of 4')
+ }
+
+ // the number of equal signs (place holders)
+ // if there are two placeholders, than the two characters before it
+ // represent one byte
+ // if there is only one, then the three characters before it represent 2 bytes
+ // this is just a cheap hack to not do indexOf twice
+ placeHolders = b64[len - 2] === '=' ? 2 : b64[len - 1] === '=' ? 1 : 0
+
+ // base64 is 4/3 + up to two characters of the original data
+ arr = new Arr(len * 3 / 4 - placeHolders)
+
+ // if there are placeholders, only get up to the last complete 4 chars
+ l = placeHolders > 0 ? len - 4 : len
+
+ var L = 0
+
+ for (i = 0, j = 0; i < l; i += 4, j += 3) {
+ tmp = (revLookup[b64.charCodeAt(i)] << 18) | (revLookup[b64.charCodeAt(i + 1)] << 12) | (revLookup[b64.charCodeAt(i + 2)] << 6) | revLookup[b64.charCodeAt(i + 3)]
+ arr[L++] = (tmp >> 16) & 0xFF
+ arr[L++] = (tmp >> 8) & 0xFF
+ arr[L++] = tmp & 0xFF
+ }
+
+ if (placeHolders === 2) {
+ tmp = (revLookup[b64.charCodeAt(i)] << 2) | (revLookup[b64.charCodeAt(i + 1)] >> 4)
+ arr[L++] = tmp & 0xFF
+ } else if (placeHolders === 1) {
+ tmp = (revLookup[b64.charCodeAt(i)] << 10) | (revLookup[b64.charCodeAt(i + 1)] << 4) | (revLookup[b64.charCodeAt(i + 2)] >> 2)
+ arr[L++] = (tmp >> 8) & 0xFF
+ arr[L++] = tmp & 0xFF
+ }
+
+ return arr
+}
+
+function tripletToBase64 (num) {
+ return lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F]
+}
+
+function encodeChunk (uint8, start, end) {
+ var tmp
+ var output = []
+ for (var i = start; i < end; i += 3) {
+ tmp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2])
+ output.push(tripletToBase64(tmp))
+ }
+ return output.join('')
+}
+
+function fromByteArray (uint8) {
+ var tmp
+ var len = uint8.length
+ var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes
+ var output = ''
+ var parts = []
+ var maxChunkLength = 16383 // must be multiple of 3
+
+ // go through the array every three bytes, we'll deal with trailing stuff later
+ for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {
+ parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))
+ }
+
+ // pad the end with zeros, but make sure to not forget the extra bytes
+ if (extraBytes === 1) {
+ tmp = uint8[len - 1]
+ output += lookup[tmp >> 2]
+ output += lookup[(tmp << 4) & 0x3F]
+ output += '=='
+ } else if (extraBytes === 2) {
+ tmp = (uint8[len - 2] << 8) + (uint8[len - 1])
+ output += lookup[tmp >> 10]
+ output += lookup[(tmp >> 4) & 0x3F]
+ output += lookup[(tmp << 2) & 0x3F]
+ output += '='
+ }
+
+ parts.push(output)
+
+ return parts.join('')
+}
+
+},{}],40:[function(require,module,exports){
+
+},{}],41:[function(require,module,exports){
+(function (process){
+var WritableStream = require('stream').Writable
+var inherits = require('util').inherits
+
+module.exports = BrowserStdout
+
+
+inherits(BrowserStdout, WritableStream)
+
+function BrowserStdout(opts) {
+ if (!(this instanceof BrowserStdout)) return new BrowserStdout(opts)
+
+ opts = opts || {}
+ WritableStream.call(this, opts)
+ this.label = (opts.label !== undefined) ? opts.label : 'stdout'
+}
+
+BrowserStdout.prototype._write = function(chunks, encoding, cb) {
+ var output = chunks.toString ? chunks.toString() : chunks
+ if (this.label === false) {
+ console.log(output)
+ } else {
+ console.log(this.label+':', output)
+ }
+ process.nextTick(cb)
+}
+
+}).call(this,require('_process'))
+},{"_process":67,"stream":79,"util":84}],42:[function(require,module,exports){
+arguments[4][40][0].apply(exports,arguments)
+},{"dup":40}],43:[function(require,module,exports){
+(function (global){
+'use strict';
+
+var buffer = require('buffer');
+var Buffer = buffer.Buffer;
+var SlowBuffer = buffer.SlowBuffer;
+var MAX_LEN = buffer.kMaxLength || 2147483647;
+exports.alloc = function alloc(size, fill, encoding) {
+ if (typeof Buffer.alloc === 'function') {
+ return Buffer.alloc(size, fill, encoding);
+ }
+ if (typeof encoding === 'number') {
+ throw new TypeError('encoding must not be number');
+ }
+ if (typeof size !== 'number') {
+ throw new TypeError('size must be a number');
+ }
+ if (size > MAX_LEN) {
+ throw new RangeError('size is too large');
+ }
+ var enc = encoding;
+ var _fill = fill;
+ if (_fill === undefined) {
+ enc = undefined;
+ _fill = 0;
+ }
+ var buf = new Buffer(size);
+ if (typeof _fill === 'string') {
+ var fillBuf = new Buffer(_fill, enc);
+ var flen = fillBuf.length;
+ var i = -1;
+ while (++i < size) {
+ buf[i] = fillBuf[i % flen];
+ }
+ } else {
+ buf.fill(_fill);
+ }
+ return buf;
+}
+exports.allocUnsafe = function allocUnsafe(size) {
+ if (typeof Buffer.allocUnsafe === 'function') {
+ return Buffer.allocUnsafe(size);
+ }
+ if (typeof size !== 'number') {
+ throw new TypeError('size must be a number');
+ }
+ if (size > MAX_LEN) {
+ throw new RangeError('size is too large');
+ }
+ return new Buffer(size);
+}
+exports.from = function from(value, encodingOrOffset, length) {
+ if (typeof Buffer.from === 'function' && (!global.Uint8Array || Uint8Array.from !== Buffer.from)) {
+ return Buffer.from(value, encodingOrOffset, length);
+ }
+ if (typeof value === 'number') {
+ throw new TypeError('"value" argument must not be a number');
+ }
+ if (typeof value === 'string') {
+ return new Buffer(value, encodingOrOffset);
+ }
+ if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) {
+ var offset = encodingOrOffset;
+ if (arguments.length === 1) {
+ return new Buffer(value);
+ }
+ if (typeof offset === 'undefined') {
+ offset = 0;
+ }
+ var len = length;
+ if (typeof len === 'undefined') {
+ len = value.byteLength - offset;
+ }
+ if (offset >= value.byteLength) {
+ throw new RangeError('\'offset\' is out of bounds');
+ }
+ if (len > value.byteLength - offset) {
+ throw new RangeError('\'length\' is out of bounds');
+ }
+ return new Buffer(value.slice(offset, offset + len));
+ }
+ if (Buffer.isBuffer(value)) {
+ var out = new Buffer(value.length);
+ value.copy(out, 0, 0, value.length);
+ return out;
+ }
+ if (value) {
+ if (Array.isArray(value) || (typeof ArrayBuffer !== 'undefined' && value.buffer instanceof ArrayBuffer) || 'length' in value) {
+ return new Buffer(value);
+ }
+ if (value.type === 'Buffer' && Array.isArray(value.data)) {
+ return new Buffer(value.data);
+ }
+ }
+
+ throw new TypeError('First argument must be a string, Buffer, ' + 'ArrayBuffer, Array, or array-like object.');
+}
+exports.allocUnsafeSlow = function allocUnsafeSlow(size) {
+ if (typeof Buffer.allocUnsafeSlow === 'function') {
+ return Buffer.allocUnsafeSlow(size);
+ }
+ if (typeof size !== 'number') {
+ throw new TypeError('size must be a number');
+ }
+ if (size >= MAX_LEN) {
+ throw new RangeError('size is too large');
+ }
+ return new SlowBuffer(size);
+}
+
+}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+},{"buffer":44}],44:[function(require,module,exports){
+(function (global){
+/*!
+ * The buffer module from node.js, for the browser.
+ *
+ * @author Feross Aboukhadijeh <feross@feross.org> <http://feross.org>
+ * @license MIT
+ */
+/* eslint-disable no-proto */
+
+'use strict'
+
+var base64 = require('base64-js')
+var ieee754 = require('ieee754')
+var isArray = require('isarray')
+
+exports.Buffer = Buffer
+exports.SlowBuffer = SlowBuffer
+exports.INSPECT_MAX_BYTES = 50
+
+/**
+ * If `Buffer.TYPED_ARRAY_SUPPORT`:
+ * === true Use Uint8Array implementation (fastest)
+ * === false Use Object implementation (most compatible, even IE6)
+ *
+ * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,
+ * Opera 11.6+, iOS 4.2+.
+ *
+ * Due to various browser bugs, sometimes the Object implementation will be used even
+ * when the browser supports typed arrays.
+ *
+ * Note:
+ *
+ * - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances,
+ * See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438.
+ *
+ * - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function.
+ *
+ * - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of
+ * incorrect length in some situations.
+
+ * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they
+ * get the Object implementation, which is slower but behaves correctly.
+ */
+Buffer.TYPED_ARRAY_SUPPORT = global.TYPED_ARRAY_SUPPORT !== undefined
+ ? global.TYPED_ARRAY_SUPPORT
+ : typedArraySupport()
+
+/*
+ * Export kMaxLength after typed array support is determined.
+ */
+exports.kMaxLength = kMaxLength()
+
+function typedArraySupport () {
+ try {
+ var arr = new Uint8Array(1)
+ arr.__proto__ = {__proto__: Uint8Array.prototype, foo: function () { return 42 }}
+ return arr.foo() === 42 && // typed array instances can be augmented
+ typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray`
+ arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray`
+ } catch (e) {
+ return false
+ }
+}
+
+function kMaxLength () {
+ return Buffer.TYPED_ARRAY_SUPPORT
+ ? 0x7fffffff
+ : 0x3fffffff
+}
+
+function createBuffer (that, length) {
+ if (kMaxLength() < length) {
+ throw new RangeError('Invalid typed array length')
+ }
+ if (Buffer.TYPED_ARRAY_SUPPORT) {
+ // Return an augmented `Uint8Array` instance, for best performance
+ that = new Uint8Array(length)
+ that.__proto__ = Buffer.prototype
+ } else {
+ // Fallback: Return an object instance of the Buffer class
+ if (that === null) {
+ that = new Buffer(length)
+ }
+ that.length = length
+ }
+
+ return that
+}
+
+/**
+ * The Buffer constructor returns instances of `Uint8Array` that have their
+ * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of
+ * `Uint8Array`, so the returned instances will have all the node `Buffer` methods
+ * and the `Uint8Array` methods. Square bracket notation works as expected -- it
+ * returns a single octet.
+ *
+ * The `Uint8Array` prototype remains unmodified.
+ */
+
+function Buffer (arg, encodingOrOffset, length) {
+ if (!Buffer.TYPED_ARRAY_SUPPORT && !(this instanceof Buffer)) {
+ return new Buffer(arg, encodingOrOffset, length)
+ }
+
+ // Common case.
+ if (typeof arg === 'number') {
+ if (typeof encodingOrOffset === 'string') {
+ throw new Error(
+ 'If encoding is specified then the first argument must be a string'
+ )
+ }
+ return allocUnsafe(this, arg)
+ }
+ return from(this, arg, encodingOrOffset, length)
+}
+
+Buffer.poolSize = 8192 // not used by this implementation
+
+// TODO: Legacy, not needed anymore. Remove in next major version.
+Buffer._augment = function (arr) {
+ arr.__proto__ = Buffer.prototype
+ return arr
+}
+
+function from (that, value, encodingOrOffset, length) {
+ if (typeof value === 'number') {
+ throw new TypeError('"value" argument must not be a number')
+ }
+
+ if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) {
+ return fromArrayBuffer(that, value, encodingOrOffset, length)
+ }
+
+ if (typeof value === 'string') {
+ return fromString(that, value, encodingOrOffset)
+ }
+
+ return fromObject(that, value)
+}
+
+/**
+ * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError
+ * if value is a number.
+ * Buffer.from(str[, encoding])
+ * Buffer.from(array)
+ * Buffer.from(buffer)
+ * Buffer.from(arrayBuffer[, byteOffset[, length]])
+ **/
+Buffer.from = function (value, encodingOrOffset, length) {
+ return from(null, value, encodingOrOffset, length)
+}
+
+if (Buffer.TYPED_ARRAY_SUPPORT) {
+ Buffer.prototype.__proto__ = Uint8Array.prototype
+ Buffer.__proto__ = Uint8Array
+ if (typeof Symbol !== 'undefined' && Symbol.species &&
+ Buffer[Symbol.species] === Buffer) {
+ // Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97
+ Object.defineProperty(Buffer, Symbol.species, {
+ value: null,
+ configurable: true
+ })
+ }
+}
+
+function assertSize (size) {
+ if (typeof size !== 'number') {
+ throw new TypeError('"size" argument must be a number')
+ } else if (size < 0) {
+ throw new RangeError('"size" argument must not be negative')
+ }
+}
+
+function alloc (that, size, fill, encoding) {
+ assertSize(size)
+ if (size <= 0) {
+ return createBuffer(that, size)
+ }
+ if (fill !== undefined) {
+ // Only pay attention to encoding if it's a string. This
+ // prevents accidentally sending in a number that would
+ // be interpretted as a start offset.
+ return typeof encoding === 'string'
+ ? createBuffer(that, size).fill(fill, encoding)
+ : createBuffer(that, size).fill(fill)
+ }
+ return createBuffer(that, size)
+}
+
+/**
+ * Creates a new filled Buffer instance.
+ * alloc(size[, fill[, encoding]])
+ **/
+Buffer.alloc = function (size, fill, encoding) {
+ return alloc(null, size, fill, encoding)
+}
+
+function allocUnsafe (that, size) {
+ assertSize(size)
+ that = createBuffer(that, size < 0 ? 0 : checked(size) | 0)
+ if (!Buffer.TYPED_ARRAY_SUPPORT) {
+ for (var i = 0; i < size; ++i) {
+ that[i] = 0
+ }
+ }
+ return that
+}
+
+/**
+ * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.
+ * */
+Buffer.allocUnsafe = function (size) {
+ return allocUnsafe(null, size)
+}
+/**
+ * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.
+ */
+Buffer.allocUnsafeSlow = function (size) {
+ return allocUnsafe(null, size)
+}
+
+function fromString (that, string, encoding) {
+ if (typeof encoding !== 'string' || encoding === '') {
+ encoding = 'utf8'
+ }
+
+ if (!Buffer.isEncoding(encoding)) {
+ throw new TypeError('"encoding" must be a valid string encoding')
+ }
+
+ var length = byteLength(string, encoding) | 0
+ that = createBuffer(that, length)
+
+ var actual = that.write(string, encoding)
+
+ if (actual !== length) {
+ // Writing a hex string, for example, that contains invalid characters will
+ // cause everything after the first invalid character to be ignored. (e.g.
+ // 'abxxcd' will be treated as 'ab')
+ that = that.slice(0, actual)
+ }
+
+ return that
+}
+
+function fromArrayLike (that, array) {
+ var length = array.length < 0 ? 0 : checked(array.length) | 0
+ that = createBuffer(that, length)
+ for (var i = 0; i < length; i += 1) {
+ that[i] = array[i] & 255
+ }
+ return that
+}
+
+function fromArrayBuffer (that, array, byteOffset, length) {
+ array.byteLength // this throws if `array` is not a valid ArrayBuffer
+
+ if (byteOffset < 0 || array.byteLength < byteOffset) {
+ throw new RangeError('\'offset\' is out of bounds')
+ }
+
+ if (array.byteLength < byteOffset + (length || 0)) {
+ throw new RangeError('\'length\' is out of bounds')
+ }
+
+ if (byteOffset === undefined && length === undefined) {
+ array = new Uint8Array(array)
+ } else if (length === undefined) {
+ array = new Uint8Array(array, byteOffset)
+ } else {
+ array = new Uint8Array(array, byteOffset, length)
+ }
+
+ if (Buffer.TYPED_ARRAY_SUPPORT) {
+ // Return an augmented `Uint8Array` instance, for best performance
+ that = array
+ that.__proto__ = Buffer.prototype
+ } else {
+ // Fallback: Return an object instance of the Buffer class
+ that = fromArrayLike(that, array)
+ }
+ return that
+}
+
+function fromObject (that, obj) {
+ if (Buffer.isBuffer(obj)) {
+ var len = checked(obj.length) | 0
+ that = createBuffer(that, len)
+
+ if (that.length === 0) {
+ return that
+ }
+
+ obj.copy(that, 0, 0, len)
+ return that
+ }
+
+ if (obj) {
+ if ((typeof ArrayBuffer !== 'undefined' &&
+ obj.buffer instanceof ArrayBuffer) || 'length' in obj) {
+ if (typeof obj.length !== 'number' || isnan(obj.length)) {
+ return createBuffer(that, 0)
+ }
+ return fromArrayLike(that, obj)
+ }
+
+ if (obj.type === 'Buffer' && isArray(obj.data)) {
+ return fromArrayLike(that, obj.data)
+ }
+ }
+
+ throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.')
+}
+
+function checked (length) {
+ // Note: cannot use `length < kMaxLength()` here because that fails when
+ // length is NaN (which is otherwise coerced to zero.)
+ if (length >= kMaxLength()) {
+ throw new RangeError('Attempt to allocate Buffer larger than maximum ' +
+ 'size: 0x' + kMaxLength().toString(16) + ' bytes')
+ }
+ return length | 0
+}
+
+function SlowBuffer (length) {
+ if (+length != length) { // eslint-disable-line eqeqeq
+ length = 0
+ }
+ return Buffer.alloc(+length)
+}
+
+Buffer.isBuffer = function isBuffer (b) {
+ return !!(b != null && b._isBuffer)
+}
+
+Buffer.compare = function compare (a, b) {
+ if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {
+ throw new TypeError('Arguments must be Buffers')
+ }
+
+ if (a === b) return 0
+
+ var x = a.length
+ var y = b.length
+
+ for (var i = 0, len = Math.min(x, y); i < len; ++i) {
+ if (a[i] !== b[i]) {
+ x = a[i]
+ y = b[i]
+ break
+ }
+ }
+
+ if (x < y) return -1
+ if (y < x) return 1
+ return 0
+}
+
+Buffer.isEncoding = function isEncoding (encoding) {
+ switch (String(encoding).toLowerCase()) {
+ case 'hex':
+ case 'utf8':
+ case 'utf-8':
+ case 'ascii':
+ case 'latin1':
+ case 'binary':
+ case 'base64':
+ case 'ucs2':
+ case 'ucs-2':
+ case 'utf16le':
+ case 'utf-16le':
+ return true
+ default:
+ return false
+ }
+}
+
+Buffer.concat = function concat (list, length) {
+ if (!isArray(list)) {
+ throw new TypeError('"list" argument must be an Array of Buffers')
+ }
+
+ if (list.length === 0) {
+ return Buffer.alloc(0)
+ }
+
+ var i
+ if (length === undefined) {
+ length = 0
+ for (i = 0; i < list.length; ++i) {
+ length += list[i].length
+ }
+ }
+
+ var buffer = Buffer.allocUnsafe(length)
+ var pos = 0
+ for (i = 0; i < list.length; ++i) {
+ var buf = list[i]
+ if (!Buffer.isBuffer(buf)) {
+ throw new TypeError('"list" argument must be an Array of Buffers')
+ }
+ buf.copy(buffer, pos)
+ pos += buf.length
+ }
+ return buffer
+}
+
+function byteLength (string, encoding) {
+ if (Buffer.isBuffer(string)) {
+ return string.length
+ }
+ if (typeof ArrayBuffer !== 'undefined' && typeof ArrayBuffer.isView === 'function' &&
+ (ArrayBuffer.isView(string) || string instanceof ArrayBuffer)) {
+ return string.byteLength
+ }
+ if (typeof string !== 'string') {
+ string = '' + string
+ }
+
+ var len = string.length
+ if (len === 0) return 0
+
+ // Use a for loop to avoid recursion
+ var loweredCase = false
+ for (;;) {
+ switch (encoding) {
+ case 'ascii':
+ case 'latin1':
+ case 'binary':
+ return len
+ case 'utf8':
+ case 'utf-8':
+ case undefined:
+ return utf8ToBytes(string).length
+ case 'ucs2':
+ case 'ucs-2':
+ case 'utf16le':
+ case 'utf-16le':
+ return len * 2
+ case 'hex':
+ return len >>> 1
+ case 'base64':
+ return base64ToBytes(string).length
+ default:
+ if (loweredCase) return utf8ToBytes(string).length // assume utf8
+ encoding = ('' + encoding).toLowerCase()
+ loweredCase = true
+ }
+ }
+}
+Buffer.byteLength = byteLength
+
+function slowToString (encoding, start, end) {
+ var loweredCase = false
+
+ // No need to verify that "this.length <= MAX_UINT32" since it's a read-only
+ // property of a typed array.
+
+ // This behaves neither like String nor Uint8Array in that we set start/end
+ // to their upper/lower bounds if the value passed is out of range.
+ // undefined is handled specially as per ECMA-262 6th Edition,
+ // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.
+ if (start === undefined || start < 0) {
+ start = 0
+ }
+ // Return early if start > this.length. Done here to prevent potential uint32
+ // coercion fail below.
+ if (start > this.length) {
+ return ''
+ }
+
+ if (end === undefined || end > this.length) {
+ end = this.length
+ }
+
+ if (end <= 0) {
+ return ''
+ }
+
+ // Force coersion to uint32. This will also coerce falsey/NaN values to 0.
+ end >>>= 0
+ start >>>= 0
+
+ if (end <= start) {
+ return ''
+ }
+
+ if (!encoding) encoding = 'utf8'
+
+ while (true) {
+ switch (encoding) {
+ case 'hex':
+ return hexSlice(this, start, end)
+
+ case 'utf8':
+ case 'utf-8':
+ return utf8Slice(this, start, end)
+
+ case 'ascii':
+ return asciiSlice(this, start, end)
+
+ case 'latin1':
+ case 'binary':
+ return latin1Slice(this, start, end)
+
+ case 'base64':
+ return base64Slice(this, start, end)
+
+ case 'ucs2':
+ case 'ucs-2':
+ case 'utf16le':
+ case 'utf-16le':
+ return utf16leSlice(this, start, end)
+
+ default:
+ if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
+ encoding = (encoding + '').toLowerCase()
+ loweredCase = true
+ }
+ }
+}
+
+// The property is used by `Buffer.isBuffer` and `is-buffer` (in Safari 5-7) to detect
+// Buffer instances.
+Buffer.prototype._isBuffer = true
+
+function swap (b, n, m) {
+ var i = b[n]
+ b[n] = b[m]
+ b[m] = i
+}
+
+Buffer.prototype.swap16 = function swap16 () {
+ var len = this.length
+ if (len % 2 !== 0) {
+ throw new RangeError('Buffer size must be a multiple of 16-bits')
+ }
+ for (var i = 0; i < len; i += 2) {
+ swap(this, i, i + 1)
+ }
+ return this
+}
+
+Buffer.prototype.swap32 = function swap32 () {
+ var len = this.length
+ if (len % 4 !== 0) {
+ throw new RangeError('Buffer size must be a multiple of 32-bits')
+ }
+ for (var i = 0; i < len; i += 4) {
+ swap(this, i, i + 3)
+ swap(this, i + 1, i + 2)
+ }
+ return this
+}
+
+Buffer.prototype.swap64 = function swap64 () {
+ var len = this.length
+ if (len % 8 !== 0) {
+ throw new RangeError('Buffer size must be a multiple of 64-bits')
+ }
+ for (var i = 0; i < len; i += 8) {
+ swap(this, i, i + 7)
+ swap(this, i + 1, i + 6)
+ swap(this, i + 2, i + 5)
+ swap(this, i + 3, i + 4)
+ }
+ return this
+}
+
+Buffer.prototype.toString = function toString () {
+ var length = this.length | 0
+ if (length === 0) return ''
+ if (arguments.length === 0) return utf8Slice(this, 0, length)
+ return slowToString.apply(this, arguments)
+}
+
+Buffer.prototype.equals = function equals (b) {
+ if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')
+ if (this === b) return true
+ return Buffer.compare(this, b) === 0
+}
+
+Buffer.prototype.inspect = function inspect () {
+ var str = ''
+ var max = exports.INSPECT_MAX_BYTES
+ if (this.length > 0) {
+ str = this.toString('hex', 0, max).match(/.{2}/g).join(' ')
+ if (this.length > max) str += ' ... '
+ }
+ return '<Buffer ' + str + '>'
+}
+
+Buffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {
+ if (!Buffer.isBuffer(target)) {
+ throw new TypeError('Argument must be a Buffer')
+ }
+
+ if (start === undefined) {
+ start = 0
+ }
+ if (end === undefined) {
+ end = target ? target.length : 0
+ }
+ if (thisStart === undefined) {
+ thisStart = 0
+ }
+ if (thisEnd === undefined) {
+ thisEnd = this.length
+ }
+
+ if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {
+ throw new RangeError('out of range index')
+ }
+
+ if (thisStart >= thisEnd && start >= end) {
+ return 0
+ }
+ if (thisStart >= thisEnd) {
+ return -1
+ }
+ if (start >= end) {
+ return 1
+ }
+
+ start >>>= 0
+ end >>>= 0
+ thisStart >>>= 0
+ thisEnd >>>= 0
+
+ if (this === target) return 0
+
+ var x = thisEnd - thisStart
+ var y = end - start
+ var len = Math.min(x, y)
+
+ var thisCopy = this.slice(thisStart, thisEnd)
+ var targetCopy = target.slice(start, end)
+
+ for (var i = 0; i < len; ++i) {
+ if (thisCopy[i] !== targetCopy[i]) {
+ x = thisCopy[i]
+ y = targetCopy[i]
+ break
+ }
+ }
+
+ if (x < y) return -1
+ if (y < x) return 1
+ return 0
+}
+
+// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,
+// OR the last index of `val` in `buffer` at offset <= `byteOffset`.
+//
+// Arguments:
+// - buffer - a Buffer to search
+// - val - a string, Buffer, or number
+// - byteOffset - an index into `buffer`; will be clamped to an int32
+// - encoding - an optional encoding, relevant is val is a string
+// - dir - true for indexOf, false for lastIndexOf
+function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {
+ // Empty buffer means no match
+ if (buffer.length === 0) return -1
+
+ // Normalize byteOffset
+ if (typeof byteOffset === 'string') {
+ encoding = byteOffset
+ byteOffset = 0
+ } else if (byteOffset > 0x7fffffff) {
+ byteOffset = 0x7fffffff
+ } else if (byteOffset < -0x80000000) {
+ byteOffset = -0x80000000
+ }
+ byteOffset = +byteOffset // Coerce to Number.
+ if (isNaN(byteOffset)) {
+ // byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer
+ byteOffset = dir ? 0 : (buffer.length - 1)
+ }
+
+ // Normalize byteOffset: negative offsets start from the end of the buffer
+ if (byteOffset < 0) byteOffset = buffer.length + byteOffset
+ if (byteOffset >= buffer.length) {
+ if (dir) return -1
+ else byteOffset = buffer.length - 1
+ } else if (byteOffset < 0) {
+ if (dir) byteOffset = 0
+ else return -1
+ }
+
+ // Normalize val
+ if (typeof val === 'string') {
+ val = Buffer.from(val, encoding)
+ }
+
+ // Finally, search either indexOf (if dir is true) or lastIndexOf
+ if (Buffer.isBuffer(val)) {
+ // Special case: looking for empty string/buffer always fails
+ if (val.length === 0) {
+ return -1
+ }
+ return arrayIndexOf(buffer, val, byteOffset, encoding, dir)
+ } else if (typeof val === 'number') {
+ val = val & 0xFF // Search for a byte value [0-255]
+ if (Buffer.TYPED_ARRAY_SUPPORT &&
+ typeof Uint8Array.prototype.indexOf === 'function') {
+ if (dir) {
+ return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)
+ } else {
+ return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)
+ }
+ }
+ return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir)
+ }
+
+ throw new TypeError('val must be string, number or Buffer')
+}
+
+function arrayIndexOf (arr, val, byteOffset, encoding, dir) {
+ var indexSize = 1
+ var arrLength = arr.length
+ var valLength = val.length
+
+ if (encoding !== undefined) {
+ encoding = String(encoding).toLowerCase()
+ if (encoding === 'ucs2' || encoding === 'ucs-2' ||
+ encoding === 'utf16le' || encoding === 'utf-16le') {
+ if (arr.length < 2 || val.length < 2) {
+ return -1
+ }
+ indexSize = 2
+ arrLength /= 2
+ valLength /= 2
+ byteOffset /= 2
+ }
+ }
+
+ function read (buf, i) {
+ if (indexSize === 1) {
+ return buf[i]
+ } else {
+ return buf.readUInt16BE(i * indexSize)
+ }
+ }
+
+ var i
+ if (dir) {
+ var foundIndex = -1
+ for (i = byteOffset; i < arrLength; i++) {
+ if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {
+ if (foundIndex === -1) foundIndex = i
+ if (i - foundIndex + 1 === valLength) return foundIndex * indexSize
+ } else {
+ if (foundIndex !== -1) i -= i - foundIndex
+ foundIndex = -1
+ }
+ }
+ } else {
+ if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength
+ for (i = byteOffset; i >= 0; i--) {
+ var found = true
+ for (var j = 0; j < valLength; j++) {
+ if (read(arr, i + j) !== read(val, j)) {
+ found = false
+ break
+ }
+ }
+ if (found) return i
+ }
+ }
+
+ return -1
+}
+
+Buffer.prototype.includes = function includes (val, byteOffset, encoding) {
+ return this.indexOf(val, byteOffset, encoding) !== -1
+}
+
+Buffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {
+ return bidirectionalIndexOf(this, val, byteOffset, encoding, true)
+}
+
+Buffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {
+ return bidirectionalIndexOf(this, val, byteOffset, encoding, false)
+}
+
+function hexWrite (buf, string, offset, length) {
+ offset = Number(offset) || 0
+ var remaining = buf.length - offset
+ if (!length) {
+ length = remaining
+ } else {
+ length = Number(length)
+ if (length > remaining) {
+ length = remaining
+ }
+ }
+
+ // must be an even number of digits
+ var strLen = string.length
+ if (strLen % 2 !== 0) throw new TypeError('Invalid hex string')
+
+ if (length > strLen / 2) {
+ length = strLen / 2
+ }
+ for (var i = 0; i < length; ++i) {
+ var parsed = parseInt(string.substr(i * 2, 2), 16)
+ if (isNaN(parsed)) return i
+ buf[offset + i] = parsed
+ }
+ return i
+}
+
+function utf8Write (buf, string, offset, length) {
+ return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)
+}
+
+function asciiWrite (buf, string, offset, length) {
+ return blitBuffer(asciiToBytes(string), buf, offset, length)
+}
+
+function latin1Write (buf, string, offset, length) {
+ return asciiWrite(buf, string, offset, length)
+}
+
+function base64Write (buf, string, offset, length) {
+ return blitBuffer(base64ToBytes(string), buf, offset, length)
+}
+
+function ucs2Write (buf, string, offset, length) {
+ return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)
+}
+
+Buffer.prototype.write = function write (string, offset, length, encoding) {
+ // Buffer#write(string)
+ if (offset === undefined) {
+ encoding = 'utf8'
+ length = this.length
+ offset = 0
+ // Buffer#write(string, encoding)
+ } else if (length === undefined && typeof offset === 'string') {
+ encoding = offset
+ length = this.length
+ offset = 0
+ // Buffer#write(string, offset[, length][, encoding])
+ } else if (isFinite(offset)) {
+ offset = offset | 0
+ if (isFinite(length)) {
+ length = length | 0
+ if (encoding === undefined) encoding = 'utf8'
+ } else {
+ encoding = length
+ length = undefined
+ }
+ // legacy write(string, encoding, offset, length) - remove in v0.13
+ } else {
+ throw new Error(
+ 'Buffer.write(string, encoding, offset[, length]) is no longer supported'
+ )
+ }
+
+ var remaining = this.length - offset
+ if (length === undefined || length > remaining) length = remaining
+
+ if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {
+ throw new RangeError('Attempt to write outside buffer bounds')
+ }
+
+ if (!encoding) encoding = 'utf8'
+
+ var loweredCase = false
+ for (;;) {
+ switch (encoding) {
+ case 'hex':
+ return hexWrite(this, string, offset, length)
+
+ case 'utf8':
+ case 'utf-8':
+ return utf8Write(this, string, offset, length)
+
+ case 'ascii':
+ return asciiWrite(this, string, offset, length)
+
+ case 'latin1':
+ case 'binary':
+ return latin1Write(this, string, offset, length)
+
+ case 'base64':
+ // Warning: maxLength not taken into account in base64Write
+ return base64Write(this, string, offset, length)
+
+ case 'ucs2':
+ case 'ucs-2':
+ case 'utf16le':
+ case 'utf-16le':
+ return ucs2Write(this, string, offset, length)
+
+ default:
+ if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
+ encoding = ('' + encoding).toLowerCase()
+ loweredCase = true
+ }
+ }
+}
+
+Buffer.prototype.toJSON = function toJSON () {
+ return {
+ type: 'Buffer',
+ data: Array.prototype.slice.call(this._arr || this, 0)
+ }
+}
+
+function base64Slice (buf, start, end) {
+ if (start === 0 && end === buf.length) {
+ return base64.fromByteArray(buf)
+ } else {
+ return base64.fromByteArray(buf.slice(start, end))
+ }
+}
+
+function utf8Slice (buf, start, end) {
+ end = Math.min(buf.length, end)
+ var res = []
+
+ var i = start
+ while (i < end) {
+ var firstByte = buf[i]
+ var codePoint = null
+ var bytesPerSequence = (firstByte > 0xEF) ? 4
+ : (firstByte > 0xDF) ? 3
+ : (firstByte > 0xBF) ? 2
+ : 1
+
+ if (i + bytesPerSequence <= end) {
+ var secondByte, thirdByte, fourthByte, tempCodePoint
+
+ switch (bytesPerSequence) {
+ case 1:
+ if (firstByte < 0x80) {
+ codePoint = firstByte
+ }
+ break
+ case 2:
+ secondByte = buf[i + 1]
+ if ((secondByte & 0xC0) === 0x80) {
+ tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)
+ if (tempCodePoint > 0x7F) {
+ codePoint = tempCodePoint
+ }
+ }
+ break
+ case 3:
+ secondByte = buf[i + 1]
+ thirdByte = buf[i + 2]
+ if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {
+ tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)
+ if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {
+ codePoint = tempCodePoint
+ }
+ }
+ break
+ case 4:
+ secondByte = buf[i + 1]
+ thirdByte = buf[i + 2]
+ fourthByte = buf[i + 3]
+ if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {
+ tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)
+ if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {
+ codePoint = tempCodePoint
+ }
+ }
+ }
+ }
+
+ if (codePoint === null) {
+ // we did not generate a valid codePoint so insert a
+ // replacement char (U+FFFD) and advance only 1 byte
+ codePoint = 0xFFFD
+ bytesPerSequence = 1
+ } else if (codePoint > 0xFFFF) {
+ // encode to utf16 (surrogate pair dance)
+ codePoint -= 0x10000
+ res.push(codePoint >>> 10 & 0x3FF | 0xD800)
+ codePoint = 0xDC00 | codePoint & 0x3FF
+ }
+
+ res.push(codePoint)
+ i += bytesPerSequence
+ }
+
+ return decodeCodePointsArray(res)
+}
+
+// Based on http://stackoverflow.com/a/22747272/680742, the browser with
+// the lowest limit is Chrome, with 0x10000 args.
+// We go 1 magnitude less, for safety
+var MAX_ARGUMENTS_LENGTH = 0x1000
+
+function decodeCodePointsArray (codePoints) {
+ var len = codePoints.length
+ if (len <= MAX_ARGUMENTS_LENGTH) {
+ return String.fromCharCode.apply(String, codePoints) // avoid extra slice()
+ }
+
+ // Decode in chunks to avoid "call stack size exceeded".
+ var res = ''
+ var i = 0
+ while (i < len) {
+ res += String.fromCharCode.apply(
+ String,
+ codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)
+ )
+ }
+ return res
+}
+
+function asciiSlice (buf, start, end) {
+ var ret = ''
+ end = Math.min(buf.length, end)
+
+ for (var i = start; i < end; ++i) {
+ ret += String.fromCharCode(buf[i] & 0x7F)
+ }
+ return ret
+}
+
+function latin1Slice (buf, start, end) {
+ var ret = ''
+ end = Math.min(buf.length, end)
+
+ for (var i = start; i < end; ++i) {
+ ret += String.fromCharCode(buf[i])
+ }
+ return ret
+}
+
+function hexSlice (buf, start, end) {
+ var len = buf.length
+
+ if (!start || start < 0) start = 0
+ if (!end || end < 0 || end > len) end = len
+
+ var out = ''
+ for (var i = start; i < end; ++i) {
+ out += toHex(buf[i])
+ }
+ return out
+}
+
+function utf16leSlice (buf, start, end) {
+ var bytes = buf.slice(start, end)
+ var res = ''
+ for (var i = 0; i < bytes.length; i += 2) {
+ res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256)
+ }
+ return res
+}
+
+Buffer.prototype.slice = function slice (start, end) {
+ var len = this.length
+ start = ~~start
+ end = end === undefined ? len : ~~end
+
+ if (start < 0) {
+ start += len
+ if (start < 0) start = 0
+ } else if (start > len) {
+ start = len
+ }
+
+ if (end < 0) {
+ end += len
+ if (end < 0) end = 0
+ } else if (end > len) {
+ end = len
+ }
+
+ if (end < start) end = start
+
+ var newBuf
+ if (Buffer.TYPED_ARRAY_SUPPORT) {
+ newBuf = this.subarray(start, end)
+ newBuf.__proto__ = Buffer.prototype
+ } else {
+ var sliceLen = end - start
+ newBuf = new Buffer(sliceLen, undefined)
+ for (var i = 0; i < sliceLen; ++i) {
+ newBuf[i] = this[i + start]
+ }
+ }
+
+ return newBuf
+}
+
+/*
+ * Need to make sure that buffer isn't trying to write out of bounds.
+ */
+function checkOffset (offset, ext, length) {
+ if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')
+ if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')
+}
+
+Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {
+ offset = offset | 0
+ byteLength = byteLength | 0
+ if (!noAssert) checkOffset(offset, byteLength, this.length)
+
+ var val = this[offset]
+ var mul = 1
+ var i = 0
+ while (++i < byteLength && (mul *= 0x100)) {
+ val += this[offset + i] * mul
+ }
+
+ return val
+}
+
+Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {
+ offset = offset | 0
+ byteLength = byteLength | 0
+ if (!noAssert) {
+ checkOffset(offset, byteLength, this.length)
+ }
+
+ var val = this[offset + --byteLength]
+ var mul = 1
+ while (byteLength > 0 && (mul *= 0x100)) {
+ val += this[offset + --byteLength] * mul
+ }
+
+ return val
+}
+
+Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 1, this.length)
+ return this[offset]
+}
+
+Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 2, this.length)
+ return this[offset] | (this[offset + 1] << 8)
+}
+
+Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 2, this.length)
+ return (this[offset] << 8) | this[offset + 1]
+}
+
+Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 4, this.length)
+
+ return ((this[offset]) |
+ (this[offset + 1] << 8) |
+ (this[offset + 2] << 16)) +
+ (this[offset + 3] * 0x1000000)
+}
+
+Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 4, this.length)
+
+ return (this[offset] * 0x1000000) +
+ ((this[offset + 1] << 16) |
+ (this[offset + 2] << 8) |
+ this[offset + 3])
+}
+
+Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {
+ offset = offset | 0
+ byteLength = byteLength | 0
+ if (!noAssert) checkOffset(offset, byteLength, this.length)
+
+ var val = this[offset]
+ var mul = 1
+ var i = 0
+ while (++i < byteLength && (mul *= 0x100)) {
+ val += this[offset + i] * mul
+ }
+ mul *= 0x80
+
+ if (val >= mul) val -= Math.pow(2, 8 * byteLength)
+
+ return val
+}
+
+Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {
+ offset = offset | 0
+ byteLength = byteLength | 0
+ if (!noAssert) checkOffset(offset, byteLength, this.length)
+
+ var i = byteLength
+ var mul = 1
+ var val = this[offset + --i]
+ while (i > 0 && (mul *= 0x100)) {
+ val += this[offset + --i] * mul
+ }
+ mul *= 0x80
+
+ if (val >= mul) val -= Math.pow(2, 8 * byteLength)
+
+ return val
+}
+
+Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 1, this.length)
+ if (!(this[offset] & 0x80)) return (this[offset])
+ return ((0xff - this[offset] + 1) * -1)
+}
+
+Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 2, this.length)
+ var val = this[offset] | (this[offset + 1] << 8)
+ return (val & 0x8000) ? val | 0xFFFF0000 : val
+}
+
+Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 2, this.length)
+ var val = this[offset + 1] | (this[offset] << 8)
+ return (val & 0x8000) ? val | 0xFFFF0000 : val
+}
+
+Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 4, this.length)
+
+ return (this[offset]) |
+ (this[offset + 1] << 8) |
+ (this[offset + 2] << 16) |
+ (this[offset + 3] << 24)
+}
+
+Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 4, this.length)
+
+ return (this[offset] << 24) |
+ (this[offset + 1] << 16) |
+ (this[offset + 2] << 8) |
+ (this[offset + 3])
+}
+
+Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 4, this.length)
+ return ieee754.read(this, offset, true, 23, 4)
+}
+
+Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 4, this.length)
+ return ieee754.read(this, offset, false, 23, 4)
+}
+
+Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 8, this.length)
+ return ieee754.read(this, offset, true, 52, 8)
+}
+
+Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 8, this.length)
+ return ieee754.read(this, offset, false, 52, 8)
+}
+
+function checkInt (buf, value, offset, ext, max, min) {
+ if (!Buffer.isBuffer(buf)) throw new TypeError('"buffer" argument must be a Buffer instance')
+ if (value > max || value < min) throw new RangeError('"value" argument is out of bounds')
+ if (offset + ext > buf.length) throw new RangeError('Index out of range')
+}
+
+Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {
+ value = +value
+ offset = offset | 0
+ byteLength = byteLength | 0
+ if (!noAssert) {
+ var maxBytes = Math.pow(2, 8 * byteLength) - 1
+ checkInt(this, value, offset, byteLength, maxBytes, 0)
+ }
+
+ var mul = 1
+ var i = 0
+ this[offset] = value & 0xFF
+ while (++i < byteLength && (mul *= 0x100)) {
+ this[offset + i] = (value / mul) & 0xFF
+ }
+
+ return offset + byteLength
+}
+
+Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {
+ value = +value
+ offset = offset | 0
+ byteLength = byteLength | 0
+ if (!noAssert) {
+ var maxBytes = Math.pow(2, 8 * byteLength) - 1
+ checkInt(this, value, offset, byteLength, maxBytes, 0)
+ }
+
+ var i = byteLength - 1
+ var mul = 1
+ this[offset + i] = value & 0xFF
+ while (--i >= 0 && (mul *= 0x100)) {
+ this[offset + i] = (value / mul) & 0xFF
+ }
+
+ return offset + byteLength
+}
+
+Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {
+ value = +value
+ offset = offset | 0
+ if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)
+ if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)
+ this[offset] = (value & 0xff)
+ return offset + 1
+}
+
+function objectWriteUInt16 (buf, value, offset, littleEndian) {
+ if (value < 0) value = 0xffff + value + 1
+ for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; ++i) {
+ buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>>
+ (littleEndian ? i : 1 - i) * 8
+ }
+}
+
+Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {
+ value = +value
+ offset = offset | 0
+ if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
+ if (Buffer.TYPED_ARRAY_SUPPORT) {
+ this[offset] = (value & 0xff)
+ this[offset + 1] = (value >>> 8)
+ } else {
+ objectWriteUInt16(this, value, offset, true)
+ }
+ return offset + 2
+}
+
+Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {
+ value = +value
+ offset = offset | 0
+ if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
+ if (Buffer.TYPED_ARRAY_SUPPORT) {
+ this[offset] = (value >>> 8)
+ this[offset + 1] = (value & 0xff)
+ } else {
+ objectWriteUInt16(this, value, offset, false)
+ }
+ return offset + 2
+}
+
+function objectWriteUInt32 (buf, value, offset, littleEndian) {
+ if (value < 0) value = 0xffffffff + value + 1
+ for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; ++i) {
+ buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff
+ }
+}
+
+Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {
+ value = +value
+ offset = offset | 0
+ if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
+ if (Buffer.TYPED_ARRAY_SUPPORT) {
+ this[offset + 3] = (value >>> 24)
+ this[offset + 2] = (value >>> 16)
+ this[offset + 1] = (value >>> 8)
+ this[offset] = (value & 0xff)
+ } else {
+ objectWriteUInt32(this, value, offset, true)
+ }
+ return offset + 4
+}
+
+Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {
+ value = +value
+ offset = offset | 0
+ if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
+ if (Buffer.TYPED_ARRAY_SUPPORT) {
+ this[offset] = (value >>> 24)
+ this[offset + 1] = (value >>> 16)
+ this[offset + 2] = (value >>> 8)
+ this[offset + 3] = (value & 0xff)
+ } else {
+ objectWriteUInt32(this, value, offset, false)
+ }
+ return offset + 4
+}
+
+Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {
+ value = +value
+ offset = offset | 0
+ if (!noAssert) {
+ var limit = Math.pow(2, 8 * byteLength - 1)
+
+ checkInt(this, value, offset, byteLength, limit - 1, -limit)
+ }
+
+ var i = 0
+ var mul = 1
+ var sub = 0
+ this[offset] = value & 0xFF
+ while (++i < byteLength && (mul *= 0x100)) {
+ if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {
+ sub = 1
+ }
+ this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
+ }
+
+ return offset + byteLength
+}
+
+Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {
+ value = +value
+ offset = offset | 0
+ if (!noAssert) {
+ var limit = Math.pow(2, 8 * byteLength - 1)
+
+ checkInt(this, value, offset, byteLength, limit - 1, -limit)
+ }
+
+ var i = byteLength - 1
+ var mul = 1
+ var sub = 0
+ this[offset + i] = value & 0xFF
+ while (--i >= 0 && (mul *= 0x100)) {
+ if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {
+ sub = 1
+ }
+ this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
+ }
+
+ return offset + byteLength
+}
+
+Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {
+ value = +value
+ offset = offset | 0
+ if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)
+ if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)
+ if (value < 0) value = 0xff + value + 1
+ this[offset] = (value & 0xff)
+ return offset + 1
+}
+
+Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {
+ value = +value
+ offset = offset | 0
+ if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
+ if (Buffer.TYPED_ARRAY_SUPPORT) {
+ this[offset] = (value & 0xff)
+ this[offset + 1] = (value >>> 8)
+ } else {
+ objectWriteUInt16(this, value, offset, true)
+ }
+ return offset + 2
+}
+
+Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {
+ value = +value
+ offset = offset | 0
+ if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
+ if (Buffer.TYPED_ARRAY_SUPPORT) {
+ this[offset] = (value >>> 8)
+ this[offset + 1] = (value & 0xff)
+ } else {
+ objectWriteUInt16(this, value, offset, false)
+ }
+ return offset + 2
+}
+
+Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {
+ value = +value
+ offset = offset | 0
+ if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
+ if (Buffer.TYPED_ARRAY_SUPPORT) {
+ this[offset] = (value & 0xff)
+ this[offset + 1] = (value >>> 8)
+ this[offset + 2] = (value >>> 16)
+ this[offset + 3] = (value >>> 24)
+ } else {
+ objectWriteUInt32(this, value, offset, true)
+ }
+ return offset + 4
+}
+
+Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {
+ value = +value
+ offset = offset | 0
+ if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
+ if (value < 0) value = 0xffffffff + value + 1
+ if (Buffer.TYPED_ARRAY_SUPPORT) {
+ this[offset] = (value >>> 24)
+ this[offset + 1] = (value >>> 16)
+ this[offset + 2] = (value >>> 8)
+ this[offset + 3] = (value & 0xff)
+ } else {
+ objectWriteUInt32(this, value, offset, false)
+ }
+ return offset + 4
+}
+
+function checkIEEE754 (buf, value, offset, ext, max, min) {
+ if (offset + ext > buf.length) throw new RangeError('Index out of range')
+ if (offset < 0) throw new RangeError('Index out of range')
+}
+
+function writeFloat (buf, value, offset, littleEndian, noAssert) {
+ if (!noAssert) {
+ checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)
+ }
+ ieee754.write(buf, value, offset, littleEndian, 23, 4)
+ return offset + 4
+}
+
+Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {
+ return writeFloat(this, value, offset, true, noAssert)
+}
+
+Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {
+ return writeFloat(this, value, offset, false, noAssert)
+}
+
+function writeDouble (buf, value, offset, littleEndian, noAssert) {
+ if (!noAssert) {
+ checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)
+ }
+ ieee754.write(buf, value, offset, littleEndian, 52, 8)
+ return offset + 8
+}
+
+Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {
+ return writeDouble(this, value, offset, true, noAssert)
+}
+
+Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {
+ return writeDouble(this, value, offset, false, noAssert)
+}
+
+// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)
+Buffer.prototype.copy = function copy (target, targetStart, start, end) {
+ if (!start) start = 0
+ if (!end && end !== 0) end = this.length
+ if (targetStart >= target.length) targetStart = target.length
+ if (!targetStart) targetStart = 0
+ if (end > 0 && end < start) end = start
+
+ // Copy 0 bytes; we're done
+ if (end === start) return 0
+ if (target.length === 0 || this.length === 0) return 0
+
+ // Fatal error conditions
+ if (targetStart < 0) {
+ throw new RangeError('targetStart out of bounds')
+ }
+ if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds')
+ if (end < 0) throw new RangeError('sourceEnd out of bounds')
+
+ // Are we oob?
+ if (end > this.length) end = this.length
+ if (target.length - targetStart < end - start) {
+ end = target.length - targetStart + start
+ }
+
+ var len = end - start
+ var i
+
+ if (this === target && start < targetStart && targetStart < end) {
+ // descending copy from end
+ for (i = len - 1; i >= 0; --i) {
+ target[i + targetStart] = this[i + start]
+ }
+ } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) {
+ // ascending copy from start
+ for (i = 0; i < len; ++i) {
+ target[i + targetStart] = this[i + start]
+ }
+ } else {
+ Uint8Array.prototype.set.call(
+ target,
+ this.subarray(start, start + len),
+ targetStart
+ )
+ }
+
+ return len
+}
+
+// Usage:
+// buffer.fill(number[, offset[, end]])
+// buffer.fill(buffer[, offset[, end]])
+// buffer.fill(string[, offset[, end]][, encoding])
+Buffer.prototype.fill = function fill (val, start, end, encoding) {
+ // Handle string cases:
+ if (typeof val === 'string') {
+ if (typeof start === 'string') {
+ encoding = start
+ start = 0
+ end = this.length
+ } else if (typeof end === 'string') {
+ encoding = end
+ end = this.length
+ }
+ if (val.length === 1) {
+ var code = val.charCodeAt(0)
+ if (code < 256) {
+ val = code
+ }
+ }
+ if (encoding !== undefined && typeof encoding !== 'string') {
+ throw new TypeError('encoding must be a string')
+ }
+ if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {
+ throw new TypeError('Unknown encoding: ' + encoding)
+ }
+ } else if (typeof val === 'number') {
+ val = val & 255
+ }
+
+ // Invalid ranges are not set to a default, so can range check early.
+ if (start < 0 || this.length < start || this.length < end) {
+ throw new RangeError('Out of range index')
+ }
+
+ if (end <= start) {
+ return this
+ }
+
+ start = start >>> 0
+ end = end === undefined ? this.length : end >>> 0
+
+ if (!val) val = 0
+
+ var i
+ if (typeof val === 'number') {
+ for (i = start; i < end; ++i) {
+ this[i] = val
+ }
+ } else {
+ var bytes = Buffer.isBuffer(val)
+ ? val
+ : utf8ToBytes(new Buffer(val, encoding).toString())
+ var len = bytes.length
+ for (i = 0; i < end - start; ++i) {
+ this[i + start] = bytes[i % len]
+ }
+ }
+
+ return this
+}
+
+// HELPER FUNCTIONS
+// ================
+
+var INVALID_BASE64_RE = /[^+\/0-9A-Za-z-_]/g
+
+function base64clean (str) {
+ // Node strips out invalid characters like \n and \t from the string, base64-js does not
+ str = stringtrim(str).replace(INVALID_BASE64_RE, '')
+ // Node converts strings with length < 2 to ''
+ if (str.length < 2) return ''
+ // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not
+ while (str.length % 4 !== 0) {
+ str = str + '='
+ }
+ return str
+}
+
+function stringtrim (str) {
+ if (str.trim) return str.trim()
+ return str.replace(/^\s+|\s+$/g, '')
+}
+
+function toHex (n) {
+ if (n < 16) return '0' + n.toString(16)
+ return n.toString(16)
+}
+
+function utf8ToBytes (string, units) {
+ units = units || Infinity
+ var codePoint
+ var length = string.length
+ var leadSurrogate = null
+ var bytes = []
+
+ for (var i = 0; i < length; ++i) {
+ codePoint = string.charCodeAt(i)
+
+ // is surrogate component
+ if (codePoint > 0xD7FF && codePoint < 0xE000) {
+ // last char was a lead
+ if (!leadSurrogate) {
+ // no lead yet
+ if (codePoint > 0xDBFF) {
+ // unexpected trail
+ if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
+ continue
+ } else if (i + 1 === length) {
+ // unpaired lead
+ if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
+ continue
+ }
+
+ // valid lead
+ leadSurrogate = codePoint
+
+ continue
+ }
+
+ // 2 leads in a row
+ if (codePoint < 0xDC00) {
+ if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
+ leadSurrogate = codePoint
+ continue
+ }
+
+ // valid surrogate pair
+ codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000
+ } else if (leadSurrogate) {
+ // valid bmp char, but last char was a lead
+ if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
+ }
+
+ leadSurrogate = null
+
+ // encode utf8
+ if (codePoint < 0x80) {
+ if ((units -= 1) < 0) break
+ bytes.push(codePoint)
+ } else if (codePoint < 0x800) {
+ if ((units -= 2) < 0) break
+ bytes.push(
+ codePoint >> 0x6 | 0xC0,
+ codePoint & 0x3F | 0x80
+ )
+ } else if (codePoint < 0x10000) {
+ if ((units -= 3) < 0) break
+ bytes.push(
+ codePoint >> 0xC | 0xE0,
+ codePoint >> 0x6 & 0x3F | 0x80,
+ codePoint & 0x3F | 0x80
+ )
+ } else if (codePoint < 0x110000) {
+ if ((units -= 4) < 0) break
+ bytes.push(
+ codePoint >> 0x12 | 0xF0,
+ codePoint >> 0xC & 0x3F | 0x80,
+ codePoint >> 0x6 & 0x3F | 0x80,
+ codePoint & 0x3F | 0x80
+ )
+ } else {
+ throw new Error('Invalid code point')
+ }
+ }
+
+ return bytes
+}
+
+function asciiToBytes (str) {
+ var byteArray = []
+ for (var i = 0; i < str.length; ++i) {
+ // Node's code seems to be doing this and not & 0x7F..
+ byteArray.push(str.charCodeAt(i) & 0xFF)
+ }
+ return byteArray
+}
+
+function utf16leToBytes (str, units) {
+ var c, hi, lo
+ var byteArray = []
+ for (var i = 0; i < str.length; ++i) {
+ if ((units -= 2) < 0) break
+
+ c = str.charCodeAt(i)
+ hi = c >> 8
+ lo = c % 256
+ byteArray.push(lo)
+ byteArray.push(hi)
+ }
+
+ return byteArray
+}
+
+function base64ToBytes (str) {
+ return base64.toByteArray(base64clean(str))
+}
+
+function blitBuffer (src, dst, offset, length) {
+ for (var i = 0; i < length; ++i) {
+ if ((i + offset >= dst.length) || (i >= src.length)) break
+ dst[i + offset] = src[i]
+ }
+ return i
+}
+
+function isnan (val) {
+ return val !== val // eslint-disable-line no-self-compare
+}
+
+}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+},{"base64-js":39,"ieee754":50,"isarray":53}],45:[function(require,module,exports){
+(function (Buffer){
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+// NOTE: These type checking functions intentionally don't use `instanceof`
+// because it is fragile and can be easily faked with `Object.create()`.
+
+function isArray(arg) {
+ if (Array.isArray) {
+ return Array.isArray(arg);
+ }
+ return objectToString(arg) === '[object Array]';
+}
+exports.isArray = isArray;
+
+function isBoolean(arg) {
+ return typeof arg === 'boolean';
+}
+exports.isBoolean = isBoolean;
+
+function isNull(arg) {
+ return arg === null;
+}
+exports.isNull = isNull;
+
+function isNullOrUndefined(arg) {
+ return arg == null;
+}
+exports.isNullOrUndefined = isNullOrUndefined;
+
+function isNumber(arg) {
+ return typeof arg === 'number';
+}
+exports.isNumber = isNumber;
+
+function isString(arg) {
+ return typeof arg === 'string';
+}
+exports.isString = isString;
+
+function isSymbol(arg) {
+ return typeof arg === 'symbol';
+}
+exports.isSymbol = isSymbol;
+
+function isUndefined(arg) {
+ return arg === void 0;
+}
+exports.isUndefined = isUndefined;
+
+function isRegExp(re) {
+ return objectToString(re) === '[object RegExp]';
+}
+exports.isRegExp = isRegExp;
+
+function isObject(arg) {
+ return typeof arg === 'object' && arg !== null;
+}
+exports.isObject = isObject;
+
+function isDate(d) {
+ return objectToString(d) === '[object Date]';
+}
+exports.isDate = isDate;
+
+function isError(e) {
+ return (objectToString(e) === '[object Error]' || e instanceof Error);
+}
+exports.isError = isError;
+
+function isFunction(arg) {
+ return typeof arg === 'function';
+}
+exports.isFunction = isFunction;
+
+function isPrimitive(arg) {
+ return arg === null ||
+ typeof arg === 'boolean' ||
+ typeof arg === 'number' ||
+ typeof arg === 'string' ||
+ typeof arg === 'symbol' || // ES6 symbol
+ typeof arg === 'undefined';
+}
+exports.isPrimitive = isPrimitive;
+
+exports.isBuffer = Buffer.isBuffer;
+
+function objectToString(o) {
+ return Object.prototype.toString.call(o);
+}
+
+}).call(this,{"isBuffer":require("../../is-buffer/index.js")})
+},{"../../is-buffer/index.js":52}],46:[function(require,module,exports){
+/* See LICENSE file for terms of use */
+
+/*
+ * Text diff implementation.
+ *
+ * This library supports the following APIS:
+ * JsDiff.diffChars: Character by character diff
+ * JsDiff.diffWords: Word (as defined by \b regex) diff which ignores whitespace
+ * JsDiff.diffLines: Line based diff
+ *
+ * JsDiff.diffCss: Diff targeted at CSS content
+ *
+ * These methods are based on the implementation proposed in
+ * "An O(ND) Difference Algorithm and its Variations" (Myers, 1986).
+ * http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.4.6927
+ */
+(function(global, undefined) {
+ var objectPrototypeToString = Object.prototype.toString;
+
+ /*istanbul ignore next*/
+ function map(arr, mapper, that) {
+ if (Array.prototype.map) {
+ return Array.prototype.map.call(arr, mapper, that);
+ }
+
+ var other = new Array(arr.length);
+
+ for (var i = 0, n = arr.length; i < n; i++) {
+ other[i] = mapper.call(that, arr[i], i, arr);
+ }
+ return other;
+ }
+ function clonePath(path) {
+ return { newPos: path.newPos, components: path.components.slice(0) };
+ }
+ function removeEmpty(array) {
+ var ret = [];
+ for (var i = 0; i < array.length; i++) {
+ if (array[i]) {
+ ret.push(array[i]);
+ }
+ }
+ return ret;
+ }
+ function escapeHTML(s) {
+ var n = s;
+ n = n.replace(/&/g, '&amp;');
+ n = n.replace(/</g, '&lt;');
+ n = n.replace(/>/g, '&gt;');
+ n = n.replace(/"/g, '&quot;');
+
+ return n;
+ }
+
+ // This function handles the presence of circular references by bailing out when encountering an
+ // object that is already on the "stack" of items being processed.
+ function canonicalize(obj, stack, replacementStack) {
+ stack = stack || [];
+ replacementStack = replacementStack || [];
+
+ var i;
+
+ for (i = 0; i < stack.length; i += 1) {
+ if (stack[i] === obj) {
+ return replacementStack[i];
+ }
+ }
+
+ var canonicalizedObj;
+
+ if ('[object Array]' === objectPrototypeToString.call(obj)) {
+ stack.push(obj);
+ canonicalizedObj = new Array(obj.length);
+ replacementStack.push(canonicalizedObj);
+ for (i = 0; i < obj.length; i += 1) {
+ canonicalizedObj[i] = canonicalize(obj[i], stack, replacementStack);
+ }
+ stack.pop();
+ replacementStack.pop();
+ } else if (typeof obj === 'object' && obj !== null) {
+ stack.push(obj);
+ canonicalizedObj = {};
+ replacementStack.push(canonicalizedObj);
+ var sortedKeys = [],
+ key;
+ for (key in obj) {
+ sortedKeys.push(key);
+ }
+ sortedKeys.sort();
+ for (i = 0; i < sortedKeys.length; i += 1) {
+ key = sortedKeys[i];
+ canonicalizedObj[key] = canonicalize(obj[key], stack, replacementStack);
+ }
+ stack.pop();
+ replacementStack.pop();
+ } else {
+ canonicalizedObj = obj;
+ }
+ return canonicalizedObj;
+ }
+
+ function buildValues(components, newString, oldString, useLongestToken) {
+ var componentPos = 0,
+ componentLen = components.length,
+ newPos = 0,
+ oldPos = 0;
+
+ for (; componentPos < componentLen; componentPos++) {
+ var component = components[componentPos];
+ if (!component.removed) {
+ if (!component.added && useLongestToken) {
+ var value = newString.slice(newPos, newPos + component.count);
+ value = map(value, function(value, i) {
+ var oldValue = oldString[oldPos + i];
+ return oldValue.length > value.length ? oldValue : value;
+ });
+
+ component.value = value.join('');
+ } else {
+ component.value = newString.slice(newPos, newPos + component.count).join('');
+ }
+ newPos += component.count;
+
+ // Common case
+ if (!component.added) {
+ oldPos += component.count;
+ }
+ } else {
+ component.value = oldString.slice(oldPos, oldPos + component.count).join('');
+ oldPos += component.count;
+
+ // Reverse add and remove so removes are output first to match common convention
+ // The diffing algorithm is tied to add then remove output and this is the simplest
+ // route to get the desired output with minimal overhead.
+ if (componentPos && components[componentPos - 1].added) {
+ var tmp = components[componentPos - 1];
+ components[componentPos - 1] = components[componentPos];
+ components[componentPos] = tmp;
+ }
+ }
+ }
+
+ return components;
+ }
+
+ function Diff(ignoreWhitespace) {
+ this.ignoreWhitespace = ignoreWhitespace;
+ }
+ Diff.prototype = {
+ diff: function(oldString, newString, callback) {
+ var self = this;
+
+ function done(value) {
+ if (callback) {
+ setTimeout(function() { callback(undefined, value); }, 0);
+ return true;
+ } else {
+ return value;
+ }
+ }
+
+ // Handle the identity case (this is due to unrolling editLength == 0
+ if (newString === oldString) {
+ return done([{ value: newString }]);
+ }
+ if (!newString) {
+ return done([{ value: oldString, removed: true }]);
+ }
+ if (!oldString) {
+ return done([{ value: newString, added: true }]);
+ }
+
+ newString = this.tokenize(newString);
+ oldString = this.tokenize(oldString);
+
+ var newLen = newString.length, oldLen = oldString.length;
+ var editLength = 1;
+ var maxEditLength = newLen + oldLen;
+ var bestPath = [{ newPos: -1, components: [] }];
+
+ // Seed editLength = 0, i.e. the content starts with the same values
+ var oldPos = this.extractCommon(bestPath[0], newString, oldString, 0);
+ if (bestPath[0].newPos + 1 >= newLen && oldPos + 1 >= oldLen) {
+ // Identity per the equality and tokenizer
+ return done([{value: newString.join('')}]);
+ }
+
+ // Main worker method. checks all permutations of a given edit length for acceptance.
+ function execEditLength() {
+ for (var diagonalPath = -1 * editLength; diagonalPath <= editLength; diagonalPath += 2) {
+ var basePath;
+ var addPath = bestPath[diagonalPath - 1],
+ removePath = bestPath[diagonalPath + 1],
+ oldPos = (removePath ? removePath.newPos : 0) - diagonalPath;
+ if (addPath) {
+ // No one else is going to attempt to use this value, clear it
+ bestPath[diagonalPath - 1] = undefined;
+ }
+
+ var canAdd = addPath && addPath.newPos + 1 < newLen,
+ canRemove = removePath && 0 <= oldPos && oldPos < oldLen;
+ if (!canAdd && !canRemove) {
+ // If this path is a terminal then prune
+ bestPath[diagonalPath] = undefined;
+ continue;
+ }
+
+ // Select the diagonal that we want to branch from. We select the prior
+ // path whose position in the new string is the farthest from the origin
+ // and does not pass the bounds of the diff graph
+ if (!canAdd || (canRemove && addPath.newPos < removePath.newPos)) {
+ basePath = clonePath(removePath);
+ self.pushComponent(basePath.components, undefined, true);
+ } else {
+ basePath = addPath; // No need to clone, we've pulled it from the list
+ basePath.newPos++;
+ self.pushComponent(basePath.components, true, undefined);
+ }
+
+ oldPos = self.extractCommon(basePath, newString, oldString, diagonalPath);
+
+ // If we have hit the end of both strings, then we are done
+ if (basePath.newPos + 1 >= newLen && oldPos + 1 >= oldLen) {
+ return done(buildValues(basePath.components, newString, oldString, self.useLongestToken));
+ } else {
+ // Otherwise track this path as a potential candidate and continue.
+ bestPath[diagonalPath] = basePath;
+ }
+ }
+
+ editLength++;
+ }
+
+ // Performs the length of edit iteration. Is a bit fugly as this has to support the
+ // sync and async mode which is never fun. Loops over execEditLength until a value
+ // is produced.
+ if (callback) {
+ (function exec() {
+ setTimeout(function() {
+ // This should not happen, but we want to be safe.
+ /*istanbul ignore next */
+ if (editLength > maxEditLength) {
+ return callback();
+ }
+
+ if (!execEditLength()) {
+ exec();
+ }
+ }, 0);
+ }());
+ } else {
+ while (editLength <= maxEditLength) {
+ var ret = execEditLength();
+ if (ret) {
+ return ret;
+ }
+ }
+ }
+ },
+
+ pushComponent: function(components, added, removed) {
+ var last = components[components.length - 1];
+ if (last && last.added === added && last.removed === removed) {
+ // We need to clone here as the component clone operation is just
+ // as shallow array clone
+ components[components.length - 1] = {count: last.count + 1, added: added, removed: removed };
+ } else {
+ components.push({count: 1, added: added, removed: removed });
+ }
+ },
+ extractCommon: function(basePath, newString, oldString, diagonalPath) {
+ var newLen = newString.length,
+ oldLen = oldString.length,
+ newPos = basePath.newPos,
+ oldPos = newPos - diagonalPath,
+
+ commonCount = 0;
+ while (newPos + 1 < newLen && oldPos + 1 < oldLen && this.equals(newString[newPos + 1], oldString[oldPos + 1])) {
+ newPos++;
+ oldPos++;
+ commonCount++;
+ }
+
+ if (commonCount) {
+ basePath.components.push({count: commonCount});
+ }
+
+ basePath.newPos = newPos;
+ return oldPos;
+ },
+
+ equals: function(left, right) {
+ var reWhitespace = /\S/;
+ return left === right || (this.ignoreWhitespace && !reWhitespace.test(left) && !reWhitespace.test(right));
+ },
+ tokenize: function(value) {
+ return value.split('');
+ }
+ };
+
+ var CharDiff = new Diff();
+
+ var WordDiff = new Diff(true);
+ var WordWithSpaceDiff = new Diff();
+ WordDiff.tokenize = WordWithSpaceDiff.tokenize = function(value) {
+ return removeEmpty(value.split(/(\s+|\b)/));
+ };
+
+ var CssDiff = new Diff(true);
+ CssDiff.tokenize = function(value) {
+ return removeEmpty(value.split(/([{}:;,]|\s+)/));
+ };
+
+ var LineDiff = new Diff();
+
+ var TrimmedLineDiff = new Diff();
+ TrimmedLineDiff.ignoreTrim = true;
+
+ LineDiff.tokenize = TrimmedLineDiff.tokenize = function(value) {
+ var retLines = [],
+ lines = value.split(/^/m);
+ for (var i = 0; i < lines.length; i++) {
+ var line = lines[i],
+ lastLine = lines[i - 1],
+ lastLineLastChar = lastLine && lastLine[lastLine.length - 1];
+
+ // Merge lines that may contain windows new lines
+ if (line === '\n' && lastLineLastChar === '\r') {
+ retLines[retLines.length - 1] = retLines[retLines.length - 1].slice(0, -1) + '\r\n';
+ } else {
+ if (this.ignoreTrim) {
+ line = line.trim();
+ // add a newline unless this is the last line.
+ if (i < lines.length - 1) {
+ line += '\n';
+ }
+ }
+ retLines.push(line);
+ }
+ }
+
+ return retLines;
+ };
+
+ var PatchDiff = new Diff();
+ PatchDiff.tokenize = function(value) {
+ var ret = [],
+ linesAndNewlines = value.split(/(\n|\r\n)/);
+
+ // Ignore the final empty token that occurs if the string ends with a new line
+ if (!linesAndNewlines[linesAndNewlines.length - 1]) {
+ linesAndNewlines.pop();
+ }
+
+ // Merge the content and line separators into single tokens
+ for (var i = 0; i < linesAndNewlines.length; i++) {
+ var line = linesAndNewlines[i];
+
+ if (i % 2) {
+ ret[ret.length - 1] += line;
+ } else {
+ ret.push(line);
+ }
+ }
+ return ret;
+ };
+
+ var SentenceDiff = new Diff();
+ SentenceDiff.tokenize = function(value) {
+ return removeEmpty(value.split(/(\S.+?[.!?])(?=\s+|$)/));
+ };
+
+ var JsonDiff = new Diff();
+ // Discriminate between two lines of pretty-printed, serialized JSON where one of them has a
+ // dangling comma and the other doesn't. Turns out including the dangling comma yields the nicest output:
+ JsonDiff.useLongestToken = true;
+ JsonDiff.tokenize = LineDiff.tokenize;
+ JsonDiff.equals = function(left, right) {
+ return LineDiff.equals(left.replace(/,([\r\n])/g, '$1'), right.replace(/,([\r\n])/g, '$1'));
+ };
+
+ var JsDiff = {
+ Diff: Diff,
+
+ diffChars: function(oldStr, newStr, callback) { return CharDiff.diff(oldStr, newStr, callback); },
+ diffWords: function(oldStr, newStr, callback) { return WordDiff.diff(oldStr, newStr, callback); },
+ diffWordsWithSpace: function(oldStr, newStr, callback) { return WordWithSpaceDiff.diff(oldStr, newStr, callback); },
+ diffLines: function(oldStr, newStr, callback) { return LineDiff.diff(oldStr, newStr, callback); },
+ diffTrimmedLines: function(oldStr, newStr, callback) { return TrimmedLineDiff.diff(oldStr, newStr, callback); },
+
+ diffSentences: function(oldStr, newStr, callback) { return SentenceDiff.diff(oldStr, newStr, callback); },
+
+ diffCss: function(oldStr, newStr, callback) { return CssDiff.diff(oldStr, newStr, callback); },
+ diffJson: function(oldObj, newObj, callback) {
+ return JsonDiff.diff(
+ typeof oldObj === 'string' ? oldObj : JSON.stringify(canonicalize(oldObj), undefined, ' '),
+ typeof newObj === 'string' ? newObj : JSON.stringify(canonicalize(newObj), undefined, ' '),
+ callback
+ );
+ },
+
+ createTwoFilesPatch: function(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader) {
+ var ret = [];
+
+ if (oldFileName == newFileName) {
+ ret.push('Index: ' + oldFileName);
+ }
+ ret.push('===================================================================');
+ ret.push('--- ' + oldFileName + (typeof oldHeader === 'undefined' ? '' : '\t' + oldHeader));
+ ret.push('+++ ' + newFileName + (typeof newHeader === 'undefined' ? '' : '\t' + newHeader));
+
+ var diff = PatchDiff.diff(oldStr, newStr);
+ diff.push({value: '', lines: []}); // Append an empty value to make cleanup easier
+
+ // Formats a given set of lines for printing as context lines in a patch
+ function contextLines(lines) {
+ return map(lines, function(entry) { return ' ' + entry; });
+ }
+
+ // Outputs the no newline at end of file warning if needed
+ function eofNL(curRange, i, current) {
+ var last = diff[diff.length - 2],
+ isLast = i === diff.length - 2,
+ isLastOfType = i === diff.length - 3 && current.added !== last.added;
+
+ // Figure out if this is the last line for the given file and missing NL
+ if (!(/\n$/.test(current.value)) && (isLast || isLastOfType)) {
+ curRange.push('\\ No newline at end of file');
+ }
+ }
+
+ var oldRangeStart = 0, newRangeStart = 0, curRange = [],
+ oldLine = 1, newLine = 1;
+ for (var i = 0; i < diff.length; i++) {
+ var current = diff[i],
+ lines = current.lines || current.value.replace(/\n$/, '').split('\n');
+ current.lines = lines;
+
+ if (current.added || current.removed) {
+ // If we have previous context, start with that
+ if (!oldRangeStart) {
+ var prev = diff[i - 1];
+ oldRangeStart = oldLine;
+ newRangeStart = newLine;
+
+ if (prev) {
+ curRange = contextLines(prev.lines.slice(-4));
+ oldRangeStart -= curRange.length;
+ newRangeStart -= curRange.length;
+ }
+ }
+
+ // Output our changes
+ curRange.push.apply(curRange, map(lines, function(entry) {
+ return (current.added ? '+' : '-') + entry;
+ }));
+ eofNL(curRange, i, current);
+
+ // Track the updated file position
+ if (current.added) {
+ newLine += lines.length;
+ } else {
+ oldLine += lines.length;
+ }
+ } else {
+ // Identical context lines. Track line changes
+ if (oldRangeStart) {
+ // Close out any changes that have been output (or join overlapping)
+ if (lines.length <= 8 && i < diff.length - 2) {
+ // Overlapping
+ curRange.push.apply(curRange, contextLines(lines));
+ } else {
+ // end the range and output
+ var contextSize = Math.min(lines.length, 4);
+ ret.push(
+ '@@ -' + oldRangeStart + ',' + (oldLine - oldRangeStart + contextSize)
+ + ' +' + newRangeStart + ',' + (newLine - newRangeStart + contextSize)
+ + ' @@');
+ ret.push.apply(ret, curRange);
+ ret.push.apply(ret, contextLines(lines.slice(0, contextSize)));
+ if (lines.length <= 4) {
+ eofNL(ret, i, current);
+ }
+
+ oldRangeStart = 0;
+ newRangeStart = 0;
+ curRange = [];
+ }
+ }
+ oldLine += lines.length;
+ newLine += lines.length;
+ }
+ }
+
+ return ret.join('\n') + '\n';
+ },
+
+ createPatch: function(fileName, oldStr, newStr, oldHeader, newHeader) {
+ return JsDiff.createTwoFilesPatch(fileName, fileName, oldStr, newStr, oldHeader, newHeader);
+ },
+
+ applyPatch: function(oldStr, uniDiff) {
+ var diffstr = uniDiff.split('\n'),
+ hunks = [],
+ i = 0,
+ remEOFNL = false,
+ addEOFNL = false;
+
+ // Skip to the first change hunk
+ while (i < diffstr.length && !(/^@@/.test(diffstr[i]))) {
+ i++;
+ }
+
+ // Parse the unified diff
+ for (; i < diffstr.length; i++) {
+ if (diffstr[i][0] === '@') {
+ var chnukHeader = diffstr[i].split(/@@ -(\d+),(\d+) \+(\d+),(\d+) @@/);
+ hunks.unshift({
+ start: chnukHeader[3],
+ oldlength: +chnukHeader[2],
+ removed: [],
+ newlength: chnukHeader[4],
+ added: []
+ });
+ } else if (diffstr[i][0] === '+') {
+ hunks[0].added.push(diffstr[i].substr(1));
+ } else if (diffstr[i][0] === '-') {
+ hunks[0].removed.push(diffstr[i].substr(1));
+ } else if (diffstr[i][0] === ' ') {
+ hunks[0].added.push(diffstr[i].substr(1));
+ hunks[0].removed.push(diffstr[i].substr(1));
+ } else if (diffstr[i][0] === '\\') {
+ if (diffstr[i - 1][0] === '+') {
+ remEOFNL = true;
+ } else if (diffstr[i - 1][0] === '-') {
+ addEOFNL = true;
+ }
+ }
+ }
+
+ // Apply the diff to the input
+ var lines = oldStr.split('\n');
+ for (i = hunks.length - 1; i >= 0; i--) {
+ var hunk = hunks[i];
+ // Sanity check the input string. Bail if we don't match.
+ for (var j = 0; j < hunk.oldlength; j++) {
+ if (lines[hunk.start - 1 + j] !== hunk.removed[j]) {
+ return false;
+ }
+ }
+ Array.prototype.splice.apply(lines, [hunk.start - 1, hunk.oldlength].concat(hunk.added));
+ }
+
+ // Handle EOFNL insertion/removal
+ if (remEOFNL) {
+ while (!lines[lines.length - 1]) {
+ lines.pop();
+ }
+ } else if (addEOFNL) {
+ lines.push('');
+ }
+ return lines.join('\n');
+ },
+
+ convertChangesToXML: function(changes) {
+ var ret = [];
+ for (var i = 0; i < changes.length; i++) {
+ var change = changes[i];
+ if (change.added) {
+ ret.push('<ins>');
+ } else if (change.removed) {
+ ret.push('<del>');
+ }
+
+ ret.push(escapeHTML(change.value));
+
+ if (change.added) {
+ ret.push('</ins>');
+ } else if (change.removed) {
+ ret.push('</del>');
+ }
+ }
+ return ret.join('');
+ },
+
+ // See: http://code.google.com/p/google-diff-match-patch/wiki/API
+ convertChangesToDMP: function(changes) {
+ var ret = [],
+ change,
+ operation;
+ for (var i = 0; i < changes.length; i++) {
+ change = changes[i];
+ if (change.added) {
+ operation = 1;
+ } else if (change.removed) {
+ operation = -1;
+ } else {
+ operation = 0;
+ }
+
+ ret.push([operation, change.value]);
+ }
+ return ret;
+ },
+
+ canonicalize: canonicalize
+ };
+
+ /*istanbul ignore next */
+ /*global module */
+ if (typeof module !== 'undefined' && module.exports) {
+ module.exports = JsDiff;
+ } else if (false) {
+ /*global define */
+ define([], function() { return JsDiff; });
+ } else if (typeof global.JsDiff === 'undefined') {
+ global.JsDiff = JsDiff;
+ }
+}(this));
+
+},{}],47:[function(require,module,exports){
+'use strict';
+
+var matchOperatorsRe = /[|\\{}()[\]^$+*?.]/g;
+
+module.exports = function (str) {
+ if (typeof str !== 'string') {
+ throw new TypeError('Expected a string');
+ }
+
+ return str.replace(matchOperatorsRe, '\\$&');
+};
+
+},{}],48:[function(require,module,exports){
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+function EventEmitter() {
+ this._events = this._events || {};
+ this._maxListeners = this._maxListeners || undefined;
+}
+module.exports = EventEmitter;
+
+// Backwards-compat with node 0.10.x
+EventEmitter.EventEmitter = EventEmitter;
+
+EventEmitter.prototype._events = undefined;
+EventEmitter.prototype._maxListeners = undefined;
+
+// By default EventEmitters will print a warning if more than 10 listeners are
+// added to it. This is a useful default which helps finding memory leaks.
+EventEmitter.defaultMaxListeners = 10;
+
+// Obviously not all Emitters should be limited to 10. This function allows
+// that to be increased. Set to zero for unlimited.
+EventEmitter.prototype.setMaxListeners = function(n) {
+ if (!isNumber(n) || n < 0 || isNaN(n))
+ throw TypeError('n must be a positive number');
+ this._maxListeners = n;
+ return this;
+};
+
+EventEmitter.prototype.emit = function(type) {
+ var er, handler, len, args, i, listeners;
+
+ if (!this._events)
+ this._events = {};
+
+ // If there is no 'error' event listener then throw.
+ if (type === 'error') {
+ if (!this._events.error ||
+ (isObject(this._events.error) && !this._events.error.length)) {
+ er = arguments[1];
+ if (er instanceof Error) {
+ throw er; // Unhandled 'error' event
+ } else {
+ // At least give some kind of context to the user
+ var err = new Error('Uncaught, unspecified "error" event. (' + er + ')');
+ err.context = er;
+ throw err;
+ }
+ }
+ }
+
+ handler = this._events[type];
+
+ if (isUndefined(handler))
+ return false;
+
+ if (isFunction(handler)) {
+ switch (arguments.length) {
+ // fast cases
+ case 1:
+ handler.call(this);
+ break;
+ case 2:
+ handler.call(this, arguments[1]);
+ break;
+ case 3:
+ handler.call(this, arguments[1], arguments[2]);
+ break;
+ // slower
+ default:
+ args = Array.prototype.slice.call(arguments, 1);
+ handler.apply(this, args);
+ }
+ } else if (isObject(handler)) {
+ args = Array.prototype.slice.call(arguments, 1);
+ listeners = handler.slice();
+ len = listeners.length;
+ for (i = 0; i < len; i++)
+ listeners[i].apply(this, args);
+ }
+
+ return true;
+};
+
+EventEmitter.prototype.addListener = function(type, listener) {
+ var m;
+
+ if (!isFunction(listener))
+ throw TypeError('listener must be a function');
+
+ if (!this._events)
+ this._events = {};
+
+ // To avoid recursion in the case that type === "newListener"! Before
+ // adding it to the listeners, first emit "newListener".
+ if (this._events.newListener)
+ this.emit('newListener', type,
+ isFunction(listener.listener) ?
+ listener.listener : listener);
+
+ if (!this._events[type])
+ // Optimize the case of one listener. Don't need the extra array object.
+ this._events[type] = listener;
+ else if (isObject(this._events[type]))
+ // If we've already got an array, just append.
+ this._events[type].push(listener);
+ else
+ // Adding the second element, need to change to array.
+ this._events[type] = [this._events[type], listener];
+
+ // Check for listener leak
+ if (isObject(this._events[type]) && !this._events[type].warned) {
+ if (!isUndefined(this._maxListeners)) {
+ m = this._maxListeners;
+ } else {
+ m = EventEmitter.defaultMaxListeners;
+ }
+
+ if (m && m > 0 && this._events[type].length > m) {
+ this._events[type].warned = true;
+ console.error('(node) warning: possible EventEmitter memory ' +
+ 'leak detected. %d listeners added. ' +
+ 'Use emitter.setMaxListeners() to increase limit.',
+ this._events[type].length);
+ if (typeof console.trace === 'function') {
+ // not supported in IE 10
+ console.trace();
+ }
+ }
+ }
+
+ return this;
+};
+
+EventEmitter.prototype.on = EventEmitter.prototype.addListener;
+
+EventEmitter.prototype.once = function(type, listener) {
+ if (!isFunction(listener))
+ throw TypeError('listener must be a function');
+
+ var fired = false;
+
+ function g() {
+ this.removeListener(type, g);
+
+ if (!fired) {
+ fired = true;
+ listener.apply(this, arguments);
+ }
+ }
+
+ g.listener = listener;
+ this.on(type, g);
+
+ return this;
+};
+
+// emits a 'removeListener' event iff the listener was removed
+EventEmitter.prototype.removeListener = function(type, listener) {
+ var list, position, length, i;
+
+ if (!isFunction(listener))
+ throw TypeError('listener must be a function');
+
+ if (!this._events || !this._events[type])
+ return this;
+
+ list = this._events[type];
+ length = list.length;
+ position = -1;
+
+ if (list === listener ||
+ (isFunction(list.listener) && list.listener === listener)) {
+ delete this._events[type];
+ if (this._events.removeListener)
+ this.emit('removeListener', type, listener);
+
+ } else if (isObject(list)) {
+ for (i = length; i-- > 0;) {
+ if (list[i] === listener ||
+ (list[i].listener && list[i].listener === listener)) {
+ position = i;
+ break;
+ }
+ }
+
+ if (position < 0)
+ return this;
+
+ if (list.length === 1) {
+ list.length = 0;
+ delete this._events[type];
+ } else {
+ list.splice(position, 1);
+ }
+
+ if (this._events.removeListener)
+ this.emit('removeListener', type, listener);
+ }
+
+ return this;
+};
+
+EventEmitter.prototype.removeAllListeners = function(type) {
+ var key, listeners;
+
+ if (!this._events)
+ return this;
+
+ // not listening for removeListener, no need to emit
+ if (!this._events.removeListener) {
+ if (arguments.length === 0)
+ this._events = {};
+ else if (this._events[type])
+ delete this._events[type];
+ return this;
+ }
+
+ // emit removeListener for all listeners on all events
+ if (arguments.length === 0) {
+ for (key in this._events) {
+ if (key === 'removeListener') continue;
+ this.removeAllListeners(key);
+ }
+ this.removeAllListeners('removeListener');
+ this._events = {};
+ return this;
+ }
+
+ listeners = this._events[type];
+
+ if (isFunction(listeners)) {
+ this.removeListener(type, listeners);
+ } else if (listeners) {
+ // LIFO order
+ while (listeners.length)
+ this.removeListener(type, listeners[listeners.length - 1]);
+ }
+ delete this._events[type];
+
+ return this;
+};
+
+EventEmitter.prototype.listeners = function(type) {
+ var ret;
+ if (!this._events || !this._events[type])
+ ret = [];
+ else if (isFunction(this._events[type]))
+ ret = [this._events[type]];
+ else
+ ret = this._events[type].slice();
+ return ret;
+};
+
+EventEmitter.prototype.listenerCount = function(type) {
+ if (this._events) {
+ var evlistener = this._events[type];
+
+ if (isFunction(evlistener))
+ return 1;
+ else if (evlistener)
+ return evlistener.length;
+ }
+ return 0;
+};
+
+EventEmitter.listenerCount = function(emitter, type) {
+ return emitter.listenerCount(type);
+};
+
+function isFunction(arg) {
+ return typeof arg === 'function';
+}
+
+function isNumber(arg) {
+ return typeof arg === 'number';
+}
+
+function isObject(arg) {
+ return typeof arg === 'object' && arg !== null;
+}
+
+function isUndefined(arg) {
+ return arg === void 0;
+}
+
+},{}],49:[function(require,module,exports){
+(function (process){
+// Growl - Copyright TJ Holowaychuk <tj@vision-media.ca> (MIT Licensed)
+
+/**
+ * Module dependencies.
+ */
+
+var exec = require('child_process').exec
+ , fs = require('fs')
+ , path = require('path')
+ , exists = fs.existsSync || path.existsSync
+ , os = require('os')
+ , quote = JSON.stringify
+ , cmd;
+
+function which(name) {
+ var paths = process.env.PATH.split(':');
+ var loc;
+
+ for (var i = 0, len = paths.length; i < len; ++i) {
+ loc = path.join(paths[i], name);
+ if (exists(loc)) return loc;
+ }
+}
+
+switch(os.type()) {
+ case 'Darwin':
+ if (which('terminal-notifier')) {
+ cmd = {
+ type: "Darwin-NotificationCenter"
+ , pkg: "terminal-notifier"
+ , msg: '-message'
+ , title: '-title'
+ , subtitle: '-subtitle'
+ , icon: '-appIcon'
+ , sound: '-sound'
+ , url: '-open'
+ , priority: {
+ cmd: '-execute'
+ , range: []
+ }
+ };
+ } else {
+ cmd = {
+ type: "Darwin-Growl"
+ , pkg: "growlnotify"
+ , msg: '-m'
+ , sticky: '--sticky'
+ , priority: {
+ cmd: '--priority'
+ , range: [
+ -2
+ , -1
+ , 0
+ , 1
+ , 2
+ , "Very Low"
+ , "Moderate"
+ , "Normal"
+ , "High"
+ , "Emergency"
+ ]
+ }
+ };
+ }
+ break;
+ case 'Linux':
+ if (which('growl')) {
+ cmd = {
+ type: "Linux-Growl"
+ , pkg: "growl"
+ , msg: '-m'
+ , title: '-title'
+ , subtitle: '-subtitle'
+ , host: {
+ cmd: '-H'
+ , hostname: '192.168.33.1'
+ }
+ };
+ } else {
+ cmd = {
+ type: "Linux"
+ , pkg: "notify-send"
+ , msg: ''
+ , sticky: '-t 0'
+ , icon: '-i'
+ , priority: {
+ cmd: '-u'
+ , range: [
+ "low"
+ , "normal"
+ , "critical"
+ ]
+ }
+ };
+ }
+ break;
+ case 'Windows_NT':
+ cmd = {
+ type: "Windows"
+ , pkg: "growlnotify"
+ , msg: ''
+ , sticky: '/s:true'
+ , title: '/t:'
+ , icon: '/i:'
+ , url: '/cu:'
+ , priority: {
+ cmd: '/p:'
+ , range: [
+ -2
+ , -1
+ , 0
+ , 1
+ , 2
+ ]
+ }
+ };
+ break;
+}
+
+/**
+ * Expose `growl`.
+ */
+
+exports = module.exports = growl;
+
+/**
+ * Node-growl version.
+ */
+
+exports.version = '1.4.1'
+
+/**
+ * Send growl notification _msg_ with _options_.
+ *
+ * Options:
+ *
+ * - title Notification title
+ * - sticky Make the notification stick (defaults to false)
+ * - priority Specify an int or named key (default is 0)
+ * - name Application name (defaults to growlnotify)
+ * - sound Sound efect ( in OSx defined in preferences -> sound -> effects) * works only in OSX > 10.8x
+ * - image
+ * - path to an icon sets --iconpath
+ * - path to an image sets --image
+ * - capitalized word sets --appIcon
+ * - filename uses extname as --icon
+ * - otherwise treated as --icon
+ *
+ * Examples:
+ *
+ * growl('New email')
+ * growl('5 new emails', { title: 'Thunderbird' })
+ * growl('5 new emails', { title: 'Thunderbird', sound: 'Purr' })
+ * growl('Email sent', function(){
+ * // ... notification sent
+ * })
+ *
+ * @param {string} msg
+ * @param {object} options
+ * @param {function} fn
+ * @api public
+ */
+
+function growl(msg, options, fn) {
+ var image
+ , args
+ , options = options || {}
+ , fn = fn || function(){};
+
+ if (options.exec) {
+ cmd = {
+ type: "Custom"
+ , pkg: options.exec
+ , range: []
+ };
+ }
+
+ // noop
+ if (!cmd) return fn(new Error('growl not supported on this platform'));
+ args = [cmd.pkg];
+
+ // image
+ if (image = options.image) {
+ switch(cmd.type) {
+ case 'Darwin-Growl':
+ var flag, ext = path.extname(image).substr(1)
+ flag = flag || ext == 'icns' && 'iconpath'
+ flag = flag || /^[A-Z]/.test(image) && 'appIcon'
+ flag = flag || /^png|gif|jpe?g$/.test(ext) && 'image'
+ flag = flag || ext && (image = ext) && 'icon'
+ flag = flag || 'icon'
+ args.push('--' + flag, quote(image))
+ break;
+ case 'Darwin-NotificationCenter':
+ args.push(cmd.icon, quote(image));
+ break;
+ case 'Linux':
+ args.push(cmd.icon, quote(image));
+ // libnotify defaults to sticky, set a hint for transient notifications
+ if (!options.sticky) args.push('--hint=int:transient:1');
+ break;
+ case 'Windows':
+ args.push(cmd.icon + quote(image));
+ break;
+ }
+ }
+
+ // sticky
+ if (options.sticky) args.push(cmd.sticky);
+
+ // priority
+ if (options.priority) {
+ var priority = options.priority + '';
+ var checkindexOf = cmd.priority.range.indexOf(priority);
+ if (~cmd.priority.range.indexOf(priority)) {
+ args.push(cmd.priority, options.priority);
+ }
+ }
+
+ //sound
+ if(options.sound && cmd.type === 'Darwin-NotificationCenter'){
+ args.push(cmd.sound, options.sound)
+ }
+
+ // name
+ if (options.name && cmd.type === "Darwin-Growl") {
+ args.push('--name', options.name);
+ }
+
+ switch(cmd.type) {
+ case 'Darwin-Growl':
+ args.push(cmd.msg);
+ args.push(quote(msg).replace(/\\n/g, '\n'));
+ if (options.title) args.push(quote(options.title));
+ break;
+ case 'Darwin-NotificationCenter':
+ args.push(cmd.msg);
+ var stringifiedMsg = quote(msg);
+ var escapedMsg = stringifiedMsg.replace(/\\n/g, '\n');
+ args.push(escapedMsg);
+ if (options.title) {
+ args.push(cmd.title);
+ args.push(quote(options.title));
+ }
+ if (options.subtitle) {
+ args.push(cmd.subtitle);
+ args.push(quote(options.subtitle));
+ }
+ if (options.url) {
+ args.push(cmd.url);
+ args.push(quote(options.url));
+ }
+ break;
+ case 'Linux-Growl':
+ args.push(cmd.msg);
+ args.push(quote(msg).replace(/\\n/g, '\n'));
+ if (options.title) args.push(quote(options.title));
+ if (cmd.host) {
+ args.push(cmd.host.cmd, cmd.host.hostname)
+ }
+ break;
+ case 'Linux':
+ if (options.title) {
+ args.push(quote(options.title));
+ args.push(cmd.msg);
+ args.push(quote(msg).replace(/\\n/g, '\n'));
+ } else {
+ args.push(quote(msg).replace(/\\n/g, '\n'));
+ }
+ break;
+ case 'Windows':
+ args.push(quote(msg).replace(/\\n/g, '\n'));
+ if (options.title) args.push(cmd.title + quote(options.title));
+ if (options.url) args.push(cmd.url + quote(options.url));
+ break;
+ case 'Custom':
+ args[0] = (function(origCommand) {
+ var message = options.title
+ ? options.title + ': ' + msg
+ : msg;
+ var command = origCommand.replace(/(^|[^%])%s/g, '$1' + quote(message));
+ if (command === origCommand) args.push(quote(message));
+ return command;
+ })(args[0]);
+ break;
+ }
+
+ // execute
+ exec(args.join(' '), fn);
+};
+
+}).call(this,require('_process'))
+},{"_process":67,"child_process":42,"fs":42,"os":65,"path":42}],50:[function(require,module,exports){
+exports.read = function (buffer, offset, isLE, mLen, nBytes) {
+ var e, m
+ var eLen = nBytes * 8 - mLen - 1
+ var eMax = (1 << eLen) - 1
+ var eBias = eMax >> 1
+ var nBits = -7
+ var i = isLE ? (nBytes - 1) : 0
+ var d = isLE ? -1 : 1
+ var s = buffer[offset + i]
+
+ i += d
+
+ e = s & ((1 << (-nBits)) - 1)
+ s >>= (-nBits)
+ nBits += eLen
+ for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {}
+
+ m = e & ((1 << (-nBits)) - 1)
+ e >>= (-nBits)
+ nBits += mLen
+ for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {}
+
+ if (e === 0) {
+ e = 1 - eBias
+ } else if (e === eMax) {
+ return m ? NaN : ((s ? -1 : 1) * Infinity)
+ } else {
+ m = m + Math.pow(2, mLen)
+ e = e - eBias
+ }
+ return (s ? -1 : 1) * m * Math.pow(2, e - mLen)
+}
+
+exports.write = function (buffer, value, offset, isLE, mLen, nBytes) {
+ var e, m, c
+ var eLen = nBytes * 8 - mLen - 1
+ var eMax = (1 << eLen) - 1
+ var eBias = eMax >> 1
+ var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)
+ var i = isLE ? 0 : (nBytes - 1)
+ var d = isLE ? 1 : -1
+ var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0
+
+ value = Math.abs(value)
+
+ if (isNaN(value) || value === Infinity) {
+ m = isNaN(value) ? 1 : 0
+ e = eMax
+ } else {
+ e = Math.floor(Math.log(value) / Math.LN2)
+ if (value * (c = Math.pow(2, -e)) < 1) {
+ e--
+ c *= 2
+ }
+ if (e + eBias >= 1) {
+ value += rt / c
+ } else {
+ value += rt * Math.pow(2, 1 - eBias)
+ }
+ if (value * c >= 2) {
+ e++
+ c /= 2
+ }
+
+ if (e + eBias >= eMax) {
+ m = 0
+ e = eMax
+ } else if (e + eBias >= 1) {
+ m = (value * c - 1) * Math.pow(2, mLen)
+ e = e + eBias
+ } else {
+ m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)
+ e = 0
+ }
+ }
+
+ for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}
+
+ e = (e << mLen) | m
+ eLen += mLen
+ for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}
+
+ buffer[offset + i - d] |= s * 128
+}
+
+},{}],51:[function(require,module,exports){
+if (typeof Object.create === 'function') {
+ // implementation from standard node.js 'util' module
+ module.exports = function inherits(ctor, superCtor) {
+ ctor.super_ = superCtor
+ ctor.prototype = Object.create(superCtor.prototype, {
+ constructor: {
+ value: ctor,
+ enumerable: false,
+ writable: true,
+ configurable: true
+ }
+ });
+ };
+} else {
+ // old school shim for old browsers
+ module.exports = function inherits(ctor, superCtor) {
+ ctor.super_ = superCtor
+ var TempCtor = function () {}
+ TempCtor.prototype = superCtor.prototype
+ ctor.prototype = new TempCtor()
+ ctor.prototype.constructor = ctor
+ }
+}
+
+},{}],52:[function(require,module,exports){
+/*!
+ * Determine if an object is a Buffer
+ *
+ * @author Feross Aboukhadijeh <feross@feross.org> <http://feross.org>
+ * @license MIT
+ */
+
+// The _isBuffer check is for Safari 5-7 support, because it's missing
+// Object.prototype.constructor. Remove this eventually
+module.exports = function (obj) {
+ return obj != null && (isBuffer(obj) || isSlowBuffer(obj) || !!obj._isBuffer)
+}
+
+function isBuffer (obj) {
+ return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj)
+}
+
+// For Node v0.10 support. Remove this eventually.
+function isSlowBuffer (obj) {
+ return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isBuffer(obj.slice(0, 0))
+}
+
+},{}],53:[function(require,module,exports){
+var toString = {}.toString;
+
+module.exports = Array.isArray || function (arr) {
+ return toString.call(arr) == '[object Array]';
+};
+
+},{}],54:[function(require,module,exports){
+(function (global){
+/*! JSON v3.3.2 | http://bestiejs.github.io/json3 | Copyright 2012-2014, Kit Cambridge | http://kit.mit-license.org */
+;(function () {
+ // Detect the `define` function exposed by asynchronous module loaders. The
+ // strict `define` check is necessary for compatibility with `r.js`.
+ var isLoader = false;
+
+ // A set of types used to distinguish objects from primitives.
+ var objectTypes = {
+ "function": true,
+ "object": true
+ };
+
+ // Detect the `exports` object exposed by CommonJS implementations.
+ var freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports;
+
+ // Use the `global` object exposed by Node (including Browserify via
+ // `insert-module-globals`), Narwhal, and Ringo as the default context,
+ // and the `window` object in browsers. Rhino exports a `global` function
+ // instead.
+ var root = objectTypes[typeof window] && window || this,
+ freeGlobal = freeExports && objectTypes[typeof module] && module && !module.nodeType && typeof global == "object" && global;
+
+ if (freeGlobal && (freeGlobal["global"] === freeGlobal || freeGlobal["window"] === freeGlobal || freeGlobal["self"] === freeGlobal)) {
+ root = freeGlobal;
+ }
+
+ // Public: Initializes JSON 3 using the given `context` object, attaching the
+ // `stringify` and `parse` functions to the specified `exports` object.
+ function runInContext(context, exports) {
+ context || (context = root["Object"]());
+ exports || (exports = root["Object"]());
+
+ // Native constructor aliases.
+ var Number = context["Number"] || root["Number"],
+ String = context["String"] || root["String"],
+ Object = context["Object"] || root["Object"],
+ Date = context["Date"] || root["Date"],
+ SyntaxError = context["SyntaxError"] || root["SyntaxError"],
+ TypeError = context["TypeError"] || root["TypeError"],
+ Math = context["Math"] || root["Math"],
+ nativeJSON = context["JSON"] || root["JSON"];
+
+ // Delegate to the native `stringify` and `parse` implementations.
+ if (typeof nativeJSON == "object" && nativeJSON) {
+ exports.stringify = nativeJSON.stringify;
+ exports.parse = nativeJSON.parse;
+ }
+
+ // Convenience aliases.
+ var objectProto = Object.prototype,
+ getClass = objectProto.toString,
+ isProperty, forEach, undef;
+
+ // Test the `Date#getUTC*` methods. Based on work by @Yaffle.
+ var isExtended = new Date(-3509827334573292);
+ try {
+ // The `getUTCFullYear`, `Month`, and `Date` methods return nonsensical
+ // results for certain dates in Opera >= 10.53.
+ isExtended = isExtended.getUTCFullYear() == -109252 && isExtended.getUTCMonth() === 0 && isExtended.getUTCDate() === 1 &&
+ // Safari < 2.0.2 stores the internal millisecond time value correctly,
+ // but clips the values returned by the date methods to the range of
+ // signed 32-bit integers ([-2 ** 31, 2 ** 31 - 1]).
+ isExtended.getUTCHours() == 10 && isExtended.getUTCMinutes() == 37 && isExtended.getUTCSeconds() == 6 && isExtended.getUTCMilliseconds() == 708;
+ } catch (exception) {}
+
+ // Internal: Determines whether the native `JSON.stringify` and `parse`
+ // implementations are spec-compliant. Based on work by Ken Snyder.
+ function has(name) {
+ if (has[name] !== undef) {
+ // Return cached feature test result.
+ return has[name];
+ }
+ var isSupported;
+ if (name == "bug-string-char-index") {
+ // IE <= 7 doesn't support accessing string characters using square
+ // bracket notation. IE 8 only supports this for primitives.
+ isSupported = "a"[0] != "a";
+ } else if (name == "json") {
+ // Indicates whether both `JSON.stringify` and `JSON.parse` are
+ // supported.
+ isSupported = has("json-stringify") && has("json-parse");
+ } else {
+ var value, serialized = '{"a":[1,true,false,null,"\\u0000\\b\\n\\f\\r\\t"]}';
+ // Test `JSON.stringify`.
+ if (name == "json-stringify") {
+ var stringify = exports.stringify, stringifySupported = typeof stringify == "function" && isExtended;
+ if (stringifySupported) {
+ // A test function object with a custom `toJSON` method.
+ (value = function () {
+ return 1;
+ }).toJSON = value;
+ try {
+ stringifySupported =
+ // Firefox 3.1b1 and b2 serialize string, number, and boolean
+ // primitives as object literals.
+ stringify(0) === "0" &&
+ // FF 3.1b1, b2, and JSON 2 serialize wrapped primitives as object
+ // literals.
+ stringify(new Number()) === "0" &&
+ stringify(new String()) == '""' &&
+ // FF 3.1b1, 2 throw an error if the value is `null`, `undefined`, or
+ // does not define a canonical JSON representation (this applies to
+ // objects with `toJSON` properties as well, *unless* they are nested
+ // within an object or array).
+ stringify(getClass) === undef &&
+ // IE 8 serializes `undefined` as `"undefined"`. Safari <= 5.1.7 and
+ // FF 3.1b3 pass this test.
+ stringify(undef) === undef &&
+ // Safari <= 5.1.7 and FF 3.1b3 throw `Error`s and `TypeError`s,
+ // respectively, if the value is omitted entirely.
+ stringify() === undef &&
+ // FF 3.1b1, 2 throw an error if the given value is not a number,
+ // string, array, object, Boolean, or `null` literal. This applies to
+ // objects with custom `toJSON` methods as well, unless they are nested
+ // inside object or array literals. YUI 3.0.0b1 ignores custom `toJSON`
+ // methods entirely.
+ stringify(value) === "1" &&
+ stringify([value]) == "[1]" &&
+ // Prototype <= 1.6.1 serializes `[undefined]` as `"[]"` instead of
+ // `"[null]"`.
+ stringify([undef]) == "[null]" &&
+ // YUI 3.0.0b1 fails to serialize `null` literals.
+ stringify(null) == "null" &&
+ // FF 3.1b1, 2 halts serialization if an array contains a function:
+ // `[1, true, getClass, 1]` serializes as "[1,true,],". FF 3.1b3
+ // elides non-JSON values from objects and arrays, unless they
+ // define custom `toJSON` methods.
+ stringify([undef, getClass, null]) == "[null,null,null]" &&
+ // Simple serialization test. FF 3.1b1 uses Unicode escape sequences
+ // where character escape codes are expected (e.g., `\b` => `\u0008`).
+ stringify({ "a": [value, true, false, null, "\x00\b\n\f\r\t"] }) == serialized &&
+ // FF 3.1b1 and b2 ignore the `filter` and `width` arguments.
+ stringify(null, value) === "1" &&
+ stringify([1, 2], null, 1) == "[\n 1,\n 2\n]" &&
+ // JSON 2, Prototype <= 1.7, and older WebKit builds incorrectly
+ // serialize extended years.
+ stringify(new Date(-8.64e15)) == '"-271821-04-20T00:00:00.000Z"' &&
+ // The milliseconds are optional in ES 5, but required in 5.1.
+ stringify(new Date(8.64e15)) == '"+275760-09-13T00:00:00.000Z"' &&
+ // Firefox <= 11.0 incorrectly serializes years prior to 0 as negative
+ // four-digit years instead of six-digit years. Credits: @Yaffle.
+ stringify(new Date(-621987552e5)) == '"-000001-01-01T00:00:00.000Z"' &&
+ // Safari <= 5.1.5 and Opera >= 10.53 incorrectly serialize millisecond
+ // values less than 1000. Credits: @Yaffle.
+ stringify(new Date(-1)) == '"1969-12-31T23:59:59.999Z"';
+ } catch (exception) {
+ stringifySupported = false;
+ }
+ }
+ isSupported = stringifySupported;
+ }
+ // Test `JSON.parse`.
+ if (name == "json-parse") {
+ var parse = exports.parse;
+ if (typeof parse == "function") {
+ try {
+ // FF 3.1b1, b2 will throw an exception if a bare literal is provided.
+ // Conforming implementations should also coerce the initial argument to
+ // a string prior to parsing.
+ if (parse("0") === 0 && !parse(false)) {
+ // Simple parsing test.
+ value = parse(serialized);
+ var parseSupported = value["a"].length == 5 && value["a"][0] === 1;
+ if (parseSupported) {
+ try {
+ // Safari <= 5.1.2 and FF 3.1b1 allow unescaped tabs in strings.
+ parseSupported = !parse('"\t"');
+ } catch (exception) {}
+ if (parseSupported) {
+ try {
+ // FF 4.0 and 4.0.1 allow leading `+` signs and leading
+ // decimal points. FF 4.0, 4.0.1, and IE 9-10 also allow
+ // certain octal literals.
+ parseSupported = parse("01") !== 1;
+ } catch (exception) {}
+ }
+ if (parseSupported) {
+ try {
+ // FF 4.0, 4.0.1, and Rhino 1.7R3-R4 allow trailing decimal
+ // points. These environments, along with FF 3.1b1 and 2,
+ // also allow trailing commas in JSON objects and arrays.
+ parseSupported = parse("1.") !== 1;
+ } catch (exception) {}
+ }
+ }
+ }
+ } catch (exception) {
+ parseSupported = false;
+ }
+ }
+ isSupported = parseSupported;
+ }
+ }
+ return has[name] = !!isSupported;
+ }
+
+ if (!has("json")) {
+ // Common `[[Class]]` name aliases.
+ var functionClass = "[object Function]",
+ dateClass = "[object Date]",
+ numberClass = "[object Number]",
+ stringClass = "[object String]",
+ arrayClass = "[object Array]",
+ booleanClass = "[object Boolean]";
+
+ // Detect incomplete support for accessing string characters by index.
+ var charIndexBuggy = has("bug-string-char-index");
+
+ // Define additional utility methods if the `Date` methods are buggy.
+ if (!isExtended) {
+ var floor = Math.floor;
+ // A mapping between the months of the year and the number of days between
+ // January 1st and the first of the respective month.
+ var Months = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334];
+ // Internal: Calculates the number of days between the Unix epoch and the
+ // first day of the given month.
+ var getDay = function (year, month) {
+ return Months[month] + 365 * (year - 1970) + floor((year - 1969 + (month = +(month > 1))) / 4) - floor((year - 1901 + month) / 100) + floor((year - 1601 + month) / 400);
+ };
+ }
+
+ // Internal: Determines if a property is a direct property of the given
+ // object. Delegates to the native `Object#hasOwnProperty` method.
+ if (!(isProperty = objectProto.hasOwnProperty)) {
+ isProperty = function (property) {
+ var members = {}, constructor;
+ if ((members.__proto__ = null, members.__proto__ = {
+ // The *proto* property cannot be set multiple times in recent
+ // versions of Firefox and SeaMonkey.
+ "toString": 1
+ }, members).toString != getClass) {
+ // Safari <= 2.0.3 doesn't implement `Object#hasOwnProperty`, but
+ // supports the mutable *proto* property.
+ isProperty = function (property) {
+ // Capture and break the object's prototype chain (see section 8.6.2
+ // of the ES 5.1 spec). The parenthesized expression prevents an
+ // unsafe transformation by the Closure Compiler.
+ var original = this.__proto__, result = property in (this.__proto__ = null, this);
+ // Restore the original prototype chain.
+ this.__proto__ = original;
+ return result;
+ };
+ } else {
+ // Capture a reference to the top-level `Object` constructor.
+ constructor = members.constructor;
+ // Use the `constructor` property to simulate `Object#hasOwnProperty` in
+ // other environments.
+ isProperty = function (property) {
+ var parent = (this.constructor || constructor).prototype;
+ return property in this && !(property in parent && this[property] === parent[property]);
+ };
+ }
+ members = null;
+ return isProperty.call(this, property);
+ };
+ }
+
+ // Internal: Normalizes the `for...in` iteration algorithm across
+ // environments. Each enumerated key is yielded to a `callback` function.
+ forEach = function (object, callback) {
+ var size = 0, Properties, members, property;
+
+ // Tests for bugs in the current environment's `for...in` algorithm. The
+ // `valueOf` property inherits the non-enumerable flag from
+ // `Object.prototype` in older versions of IE, Netscape, and Mozilla.
+ (Properties = function () {
+ this.valueOf = 0;
+ }).prototype.valueOf = 0;
+
+ // Iterate over a new instance of the `Properties` class.
+ members = new Properties();
+ for (property in members) {
+ // Ignore all properties inherited from `Object.prototype`.
+ if (isProperty.call(members, property)) {
+ size++;
+ }
+ }
+ Properties = members = null;
+
+ // Normalize the iteration algorithm.
+ if (!size) {
+ // A list of non-enumerable properties inherited from `Object.prototype`.
+ members = ["valueOf", "toString", "toLocaleString", "propertyIsEnumerable", "isPrototypeOf", "hasOwnProperty", "constructor"];
+ // IE <= 8, Mozilla 1.0, and Netscape 6.2 ignore shadowed non-enumerable
+ // properties.
+ forEach = function (object, callback) {
+ var isFunction = getClass.call(object) == functionClass, property, length;
+ var hasProperty = !isFunction && typeof object.constructor != "function" && objectTypes[typeof object.hasOwnProperty] && object.hasOwnProperty || isProperty;
+ for (property in object) {
+ // Gecko <= 1.0 enumerates the `prototype` property of functions under
+ // certain conditions; IE does not.
+ if (!(isFunction && property == "prototype") && hasProperty.call(object, property)) {
+ callback(property);
+ }
+ }
+ // Manually invoke the callback for each non-enumerable property.
+ for (length = members.length; property = members[--length]; hasProperty.call(object, property) && callback(property));
+ };
+ } else if (size == 2) {
+ // Safari <= 2.0.4 enumerates shadowed properties twice.
+ forEach = function (object, callback) {
+ // Create a set of iterated properties.
+ var members = {}, isFunction = getClass.call(object) == functionClass, property;
+ for (property in object) {
+ // Store each property name to prevent double enumeration. The
+ // `prototype` property of functions is not enumerated due to cross-
+ // environment inconsistencies.
+ if (!(isFunction && property == "prototype") && !isProperty.call(members, property) && (members[property] = 1) && isProperty.call(object, property)) {
+ callback(property);
+ }
+ }
+ };
+ } else {
+ // No bugs detected; use the standard `for...in` algorithm.
+ forEach = function (object, callback) {
+ var isFunction = getClass.call(object) == functionClass, property, isConstructor;
+ for (property in object) {
+ if (!(isFunction && property == "prototype") && isProperty.call(object, property) && !(isConstructor = property === "constructor")) {
+ callback(property);
+ }
+ }
+ // Manually invoke the callback for the `constructor` property due to
+ // cross-environment inconsistencies.
+ if (isConstructor || isProperty.call(object, (property = "constructor"))) {
+ callback(property);
+ }
+ };
+ }
+ return forEach(object, callback);
+ };
+
+ // Public: Serializes a JavaScript `value` as a JSON string. The optional
+ // `filter` argument may specify either a function that alters how object and
+ // array members are serialized, or an array of strings and numbers that
+ // indicates which properties should be serialized. The optional `width`
+ // argument may be either a string or number that specifies the indentation
+ // level of the output.
+ if (!has("json-stringify")) {
+ // Internal: A map of control characters and their escaped equivalents.
+ var Escapes = {
+ 92: "\\\\",
+ 34: '\\"',
+ 8: "\\b",
+ 12: "\\f",
+ 10: "\\n",
+ 13: "\\r",
+ 9: "\\t"
+ };
+
+ // Internal: Converts `value` into a zero-padded string such that its
+ // length is at least equal to `width`. The `width` must be <= 6.
+ var leadingZeroes = "000000";
+ var toPaddedString = function (width, value) {
+ // The `|| 0` expression is necessary to work around a bug in
+ // Opera <= 7.54u2 where `0 == -0`, but `String(-0) !== "0"`.
+ return (leadingZeroes + (value || 0)).slice(-width);
+ };
+
+ // Internal: Double-quotes a string `value`, replacing all ASCII control
+ // characters (characters with code unit values between 0 and 31) with
+ // their escaped equivalents. This is an implementation of the
+ // `Quote(value)` operation defined in ES 5.1 section 15.12.3.
+ var unicodePrefix = "\\u00";
+ var quote = function (value) {
+ var result = '"', index = 0, length = value.length, useCharIndex = !charIndexBuggy || length > 10;
+ var symbols = useCharIndex && (charIndexBuggy ? value.split("") : value);
+ for (; index < length; index++) {
+ var charCode = value.charCodeAt(index);
+ // If the character is a control character, append its Unicode or
+ // shorthand escape sequence; otherwise, append the character as-is.
+ switch (charCode) {
+ case 8: case 9: case 10: case 12: case 13: case 34: case 92:
+ result += Escapes[charCode];
+ break;
+ default:
+ if (charCode < 32) {
+ result += unicodePrefix + toPaddedString(2, charCode.toString(16));
+ break;
+ }
+ result += useCharIndex ? symbols[index] : value.charAt(index);
+ }
+ }
+ return result + '"';
+ };
+
+ // Internal: Recursively serializes an object. Implements the
+ // `Str(key, holder)`, `JO(value)`, and `JA(value)` operations.
+ var serialize = function (property, object, callback, properties, whitespace, indentation, stack) {
+ var value, className, year, month, date, time, hours, minutes, seconds, milliseconds, results, element, index, length, prefix, result;
+ try {
+ // Necessary for host object support.
+ value = object[property];
+ } catch (exception) {}
+ if (typeof value == "object" && value) {
+ className = getClass.call(value);
+ if (className == dateClass && !isProperty.call(value, "toJSON")) {
+ if (value > -1 / 0 && value < 1 / 0) {
+ // Dates are serialized according to the `Date#toJSON` method
+ // specified in ES 5.1 section 15.9.5.44. See section 15.9.1.15
+ // for the ISO 8601 date time string format.
+ if (getDay) {
+ // Manually compute the year, month, date, hours, minutes,
+ // seconds, and milliseconds if the `getUTC*` methods are
+ // buggy. Adapted from @Yaffle's `date-shim` project.
+ date = floor(value / 864e5);
+ for (year = floor(date / 365.2425) + 1970 - 1; getDay(year + 1, 0) <= date; year++);
+ for (month = floor((date - getDay(year, 0)) / 30.42); getDay(year, month + 1) <= date; month++);
+ date = 1 + date - getDay(year, month);
+ // The `time` value specifies the time within the day (see ES
+ // 5.1 section 15.9.1.2). The formula `(A % B + B) % B` is used
+ // to compute `A modulo B`, as the `%` operator does not
+ // correspond to the `modulo` operation for negative numbers.
+ time = (value % 864e5 + 864e5) % 864e5;
+ // The hours, minutes, seconds, and milliseconds are obtained by
+ // decomposing the time within the day. See section 15.9.1.10.
+ hours = floor(time / 36e5) % 24;
+ minutes = floor(time / 6e4) % 60;
+ seconds = floor(time / 1e3) % 60;
+ milliseconds = time % 1e3;
+ } else {
+ year = value.getUTCFullYear();
+ month = value.getUTCMonth();
+ date = value.getUTCDate();
+ hours = value.getUTCHours();
+ minutes = value.getUTCMinutes();
+ seconds = value.getUTCSeconds();
+ milliseconds = value.getUTCMilliseconds();
+ }
+ // Serialize extended years correctly.
+ value = (year <= 0 || year >= 1e4 ? (year < 0 ? "-" : "+") + toPaddedString(6, year < 0 ? -year : year) : toPaddedString(4, year)) +
+ "-" + toPaddedString(2, month + 1) + "-" + toPaddedString(2, date) +
+ // Months, dates, hours, minutes, and seconds should have two
+ // digits; milliseconds should have three.
+ "T" + toPaddedString(2, hours) + ":" + toPaddedString(2, minutes) + ":" + toPaddedString(2, seconds) +
+ // Milliseconds are optional in ES 5.0, but required in 5.1.
+ "." + toPaddedString(3, milliseconds) + "Z";
+ } else {
+ value = null;
+ }
+ } else if (typeof value.toJSON == "function" && ((className != numberClass && className != stringClass && className != arrayClass) || isProperty.call(value, "toJSON"))) {
+ // Prototype <= 1.6.1 adds non-standard `toJSON` methods to the
+ // `Number`, `String`, `Date`, and `Array` prototypes. JSON 3
+ // ignores all `toJSON` methods on these objects unless they are
+ // defined directly on an instance.
+ value = value.toJSON(property);
+ }
+ }
+ if (callback) {
+ // If a replacement function was provided, call it to obtain the value
+ // for serialization.
+ value = callback.call(object, property, value);
+ }
+ if (value === null) {
+ return "null";
+ }
+ className = getClass.call(value);
+ if (className == booleanClass) {
+ // Booleans are represented literally.
+ return "" + value;
+ } else if (className == numberClass) {
+ // JSON numbers must be finite. `Infinity` and `NaN` are serialized as
+ // `"null"`.
+ return value > -1 / 0 && value < 1 / 0 ? "" + value : "null";
+ } else if (className == stringClass) {
+ // Strings are double-quoted and escaped.
+ return quote("" + value);
+ }
+ // Recursively serialize objects and arrays.
+ if (typeof value == "object") {
+ // Check for cyclic structures. This is a linear search; performance
+ // is inversely proportional to the number of unique nested objects.
+ for (length = stack.length; length--;) {
+ if (stack[length] === value) {
+ // Cyclic structures cannot be serialized by `JSON.stringify`.
+ throw TypeError();
+ }
+ }
+ // Add the object to the stack of traversed objects.
+ stack.push(value);
+ results = [];
+ // Save the current indentation level and indent one additional level.
+ prefix = indentation;
+ indentation += whitespace;
+ if (className == arrayClass) {
+ // Recursively serialize array elements.
+ for (index = 0, length = value.length; index < length; index++) {
+ element = serialize(index, value, callback, properties, whitespace, indentation, stack);
+ results.push(element === undef ? "null" : element);
+ }
+ result = results.length ? (whitespace ? "[\n" + indentation + results.join(",\n" + indentation) + "\n" + prefix + "]" : ("[" + results.join(",") + "]")) : "[]";
+ } else {
+ // Recursively serialize object members. Members are selected from
+ // either a user-specified list of property names, or the object
+ // itself.
+ forEach(properties || value, function (property) {
+ var element = serialize(property, value, callback, properties, whitespace, indentation, stack);
+ if (element !== undef) {
+ // According to ES 5.1 section 15.12.3: "If `gap` {whitespace}
+ // is not the empty string, let `member` {quote(property) + ":"}
+ // be the concatenation of `member` and the `space` character."
+ // The "`space` character" refers to the literal space
+ // character, not the `space` {width} argument provided to
+ // `JSON.stringify`.
+ results.push(quote(property) + ":" + (whitespace ? " " : "") + element);
+ }
+ });
+ result = results.length ? (whitespace ? "{\n" + indentation + results.join(",\n" + indentation) + "\n" + prefix + "}" : ("{" + results.join(",") + "}")) : "{}";
+ }
+ // Remove the object from the traversed object stack.
+ stack.pop();
+ return result;
+ }
+ };
+
+ // Public: `JSON.stringify`. See ES 5.1 section 15.12.3.
+ exports.stringify = function (source, filter, width) {
+ var whitespace, callback, properties, className;
+ if (objectTypes[typeof filter] && filter) {
+ if ((className = getClass.call(filter)) == functionClass) {
+ callback = filter;
+ } else if (className == arrayClass) {
+ // Convert the property names array into a makeshift set.
+ properties = {};
+ for (var index = 0, length = filter.length, value; index < length; value = filter[index++], ((className = getClass.call(value)), className == stringClass || className == numberClass) && (properties[value] = 1));
+ }
+ }
+ if (width) {
+ if ((className = getClass.call(width)) == numberClass) {
+ // Convert the `width` to an integer and create a string containing
+ // `width` number of space characters.
+ if ((width -= width % 1) > 0) {
+ for (whitespace = "", width > 10 && (width = 10); whitespace.length < width; whitespace += " ");
+ }
+ } else if (className == stringClass) {
+ whitespace = width.length <= 10 ? width : width.slice(0, 10);
+ }
+ }
+ // Opera <= 7.54u2 discards the values associated with empty string keys
+ // (`""`) only if they are used directly within an object member list
+ // (e.g., `!("" in { "": 1})`).
+ return serialize("", (value = {}, value[""] = source, value), callback, properties, whitespace, "", []);
+ };
+ }
+
+ // Public: Parses a JSON source string.
+ if (!has("json-parse")) {
+ var fromCharCode = String.fromCharCode;
+
+ // Internal: A map of escaped control characters and their unescaped
+ // equivalents.
+ var Unescapes = {
+ 92: "\\",
+ 34: '"',
+ 47: "/",
+ 98: "\b",
+ 116: "\t",
+ 110: "\n",
+ 102: "\f",
+ 114: "\r"
+ };
+
+ // Internal: Stores the parser state.
+ var Index, Source;
+
+ // Internal: Resets the parser state and throws a `SyntaxError`.
+ var abort = function () {
+ Index = Source = null;
+ throw SyntaxError();
+ };
+
+ // Internal: Returns the next token, or `"$"` if the parser has reached
+ // the end of the source string. A token may be a string, number, `null`
+ // literal, or Boolean literal.
+ var lex = function () {
+ var source = Source, length = source.length, value, begin, position, isSigned, charCode;
+ while (Index < length) {
+ charCode = source.charCodeAt(Index);
+ switch (charCode) {
+ case 9: case 10: case 13: case 32:
+ // Skip whitespace tokens, including tabs, carriage returns, line
+ // feeds, and space characters.
+ Index++;
+ break;
+ case 123: case 125: case 91: case 93: case 58: case 44:
+ // Parse a punctuator token (`{`, `}`, `[`, `]`, `:`, or `,`) at
+ // the current position.
+ value = charIndexBuggy ? source.charAt(Index) : source[Index];
+ Index++;
+ return value;
+ case 34:
+ // `"` delimits a JSON string; advance to the next character and
+ // begin parsing the string. String tokens are prefixed with the
+ // sentinel `@` character to distinguish them from punctuators and
+ // end-of-string tokens.
+ for (value = "@", Index++; Index < length;) {
+ charCode = source.charCodeAt(Index);
+ if (charCode < 32) {
+ // Unescaped ASCII control characters (those with a code unit
+ // less than the space character) are not permitted.
+ abort();
+ } else if (charCode == 92) {
+ // A reverse solidus (`\`) marks the beginning of an escaped
+ // control character (including `"`, `\`, and `/`) or Unicode
+ // escape sequence.
+ charCode = source.charCodeAt(++Index);
+ switch (charCode) {
+ case 92: case 34: case 47: case 98: case 116: case 110: case 102: case 114:
+ // Revive escaped control characters.
+ value += Unescapes[charCode];
+ Index++;
+ break;
+ case 117:
+ // `\u` marks the beginning of a Unicode escape sequence.
+ // Advance to the first character and validate the
+ // four-digit code point.
+ begin = ++Index;
+ for (position = Index + 4; Index < position; Index++) {
+ charCode = source.charCodeAt(Index);
+ // A valid sequence comprises four hexdigits (case-
+ // insensitive) that form a single hexadecimal value.
+ if (!(charCode >= 48 && charCode <= 57 || charCode >= 97 && charCode <= 102 || charCode >= 65 && charCode <= 70)) {
+ // Invalid Unicode escape sequence.
+ abort();
+ }
+ }
+ // Revive the escaped character.
+ value += fromCharCode("0x" + source.slice(begin, Index));
+ break;
+ default:
+ // Invalid escape sequence.
+ abort();
+ }
+ } else {
+ if (charCode == 34) {
+ // An unescaped double-quote character marks the end of the
+ // string.
+ break;
+ }
+ charCode = source.charCodeAt(Index);
+ begin = Index;
+ // Optimize for the common case where a string is valid.
+ while (charCode >= 32 && charCode != 92 && charCode != 34) {
+ charCode = source.charCodeAt(++Index);
+ }
+ // Append the string as-is.
+ value += source.slice(begin, Index);
+ }
+ }
+ if (source.charCodeAt(Index) == 34) {
+ // Advance to the next character and return the revived string.
+ Index++;
+ return value;
+ }
+ // Unterminated string.
+ abort();
+ default:
+ // Parse numbers and literals.
+ begin = Index;
+ // Advance past the negative sign, if one is specified.
+ if (charCode == 45) {
+ isSigned = true;
+ charCode = source.charCodeAt(++Index);
+ }
+ // Parse an integer or floating-point value.
+ if (charCode >= 48 && charCode <= 57) {
+ // Leading zeroes are interpreted as octal literals.
+ if (charCode == 48 && ((charCode = source.charCodeAt(Index + 1)), charCode >= 48 && charCode <= 57)) {
+ // Illegal octal literal.
+ abort();
+ }
+ isSigned = false;
+ // Parse the integer component.
+ for (; Index < length && ((charCode = source.charCodeAt(Index)), charCode >= 48 && charCode <= 57); Index++);
+ // Floats cannot contain a leading decimal point; however, this
+ // case is already accounted for by the parser.
+ if (source.charCodeAt(Index) == 46) {
+ position = ++Index;
+ // Parse the decimal component.
+ for (; position < length && ((charCode = source.charCodeAt(position)), charCode >= 48 && charCode <= 57); position++);
+ if (position == Index) {
+ // Illegal trailing decimal.
+ abort();
+ }
+ Index = position;
+ }
+ // Parse exponents. The `e` denoting the exponent is
+ // case-insensitive.
+ charCode = source.charCodeAt(Index);
+ if (charCode == 101 || charCode == 69) {
+ charCode = source.charCodeAt(++Index);
+ // Skip past the sign following the exponent, if one is
+ // specified.
+ if (charCode == 43 || charCode == 45) {
+ Index++;
+ }
+ // Parse the exponential component.
+ for (position = Index; position < length && ((charCode = source.charCodeAt(position)), charCode >= 48 && charCode <= 57); position++);
+ if (position == Index) {
+ // Illegal empty exponent.
+ abort();
+ }
+ Index = position;
+ }
+ // Coerce the parsed value to a JavaScript number.
+ return +source.slice(begin, Index);
+ }
+ // A negative sign may only precede numbers.
+ if (isSigned) {
+ abort();
+ }
+ // `true`, `false`, and `null` literals.
+ if (source.slice(Index, Index + 4) == "true") {
+ Index += 4;
+ return true;
+ } else if (source.slice(Index, Index + 5) == "false") {
+ Index += 5;
+ return false;
+ } else if (source.slice(Index, Index + 4) == "null") {
+ Index += 4;
+ return null;
+ }
+ // Unrecognized token.
+ abort();
+ }
+ }
+ // Return the sentinel `$` character if the parser has reached the end
+ // of the source string.
+ return "$";
+ };
+
+ // Internal: Parses a JSON `value` token.
+ var get = function (value) {
+ var results, hasMembers;
+ if (value == "$") {
+ // Unexpected end of input.
+ abort();
+ }
+ if (typeof value == "string") {
+ if ((charIndexBuggy ? value.charAt(0) : value[0]) == "@") {
+ // Remove the sentinel `@` character.
+ return value.slice(1);
+ }
+ // Parse object and array literals.
+ if (value == "[") {
+ // Parses a JSON array, returning a new JavaScript array.
+ results = [];
+ for (;; hasMembers || (hasMembers = true)) {
+ value = lex();
+ // A closing square bracket marks the end of the array literal.
+ if (value == "]") {
+ break;
+ }
+ // If the array literal contains elements, the current token
+ // should be a comma separating the previous element from the
+ // next.
+ if (hasMembers) {
+ if (value == ",") {
+ value = lex();
+ if (value == "]") {
+ // Unexpected trailing `,` in array literal.
+ abort();
+ }
+ } else {
+ // A `,` must separate each array element.
+ abort();
+ }
+ }
+ // Elisions and leading commas are not permitted.
+ if (value == ",") {
+ abort();
+ }
+ results.push(get(value));
+ }
+ return results;
+ } else if (value == "{") {
+ // Parses a JSON object, returning a new JavaScript object.
+ results = {};
+ for (;; hasMembers || (hasMembers = true)) {
+ value = lex();
+ // A closing curly brace marks the end of the object literal.
+ if (value == "}") {
+ break;
+ }
+ // If the object literal contains members, the current token
+ // should be a comma separator.
+ if (hasMembers) {
+ if (value == ",") {
+ value = lex();
+ if (value == "}") {
+ // Unexpected trailing `,` in object literal.
+ abort();
+ }
+ } else {
+ // A `,` must separate each object member.
+ abort();
+ }
+ }
+ // Leading commas are not permitted, object property names must be
+ // double-quoted strings, and a `:` must separate each property
+ // name and value.
+ if (value == "," || typeof value != "string" || (charIndexBuggy ? value.charAt(0) : value[0]) != "@" || lex() != ":") {
+ abort();
+ }
+ results[value.slice(1)] = get(lex());
+ }
+ return results;
+ }
+ // Unexpected token encountered.
+ abort();
+ }
+ return value;
+ };
+
+ // Internal: Updates a traversed object member.
+ var update = function (source, property, callback) {
+ var element = walk(source, property, callback);
+ if (element === undef) {
+ delete source[property];
+ } else {
+ source[property] = element;
+ }
+ };
+
+ // Internal: Recursively traverses a parsed JSON object, invoking the
+ // `callback` function for each value. This is an implementation of the
+ // `Walk(holder, name)` operation defined in ES 5.1 section 15.12.2.
+ var walk = function (source, property, callback) {
+ var value = source[property], length;
+ if (typeof value == "object" && value) {
+ // `forEach` can't be used to traverse an array in Opera <= 8.54
+ // because its `Object#hasOwnProperty` implementation returns `false`
+ // for array indices (e.g., `![1, 2, 3].hasOwnProperty("0")`).
+ if (getClass.call(value) == arrayClass) {
+ for (length = value.length; length--;) {
+ update(value, length, callback);
+ }
+ } else {
+ forEach(value, function (property) {
+ update(value, property, callback);
+ });
+ }
+ }
+ return callback.call(source, property, value);
+ };
+
+ // Public: `JSON.parse`. See ES 5.1 section 15.12.2.
+ exports.parse = function (source, callback) {
+ var result, value;
+ Index = 0;
+ Source = "" + source;
+ result = get(lex());
+ // If a JSON string contains multiple tokens, it is invalid.
+ if (lex() != "$") {
+ abort();
+ }
+ // Reset the parser state.
+ Index = Source = null;
+ return callback && getClass.call(callback) == functionClass ? walk((value = {}, value[""] = result, value), "", callback) : result;
+ };
+ }
+ }
+
+ exports["runInContext"] = runInContext;
+ return exports;
+ }
+
+ if (freeExports && !isLoader) {
+ // Export for CommonJS environments.
+ runInContext(root, freeExports);
+ } else {
+ // Export for web browsers and JavaScript engines.
+ var nativeJSON = root.JSON,
+ previousJSON = root["JSON3"],
+ isRestored = false;
+
+ var JSON3 = runInContext(root, (root["JSON3"] = {
+ // Public: Restores the original value of the global `JSON` object and
+ // returns a reference to the `JSON3` object.
+ "noConflict": function () {
+ if (!isRestored) {
+ isRestored = true;
+ root.JSON = nativeJSON;
+ root["JSON3"] = previousJSON;
+ nativeJSON = previousJSON = null;
+ }
+ return JSON3;
+ }
+ }));
+
+ root.JSON = {
+ "parse": JSON3.parse,
+ "stringify": JSON3.stringify
+ };
+ }
+
+ // Export for asynchronous module loaders.
+ if (isLoader) {
+ define(function () {
+ return JSON3;
+ });
+ }
+}).call(this);
+
+}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+},{}],55:[function(require,module,exports){
+/**
+ * lodash 3.2.0 (Custom Build) <https://lodash.com/>
+ * Build: `lodash modern modularize exports="npm" -o ./`
+ * Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/>
+ * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
+ * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
+ * Available under MIT license <https://lodash.com/license>
+ */
+var baseCopy = require('lodash._basecopy'),
+ keys = require('lodash.keys');
+
+/**
+ * The base implementation of `_.assign` without support for argument juggling,
+ * multiple sources, and `customizer` functions.
+ *
+ * @private
+ * @param {Object} object The destination object.
+ * @param {Object} source The source object.
+ * @returns {Object} Returns `object`.
+ */
+function baseAssign(object, source) {
+ return source == null
+ ? object
+ : baseCopy(source, keys(source), object);
+}
+
+module.exports = baseAssign;
+
+},{"lodash._basecopy":56,"lodash.keys":63}],56:[function(require,module,exports){
+/**
+ * lodash 3.0.1 (Custom Build) <https://lodash.com/>
+ * Build: `lodash modern modularize exports="npm" -o ./`
+ * Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/>
+ * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
+ * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
+ * Available under MIT license <https://lodash.com/license>
+ */
+
+/**
+ * Copies properties of `source` to `object`.
+ *
+ * @private
+ * @param {Object} source The object to copy properties from.
+ * @param {Array} props The property names to copy.
+ * @param {Object} [object={}] The object to copy properties to.
+ * @returns {Object} Returns `object`.
+ */
+function baseCopy(source, props, object) {
+ object || (object = {});
+
+ var index = -1,
+ length = props.length;
+
+ while (++index < length) {
+ var key = props[index];
+ object[key] = source[key];
+ }
+ return object;
+}
+
+module.exports = baseCopy;
+
+},{}],57:[function(require,module,exports){
+/**
+ * lodash 3.0.3 (Custom Build) <https://lodash.com/>
+ * Build: `lodash modern modularize exports="npm" -o ./`
+ * Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/>
+ * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
+ * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
+ * Available under MIT license <https://lodash.com/license>
+ */
+
+/**
+ * The base implementation of `_.create` without support for assigning
+ * properties to the created object.
+ *
+ * @private
+ * @param {Object} prototype The object to inherit from.
+ * @returns {Object} Returns the new object.
+ */
+var baseCreate = (function() {
+ function object() {}
+ return function(prototype) {
+ if (isObject(prototype)) {
+ object.prototype = prototype;
+ var result = new object;
+ object.prototype = undefined;
+ }
+ return result || {};
+ };
+}());
+
+/**
+ * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.
+ * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is an object, else `false`.
+ * @example
+ *
+ * _.isObject({});
+ * // => true
+ *
+ * _.isObject([1, 2, 3]);
+ * // => true
+ *
+ * _.isObject(1);
+ * // => false
+ */
+function isObject(value) {
+ // Avoid a V8 JIT bug in Chrome 19-20.
+ // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.
+ var type = typeof value;
+ return !!value && (type == 'object' || type == 'function');
+}
+
+module.exports = baseCreate;
+
+},{}],58:[function(require,module,exports){
+/**
+ * lodash 3.9.1 (Custom Build) <https://lodash.com/>
+ * Build: `lodash modern modularize exports="npm" -o ./`
+ * Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/>
+ * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
+ * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
+ * Available under MIT license <https://lodash.com/license>
+ */
+
+/** `Object#toString` result references. */
+var funcTag = '[object Function]';
+
+/** Used to detect host constructors (Safari > 5). */
+var reIsHostCtor = /^\[object .+?Constructor\]$/;
+
+/**
+ * Checks if `value` is object-like.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
+ */
+function isObjectLike(value) {
+ return !!value && typeof value == 'object';
+}
+
+/** Used for native method references. */
+var objectProto = Object.prototype;
+
+/** Used to resolve the decompiled source of functions. */
+var fnToString = Function.prototype.toString;
+
+/** Used to check objects for own properties. */
+var hasOwnProperty = objectProto.hasOwnProperty;
+
+/**
+ * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
+ * of values.
+ */
+var objToString = objectProto.toString;
+
+/** Used to detect if a method is native. */
+var reIsNative = RegExp('^' +
+ fnToString.call(hasOwnProperty).replace(/[\\^$.*+?()[\]{}|]/g, '\\$&')
+ .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
+);
+
+/**
+ * Gets the native function at `key` of `object`.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @param {string} key The key of the method to get.
+ * @returns {*} Returns the function if it's native, else `undefined`.
+ */
+function getNative(object, key) {
+ var value = object == null ? undefined : object[key];
+ return isNative(value) ? value : undefined;
+}
+
+/**
+ * Checks if `value` is classified as a `Function` object.
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
+ * @example
+ *
+ * _.isFunction(_);
+ * // => true
+ *
+ * _.isFunction(/abc/);
+ * // => false
+ */
+function isFunction(value) {
+ // The use of `Object#toString` avoids issues with the `typeof` operator
+ // in older versions of Chrome and Safari which return 'function' for regexes
+ // and Safari 8 equivalents which return 'object' for typed array constructors.
+ return isObject(value) && objToString.call(value) == funcTag;
+}
+
+/**
+ * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.
+ * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is an object, else `false`.
+ * @example
+ *
+ * _.isObject({});
+ * // => true
+ *
+ * _.isObject([1, 2, 3]);
+ * // => true
+ *
+ * _.isObject(1);
+ * // => false
+ */
+function isObject(value) {
+ // Avoid a V8 JIT bug in Chrome 19-20.
+ // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.
+ var type = typeof value;
+ return !!value && (type == 'object' || type == 'function');
+}
+
+/**
+ * Checks if `value` is a native function.
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a native function, else `false`.
+ * @example
+ *
+ * _.isNative(Array.prototype.push);
+ * // => true
+ *
+ * _.isNative(_);
+ * // => false
+ */
+function isNative(value) {
+ if (value == null) {
+ return false;
+ }
+ if (isFunction(value)) {
+ return reIsNative.test(fnToString.call(value));
+ }
+ return isObjectLike(value) && reIsHostCtor.test(value);
+}
+
+module.exports = getNative;
+
+},{}],59:[function(require,module,exports){
+/**
+ * lodash 3.0.9 (Custom Build) <https://lodash.com/>
+ * Build: `lodash modern modularize exports="npm" -o ./`
+ * Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/>
+ * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
+ * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
+ * Available under MIT license <https://lodash.com/license>
+ */
+
+/** Used to detect unsigned integer values. */
+var reIsUint = /^\d+$/;
+
+/**
+ * Used as the [maximum length](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-number.max_safe_integer)
+ * of an array-like value.
+ */
+var MAX_SAFE_INTEGER = 9007199254740991;
+
+/**
+ * The base implementation of `_.property` without support for deep paths.
+ *
+ * @private
+ * @param {string} key The key of the property to get.
+ * @returns {Function} Returns the new function.
+ */
+function baseProperty(key) {
+ return function(object) {
+ return object == null ? undefined : object[key];
+ };
+}
+
+/**
+ * Gets the "length" property value of `object`.
+ *
+ * **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792)
+ * that affects Safari on at least iOS 8.1-8.3 ARM64.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @returns {*} Returns the "length" value.
+ */
+var getLength = baseProperty('length');
+
+/**
+ * Checks if `value` is array-like.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is array-like, else `false`.
+ */
+function isArrayLike(value) {
+ return value != null && isLength(getLength(value));
+}
+
+/**
+ * Checks if `value` is a valid array-like index.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
+ * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
+ */
+function isIndex(value, length) {
+ value = (typeof value == 'number' || reIsUint.test(value)) ? +value : -1;
+ length = length == null ? MAX_SAFE_INTEGER : length;
+ return value > -1 && value % 1 == 0 && value < length;
+}
+
+/**
+ * Checks if the provided arguments are from an iteratee call.
+ *
+ * @private
+ * @param {*} value The potential iteratee value argument.
+ * @param {*} index The potential iteratee index or key argument.
+ * @param {*} object The potential iteratee object argument.
+ * @returns {boolean} Returns `true` if the arguments are from an iteratee call, else `false`.
+ */
+function isIterateeCall(value, index, object) {
+ if (!isObject(object)) {
+ return false;
+ }
+ var type = typeof index;
+ if (type == 'number'
+ ? (isArrayLike(object) && isIndex(index, object.length))
+ : (type == 'string' && index in object)) {
+ var other = object[index];
+ return value === value ? (value === other) : (other !== other);
+ }
+ return false;
+}
+
+/**
+ * Checks if `value` is a valid array-like length.
+ *
+ * **Note:** This function is based on [`ToLength`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength).
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
+ */
+function isLength(value) {
+ return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
+}
+
+/**
+ * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.
+ * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is an object, else `false`.
+ * @example
+ *
+ * _.isObject({});
+ * // => true
+ *
+ * _.isObject([1, 2, 3]);
+ * // => true
+ *
+ * _.isObject(1);
+ * // => false
+ */
+function isObject(value) {
+ // Avoid a V8 JIT bug in Chrome 19-20.
+ // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.
+ var type = typeof value;
+ return !!value && (type == 'object' || type == 'function');
+}
+
+module.exports = isIterateeCall;
+
+},{}],60:[function(require,module,exports){
+/**
+ * lodash 3.1.1 (Custom Build) <https://lodash.com/>
+ * Build: `lodash modern modularize exports="npm" -o ./`
+ * Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/>
+ * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
+ * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
+ * Available under MIT license <https://lodash.com/license>
+ */
+var baseAssign = require('lodash._baseassign'),
+ baseCreate = require('lodash._basecreate'),
+ isIterateeCall = require('lodash._isiterateecall');
+
+/**
+ * Creates an object that inherits from the given `prototype` object. If a
+ * `properties` object is provided its own enumerable properties are assigned
+ * to the created object.
+ *
+ * @static
+ * @memberOf _
+ * @category Object
+ * @param {Object} prototype The object to inherit from.
+ * @param {Object} [properties] The properties to assign to the object.
+ * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
+ * @returns {Object} Returns the new object.
+ * @example
+ *
+ * function Shape() {
+ * this.x = 0;
+ * this.y = 0;
+ * }
+ *
+ * function Circle() {
+ * Shape.call(this);
+ * }
+ *
+ * Circle.prototype = _.create(Shape.prototype, {
+ * 'constructor': Circle
+ * });
+ *
+ * var circle = new Circle;
+ * circle instanceof Circle;
+ * // => true
+ *
+ * circle instanceof Shape;
+ * // => true
+ */
+function create(prototype, properties, guard) {
+ var result = baseCreate(prototype);
+ if (guard && isIterateeCall(prototype, properties, guard)) {
+ properties = undefined;
+ }
+ return properties ? baseAssign(result, properties) : result;
+}
+
+module.exports = create;
+
+},{"lodash._baseassign":55,"lodash._basecreate":57,"lodash._isiterateecall":59}],61:[function(require,module,exports){
+/**
+ * lodash (Custom Build) <https://lodash.com/>
+ * Build: `lodash modularize exports="npm" -o ./`
+ * Copyright jQuery Foundation and other contributors <https://jquery.org/>
+ * Released under MIT license <https://lodash.com/license>
+ * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
+ * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
+ */
+
+/** Used as references for various `Number` constants. */
+var MAX_SAFE_INTEGER = 9007199254740991;
+
+/** `Object#toString` result references. */
+var argsTag = '[object Arguments]',
+ funcTag = '[object Function]',
+ genTag = '[object GeneratorFunction]';
+
+/** Used for built-in method references. */
+var objectProto = Object.prototype;
+
+/** Used to check objects for own properties. */
+var hasOwnProperty = objectProto.hasOwnProperty;
+
+/**
+ * Used to resolve the
+ * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
+ * of values.
+ */
+var objectToString = objectProto.toString;
+
+/** Built-in value references. */
+var propertyIsEnumerable = objectProto.propertyIsEnumerable;
+
+/**
+ * Checks if `value` is likely an `arguments` object.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is an `arguments` object,
+ * else `false`.
+ * @example
+ *
+ * _.isArguments(function() { return arguments; }());
+ * // => true
+ *
+ * _.isArguments([1, 2, 3]);
+ * // => false
+ */
+function isArguments(value) {
+ // Safari 8.1 makes `arguments.callee` enumerable in strict mode.
+ return isArrayLikeObject(value) && hasOwnProperty.call(value, 'callee') &&
+ (!propertyIsEnumerable.call(value, 'callee') || objectToString.call(value) == argsTag);
+}
+
+/**
+ * Checks if `value` is array-like. A value is considered array-like if it's
+ * not a function and has a `value.length` that's an integer greater than or
+ * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is array-like, else `false`.
+ * @example
+ *
+ * _.isArrayLike([1, 2, 3]);
+ * // => true
+ *
+ * _.isArrayLike(document.body.children);
+ * // => true
+ *
+ * _.isArrayLike('abc');
+ * // => true
+ *
+ * _.isArrayLike(_.noop);
+ * // => false
+ */
+function isArrayLike(value) {
+ return value != null && isLength(value.length) && !isFunction(value);
+}
+
+/**
+ * This method is like `_.isArrayLike` except that it also checks if `value`
+ * is an object.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is an array-like object,
+ * else `false`.
+ * @example
+ *
+ * _.isArrayLikeObject([1, 2, 3]);
+ * // => true
+ *
+ * _.isArrayLikeObject(document.body.children);
+ * // => true
+ *
+ * _.isArrayLikeObject('abc');
+ * // => false
+ *
+ * _.isArrayLikeObject(_.noop);
+ * // => false
+ */
+function isArrayLikeObject(value) {
+ return isObjectLike(value) && isArrayLike(value);
+}
+
+/**
+ * Checks if `value` is classified as a `Function` object.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a function, else `false`.
+ * @example
+ *
+ * _.isFunction(_);
+ * // => true
+ *
+ * _.isFunction(/abc/);
+ * // => false
+ */
+function isFunction(value) {
+ // The use of `Object#toString` avoids issues with the `typeof` operator
+ // in Safari 8-9 which returns 'object' for typed array and other constructors.
+ var tag = isObject(value) ? objectToString.call(value) : '';
+ return tag == funcTag || tag == genTag;
+}
+
+/**
+ * Checks if `value` is a valid array-like length.
+ *
+ * **Note:** This method is loosely based on
+ * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
+ * @example
+ *
+ * _.isLength(3);
+ * // => true
+ *
+ * _.isLength(Number.MIN_VALUE);
+ * // => false
+ *
+ * _.isLength(Infinity);
+ * // => false
+ *
+ * _.isLength('3');
+ * // => false
+ */
+function isLength(value) {
+ return typeof value == 'number' &&
+ value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
+}
+
+/**
+ * Checks if `value` is the
+ * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
+ * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is an object, else `false`.
+ * @example
+ *
+ * _.isObject({});
+ * // => true
+ *
+ * _.isObject([1, 2, 3]);
+ * // => true
+ *
+ * _.isObject(_.noop);
+ * // => true
+ *
+ * _.isObject(null);
+ * // => false
+ */
+function isObject(value) {
+ var type = typeof value;
+ return !!value && (type == 'object' || type == 'function');
+}
+
+/**
+ * Checks if `value` is object-like. A value is object-like if it's not `null`
+ * and has a `typeof` result of "object".
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
+ * @example
+ *
+ * _.isObjectLike({});
+ * // => true
+ *
+ * _.isObjectLike([1, 2, 3]);
+ * // => true
+ *
+ * _.isObjectLike(_.noop);
+ * // => false
+ *
+ * _.isObjectLike(null);
+ * // => false
+ */
+function isObjectLike(value) {
+ return !!value && typeof value == 'object';
+}
+
+module.exports = isArguments;
+
+},{}],62:[function(require,module,exports){
+/**
+ * lodash 3.0.4 (Custom Build) <https://lodash.com/>
+ * Build: `lodash modern modularize exports="npm" -o ./`
+ * Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/>
+ * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
+ * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
+ * Available under MIT license <https://lodash.com/license>
+ */
+
+/** `Object#toString` result references. */
+var arrayTag = '[object Array]',
+ funcTag = '[object Function]';
+
+/** Used to detect host constructors (Safari > 5). */
+var reIsHostCtor = /^\[object .+?Constructor\]$/;
+
+/**
+ * Checks if `value` is object-like.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
+ */
+function isObjectLike(value) {
+ return !!value && typeof value == 'object';
+}
+
+/** Used for native method references. */
+var objectProto = Object.prototype;
+
+/** Used to resolve the decompiled source of functions. */
+var fnToString = Function.prototype.toString;
+
+/** Used to check objects for own properties. */
+var hasOwnProperty = objectProto.hasOwnProperty;
+
+/**
+ * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
+ * of values.
+ */
+var objToString = objectProto.toString;
+
+/** Used to detect if a method is native. */
+var reIsNative = RegExp('^' +
+ fnToString.call(hasOwnProperty).replace(/[\\^$.*+?()[\]{}|]/g, '\\$&')
+ .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
+);
+
+/* Native method references for those with the same name as other `lodash` methods. */
+var nativeIsArray = getNative(Array, 'isArray');
+
+/**
+ * Used as the [maximum length](http://ecma-international.org/ecma-262/6.0/#sec-number.max_safe_integer)
+ * of an array-like value.
+ */
+var MAX_SAFE_INTEGER = 9007199254740991;
+
+/**
+ * Gets the native function at `key` of `object`.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @param {string} key The key of the method to get.
+ * @returns {*} Returns the function if it's native, else `undefined`.
+ */
+function getNative(object, key) {
+ var value = object == null ? undefined : object[key];
+ return isNative(value) ? value : undefined;
+}
+
+/**
+ * Checks if `value` is a valid array-like length.
+ *
+ * **Note:** This function is based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength).
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
+ */
+function isLength(value) {
+ return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
+}
+
+/**
+ * Checks if `value` is classified as an `Array` object.
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
+ * @example
+ *
+ * _.isArray([1, 2, 3]);
+ * // => true
+ *
+ * _.isArray(function() { return arguments; }());
+ * // => false
+ */
+var isArray = nativeIsArray || function(value) {
+ return isObjectLike(value) && isLength(value.length) && objToString.call(value) == arrayTag;
+};
+
+/**
+ * Checks if `value` is classified as a `Function` object.
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
+ * @example
+ *
+ * _.isFunction(_);
+ * // => true
+ *
+ * _.isFunction(/abc/);
+ * // => false
+ */
+function isFunction(value) {
+ // The use of `Object#toString` avoids issues with the `typeof` operator
+ // in older versions of Chrome and Safari which return 'function' for regexes
+ // and Safari 8 equivalents which return 'object' for typed array constructors.
+ return isObject(value) && objToString.call(value) == funcTag;
+}
+
+/**
+ * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.
+ * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is an object, else `false`.
+ * @example
+ *
+ * _.isObject({});
+ * // => true
+ *
+ * _.isObject([1, 2, 3]);
+ * // => true
+ *
+ * _.isObject(1);
+ * // => false
+ */
+function isObject(value) {
+ // Avoid a V8 JIT bug in Chrome 19-20.
+ // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.
+ var type = typeof value;
+ return !!value && (type == 'object' || type == 'function');
+}
+
+/**
+ * Checks if `value` is a native function.
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a native function, else `false`.
+ * @example
+ *
+ * _.isNative(Array.prototype.push);
+ * // => true
+ *
+ * _.isNative(_);
+ * // => false
+ */
+function isNative(value) {
+ if (value == null) {
+ return false;
+ }
+ if (isFunction(value)) {
+ return reIsNative.test(fnToString.call(value));
+ }
+ return isObjectLike(value) && reIsHostCtor.test(value);
+}
+
+module.exports = isArray;
+
+},{}],63:[function(require,module,exports){
+/**
+ * lodash 3.1.2 (Custom Build) <https://lodash.com/>
+ * Build: `lodash modern modularize exports="npm" -o ./`
+ * Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/>
+ * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
+ * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
+ * Available under MIT license <https://lodash.com/license>
+ */
+var getNative = require('lodash._getnative'),
+ isArguments = require('lodash.isarguments'),
+ isArray = require('lodash.isarray');
+
+/** Used to detect unsigned integer values. */
+var reIsUint = /^\d+$/;
+
+/** Used for native method references. */
+var objectProto = Object.prototype;
+
+/** Used to check objects for own properties. */
+var hasOwnProperty = objectProto.hasOwnProperty;
+
+/* Native method references for those with the same name as other `lodash` methods. */
+var nativeKeys = getNative(Object, 'keys');
+
+/**
+ * Used as the [maximum length](http://ecma-international.org/ecma-262/6.0/#sec-number.max_safe_integer)
+ * of an array-like value.
+ */
+var MAX_SAFE_INTEGER = 9007199254740991;
+
+/**
+ * The base implementation of `_.property` without support for deep paths.
+ *
+ * @private
+ * @param {string} key The key of the property to get.
+ * @returns {Function} Returns the new function.
+ */
+function baseProperty(key) {
+ return function(object) {
+ return object == null ? undefined : object[key];
+ };
+}
+
+/**
+ * Gets the "length" property value of `object`.
+ *
+ * **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792)
+ * that affects Safari on at least iOS 8.1-8.3 ARM64.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @returns {*} Returns the "length" value.
+ */
+var getLength = baseProperty('length');
+
+/**
+ * Checks if `value` is array-like.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is array-like, else `false`.
+ */
+function isArrayLike(value) {
+ return value != null && isLength(getLength(value));
+}
+
+/**
+ * Checks if `value` is a valid array-like index.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
+ * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
+ */
+function isIndex(value, length) {
+ value = (typeof value == 'number' || reIsUint.test(value)) ? +value : -1;
+ length = length == null ? MAX_SAFE_INTEGER : length;
+ return value > -1 && value % 1 == 0 && value < length;
+}
+
+/**
+ * Checks if `value` is a valid array-like length.
+ *
+ * **Note:** This function is based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength).
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
+ */
+function isLength(value) {
+ return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
+}
+
+/**
+ * A fallback implementation of `Object.keys` which creates an array of the
+ * own enumerable property names of `object`.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @returns {Array} Returns the array of property names.
+ */
+function shimKeys(object) {
+ var props = keysIn(object),
+ propsLength = props.length,
+ length = propsLength && object.length;
+
+ var allowIndexes = !!length && isLength(length) &&
+ (isArray(object) || isArguments(object));
+
+ var index = -1,
+ result = [];
+
+ while (++index < propsLength) {
+ var key = props[index];
+ if ((allowIndexes && isIndex(key, length)) || hasOwnProperty.call(object, key)) {
+ result.push(key);
+ }
+ }
+ return result;
+}
+
+/**
+ * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.
+ * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is an object, else `false`.
+ * @example
+ *
+ * _.isObject({});
+ * // => true
+ *
+ * _.isObject([1, 2, 3]);
+ * // => true
+ *
+ * _.isObject(1);
+ * // => false
+ */
+function isObject(value) {
+ // Avoid a V8 JIT bug in Chrome 19-20.
+ // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.
+ var type = typeof value;
+ return !!value && (type == 'object' || type == 'function');
+}
+
+/**
+ * Creates an array of the own enumerable property names of `object`.
+ *
+ * **Note:** Non-object values are coerced to objects. See the
+ * [ES spec](http://ecma-international.org/ecma-262/6.0/#sec-object.keys)
+ * for more details.
+ *
+ * @static
+ * @memberOf _
+ * @category Object
+ * @param {Object} object The object to query.
+ * @returns {Array} Returns the array of property names.
+ * @example
+ *
+ * function Foo() {
+ * this.a = 1;
+ * this.b = 2;
+ * }
+ *
+ * Foo.prototype.c = 3;
+ *
+ * _.keys(new Foo);
+ * // => ['a', 'b'] (iteration order is not guaranteed)
+ *
+ * _.keys('hi');
+ * // => ['0', '1']
+ */
+var keys = !nativeKeys ? shimKeys : function(object) {
+ var Ctor = object == null ? undefined : object.constructor;
+ if ((typeof Ctor == 'function' && Ctor.prototype === object) ||
+ (typeof object != 'function' && isArrayLike(object))) {
+ return shimKeys(object);
+ }
+ return isObject(object) ? nativeKeys(object) : [];
+};
+
+/**
+ * Creates an array of the own and inherited enumerable property names of `object`.
+ *
+ * **Note:** Non-object values are coerced to objects.
+ *
+ * @static
+ * @memberOf _
+ * @category Object
+ * @param {Object} object The object to query.
+ * @returns {Array} Returns the array of property names.
+ * @example
+ *
+ * function Foo() {
+ * this.a = 1;
+ * this.b = 2;
+ * }
+ *
+ * Foo.prototype.c = 3;
+ *
+ * _.keysIn(new Foo);
+ * // => ['a', 'b', 'c'] (iteration order is not guaranteed)
+ */
+function keysIn(object) {
+ if (object == null) {
+ return [];
+ }
+ if (!isObject(object)) {
+ object = Object(object);
+ }
+ var length = object.length;
+ length = (length && isLength(length) &&
+ (isArray(object) || isArguments(object)) && length) || 0;
+
+ var Ctor = object.constructor,
+ index = -1,
+ isProto = typeof Ctor == 'function' && Ctor.prototype === object,
+ result = Array(length),
+ skipIndexes = length > 0;
+
+ while (++index < length) {
+ result[index] = (index + '');
+ }
+ for (var key in object) {
+ if (!(skipIndexes && isIndex(key, length)) &&
+ !(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {
+ result.push(key);
+ }
+ }
+ return result;
+}
+
+module.exports = keys;
+
+},{"lodash._getnative":58,"lodash.isarguments":61,"lodash.isarray":62}],64:[function(require,module,exports){
+(function (process){
+var path = require('path');
+var fs = require('fs');
+var _0777 = parseInt('0777', 8);
+
+module.exports = mkdirP.mkdirp = mkdirP.mkdirP = mkdirP;
+
+function mkdirP (p, opts, f, made) {
+ if (typeof opts === 'function') {
+ f = opts;
+ opts = {};
+ }
+ else if (!opts || typeof opts !== 'object') {
+ opts = { mode: opts };
+ }
+
+ var mode = opts.mode;
+ var xfs = opts.fs || fs;
+
+ if (mode === undefined) {
+ mode = _0777 & (~process.umask());
+ }
+ if (!made) made = null;
+
+ var cb = f || function () {};
+ p = path.resolve(p);
+
+ xfs.mkdir(p, mode, function (er) {
+ if (!er) {
+ made = made || p;
+ return cb(null, made);
+ }
+ switch (er.code) {
+ case 'ENOENT':
+ mkdirP(path.dirname(p), opts, function (er, made) {
+ if (er) cb(er, made);
+ else mkdirP(p, opts, cb, made);
+ });
+ break;
+
+ // In the case of any other error, just see if there's a dir
+ // there already. If so, then hooray! If not, then something
+ // is borked.
+ default:
+ xfs.stat(p, function (er2, stat) {
+ // if the stat fails, then that's super weird.
+ // let the original error be the failure reason.
+ if (er2 || !stat.isDirectory()) cb(er, made)
+ else cb(null, made);
+ });
+ break;
+ }
+ });
+}
+
+mkdirP.sync = function sync (p, opts, made) {
+ if (!opts || typeof opts !== 'object') {
+ opts = { mode: opts };
+ }
+
+ var mode = opts.mode;
+ var xfs = opts.fs || fs;
+
+ if (mode === undefined) {
+ mode = _0777 & (~process.umask());
+ }
+ if (!made) made = null;
+
+ p = path.resolve(p);
+
+ try {
+ xfs.mkdirSync(p, mode);
+ made = made || p;
+ }
+ catch (err0) {
+ switch (err0.code) {
+ case 'ENOENT' :
+ made = sync(path.dirname(p), opts, made);
+ sync(p, opts, made);
+ break;
+
+ // In the case of any other error, just see if there's a dir
+ // there already. If so, then hooray! If not, then something
+ // is borked.
+ default:
+ var stat;
+ try {
+ stat = xfs.statSync(p);
+ }
+ catch (err1) {
+ throw err0;
+ }
+ if (!stat.isDirectory()) throw err0;
+ break;
+ }
+ }
+
+ return made;
+};
+
+}).call(this,require('_process'))
+},{"_process":67,"fs":42,"path":42}],65:[function(require,module,exports){
+exports.endianness = function () { return 'LE' };
+
+exports.hostname = function () {
+ if (typeof location !== 'undefined') {
+ return location.hostname
+ }
+ else return '';
+};
+
+exports.loadavg = function () { return [] };
+
+exports.uptime = function () { return 0 };
+
+exports.freemem = function () {
+ return Number.MAX_VALUE;
+};
+
+exports.totalmem = function () {
+ return Number.MAX_VALUE;
+};
+
+exports.cpus = function () { return [] };
+
+exports.type = function () { return 'Browser' };
+
+exports.release = function () {
+ if (typeof navigator !== 'undefined') {
+ return navigator.appVersion;
+ }
+ return '';
+};
+
+exports.networkInterfaces
+= exports.getNetworkInterfaces
+= function () { return {} };
+
+exports.arch = function () { return 'javascript' };
+
+exports.platform = function () { return 'browser' };
+
+exports.tmpdir = exports.tmpDir = function () {
+ return '/tmp';
+};
+
+exports.EOL = '\n';
+
+},{}],66:[function(require,module,exports){
+(function (process){
+'use strict';
+
+if (!process.version ||
+ process.version.indexOf('v0.') === 0 ||
+ process.version.indexOf('v1.') === 0 && process.version.indexOf('v1.8.') !== 0) {
+ module.exports = nextTick;
+} else {
+ module.exports = process.nextTick;
+}
+
+function nextTick(fn, arg1, arg2, arg3) {
+ if (typeof fn !== 'function') {
+ throw new TypeError('"callback" argument must be a function');
+ }
+ var len = arguments.length;
+ var args, i;
+ switch (len) {
+ case 0:
+ case 1:
+ return process.nextTick(fn);
+ case 2:
+ return process.nextTick(function afterTickOne() {
+ fn.call(null, arg1);
+ });
+ case 3:
+ return process.nextTick(function afterTickTwo() {
+ fn.call(null, arg1, arg2);
+ });
+ case 4:
+ return process.nextTick(function afterTickThree() {
+ fn.call(null, arg1, arg2, arg3);
+ });
+ default:
+ args = new Array(len - 1);
+ i = 0;
+ while (i < args.length) {
+ args[i++] = arguments[i];
+ }
+ return process.nextTick(function afterTick() {
+ fn.apply(null, args);
+ });
+ }
+}
+
+}).call(this,require('_process'))
+},{"_process":67}],67:[function(require,module,exports){
+// shim for using process in browser
+var process = module.exports = {};
+
+// cached from whatever global is present so that test runners that stub it
+// don't break things. But we need to wrap it in a try catch in case it is
+// wrapped in strict mode code which doesn't define any globals. It's inside a
+// function because try/catches deoptimize in certain engines.
+
+var cachedSetTimeout;
+var cachedClearTimeout;
+
+function defaultSetTimout() {
+ throw new Error('setTimeout has not been defined');
+}
+function defaultClearTimeout () {
+ throw new Error('clearTimeout has not been defined');
+}
+(function () {
+ try {
+ if (typeof setTimeout === 'function') {
+ cachedSetTimeout = setTimeout;
+ } else {
+ cachedSetTimeout = defaultSetTimout;
+ }
+ } catch (e) {
+ cachedSetTimeout = defaultSetTimout;
+ }
+ try {
+ if (typeof clearTimeout === 'function') {
+ cachedClearTimeout = clearTimeout;
+ } else {
+ cachedClearTimeout = defaultClearTimeout;
+ }
+ } catch (e) {
+ cachedClearTimeout = defaultClearTimeout;
+ }
+} ())
+function runTimeout(fun) {
+ if (cachedSetTimeout === setTimeout) {
+ //normal enviroments in sane situations
+ return setTimeout(fun, 0);
+ }
+ // if setTimeout wasn't available but was latter defined
+ if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
+ cachedSetTimeout = setTimeout;
+ return setTimeout(fun, 0);
+ }
+ try {
+ // when when somebody has screwed with setTimeout but no I.E. maddness
+ return cachedSetTimeout(fun, 0);
+ } catch(e){
+ try {
+ // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
+ return cachedSetTimeout.call(null, fun, 0);
+ } catch(e){
+ // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error
+ return cachedSetTimeout.call(this, fun, 0);
+ }
+ }
+
+
+}
+function runClearTimeout(marker) {
+ if (cachedClearTimeout === clearTimeout) {
+ //normal enviroments in sane situations
+ return clearTimeout(marker);
+ }
+ // if clearTimeout wasn't available but was latter defined
+ if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
+ cachedClearTimeout = clearTimeout;
+ return clearTimeout(marker);
+ }
+ try {
+ // when when somebody has screwed with setTimeout but no I.E. maddness
+ return cachedClearTimeout(marker);
+ } catch (e){
+ try {
+ // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
+ return cachedClearTimeout.call(null, marker);
+ } catch (e){
+ // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
+ // Some versions of I.E. have different rules for clearTimeout vs setTimeout
+ return cachedClearTimeout.call(this, marker);
+ }
+ }
+
+
+
+}
+var queue = [];
+var draining = false;
+var currentQueue;
+var queueIndex = -1;
+
+function cleanUpNextTick() {
+ if (!draining || !currentQueue) {
+ return;
+ }
+ draining = false;
+ if (currentQueue.length) {
+ queue = currentQueue.concat(queue);
+ } else {
+ queueIndex = -1;
+ }
+ if (queue.length) {
+ drainQueue();
+ }
+}
+
+function drainQueue() {
+ if (draining) {
+ return;
+ }
+ var timeout = runTimeout(cleanUpNextTick);
+ draining = true;
+
+ var len = queue.length;
+ while(len) {
+ currentQueue = queue;
+ queue = [];
+ while (++queueIndex < len) {
+ if (currentQueue) {
+ currentQueue[queueIndex].run();
+ }
+ }
+ queueIndex = -1;
+ len = queue.length;
+ }
+ currentQueue = null;
+ draining = false;
+ runClearTimeout(timeout);
+}
+
+process.nextTick = function (fun) {
+ var args = new Array(arguments.length - 1);
+ if (arguments.length > 1) {
+ for (var i = 1; i < arguments.length; i++) {
+ args[i - 1] = arguments[i];
+ }
+ }
+ queue.push(new Item(fun, args));
+ if (queue.length === 1 && !draining) {
+ runTimeout(drainQueue);
+ }
+};
+
+// v8 likes predictible objects
+function Item(fun, array) {
+ this.fun = fun;
+ this.array = array;
+}
+Item.prototype.run = function () {
+ this.fun.apply(null, this.array);
+};
+process.title = 'browser';
+process.browser = true;
+process.env = {};
+process.argv = [];
+process.version = ''; // empty string to avoid regexp issues
+process.versions = {};
+
+function noop() {}
+
+process.on = noop;
+process.addListener = noop;
+process.once = noop;
+process.off = noop;
+process.removeListener = noop;
+process.removeAllListeners = noop;
+process.emit = noop;
+
+process.binding = function (name) {
+ throw new Error('process.binding is not supported');
+};
+
+process.cwd = function () { return '/' };
+process.chdir = function (dir) {
+ throw new Error('process.chdir is not supported');
+};
+process.umask = function() { return 0; };
+
+},{}],68:[function(require,module,exports){
+module.exports = require("./lib/_stream_duplex.js")
+
+},{"./lib/_stream_duplex.js":69}],69:[function(require,module,exports){
+// a duplex stream is just a stream that is both readable and writable.
+// Since JS doesn't have multiple prototypal inheritance, this class
+// prototypally inherits from Readable, and then parasitically from
+// Writable.
+
+'use strict';
+
+/*<replacement>*/
+
+var objectKeys = Object.keys || function (obj) {
+ var keys = [];
+ for (var key in obj) {
+ keys.push(key);
+ }return keys;
+};
+/*</replacement>*/
+
+module.exports = Duplex;
+
+/*<replacement>*/
+var processNextTick = require('process-nextick-args');
+/*</replacement>*/
+
+/*<replacement>*/
+var util = require('core-util-is');
+util.inherits = require('inherits');
+/*</replacement>*/
+
+var Readable = require('./_stream_readable');
+var Writable = require('./_stream_writable');
+
+util.inherits(Duplex, Readable);
+
+var keys = objectKeys(Writable.prototype);
+for (var v = 0; v < keys.length; v++) {
+ var method = keys[v];
+ if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method];
+}
+
+function Duplex(options) {
+ if (!(this instanceof Duplex)) return new Duplex(options);
+
+ Readable.call(this, options);
+ Writable.call(this, options);
+
+ if (options && options.readable === false) this.readable = false;
+
+ if (options && options.writable === false) this.writable = false;
+
+ this.allowHalfOpen = true;
+ if (options && options.allowHalfOpen === false) this.allowHalfOpen = false;
+
+ this.once('end', onend);
+}
+
+// the no-half-open enforcer
+function onend() {
+ // if we allow half-open state, or if the writable side ended,
+ // then we're ok.
+ if (this.allowHalfOpen || this._writableState.ended) return;
+
+ // no more data can be written.
+ // But allow more writes to happen in this tick.
+ processNextTick(onEndNT, this);
+}
+
+function onEndNT(self) {
+ self.end();
+}
+
+function forEach(xs, f) {
+ for (var i = 0, l = xs.length; i < l; i++) {
+ f(xs[i], i);
+ }
+}
+},{"./_stream_readable":71,"./_stream_writable":73,"core-util-is":45,"inherits":51,"process-nextick-args":66}],70:[function(require,module,exports){
+// a passthrough stream.
+// basically just the most minimal sort of Transform stream.
+// Every written chunk gets output as-is.
+
+'use strict';
+
+module.exports = PassThrough;
+
+var Transform = require('./_stream_transform');
+
+/*<replacement>*/
+var util = require('core-util-is');
+util.inherits = require('inherits');
+/*</replacement>*/
+
+util.inherits(PassThrough, Transform);
+
+function PassThrough(options) {
+ if (!(this instanceof PassThrough)) return new PassThrough(options);
+
+ Transform.call(this, options);
+}
+
+PassThrough.prototype._transform = function (chunk, encoding, cb) {
+ cb(null, chunk);
+};
+},{"./_stream_transform":72,"core-util-is":45,"inherits":51}],71:[function(require,module,exports){
+(function (process){
+'use strict';
+
+module.exports = Readable;
+
+/*<replacement>*/
+var processNextTick = require('process-nextick-args');
+/*</replacement>*/
+
+/*<replacement>*/
+var isArray = require('isarray');
+/*</replacement>*/
+
+Readable.ReadableState = ReadableState;
+
+/*<replacement>*/
+var EE = require('events').EventEmitter;
+
+var EElistenerCount = function (emitter, type) {
+ return emitter.listeners(type).length;
+};
+/*</replacement>*/
+
+/*<replacement>*/
+var Stream;
+(function () {
+ try {
+ Stream = require('st' + 'ream');
+ } catch (_) {} finally {
+ if (!Stream) Stream = require('events').EventEmitter;
+ }
+})();
+/*</replacement>*/
+
+var Buffer = require('buffer').Buffer;
+/*<replacement>*/
+var bufferShim = require('buffer-shims');
+/*</replacement>*/
+
+/*<replacement>*/
+var util = require('core-util-is');
+util.inherits = require('inherits');
+/*</replacement>*/
+
+/*<replacement>*/
+var debugUtil = require('util');
+var debug = void 0;
+if (debugUtil && debugUtil.debuglog) {
+ debug = debugUtil.debuglog('stream');
+} else {
+ debug = function () {};
+}
+/*</replacement>*/
+
+var BufferList = require('./internal/streams/BufferList');
+var StringDecoder;
+
+util.inherits(Readable, Stream);
+
+function prependListener(emitter, event, fn) {
+ if (typeof emitter.prependListener === 'function') {
+ return emitter.prependListener(event, fn);
+ } else {
+ // This is a hack to make sure that our error handler is attached before any
+ // userland ones. NEVER DO THIS. This is here only because this code needs
+ // to continue to work with older versions of Node.js that do not include
+ // the prependListener() method. The goal is to eventually remove this hack.
+ if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]];
+ }
+}
+
+var Duplex;
+function ReadableState(options, stream) {
+ Duplex = Duplex || require('./_stream_duplex');
+
+ options = options || {};
+
+ // object stream flag. Used to make read(n) ignore n and to
+ // make all the buffer merging and length checks go away
+ this.objectMode = !!options.objectMode;
+
+ if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.readableObjectMode;
+
+ // the point at which it stops calling _read() to fill the buffer
+ // Note: 0 is a valid value, means "don't call _read preemptively ever"
+ var hwm = options.highWaterMark;
+ var defaultHwm = this.objectMode ? 16 : 16 * 1024;
+ this.highWaterMark = hwm || hwm === 0 ? hwm : defaultHwm;
+
+ // cast to ints.
+ this.highWaterMark = ~ ~this.highWaterMark;
+
+ // A linked list is used to store data chunks instead of an array because the
+ // linked list can remove elements from the beginning faster than
+ // array.shift()
+ this.buffer = new BufferList();
+ this.length = 0;
+ this.pipes = null;
+ this.pipesCount = 0;
+ this.flowing = null;
+ this.ended = false;
+ this.endEmitted = false;
+ this.reading = false;
+
+ // a flag to be able to tell if the onwrite cb is called immediately,
+ // or on a later tick. We set this to true at first, because any
+ // actions that shouldn't happen until "later" should generally also
+ // not happen before the first write call.
+ this.sync = true;
+
+ // whenever we return null, then we set a flag to say
+ // that we're awaiting a 'readable' event emission.
+ this.needReadable = false;
+ this.emittedReadable = false;
+ this.readableListening = false;
+ this.resumeScheduled = false;
+
+ // Crypto is kind of old and crusty. Historically, its default string
+ // encoding is 'binary' so we have to make this configurable.
+ // Everything else in the universe uses 'utf8', though.
+ this.defaultEncoding = options.defaultEncoding || 'utf8';
+
+ // when piping, we only care about 'readable' events that happen
+ // after read()ing all the bytes and not getting any pushback.
+ this.ranOut = false;
+
+ // the number of writers that are awaiting a drain event in .pipe()s
+ this.awaitDrain = 0;
+
+ // if true, a maybeReadMore has been scheduled
+ this.readingMore = false;
+
+ this.decoder = null;
+ this.encoding = null;
+ if (options.encoding) {
+ if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder;
+ this.decoder = new StringDecoder(options.encoding);
+ this.encoding = options.encoding;
+ }
+}
+
+var Duplex;
+function Readable(options) {
+ Duplex = Duplex || require('./_stream_duplex');
+
+ if (!(this instanceof Readable)) return new Readable(options);
+
+ this._readableState = new ReadableState(options, this);
+
+ // legacy
+ this.readable = true;
+
+ if (options && typeof options.read === 'function') this._read = options.read;
+
+ Stream.call(this);
+}
+
+// Manually shove something into the read() buffer.
+// This returns true if the highWaterMark has not been hit yet,
+// similar to how Writable.write() returns true if you should
+// write() some more.
+Readable.prototype.push = function (chunk, encoding) {
+ var state = this._readableState;
+
+ if (!state.objectMode && typeof chunk === 'string') {
+ encoding = encoding || state.defaultEncoding;
+ if (encoding !== state.encoding) {
+ chunk = bufferShim.from(chunk, encoding);
+ encoding = '';
+ }
+ }
+
+ return readableAddChunk(this, state, chunk, encoding, false);
+};
+
+// Unshift should *always* be something directly out of read()
+Readable.prototype.unshift = function (chunk) {
+ var state = this._readableState;
+ return readableAddChunk(this, state, chunk, '', true);
+};
+
+Readable.prototype.isPaused = function () {
+ return this._readableState.flowing === false;
+};
+
+function readableAddChunk(stream, state, chunk, encoding, addToFront) {
+ var er = chunkInvalid(state, chunk);
+ if (er) {
+ stream.emit('error', er);
+ } else if (chunk === null) {
+ state.reading = false;
+ onEofChunk(stream, state);
+ } else if (state.objectMode || chunk && chunk.length > 0) {
+ if (state.ended && !addToFront) {
+ var e = new Error('stream.push() after EOF');
+ stream.emit('error', e);
+ } else if (state.endEmitted && addToFront) {
+ var _e = new Error('stream.unshift() after end event');
+ stream.emit('error', _e);
+ } else {
+ var skipAdd;
+ if (state.decoder && !addToFront && !encoding) {
+ chunk = state.decoder.write(chunk);
+ skipAdd = !state.objectMode && chunk.length === 0;
+ }
+
+ if (!addToFront) state.reading = false;
+
+ // Don't add to the buffer if we've decoded to an empty string chunk and
+ // we're not in object mode
+ if (!skipAdd) {
+ // if we want the data now, just emit it.
+ if (state.flowing && state.length === 0 && !state.sync) {
+ stream.emit('data', chunk);
+ stream.read(0);
+ } else {
+ // update the buffer info.
+ state.length += state.objectMode ? 1 : chunk.length;
+ if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk);
+
+ if (state.needReadable) emitReadable(stream);
+ }
+ }
+
+ maybeReadMore(stream, state);
+ }
+ } else if (!addToFront) {
+ state.reading = false;
+ }
+
+ return needMoreData(state);
+}
+
+// if it's past the high water mark, we can push in some more.
+// Also, if we have no data yet, we can stand some
+// more bytes. This is to work around cases where hwm=0,
+// such as the repl. Also, if the push() triggered a
+// readable event, and the user called read(largeNumber) such that
+// needReadable was set, then we ought to push more, so that another
+// 'readable' event will be triggered.
+function needMoreData(state) {
+ return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0);
+}
+
+// backwards compatibility.
+Readable.prototype.setEncoding = function (enc) {
+ if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder;
+ this._readableState.decoder = new StringDecoder(enc);
+ this._readableState.encoding = enc;
+ return this;
+};
+
+// Don't raise the hwm > 8MB
+var MAX_HWM = 0x800000;
+function computeNewHighWaterMark(n) {
+ if (n >= MAX_HWM) {
+ n = MAX_HWM;
+ } else {
+ // Get the next highest power of 2 to prevent increasing hwm excessively in
+ // tiny amounts
+ n--;
+ n |= n >>> 1;
+ n |= n >>> 2;
+ n |= n >>> 4;
+ n |= n >>> 8;
+ n |= n >>> 16;
+ n++;
+ }
+ return n;
+}
+
+// This function is designed to be inlinable, so please take care when making
+// changes to the function body.
+function howMuchToRead(n, state) {
+ if (n <= 0 || state.length === 0 && state.ended) return 0;
+ if (state.objectMode) return 1;
+ if (n !== n) {
+ // Only flow one buffer at a time
+ if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length;
+ }
+ // If we're asking for more than the current hwm, then raise the hwm.
+ if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n);
+ if (n <= state.length) return n;
+ // Don't have enough
+ if (!state.ended) {
+ state.needReadable = true;
+ return 0;
+ }
+ return state.length;
+}
+
+// you can override either this method, or the async _read(n) below.
+Readable.prototype.read = function (n) {
+ debug('read', n);
+ n = parseInt(n, 10);
+ var state = this._readableState;
+ var nOrig = n;
+
+ if (n !== 0) state.emittedReadable = false;
+
+ // if we're doing read(0) to trigger a readable event, but we
+ // already have a bunch of data in the buffer, then just trigger
+ // the 'readable' event and move on.
+ if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) {
+ debug('read: emitReadable', state.length, state.ended);
+ if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this);
+ return null;
+ }
+
+ n = howMuchToRead(n, state);
+
+ // if we've ended, and we're now clear, then finish it up.
+ if (n === 0 && state.ended) {
+ if (state.length === 0) endReadable(this);
+ return null;
+ }
+
+ // All the actual chunk generation logic needs to be
+ // *below* the call to _read. The reason is that in certain
+ // synthetic stream cases, such as passthrough streams, _read
+ // may be a completely synchronous operation which may change
+ // the state of the read buffer, providing enough data when
+ // before there was *not* enough.
+ //
+ // So, the steps are:
+ // 1. Figure out what the state of things will be after we do
+ // a read from the buffer.
+ //
+ // 2. If that resulting state will trigger a _read, then call _read.
+ // Note that this may be asynchronous, or synchronous. Yes, it is
+ // deeply ugly to write APIs this way, but that still doesn't mean
+ // that the Readable class should behave improperly, as streams are
+ // designed to be sync/async agnostic.
+ // Take note if the _read call is sync or async (ie, if the read call
+ // has returned yet), so that we know whether or not it's safe to emit
+ // 'readable' etc.
+ //
+ // 3. Actually pull the requested chunks out of the buffer and return.
+
+ // if we need a readable event, then we need to do some reading.
+ var doRead = state.needReadable;
+ debug('need readable', doRead);
+
+ // if we currently have less than the highWaterMark, then also read some
+ if (state.length === 0 || state.length - n < state.highWaterMark) {
+ doRead = true;
+ debug('length less than watermark', doRead);
+ }
+
+ // however, if we've ended, then there's no point, and if we're already
+ // reading, then it's unnecessary.
+ if (state.ended || state.reading) {
+ doRead = false;
+ debug('reading or ended', doRead);
+ } else if (doRead) {
+ debug('do read');
+ state.reading = true;
+ state.sync = true;
+ // if the length is currently zero, then we *need* a readable event.
+ if (state.length === 0) state.needReadable = true;
+ // call internal read method
+ this._read(state.highWaterMark);
+ state.sync = false;
+ // If _read pushed data synchronously, then `reading` will be false,
+ // and we need to re-evaluate how much data we can return to the user.
+ if (!state.reading) n = howMuchToRead(nOrig, state);
+ }
+
+ var ret;
+ if (n > 0) ret = fromList(n, state);else ret = null;
+
+ if (ret === null) {
+ state.needReadable = true;
+ n = 0;
+ } else {
+ state.length -= n;
+ }
+
+ if (state.length === 0) {
+ // If we have nothing in the buffer, then we want to know
+ // as soon as we *do* get something into the buffer.
+ if (!state.ended) state.needReadable = true;
+
+ // If we tried to read() past the EOF, then emit end on the next tick.
+ if (nOrig !== n && state.ended) endReadable(this);
+ }
+
+ if (ret !== null) this.emit('data', ret);
+
+ return ret;
+};
+
+function chunkInvalid(state, chunk) {
+ var er = null;
+ if (!Buffer.isBuffer(chunk) && typeof chunk !== 'string' && chunk !== null && chunk !== undefined && !state.objectMode) {
+ er = new TypeError('Invalid non-string/buffer chunk');
+ }
+ return er;
+}
+
+function onEofChunk(stream, state) {
+ if (state.ended) return;
+ if (state.decoder) {
+ var chunk = state.decoder.end();
+ if (chunk && chunk.length) {
+ state.buffer.push(chunk);
+ state.length += state.objectMode ? 1 : chunk.length;
+ }
+ }
+ state.ended = true;
+
+ // emit 'readable' now to make sure it gets picked up.
+ emitReadable(stream);
+}
+
+// Don't emit readable right away in sync mode, because this can trigger
+// another read() call => stack overflow. This way, it might trigger
+// a nextTick recursion warning, but that's not so bad.
+function emitReadable(stream) {
+ var state = stream._readableState;
+ state.needReadable = false;
+ if (!state.emittedReadable) {
+ debug('emitReadable', state.flowing);
+ state.emittedReadable = true;
+ if (state.sync) processNextTick(emitReadable_, stream);else emitReadable_(stream);
+ }
+}
+
+function emitReadable_(stream) {
+ debug('emit readable');
+ stream.emit('readable');
+ flow(stream);
+}
+
+// at this point, the user has presumably seen the 'readable' event,
+// and called read() to consume some data. that may have triggered
+// in turn another _read(n) call, in which case reading = true if
+// it's in progress.
+// However, if we're not ended, or reading, and the length < hwm,
+// then go ahead and try to read some more preemptively.
+function maybeReadMore(stream, state) {
+ if (!state.readingMore) {
+ state.readingMore = true;
+ processNextTick(maybeReadMore_, stream, state);
+ }
+}
+
+function maybeReadMore_(stream, state) {
+ var len = state.length;
+ while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) {
+ debug('maybeReadMore read 0');
+ stream.read(0);
+ if (len === state.length)
+ // didn't get any data, stop spinning.
+ break;else len = state.length;
+ }
+ state.readingMore = false;
+}
+
+// abstract method. to be overridden in specific implementation classes.
+// call cb(er, data) where data is <= n in length.
+// for virtual (non-string, non-buffer) streams, "length" is somewhat
+// arbitrary, and perhaps not very meaningful.
+Readable.prototype._read = function (n) {
+ this.emit('error', new Error('not implemented'));
+};
+
+Readable.prototype.pipe = function (dest, pipeOpts) {
+ var src = this;
+ var state = this._readableState;
+
+ switch (state.pipesCount) {
+ case 0:
+ state.pipes = dest;
+ break;
+ case 1:
+ state.pipes = [state.pipes, dest];
+ break;
+ default:
+ state.pipes.push(dest);
+ break;
+ }
+ state.pipesCount += 1;
+ debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts);
+
+ var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr;
+
+ var endFn = doEnd ? onend : cleanup;
+ if (state.endEmitted) processNextTick(endFn);else src.once('end', endFn);
+
+ dest.on('unpipe', onunpipe);
+ function onunpipe(readable) {
+ debug('onunpipe');
+ if (readable === src) {
+ cleanup();
+ }
+ }
+
+ function onend() {
+ debug('onend');
+ dest.end();
+ }
+
+ // when the dest drains, it reduces the awaitDrain counter
+ // on the source. This would be more elegant with a .once()
+ // handler in flow(), but adding and removing repeatedly is
+ // too slow.
+ var ondrain = pipeOnDrain(src);
+ dest.on('drain', ondrain);
+
+ var cleanedUp = false;
+ function cleanup() {
+ debug('cleanup');
+ // cleanup event handlers once the pipe is broken
+ dest.removeListener('close', onclose);
+ dest.removeListener('finish', onfinish);
+ dest.removeListener('drain', ondrain);
+ dest.removeListener('error', onerror);
+ dest.removeListener('unpipe', onunpipe);
+ src.removeListener('end', onend);
+ src.removeListener('end', cleanup);
+ src.removeListener('data', ondata);
+
+ cleanedUp = true;
+
+ // if the reader is waiting for a drain event from this
+ // specific writer, then it would cause it to never start
+ // flowing again.
+ // So, if this is awaiting a drain, then we just call it now.
+ // If we don't know, then assume that we are waiting for one.
+ if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain();
+ }
+
+ // If the user pushes more data while we're writing to dest then we'll end up
+ // in ondata again. However, we only want to increase awaitDrain once because
+ // dest will only emit one 'drain' event for the multiple writes.
+ // => Introduce a guard on increasing awaitDrain.
+ var increasedAwaitDrain = false;
+ src.on('data', ondata);
+ function ondata(chunk) {
+ debug('ondata');
+ increasedAwaitDrain = false;
+ var ret = dest.write(chunk);
+ if (false === ret && !increasedAwaitDrain) {
+ // If the user unpiped during `dest.write()`, it is possible
+ // to get stuck in a permanently paused state if that write
+ // also returned false.
+ // => Check whether `dest` is still a piping destination.
+ if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) {
+ debug('false write response, pause', src._readableState.awaitDrain);
+ src._readableState.awaitDrain++;
+ increasedAwaitDrain = true;
+ }
+ src.pause();
+ }
+ }
+
+ // if the dest has an error, then stop piping into it.
+ // however, don't suppress the throwing behavior for this.
+ function onerror(er) {
+ debug('onerror', er);
+ unpipe();
+ dest.removeListener('error', onerror);
+ if (EElistenerCount(dest, 'error') === 0) dest.emit('error', er);
+ }
+
+ // Make sure our error handler is attached before userland ones.
+ prependListener(dest, 'error', onerror);
+
+ // Both close and finish should trigger unpipe, but only once.
+ function onclose() {
+ dest.removeListener('finish', onfinish);
+ unpipe();
+ }
+ dest.once('close', onclose);
+ function onfinish() {
+ debug('onfinish');
+ dest.removeListener('close', onclose);
+ unpipe();
+ }
+ dest.once('finish', onfinish);
+
+ function unpipe() {
+ debug('unpipe');
+ src.unpipe(dest);
+ }
+
+ // tell the dest that it's being piped to
+ dest.emit('pipe', src);
+
+ // start the flow if it hasn't been started already.
+ if (!state.flowing) {
+ debug('pipe resume');
+ src.resume();
+ }
+
+ return dest;
+};
+
+function pipeOnDrain(src) {
+ return function () {
+ var state = src._readableState;
+ debug('pipeOnDrain', state.awaitDrain);
+ if (state.awaitDrain) state.awaitDrain--;
+ if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) {
+ state.flowing = true;
+ flow(src);
+ }
+ };
+}
+
+Readable.prototype.unpipe = function (dest) {
+ var state = this._readableState;
+
+ // if we're not piping anywhere, then do nothing.
+ if (state.pipesCount === 0) return this;
+
+ // just one destination. most common case.
+ if (state.pipesCount === 1) {
+ // passed in one, but it's not the right one.
+ if (dest && dest !== state.pipes) return this;
+
+ if (!dest) dest = state.pipes;
+
+ // got a match.
+ state.pipes = null;
+ state.pipesCount = 0;
+ state.flowing = false;
+ if (dest) dest.emit('unpipe', this);
+ return this;
+ }
+
+ // slow case. multiple pipe destinations.
+
+ if (!dest) {
+ // remove all.
+ var dests = state.pipes;
+ var len = state.pipesCount;
+ state.pipes = null;
+ state.pipesCount = 0;
+ state.flowing = false;
+
+ for (var _i = 0; _i < len; _i++) {
+ dests[_i].emit('unpipe', this);
+ }return this;
+ }
+
+ // try to find the right one.
+ var i = indexOf(state.pipes, dest);
+ if (i === -1) return this;
+
+ state.pipes.splice(i, 1);
+ state.pipesCount -= 1;
+ if (state.pipesCount === 1) state.pipes = state.pipes[0];
+
+ dest.emit('unpipe', this);
+
+ return this;
+};
+
+// set up data events if they are asked for
+// Ensure readable listeners eventually get something
+Readable.prototype.on = function (ev, fn) {
+ var res = Stream.prototype.on.call(this, ev, fn);
+
+ if (ev === 'data') {
+ // Start flowing on next tick if stream isn't explicitly paused
+ if (this._readableState.flowing !== false) this.resume();
+ } else if (ev === 'readable') {
+ var state = this._readableState;
+ if (!state.endEmitted && !state.readableListening) {
+ state.readableListening = state.needReadable = true;
+ state.emittedReadable = false;
+ if (!state.reading) {
+ processNextTick(nReadingNextTick, this);
+ } else if (state.length) {
+ emitReadable(this, state);
+ }
+ }
+ }
+
+ return res;
+};
+Readable.prototype.addListener = Readable.prototype.on;
+
+function nReadingNextTick(self) {
+ debug('readable nexttick read 0');
+ self.read(0);
+}
+
+// pause() and resume() are remnants of the legacy readable stream API
+// If the user uses them, then switch into old mode.
+Readable.prototype.resume = function () {
+ var state = this._readableState;
+ if (!state.flowing) {
+ debug('resume');
+ state.flowing = true;
+ resume(this, state);
+ }
+ return this;
+};
+
+function resume(stream, state) {
+ if (!state.resumeScheduled) {
+ state.resumeScheduled = true;
+ processNextTick(resume_, stream, state);
+ }
+}
+
+function resume_(stream, state) {
+ if (!state.reading) {
+ debug('resume read 0');
+ stream.read(0);
+ }
+
+ state.resumeScheduled = false;
+ state.awaitDrain = 0;
+ stream.emit('resume');
+ flow(stream);
+ if (state.flowing && !state.reading) stream.read(0);
+}
+
+Readable.prototype.pause = function () {
+ debug('call pause flowing=%j', this._readableState.flowing);
+ if (false !== this._readableState.flowing) {
+ debug('pause');
+ this._readableState.flowing = false;
+ this.emit('pause');
+ }
+ return this;
+};
+
+function flow(stream) {
+ var state = stream._readableState;
+ debug('flow', state.flowing);
+ while (state.flowing && stream.read() !== null) {}
+}
+
+// wrap an old-style stream as the async data source.
+// This is *not* part of the readable stream interface.
+// It is an ugly unfortunate mess of history.
+Readable.prototype.wrap = function (stream) {
+ var state = this._readableState;
+ var paused = false;
+
+ var self = this;
+ stream.on('end', function () {
+ debug('wrapped end');
+ if (state.decoder && !state.ended) {
+ var chunk = state.decoder.end();
+ if (chunk && chunk.length) self.push(chunk);
+ }
+
+ self.push(null);
+ });
+
+ stream.on('data', function (chunk) {
+ debug('wrapped data');
+ if (state.decoder) chunk = state.decoder.write(chunk);
+
+ // don't skip over falsy values in objectMode
+ if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return;
+
+ var ret = self.push(chunk);
+ if (!ret) {
+ paused = true;
+ stream.pause();
+ }
+ });
+
+ // proxy all the other methods.
+ // important when wrapping filters and duplexes.
+ for (var i in stream) {
+ if (this[i] === undefined && typeof stream[i] === 'function') {
+ this[i] = function (method) {
+ return function () {
+ return stream[method].apply(stream, arguments);
+ };
+ }(i);
+ }
+ }
+
+ // proxy certain important events.
+ var events = ['error', 'close', 'destroy', 'pause', 'resume'];
+ forEach(events, function (ev) {
+ stream.on(ev, self.emit.bind(self, ev));
+ });
+
+ // when we try to consume some more bytes, simply unpause the
+ // underlying stream.
+ self._read = function (n) {
+ debug('wrapped _read', n);
+ if (paused) {
+ paused = false;
+ stream.resume();
+ }
+ };
+
+ return self;
+};
+
+// exposed for testing purposes only.
+Readable._fromList = fromList;
+
+// Pluck off n bytes from an array of buffers.
+// Length is the combined lengths of all the buffers in the list.
+// This function is designed to be inlinable, so please take care when making
+// changes to the function body.
+function fromList(n, state) {
+ // nothing buffered
+ if (state.length === 0) return null;
+
+ var ret;
+ if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) {
+ // read it all, truncate the list
+ if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.head.data;else ret = state.buffer.concat(state.length);
+ state.buffer.clear();
+ } else {
+ // read part of list
+ ret = fromListPartial(n, state.buffer, state.decoder);
+ }
+
+ return ret;
+}
+
+// Extracts only enough buffered data to satisfy the amount requested.
+// This function is designed to be inlinable, so please take care when making
+// changes to the function body.
+function fromListPartial(n, list, hasStrings) {
+ var ret;
+ if (n < list.head.data.length) {
+ // slice is the same for buffers and strings
+ ret = list.head.data.slice(0, n);
+ list.head.data = list.head.data.slice(n);
+ } else if (n === list.head.data.length) {
+ // first chunk is a perfect match
+ ret = list.shift();
+ } else {
+ // result spans more than one buffer
+ ret = hasStrings ? copyFromBufferString(n, list) : copyFromBuffer(n, list);
+ }
+ return ret;
+}
+
+// Copies a specified amount of characters from the list of buffered data
+// chunks.
+// This function is designed to be inlinable, so please take care when making
+// changes to the function body.
+function copyFromBufferString(n, list) {
+ var p = list.head;
+ var c = 1;
+ var ret = p.data;
+ n -= ret.length;
+ while (p = p.next) {
+ var str = p.data;
+ var nb = n > str.length ? str.length : n;
+ if (nb === str.length) ret += str;else ret += str.slice(0, n);
+ n -= nb;
+ if (n === 0) {
+ if (nb === str.length) {
+ ++c;
+ if (p.next) list.head = p.next;else list.head = list.tail = null;
+ } else {
+ list.head = p;
+ p.data = str.slice(nb);
+ }
+ break;
+ }
+ ++c;
+ }
+ list.length -= c;
+ return ret;
+}
+
+// Copies a specified amount of bytes from the list of buffered data chunks.
+// This function is designed to be inlinable, so please take care when making
+// changes to the function body.
+function copyFromBuffer(n, list) {
+ var ret = bufferShim.allocUnsafe(n);
+ var p = list.head;
+ var c = 1;
+ p.data.copy(ret);
+ n -= p.data.length;
+ while (p = p.next) {
+ var buf = p.data;
+ var nb = n > buf.length ? buf.length : n;
+ buf.copy(ret, ret.length - n, 0, nb);
+ n -= nb;
+ if (n === 0) {
+ if (nb === buf.length) {
+ ++c;
+ if (p.next) list.head = p.next;else list.head = list.tail = null;
+ } else {
+ list.head = p;
+ p.data = buf.slice(nb);
+ }
+ break;
+ }
+ ++c;
+ }
+ list.length -= c;
+ return ret;
+}
+
+function endReadable(stream) {
+ var state = stream._readableState;
+
+ // If we get here before consuming all the bytes, then that is a
+ // bug in node. Should never happen.
+ if (state.length > 0) throw new Error('"endReadable()" called on non-empty stream');
+
+ if (!state.endEmitted) {
+ state.ended = true;
+ processNextTick(endReadableNT, state, stream);
+ }
+}
+
+function endReadableNT(state, stream) {
+ // Check that we didn't get one last unshift.
+ if (!state.endEmitted && state.length === 0) {
+ state.endEmitted = true;
+ stream.readable = false;
+ stream.emit('end');
+ }
+}
+
+function forEach(xs, f) {
+ for (var i = 0, l = xs.length; i < l; i++) {
+ f(xs[i], i);
+ }
+}
+
+function indexOf(xs, x) {
+ for (var i = 0, l = xs.length; i < l; i++) {
+ if (xs[i] === x) return i;
+ }
+ return -1;
+}
+}).call(this,require('_process'))
+},{"./_stream_duplex":69,"./internal/streams/BufferList":74,"_process":67,"buffer":44,"buffer-shims":43,"core-util-is":45,"events":48,"inherits":51,"isarray":53,"process-nextick-args":66,"string_decoder/":80,"util":40}],72:[function(require,module,exports){
+// a transform stream is a readable/writable stream where you do
+// something with the data. Sometimes it's called a "filter",
+// but that's not a great name for it, since that implies a thing where
+// some bits pass through, and others are simply ignored. (That would
+// be a valid example of a transform, of course.)
+//
+// While the output is causally related to the input, it's not a
+// necessarily symmetric or synchronous transformation. For example,
+// a zlib stream might take multiple plain-text writes(), and then
+// emit a single compressed chunk some time in the future.
+//
+// Here's how this works:
+//
+// The Transform stream has all the aspects of the readable and writable
+// stream classes. When you write(chunk), that calls _write(chunk,cb)
+// internally, and returns false if there's a lot of pending writes
+// buffered up. When you call read(), that calls _read(n) until
+// there's enough pending readable data buffered up.
+//
+// In a transform stream, the written data is placed in a buffer. When
+// _read(n) is called, it transforms the queued up data, calling the
+// buffered _write cb's as it consumes chunks. If consuming a single
+// written chunk would result in multiple output chunks, then the first
+// outputted bit calls the readcb, and subsequent chunks just go into
+// the read buffer, and will cause it to emit 'readable' if necessary.
+//
+// This way, back-pressure is actually determined by the reading side,
+// since _read has to be called to start processing a new chunk. However,
+// a pathological inflate type of transform can cause excessive buffering
+// here. For example, imagine a stream where every byte of input is
+// interpreted as an integer from 0-255, and then results in that many
+// bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in
+// 1kb of data being output. In this case, you could write a very small
+// amount of input, and end up with a very large amount of output. In
+// such a pathological inflating mechanism, there'd be no way to tell
+// the system to stop doing the transform. A single 4MB write could
+// cause the system to run out of memory.
+//
+// However, even in such a pathological case, only a single written chunk
+// would be consumed, and then the rest would wait (un-transformed) until
+// the results of the previous transformed chunk were consumed.
+
+'use strict';
+
+module.exports = Transform;
+
+var Duplex = require('./_stream_duplex');
+
+/*<replacement>*/
+var util = require('core-util-is');
+util.inherits = require('inherits');
+/*</replacement>*/
+
+util.inherits(Transform, Duplex);
+
+function TransformState(stream) {
+ this.afterTransform = function (er, data) {
+ return afterTransform(stream, er, data);
+ };
+
+ this.needTransform = false;
+ this.transforming = false;
+ this.writecb = null;
+ this.writechunk = null;
+ this.writeencoding = null;
+}
+
+function afterTransform(stream, er, data) {
+ var ts = stream._transformState;
+ ts.transforming = false;
+
+ var cb = ts.writecb;
+
+ if (!cb) return stream.emit('error', new Error('no writecb in Transform class'));
+
+ ts.writechunk = null;
+ ts.writecb = null;
+
+ if (data !== null && data !== undefined) stream.push(data);
+
+ cb(er);
+
+ var rs = stream._readableState;
+ rs.reading = false;
+ if (rs.needReadable || rs.length < rs.highWaterMark) {
+ stream._read(rs.highWaterMark);
+ }
+}
+
+function Transform(options) {
+ if (!(this instanceof Transform)) return new Transform(options);
+
+ Duplex.call(this, options);
+
+ this._transformState = new TransformState(this);
+
+ // when the writable side finishes, then flush out anything remaining.
+ var stream = this;
+
+ // start out asking for a readable event once data is transformed.
+ this._readableState.needReadable = true;
+
+ // we have implemented the _read method, and done the other things
+ // that Readable wants before the first _read call, so unset the
+ // sync guard flag.
+ this._readableState.sync = false;
+
+ if (options) {
+ if (typeof options.transform === 'function') this._transform = options.transform;
+
+ if (typeof options.flush === 'function') this._flush = options.flush;
+ }
+
+ this.once('prefinish', function () {
+ if (typeof this._flush === 'function') this._flush(function (er) {
+ done(stream, er);
+ });else done(stream);
+ });
+}
+
+Transform.prototype.push = function (chunk, encoding) {
+ this._transformState.needTransform = false;
+ return Duplex.prototype.push.call(this, chunk, encoding);
+};
+
+// This is the part where you do stuff!
+// override this function in implementation classes.
+// 'chunk' is an input chunk.
+//
+// Call `push(newChunk)` to pass along transformed output
+// to the readable side. You may call 'push' zero or more times.
+//
+// Call `cb(err)` when you are done with this chunk. If you pass
+// an error, then that'll put the hurt on the whole operation. If you
+// never call cb(), then you'll never get another chunk.
+Transform.prototype._transform = function (chunk, encoding, cb) {
+ throw new Error('Not implemented');
+};
+
+Transform.prototype._write = function (chunk, encoding, cb) {
+ var ts = this._transformState;
+ ts.writecb = cb;
+ ts.writechunk = chunk;
+ ts.writeencoding = encoding;
+ if (!ts.transforming) {
+ var rs = this._readableState;
+ if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark);
+ }
+};
+
+// Doesn't matter what the args are here.
+// _transform does all the work.
+// That we got here means that the readable side wants more data.
+Transform.prototype._read = function (n) {
+ var ts = this._transformState;
+
+ if (ts.writechunk !== null && ts.writecb && !ts.transforming) {
+ ts.transforming = true;
+ this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform);
+ } else {
+ // mark that we need a transform, so that any data that comes in
+ // will get processed, now that we've asked for it.
+ ts.needTransform = true;
+ }
+};
+
+function done(stream, er) {
+ if (er) return stream.emit('error', er);
+
+ // if there's nothing in the write buffer, then that means
+ // that nothing more will ever be provided
+ var ws = stream._writableState;
+ var ts = stream._transformState;
+
+ if (ws.length) throw new Error('Calling transform done when ws.length != 0');
+
+ if (ts.transforming) throw new Error('Calling transform done when still transforming');
+
+ return stream.push(null);
+}
+},{"./_stream_duplex":69,"core-util-is":45,"inherits":51}],73:[function(require,module,exports){
+(function (process){
+// A bit simpler than readable streams.
+// Implement an async ._write(chunk, encoding, cb), and it'll handle all
+// the drain event emission and buffering.
+
+'use strict';
+
+module.exports = Writable;
+
+/*<replacement>*/
+var processNextTick = require('process-nextick-args');
+/*</replacement>*/
+
+/*<replacement>*/
+var asyncWrite = !process.browser && ['v0.10', 'v0.9.'].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : processNextTick;
+/*</replacement>*/
+
+Writable.WritableState = WritableState;
+
+/*<replacement>*/
+var util = require('core-util-is');
+util.inherits = require('inherits');
+/*</replacement>*/
+
+/*<replacement>*/
+var internalUtil = {
+ deprecate: require('util-deprecate')
+};
+/*</replacement>*/
+
+/*<replacement>*/
+var Stream;
+(function () {
+ try {
+ Stream = require('st' + 'ream');
+ } catch (_) {} finally {
+ if (!Stream) Stream = require('events').EventEmitter;
+ }
+})();
+/*</replacement>*/
+
+var Buffer = require('buffer').Buffer;
+/*<replacement>*/
+var bufferShim = require('buffer-shims');
+/*</replacement>*/
+
+util.inherits(Writable, Stream);
+
+function nop() {}
+
+function WriteReq(chunk, encoding, cb) {
+ this.chunk = chunk;
+ this.encoding = encoding;
+ this.callback = cb;
+ this.next = null;
+}
+
+var Duplex;
+function WritableState(options, stream) {
+ Duplex = Duplex || require('./_stream_duplex');
+
+ options = options || {};
+
+ // object stream flag to indicate whether or not this stream
+ // contains buffers or objects.
+ this.objectMode = !!options.objectMode;
+
+ if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.writableObjectMode;
+
+ // the point at which write() starts returning false
+ // Note: 0 is a valid value, means that we always return false if
+ // the entire buffer is not flushed immediately on write()
+ var hwm = options.highWaterMark;
+ var defaultHwm = this.objectMode ? 16 : 16 * 1024;
+ this.highWaterMark = hwm || hwm === 0 ? hwm : defaultHwm;
+
+ // cast to ints.
+ this.highWaterMark = ~ ~this.highWaterMark;
+
+ this.needDrain = false;
+ // at the start of calling end()
+ this.ending = false;
+ // when end() has been called, and returned
+ this.ended = false;
+ // when 'finish' is emitted
+ this.finished = false;
+
+ // should we decode strings into buffers before passing to _write?
+ // this is here so that some node-core streams can optimize string
+ // handling at a lower level.
+ var noDecode = options.decodeStrings === false;
+ this.decodeStrings = !noDecode;
+
+ // Crypto is kind of old and crusty. Historically, its default string
+ // encoding is 'binary' so we have to make this configurable.
+ // Everything else in the universe uses 'utf8', though.
+ this.defaultEncoding = options.defaultEncoding || 'utf8';
+
+ // not an actual buffer we keep track of, but a measurement
+ // of how much we're waiting to get pushed to some underlying
+ // socket or file.
+ this.length = 0;
+
+ // a flag to see when we're in the middle of a write.
+ this.writing = false;
+
+ // when true all writes will be buffered until .uncork() call
+ this.corked = 0;
+
+ // a flag to be able to tell if the onwrite cb is called immediately,
+ // or on a later tick. We set this to true at first, because any
+ // actions that shouldn't happen until "later" should generally also
+ // not happen before the first write call.
+ this.sync = true;
+
+ // a flag to know if we're processing previously buffered items, which
+ // may call the _write() callback in the same tick, so that we don't
+ // end up in an overlapped onwrite situation.
+ this.bufferProcessing = false;
+
+ // the callback that's passed to _write(chunk,cb)
+ this.onwrite = function (er) {
+ onwrite(stream, er);
+ };
+
+ // the callback that the user supplies to write(chunk,encoding,cb)
+ this.writecb = null;
+
+ // the amount that is being written when _write is called.
+ this.writelen = 0;
+
+ this.bufferedRequest = null;
+ this.lastBufferedRequest = null;
+
+ // number of pending user-supplied write callbacks
+ // this must be 0 before 'finish' can be emitted
+ this.pendingcb = 0;
+
+ // emit prefinish if the only thing we're waiting for is _write cbs
+ // This is relevant for synchronous Transform streams
+ this.prefinished = false;
+
+ // True if the error was already emitted and should not be thrown again
+ this.errorEmitted = false;
+
+ // count buffered requests
+ this.bufferedRequestCount = 0;
+
+ // allocate the first CorkedRequest, there is always
+ // one allocated and free to use, and we maintain at most two
+ this.corkedRequestsFree = new CorkedRequest(this);
+}
+
+WritableState.prototype.getBuffer = function writableStateGetBuffer() {
+ var current = this.bufferedRequest;
+ var out = [];
+ while (current) {
+ out.push(current);
+ current = current.next;
+ }
+ return out;
+};
+
+(function () {
+ try {
+ Object.defineProperty(WritableState.prototype, 'buffer', {
+ get: internalUtil.deprecate(function () {
+ return this.getBuffer();
+ }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.')
+ });
+ } catch (_) {}
+})();
+
+var Duplex;
+function Writable(options) {
+ Duplex = Duplex || require('./_stream_duplex');
+
+ // Writable ctor is applied to Duplexes, though they're not
+ // instanceof Writable, they're instanceof Readable.
+ if (!(this instanceof Writable) && !(this instanceof Duplex)) return new Writable(options);
+
+ this._writableState = new WritableState(options, this);
+
+ // legacy.
+ this.writable = true;
+
+ if (options) {
+ if (typeof options.write === 'function') this._write = options.write;
+
+ if (typeof options.writev === 'function') this._writev = options.writev;
+ }
+
+ Stream.call(this);
+}
+
+// Otherwise people can pipe Writable streams, which is just wrong.
+Writable.prototype.pipe = function () {
+ this.emit('error', new Error('Cannot pipe, not readable'));
+};
+
+function writeAfterEnd(stream, cb) {
+ var er = new Error('write after end');
+ // TODO: defer error events consistently everywhere, not just the cb
+ stream.emit('error', er);
+ processNextTick(cb, er);
+}
+
+// If we get something that is not a buffer, string, null, or undefined,
+// and we're not in objectMode, then that's an error.
+// Otherwise stream chunks are all considered to be of length=1, and the
+// watermarks determine how many objects to keep in the buffer, rather than
+// how many bytes or characters.
+function validChunk(stream, state, chunk, cb) {
+ var valid = true;
+ var er = false;
+ // Always throw error if a null is written
+ // if we are not in object mode then throw
+ // if it is not a buffer, string, or undefined.
+ if (chunk === null) {
+ er = new TypeError('May not write null values to stream');
+ } else if (!Buffer.isBuffer(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) {
+ er = new TypeError('Invalid non-string/buffer chunk');
+ }
+ if (er) {
+ stream.emit('error', er);
+ processNextTick(cb, er);
+ valid = false;
+ }
+ return valid;
+}
+
+Writable.prototype.write = function (chunk, encoding, cb) {
+ var state = this._writableState;
+ var ret = false;
+
+ if (typeof encoding === 'function') {
+ cb = encoding;
+ encoding = null;
+ }
+
+ if (Buffer.isBuffer(chunk)) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding;
+
+ if (typeof cb !== 'function') cb = nop;
+
+ if (state.ended) writeAfterEnd(this, cb);else if (validChunk(this, state, chunk, cb)) {
+ state.pendingcb++;
+ ret = writeOrBuffer(this, state, chunk, encoding, cb);
+ }
+
+ return ret;
+};
+
+Writable.prototype.cork = function () {
+ var state = this._writableState;
+
+ state.corked++;
+};
+
+Writable.prototype.uncork = function () {
+ var state = this._writableState;
+
+ if (state.corked) {
+ state.corked--;
+
+ if (!state.writing && !state.corked && !state.finished && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state);
+ }
+};
+
+Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) {
+ // node::ParseEncoding() requires lower case.
+ if (typeof encoding === 'string') encoding = encoding.toLowerCase();
+ if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new TypeError('Unknown encoding: ' + encoding);
+ this._writableState.defaultEncoding = encoding;
+ return this;
+};
+
+function decodeChunk(state, chunk, encoding) {
+ if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') {
+ chunk = bufferShim.from(chunk, encoding);
+ }
+ return chunk;
+}
+
+// if we're already writing something, then just put this
+// in the queue, and wait our turn. Otherwise, call _write
+// If we return false, then we need a drain event, so set that flag.
+function writeOrBuffer(stream, state, chunk, encoding, cb) {
+ chunk = decodeChunk(state, chunk, encoding);
+
+ if (Buffer.isBuffer(chunk)) encoding = 'buffer';
+ var len = state.objectMode ? 1 : chunk.length;
+
+ state.length += len;
+
+ var ret = state.length < state.highWaterMark;
+ // we must ensure that previous needDrain will not be reset to false.
+ if (!ret) state.needDrain = true;
+
+ if (state.writing || state.corked) {
+ var last = state.lastBufferedRequest;
+ state.lastBufferedRequest = new WriteReq(chunk, encoding, cb);
+ if (last) {
+ last.next = state.lastBufferedRequest;
+ } else {
+ state.bufferedRequest = state.lastBufferedRequest;
+ }
+ state.bufferedRequestCount += 1;
+ } else {
+ doWrite(stream, state, false, len, chunk, encoding, cb);
+ }
+
+ return ret;
+}
+
+function doWrite(stream, state, writev, len, chunk, encoding, cb) {
+ state.writelen = len;
+ state.writecb = cb;
+ state.writing = true;
+ state.sync = true;
+ if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite);
+ state.sync = false;
+}
+
+function onwriteError(stream, state, sync, er, cb) {
+ --state.pendingcb;
+ if (sync) processNextTick(cb, er);else cb(er);
+
+ stream._writableState.errorEmitted = true;
+ stream.emit('error', er);
+}
+
+function onwriteStateUpdate(state) {
+ state.writing = false;
+ state.writecb = null;
+ state.length -= state.writelen;
+ state.writelen = 0;
+}
+
+function onwrite(stream, er) {
+ var state = stream._writableState;
+ var sync = state.sync;
+ var cb = state.writecb;
+
+ onwriteStateUpdate(state);
+
+ if (er) onwriteError(stream, state, sync, er, cb);else {
+ // Check if we're actually ready to finish, but don't emit yet
+ var finished = needFinish(state);
+
+ if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) {
+ clearBuffer(stream, state);
+ }
+
+ if (sync) {
+ /*<replacement>*/
+ asyncWrite(afterWrite, stream, state, finished, cb);
+ /*</replacement>*/
+ } else {
+ afterWrite(stream, state, finished, cb);
+ }
+ }
+}
+
+function afterWrite(stream, state, finished, cb) {
+ if (!finished) onwriteDrain(stream, state);
+ state.pendingcb--;
+ cb();
+ finishMaybe(stream, state);
+}
+
+// Must force callback to be called on nextTick, so that we don't
+// emit 'drain' before the write() consumer gets the 'false' return
+// value, and has a chance to attach a 'drain' listener.
+function onwriteDrain(stream, state) {
+ if (state.length === 0 && state.needDrain) {
+ state.needDrain = false;
+ stream.emit('drain');
+ }
+}
+
+// if there's something in the buffer waiting, then process it
+function clearBuffer(stream, state) {
+ state.bufferProcessing = true;
+ var entry = state.bufferedRequest;
+
+ if (stream._writev && entry && entry.next) {
+ // Fast case, write everything using _writev()
+ var l = state.bufferedRequestCount;
+ var buffer = new Array(l);
+ var holder = state.corkedRequestsFree;
+ holder.entry = entry;
+
+ var count = 0;
+ while (entry) {
+ buffer[count] = entry;
+ entry = entry.next;
+ count += 1;
+ }
+
+ doWrite(stream, state, true, state.length, buffer, '', holder.finish);
+
+ // doWrite is almost always async, defer these to save a bit of time
+ // as the hot path ends with doWrite
+ state.pendingcb++;
+ state.lastBufferedRequest = null;
+ if (holder.next) {
+ state.corkedRequestsFree = holder.next;
+ holder.next = null;
+ } else {
+ state.corkedRequestsFree = new CorkedRequest(state);
+ }
+ } else {
+ // Slow case, write chunks one-by-one
+ while (entry) {
+ var chunk = entry.chunk;
+ var encoding = entry.encoding;
+ var cb = entry.callback;
+ var len = state.objectMode ? 1 : chunk.length;
+
+ doWrite(stream, state, false, len, chunk, encoding, cb);
+ entry = entry.next;
+ // if we didn't call the onwrite immediately, then
+ // it means that we need to wait until it does.
+ // also, that means that the chunk and cb are currently
+ // being processed, so move the buffer counter past them.
+ if (state.writing) {
+ break;
+ }
+ }
+
+ if (entry === null) state.lastBufferedRequest = null;
+ }
+
+ state.bufferedRequestCount = 0;
+ state.bufferedRequest = entry;
+ state.bufferProcessing = false;
+}
+
+Writable.prototype._write = function (chunk, encoding, cb) {
+ cb(new Error('not implemented'));
+};
+
+Writable.prototype._writev = null;
+
+Writable.prototype.end = function (chunk, encoding, cb) {
+ var state = this._writableState;
+
+ if (typeof chunk === 'function') {
+ cb = chunk;
+ chunk = null;
+ encoding = null;
+ } else if (typeof encoding === 'function') {
+ cb = encoding;
+ encoding = null;
+ }
+
+ if (chunk !== null && chunk !== undefined) this.write(chunk, encoding);
+
+ // .end() fully uncorks
+ if (state.corked) {
+ state.corked = 1;
+ this.uncork();
+ }
+
+ // ignore unnecessary end() calls.
+ if (!state.ending && !state.finished) endWritable(this, state, cb);
+};
+
+function needFinish(state) {
+ return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing;
+}
+
+function prefinish(stream, state) {
+ if (!state.prefinished) {
+ state.prefinished = true;
+ stream.emit('prefinish');
+ }
+}
+
+function finishMaybe(stream, state) {
+ var need = needFinish(state);
+ if (need) {
+ if (state.pendingcb === 0) {
+ prefinish(stream, state);
+ state.finished = true;
+ stream.emit('finish');
+ } else {
+ prefinish(stream, state);
+ }
+ }
+ return need;
+}
+
+function endWritable(stream, state, cb) {
+ state.ending = true;
+ finishMaybe(stream, state);
+ if (cb) {
+ if (state.finished) processNextTick(cb);else stream.once('finish', cb);
+ }
+ state.ended = true;
+ stream.writable = false;
+}
+
+// It seems a linked list but it is not
+// there will be only 2 of these for each stream
+function CorkedRequest(state) {
+ var _this = this;
+
+ this.next = null;
+ this.entry = null;
+
+ this.finish = function (err) {
+ var entry = _this.entry;
+ _this.entry = null;
+ while (entry) {
+ var cb = entry.callback;
+ state.pendingcb--;
+ cb(err);
+ entry = entry.next;
+ }
+ if (state.corkedRequestsFree) {
+ state.corkedRequestsFree.next = _this;
+ } else {
+ state.corkedRequestsFree = _this;
+ }
+ };
+}
+}).call(this,require('_process'))
+},{"./_stream_duplex":69,"_process":67,"buffer":44,"buffer-shims":43,"core-util-is":45,"events":48,"inherits":51,"process-nextick-args":66,"util-deprecate":81}],74:[function(require,module,exports){
+'use strict';
+
+var Buffer = require('buffer').Buffer;
+/*<replacement>*/
+var bufferShim = require('buffer-shims');
+/*</replacement>*/
+
+module.exports = BufferList;
+
+function BufferList() {
+ this.head = null;
+ this.tail = null;
+ this.length = 0;
+}
+
+BufferList.prototype.push = function (v) {
+ var entry = { data: v, next: null };
+ if (this.length > 0) this.tail.next = entry;else this.head = entry;
+ this.tail = entry;
+ ++this.length;
+};
+
+BufferList.prototype.unshift = function (v) {
+ var entry = { data: v, next: this.head };
+ if (this.length === 0) this.tail = entry;
+ this.head = entry;
+ ++this.length;
+};
+
+BufferList.prototype.shift = function () {
+ if (this.length === 0) return;
+ var ret = this.head.data;
+ if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next;
+ --this.length;
+ return ret;
+};
+
+BufferList.prototype.clear = function () {
+ this.head = this.tail = null;
+ this.length = 0;
+};
+
+BufferList.prototype.join = function (s) {
+ if (this.length === 0) return '';
+ var p = this.head;
+ var ret = '' + p.data;
+ while (p = p.next) {
+ ret += s + p.data;
+ }return ret;
+};
+
+BufferList.prototype.concat = function (n) {
+ if (this.length === 0) return bufferShim.alloc(0);
+ if (this.length === 1) return this.head.data;
+ var ret = bufferShim.allocUnsafe(n >>> 0);
+ var p = this.head;
+ var i = 0;
+ while (p) {
+ p.data.copy(ret, i);
+ i += p.data.length;
+ p = p.next;
+ }
+ return ret;
+};
+},{"buffer":44,"buffer-shims":43}],75:[function(require,module,exports){
+module.exports = require("./lib/_stream_passthrough.js")
+
+},{"./lib/_stream_passthrough.js":70}],76:[function(require,module,exports){
+(function (process){
+var Stream = (function (){
+ try {
+ return require('st' + 'ream'); // hack to fix a circular dependency issue when used with browserify
+ } catch(_){}
+}());
+exports = module.exports = require('./lib/_stream_readable.js');
+exports.Stream = Stream || exports;
+exports.Readable = exports;
+exports.Writable = require('./lib/_stream_writable.js');
+exports.Duplex = require('./lib/_stream_duplex.js');
+exports.Transform = require('./lib/_stream_transform.js');
+exports.PassThrough = require('./lib/_stream_passthrough.js');
+
+if (!process.browser && process.env.READABLE_STREAM === 'disable' && Stream) {
+ module.exports = Stream;
+}
+
+}).call(this,require('_process'))
+},{"./lib/_stream_duplex.js":69,"./lib/_stream_passthrough.js":70,"./lib/_stream_readable.js":71,"./lib/_stream_transform.js":72,"./lib/_stream_writable.js":73,"_process":67}],77:[function(require,module,exports){
+module.exports = require("./lib/_stream_transform.js")
+
+},{"./lib/_stream_transform.js":72}],78:[function(require,module,exports){
+module.exports = require("./lib/_stream_writable.js")
+
+},{"./lib/_stream_writable.js":73}],79:[function(require,module,exports){
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+module.exports = Stream;
+
+var EE = require('events').EventEmitter;
+var inherits = require('inherits');
+
+inherits(Stream, EE);
+Stream.Readable = require('readable-stream/readable.js');
+Stream.Writable = require('readable-stream/writable.js');
+Stream.Duplex = require('readable-stream/duplex.js');
+Stream.Transform = require('readable-stream/transform.js');
+Stream.PassThrough = require('readable-stream/passthrough.js');
+
+// Backwards-compat with node 0.4.x
+Stream.Stream = Stream;
+
+
+
+// old-style streams. Note that the pipe method (the only relevant
+// part of this class) is overridden in the Readable class.
+
+function Stream() {
+ EE.call(this);
+}
+
+Stream.prototype.pipe = function(dest, options) {
+ var source = this;
+
+ function ondata(chunk) {
+ if (dest.writable) {
+ if (false === dest.write(chunk) && source.pause) {
+ source.pause();
+ }
+ }
+ }
+
+ source.on('data', ondata);
+
+ function ondrain() {
+ if (source.readable && source.resume) {
+ source.resume();
+ }
+ }
+
+ dest.on('drain', ondrain);
+
+ // If the 'end' option is not supplied, dest.end() will be called when
+ // source gets the 'end' or 'close' events. Only dest.end() once.
+ if (!dest._isStdio && (!options || options.end !== false)) {
+ source.on('end', onend);
+ source.on('close', onclose);
+ }
+
+ var didOnEnd = false;
+ function onend() {
+ if (didOnEnd) return;
+ didOnEnd = true;
+
+ dest.end();
+ }
+
+
+ function onclose() {
+ if (didOnEnd) return;
+ didOnEnd = true;
+
+ if (typeof dest.destroy === 'function') dest.destroy();
+ }
+
+ // don't leave dangling pipes when there are errors.
+ function onerror(er) {
+ cleanup();
+ if (EE.listenerCount(this, 'error') === 0) {
+ throw er; // Unhandled stream error in pipe.
+ }
+ }
+
+ source.on('error', onerror);
+ dest.on('error', onerror);
+
+ // remove all the event listeners that were added.
+ function cleanup() {
+ source.removeListener('data', ondata);
+ dest.removeListener('drain', ondrain);
+
+ source.removeListener('end', onend);
+ source.removeListener('close', onclose);
+
+ source.removeListener('error', onerror);
+ dest.removeListener('error', onerror);
+
+ source.removeListener('end', cleanup);
+ source.removeListener('close', cleanup);
+
+ dest.removeListener('close', cleanup);
+ }
+
+ source.on('end', cleanup);
+ source.on('close', cleanup);
+
+ dest.on('close', cleanup);
+
+ dest.emit('pipe', source);
+
+ // Allow for unix-like usage: A.pipe(B).pipe(C)
+ return dest;
+};
+
+},{"events":48,"inherits":51,"readable-stream/duplex.js":68,"readable-stream/passthrough.js":75,"readable-stream/readable.js":76,"readable-stream/transform.js":77,"readable-stream/writable.js":78}],80:[function(require,module,exports){
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+var Buffer = require('buffer').Buffer;
+
+var isBufferEncoding = Buffer.isEncoding
+ || function(encoding) {
+ switch (encoding && encoding.toLowerCase()) {
+ case 'hex': case 'utf8': case 'utf-8': case 'ascii': case 'binary': case 'base64': case 'ucs2': case 'ucs-2': case 'utf16le': case 'utf-16le': case 'raw': return true;
+ default: return false;
+ }
+ }
+
+
+function assertEncoding(encoding) {
+ if (encoding && !isBufferEncoding(encoding)) {
+ throw new Error('Unknown encoding: ' + encoding);
+ }
+}
+
+// StringDecoder provides an interface for efficiently splitting a series of
+// buffers into a series of JS strings without breaking apart multi-byte
+// characters. CESU-8 is handled as part of the UTF-8 encoding.
+//
+// @TODO Handling all encodings inside a single object makes it very difficult
+// to reason about this code, so it should be split up in the future.
+// @TODO There should be a utf8-strict encoding that rejects invalid UTF-8 code
+// points as used by CESU-8.
+var StringDecoder = exports.StringDecoder = function(encoding) {
+ this.encoding = (encoding || 'utf8').toLowerCase().replace(/[-_]/, '');
+ assertEncoding(encoding);
+ switch (this.encoding) {
+ case 'utf8':
+ // CESU-8 represents each of Surrogate Pair by 3-bytes
+ this.surrogateSize = 3;
+ break;
+ case 'ucs2':
+ case 'utf16le':
+ // UTF-16 represents each of Surrogate Pair by 2-bytes
+ this.surrogateSize = 2;
+ this.detectIncompleteChar = utf16DetectIncompleteChar;
+ break;
+ case 'base64':
+ // Base-64 stores 3 bytes in 4 chars, and pads the remainder.
+ this.surrogateSize = 3;
+ this.detectIncompleteChar = base64DetectIncompleteChar;
+ break;
+ default:
+ this.write = passThroughWrite;
+ return;
+ }
+
+ // Enough space to store all bytes of a single character. UTF-8 needs 4
+ // bytes, but CESU-8 may require up to 6 (3 bytes per surrogate).
+ this.charBuffer = new Buffer(6);
+ // Number of bytes received for the current incomplete multi-byte character.
+ this.charReceived = 0;
+ // Number of bytes expected for the current incomplete multi-byte character.
+ this.charLength = 0;
+};
+
+
+// write decodes the given buffer and returns it as JS string that is
+// guaranteed to not contain any partial multi-byte characters. Any partial
+// character found at the end of the buffer is buffered up, and will be
+// returned when calling write again with the remaining bytes.
+//
+// Note: Converting a Buffer containing an orphan surrogate to a String
+// currently works, but converting a String to a Buffer (via `new Buffer`, or
+// Buffer#write) will replace incomplete surrogates with the unicode
+// replacement character. See https://codereview.chromium.org/121173009/ .
+StringDecoder.prototype.write = function(buffer) {
+ var charStr = '';
+ // if our last write ended with an incomplete multibyte character
+ while (this.charLength) {
+ // determine how many remaining bytes this buffer has to offer for this char
+ var available = (buffer.length >= this.charLength - this.charReceived) ?
+ this.charLength - this.charReceived :
+ buffer.length;
+
+ // add the new bytes to the char buffer
+ buffer.copy(this.charBuffer, this.charReceived, 0, available);
+ this.charReceived += available;
+
+ if (this.charReceived < this.charLength) {
+ // still not enough chars in this buffer? wait for more ...
+ return '';
+ }
+
+ // remove bytes belonging to the current character from the buffer
+ buffer = buffer.slice(available, buffer.length);
+
+ // get the character that was split
+ charStr = this.charBuffer.slice(0, this.charLength).toString(this.encoding);
+
+ // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character
+ var charCode = charStr.charCodeAt(charStr.length - 1);
+ if (charCode >= 0xD800 && charCode <= 0xDBFF) {
+ this.charLength += this.surrogateSize;
+ charStr = '';
+ continue;
+ }
+ this.charReceived = this.charLength = 0;
+
+ // if there are no more bytes in this buffer, just emit our char
+ if (buffer.length === 0) {
+ return charStr;
+ }
+ break;
+ }
+
+ // determine and set charLength / charReceived
+ this.detectIncompleteChar(buffer);
+
+ var end = buffer.length;
+ if (this.charLength) {
+ // buffer the incomplete character bytes we got
+ buffer.copy(this.charBuffer, 0, buffer.length - this.charReceived, end);
+ end -= this.charReceived;
+ }
+
+ charStr += buffer.toString(this.encoding, 0, end);
+
+ var end = charStr.length - 1;
+ var charCode = charStr.charCodeAt(end);
+ // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character
+ if (charCode >= 0xD800 && charCode <= 0xDBFF) {
+ var size = this.surrogateSize;
+ this.charLength += size;
+ this.charReceived += size;
+ this.charBuffer.copy(this.charBuffer, size, 0, size);
+ buffer.copy(this.charBuffer, 0, 0, size);
+ return charStr.substring(0, end);
+ }
+
+ // or just emit the charStr
+ return charStr;
+};
+
+// detectIncompleteChar determines if there is an incomplete UTF-8 character at
+// the end of the given buffer. If so, it sets this.charLength to the byte
+// length that character, and sets this.charReceived to the number of bytes
+// that are available for this character.
+StringDecoder.prototype.detectIncompleteChar = function(buffer) {
+ // determine how many bytes we have to check at the end of this buffer
+ var i = (buffer.length >= 3) ? 3 : buffer.length;
+
+ // Figure out if one of the last i bytes of our buffer announces an
+ // incomplete char.
+ for (; i > 0; i--) {
+ var c = buffer[buffer.length - i];
+
+ // See http://en.wikipedia.org/wiki/UTF-8#Description
+
+ // 110XXXXX
+ if (i == 1 && c >> 5 == 0x06) {
+ this.charLength = 2;
+ break;
+ }
+
+ // 1110XXXX
+ if (i <= 2 && c >> 4 == 0x0E) {
+ this.charLength = 3;
+ break;
+ }
+
+ // 11110XXX
+ if (i <= 3 && c >> 3 == 0x1E) {
+ this.charLength = 4;
+ break;
+ }
+ }
+ this.charReceived = i;
+};
+
+StringDecoder.prototype.end = function(buffer) {
+ var res = '';
+ if (buffer && buffer.length)
+ res = this.write(buffer);
+
+ if (this.charReceived) {
+ var cr = this.charReceived;
+ var buf = this.charBuffer;
+ var enc = this.encoding;
+ res += buf.slice(0, cr).toString(enc);
+ }
+
+ return res;
+};
+
+function passThroughWrite(buffer) {
+ return buffer.toString(this.encoding);
+}
+
+function utf16DetectIncompleteChar(buffer) {
+ this.charReceived = buffer.length % 2;
+ this.charLength = this.charReceived ? 2 : 0;
+}
+
+function base64DetectIncompleteChar(buffer) {
+ this.charReceived = buffer.length % 3;
+ this.charLength = this.charReceived ? 3 : 0;
+}
+
+},{"buffer":44}],81:[function(require,module,exports){
+(function (global){
+
+/**
+ * Module exports.
+ */
+
+module.exports = deprecate;
+
+/**
+ * Mark that a method should not be used.
+ * Returns a modified function which warns once by default.
+ *
+ * If `localStorage.noDeprecation = true` is set, then it is a no-op.
+ *
+ * If `localStorage.throwDeprecation = true` is set, then deprecated functions
+ * will throw an Error when invoked.
+ *
+ * If `localStorage.traceDeprecation = true` is set, then deprecated functions
+ * will invoke `console.trace()` instead of `console.error()`.
+ *
+ * @param {Function} fn - the function to deprecate
+ * @param {String} msg - the string to print to the console when `fn` is invoked
+ * @returns {Function} a new "deprecated" version of `fn`
+ * @api public
+ */
+
+function deprecate (fn, msg) {
+ if (config('noDeprecation')) {
+ return fn;
+ }
+
+ var warned = false;
+ function deprecated() {
+ if (!warned) {
+ if (config('throwDeprecation')) {
+ throw new Error(msg);
+ } else if (config('traceDeprecation')) {
+ console.trace(msg);
+ } else {
+ console.warn(msg);
+ }
+ warned = true;
+ }
+ return fn.apply(this, arguments);
+ }
+
+ return deprecated;
+}
+
+/**
+ * Checks `localStorage` for boolean values for the given `name`.
+ *
+ * @param {String} name
+ * @returns {Boolean}
+ * @api private
+ */
+
+function config (name) {
+ // accessing global.localStorage can trigger a DOMException in sandboxed iframes
+ try {
+ if (!global.localStorage) return false;
+ } catch (_) {
+ return false;
+ }
+ var val = global.localStorage[name];
+ if (null == val) return false;
+ return String(val).toLowerCase() === 'true';
+}
+
+}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+},{}],82:[function(require,module,exports){
+arguments[4][51][0].apply(exports,arguments)
+},{"dup":51}],83:[function(require,module,exports){
+module.exports = function isBuffer(arg) {
+ return arg && typeof arg === 'object'
+ && typeof arg.copy === 'function'
+ && typeof arg.fill === 'function'
+ && typeof arg.readUInt8 === 'function';
+}
+},{}],84:[function(require,module,exports){
+(function (process,global){
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+var formatRegExp = /%[sdj%]/g;
+exports.format = function(f) {
+ if (!isString(f)) {
+ var objects = [];
+ for (var i = 0; i < arguments.length; i++) {
+ objects.push(inspect(arguments[i]));
+ }
+ return objects.join(' ');
+ }
+
+ var i = 1;
+ var args = arguments;
+ var len = args.length;
+ var str = String(f).replace(formatRegExp, function(x) {
+ if (x === '%%') return '%';
+ if (i >= len) return x;
+ switch (x) {
+ case '%s': return String(args[i++]);
+ case '%d': return Number(args[i++]);
+ case '%j':
+ try {
+ return JSON.stringify(args[i++]);
+ } catch (_) {
+ return '[Circular]';
+ }
+ default:
+ return x;
+ }
+ });
+ for (var x = args[i]; i < len; x = args[++i]) {
+ if (isNull(x) || !isObject(x)) {
+ str += ' ' + x;
+ } else {
+ str += ' ' + inspect(x);
+ }
+ }
+ return str;
+};
+
+
+// Mark that a method should not be used.
+// Returns a modified function which warns once by default.
+// If --no-deprecation is set, then it is a no-op.
+exports.deprecate = function(fn, msg) {
+ // Allow for deprecating things in the process of starting up.
+ if (isUndefined(global.process)) {
+ return function() {
+ return exports.deprecate(fn, msg).apply(this, arguments);
+ };
+ }
+
+ if (process.noDeprecation === true) {
+ return fn;
+ }
+
+ var warned = false;
+ function deprecated() {
+ if (!warned) {
+ if (process.throwDeprecation) {
+ throw new Error(msg);
+ } else if (process.traceDeprecation) {
+ console.trace(msg);
+ } else {
+ console.error(msg);
+ }
+ warned = true;
+ }
+ return fn.apply(this, arguments);
+ }
+
+ return deprecated;
+};
+
+
+var debugs = {};
+var debugEnviron;
+exports.debuglog = function(set) {
+ if (isUndefined(debugEnviron))
+ debugEnviron = process.env.NODE_DEBUG || '';
+ set = set.toUpperCase();
+ if (!debugs[set]) {
+ if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) {
+ var pid = process.pid;
+ debugs[set] = function() {
+ var msg = exports.format.apply(exports, arguments);
+ console.error('%s %d: %s', set, pid, msg);
+ };
+ } else {
+ debugs[set] = function() {};
+ }
+ }
+ return debugs[set];
+};
+
+
+/**
+ * Echos the value of a value. Trys to print the value out
+ * in the best way possible given the different types.
+ *
+ * @param {Object} obj The object to print out.
+ * @param {Object} opts Optional options object that alters the output.
+ */
+/* legacy: obj, showHidden, depth, colors*/
+function inspect(obj, opts) {
+ // default options
+ var ctx = {
+ seen: [],
+ stylize: stylizeNoColor
+ };
+ // legacy...
+ if (arguments.length >= 3) ctx.depth = arguments[2];
+ if (arguments.length >= 4) ctx.colors = arguments[3];
+ if (isBoolean(opts)) {
+ // legacy...
+ ctx.showHidden = opts;
+ } else if (opts) {
+ // got an "options" object
+ exports._extend(ctx, opts);
+ }
+ // set default options
+ if (isUndefined(ctx.showHidden)) ctx.showHidden = false;
+ if (isUndefined(ctx.depth)) ctx.depth = 2;
+ if (isUndefined(ctx.colors)) ctx.colors = false;
+ if (isUndefined(ctx.customInspect)) ctx.customInspect = true;
+ if (ctx.colors) ctx.stylize = stylizeWithColor;
+ return formatValue(ctx, obj, ctx.depth);
+}
+exports.inspect = inspect;
+
+
+// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics
+inspect.colors = {
+ 'bold' : [1, 22],
+ 'italic' : [3, 23],
+ 'underline' : [4, 24],
+ 'inverse' : [7, 27],
+ 'white' : [37, 39],
+ 'grey' : [90, 39],
+ 'black' : [30, 39],
+ 'blue' : [34, 39],
+ 'cyan' : [36, 39],
+ 'green' : [32, 39],
+ 'magenta' : [35, 39],
+ 'red' : [31, 39],
+ 'yellow' : [33, 39]
+};
+
+// Don't use 'blue' not visible on cmd.exe
+inspect.styles = {
+ 'special': 'cyan',
+ 'number': 'yellow',
+ 'boolean': 'yellow',
+ 'undefined': 'grey',
+ 'null': 'bold',
+ 'string': 'green',
+ 'date': 'magenta',
+ // "name": intentionally not styling
+ 'regexp': 'red'
+};
+
+
+function stylizeWithColor(str, styleType) {
+ var style = inspect.styles[styleType];
+
+ if (style) {
+ return '\u001b[' + inspect.colors[style][0] + 'm' + str +
+ '\u001b[' + inspect.colors[style][1] + 'm';
+ } else {
+ return str;
+ }
+}
+
+
+function stylizeNoColor(str, styleType) {
+ return str;
+}
+
+
+function arrayToHash(array) {
+ var hash = {};
+
+ array.forEach(function(val, idx) {
+ hash[val] = true;
+ });
+
+ return hash;
+}
+
+
+function formatValue(ctx, value, recurseTimes) {
+ // Provide a hook for user-specified inspect functions.
+ // Check that value is an object with an inspect function on it
+ if (ctx.customInspect &&
+ value &&
+ isFunction(value.inspect) &&
+ // Filter out the util module, it's inspect function is special
+ value.inspect !== exports.inspect &&
+ // Also filter out any prototype objects using the circular check.
+ !(value.constructor && value.constructor.prototype === value)) {
+ var ret = value.inspect(recurseTimes, ctx);
+ if (!isString(ret)) {
+ ret = formatValue(ctx, ret, recurseTimes);
+ }
+ return ret;
+ }
+
+ // Primitive types cannot have properties
+ var primitive = formatPrimitive(ctx, value);
+ if (primitive) {
+ return primitive;
+ }
+
+ // Look up the keys of the object.
+ var keys = Object.keys(value);
+ var visibleKeys = arrayToHash(keys);
+
+ if (ctx.showHidden) {
+ keys = Object.getOwnPropertyNames(value);
+ }
+
+ // IE doesn't make error fields non-enumerable
+ // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx
+ if (isError(value)
+ && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) {
+ return formatError(value);
+ }
+
+ // Some type of object without properties can be shortcutted.
+ if (keys.length === 0) {
+ if (isFunction(value)) {
+ var name = value.name ? ': ' + value.name : '';
+ return ctx.stylize('[Function' + name + ']', 'special');
+ }
+ if (isRegExp(value)) {
+ return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
+ }
+ if (isDate(value)) {
+ return ctx.stylize(Date.prototype.toString.call(value), 'date');
+ }
+ if (isError(value)) {
+ return formatError(value);
+ }
+ }
+
+ var base = '', array = false, braces = ['{', '}'];
+
+ // Make Array say that they are Array
+ if (isArray(value)) {
+ array = true;
+ braces = ['[', ']'];
+ }
+
+ // Make functions say that they are functions
+ if (isFunction(value)) {
+ var n = value.name ? ': ' + value.name : '';
+ base = ' [Function' + n + ']';
+ }
+
+ // Make RegExps say that they are RegExps
+ if (isRegExp(value)) {
+ base = ' ' + RegExp.prototype.toString.call(value);
+ }
+
+ // Make dates with properties first say the date
+ if (isDate(value)) {
+ base = ' ' + Date.prototype.toUTCString.call(value);
+ }
+
+ // Make error with message first say the error
+ if (isError(value)) {
+ base = ' ' + formatError(value);
+ }
+
+ if (keys.length === 0 && (!array || value.length == 0)) {
+ return braces[0] + base + braces[1];
+ }
+
+ if (recurseTimes < 0) {
+ if (isRegExp(value)) {
+ return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
+ } else {
+ return ctx.stylize('[Object]', 'special');
+ }
+ }
+
+ ctx.seen.push(value);
+
+ var output;
+ if (array) {
+ output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);
+ } else {
+ output = keys.map(function(key) {
+ return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);
+ });
+ }
+
+ ctx.seen.pop();
+
+ return reduceToSingleString(output, base, braces);
+}
+
+
+function formatPrimitive(ctx, value) {
+ if (isUndefined(value))
+ return ctx.stylize('undefined', 'undefined');
+ if (isString(value)) {
+ var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '')
+ .replace(/'/g, "\\'")
+ .replace(/\\"/g, '"') + '\'';
+ return ctx.stylize(simple, 'string');
+ }
+ if (isNumber(value))
+ return ctx.stylize('' + value, 'number');
+ if (isBoolean(value))
+ return ctx.stylize('' + value, 'boolean');
+ // For some reason typeof null is "object", so special case here.
+ if (isNull(value))
+ return ctx.stylize('null', 'null');
+}
+
+
+function formatError(value) {
+ return '[' + Error.prototype.toString.call(value) + ']';
+}
+
+
+function formatArray(ctx, value, recurseTimes, visibleKeys, keys) {
+ var output = [];
+ for (var i = 0, l = value.length; i < l; ++i) {
+ if (hasOwnProperty(value, String(i))) {
+ output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
+ String(i), true));
+ } else {
+ output.push('');
+ }
+ }
+ keys.forEach(function(key) {
+ if (!key.match(/^\d+$/)) {
+ output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
+ key, true));
+ }
+ });
+ return output;
+}
+
+
+function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {
+ var name, str, desc;
+ desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] };
+ if (desc.get) {
+ if (desc.set) {
+ str = ctx.stylize('[Getter/Setter]', 'special');
+ } else {
+ str = ctx.stylize('[Getter]', 'special');
+ }
+ } else {
+ if (desc.set) {
+ str = ctx.stylize('[Setter]', 'special');
+ }
+ }
+ if (!hasOwnProperty(visibleKeys, key)) {
+ name = '[' + key + ']';
+ }
+ if (!str) {
+ if (ctx.seen.indexOf(desc.value) < 0) {
+ if (isNull(recurseTimes)) {
+ str = formatValue(ctx, desc.value, null);
+ } else {
+ str = formatValue(ctx, desc.value, recurseTimes - 1);
+ }
+ if (str.indexOf('\n') > -1) {
+ if (array) {
+ str = str.split('\n').map(function(line) {
+ return ' ' + line;
+ }).join('\n').substr(2);
+ } else {
+ str = '\n' + str.split('\n').map(function(line) {
+ return ' ' + line;
+ }).join('\n');
+ }
+ }
+ } else {
+ str = ctx.stylize('[Circular]', 'special');
+ }
+ }
+ if (isUndefined(name)) {
+ if (array && key.match(/^\d+$/)) {
+ return str;
+ }
+ name = JSON.stringify('' + key);
+ if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) {
+ name = name.substr(1, name.length - 2);
+ name = ctx.stylize(name, 'name');
+ } else {
+ name = name.replace(/'/g, "\\'")
+ .replace(/\\"/g, '"')
+ .replace(/(^"|"$)/g, "'");
+ name = ctx.stylize(name, 'string');
+ }
+ }
+
+ return name + ': ' + str;
+}
+
+
+function reduceToSingleString(output, base, braces) {
+ var numLinesEst = 0;
+ var length = output.reduce(function(prev, cur) {
+ numLinesEst++;
+ if (cur.indexOf('\n') >= 0) numLinesEst++;
+ return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1;
+ }, 0);
+
+ if (length > 60) {
+ return braces[0] +
+ (base === '' ? '' : base + '\n ') +
+ ' ' +
+ output.join(',\n ') +
+ ' ' +
+ braces[1];
+ }
+
+ return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];
+}
+
+
+// NOTE: These type checking functions intentionally don't use `instanceof`
+// because it is fragile and can be easily faked with `Object.create()`.
+function isArray(ar) {
+ return Array.isArray(ar);
+}
+exports.isArray = isArray;
+
+function isBoolean(arg) {
+ return typeof arg === 'boolean';
+}
+exports.isBoolean = isBoolean;
+
+function isNull(arg) {
+ return arg === null;
+}
+exports.isNull = isNull;
+
+function isNullOrUndefined(arg) {
+ return arg == null;
+}
+exports.isNullOrUndefined = isNullOrUndefined;
+
+function isNumber(arg) {
+ return typeof arg === 'number';
+}
+exports.isNumber = isNumber;
+
+function isString(arg) {
+ return typeof arg === 'string';
+}
+exports.isString = isString;
+
+function isSymbol(arg) {
+ return typeof arg === 'symbol';
+}
+exports.isSymbol = isSymbol;
+
+function isUndefined(arg) {
+ return arg === void 0;
+}
+exports.isUndefined = isUndefined;
+
+function isRegExp(re) {
+ return isObject(re) && objectToString(re) === '[object RegExp]';
+}
+exports.isRegExp = isRegExp;
+
+function isObject(arg) {
+ return typeof arg === 'object' && arg !== null;
+}
+exports.isObject = isObject;
+
+function isDate(d) {
+ return isObject(d) && objectToString(d) === '[object Date]';
+}
+exports.isDate = isDate;
+
+function isError(e) {
+ return isObject(e) &&
+ (objectToString(e) === '[object Error]' || e instanceof Error);
+}
+exports.isError = isError;
+
+function isFunction(arg) {
+ return typeof arg === 'function';
+}
+exports.isFunction = isFunction;
+
+function isPrimitive(arg) {
+ return arg === null ||
+ typeof arg === 'boolean' ||
+ typeof arg === 'number' ||
+ typeof arg === 'string' ||
+ typeof arg === 'symbol' || // ES6 symbol
+ typeof arg === 'undefined';
+}
+exports.isPrimitive = isPrimitive;
+
+exports.isBuffer = require('./support/isBuffer');
+
+function objectToString(o) {
+ return Object.prototype.toString.call(o);
+}
+
+
+function pad(n) {
+ return n < 10 ? '0' + n.toString(10) : n.toString(10);
+}
+
+
+var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep',
+ 'Oct', 'Nov', 'Dec'];
+
+// 26 Feb 16:19:34
+function timestamp() {
+ var d = new Date();
+ var time = [pad(d.getHours()),
+ pad(d.getMinutes()),
+ pad(d.getSeconds())].join(':');
+ return [d.getDate(), months[d.getMonth()], time].join(' ');
+}
+
+
+// log is just a thin wrapper to console.log that prepends a timestamp
+exports.log = function() {
+ console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments));
+};
+
+
+/**
+ * Inherit the prototype methods from one constructor into another.
+ *
+ * The Function.prototype.inherits from lang.js rewritten as a standalone
+ * function (not on Function.prototype). NOTE: If this file is to be loaded
+ * during bootstrapping this function needs to be rewritten using some native
+ * functions as prototype setup using normal JavaScript does not work as
+ * expected during bootstrapping (see mirror.js in r114903).
+ *
+ * @param {function} ctor Constructor function which needs to inherit the
+ * prototype.
+ * @param {function} superCtor Constructor function to inherit prototype from.
+ */
+exports.inherits = require('inherits');
+
+exports._extend = function(origin, add) {
+ // Don't do anything if add isn't an object
+ if (!add || !isObject(add)) return origin;
+
+ var keys = Object.keys(add);
+ var i = keys.length;
+ while (i--) {
+ origin[keys[i]] = add[keys[i]];
+ }
+ return origin;
+};
+
+function hasOwnProperty(obj, prop) {
+ return Object.prototype.hasOwnProperty.call(obj, prop);
+}
+
+}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+},{"./support/isBuffer":83,"_process":67,"inherits":82}]},{},[1]);
diff --git a/tests/lib/mocha-3.1.0/package.json b/tests/lib/mocha-3.1.0/package.json
new file mode 100644
index 0000000000..4ec6546e6d
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/package.json
@@ -0,0 +1,357 @@
+{
+ "name": "mocha",
+ "version": "3.1.0",
+ "description": "simple, flexible, fun test framework",
+ "keywords": [
+ "mocha",
+ "test",
+ "bdd",
+ "tdd",
+ "tap"
+ ],
+ "author": "TJ Holowaychuk <tj@vision-media.ca>",
+ "contributors": [
+ "aaroncrows (https://github.com/aaroncrows)",
+ "Aaron Hamid <aaron@incsw.com> (https://github.com/ahamid)",
+ "Aaron Heckmann <aaron.heckmann+github@gmail.com> (https://github.com/aheckmann)",
+ "Adam Crabtree (CrabDude's alias) (https://github.com/CrabBot)",
+ "Adam Gruber (https://github.com/adamgruber)",
+ "Adrian Ludwig (https://github.com/adrian-ludwig)",
+ "Ainthe Kitchen <a.in.the.k@gmail.com> (https://github.com/ainthek)",
+ "ajaykodali (https://github.com/ajaykodali)",
+ "Alex Early (https://github.com/aearly)",
+ "Alex Pham <thedark1337@thedark1337.com> (https://github.com/thedark1337)",
+ "amsul (https://github.com/amsul)",
+ "Andreas Brekken <andreas@brekken.com> (https://github.com/abrkn)",
+ "Andreas Lind <andreas@one.com> (https://github.com/papandreou)",
+ "Andrew Miller <vnikitin@live.com> (https://github.com/vnikiti)",
+ "Andrew Nesbitt <andrewnez@gmail.com> (https://github.com/andrew)",
+ "Andrey Popp <8mayday@gmail.com> (https://github.com/andreypopp)",
+ "Andrii Shumada <eagleeyes91@gmail.com> (https://github.com/eagleeye)",
+ "Anis Safine (https://github.com/anis)",
+ "Arian Stolwijk <stolwijk.arian@gmail.com> (https://github.com/arian)",
+ "Ariel Mashraki <ariel@mashraki.co.il> (https://github.com/a8m)",
+ "Arnaud Brousseau (https://github.com/ArnaudBrousseau)",
+ "Atsuya Takagi <atsuya.takagi@gmail.com> (https://github.com/atsuya)",
+ "Attila Domokos (https://github.com/adomokos)",
+ "Austin Birch (https://github.com/austinbirch)",
+ "Avi Vahl (https://github.com/AviVahl)",
+ "Ben Bradley (https://github.com/ben-bradley)",
+ "beneidel (https://github.com/beneidel)",
+ "Benjie Gillam (https://github.com/benjie)",
+ "Ben Noordhuis <info@bnoordhuis.nl> (https://github.com/bnoordhuis)",
+ "Benoit Larroque (https://github.com/zetaben)",
+ "Benoît Zugmeyer (https://github.com/BenoitZugmeyer)",
+ "Ben Vinegar (https://github.com/benvinegar)",
+ "Berker Peksag <berker.peksag@gmail.com> (https://github.com/berkerpeksag)",
+ "Bjørge Næss (https://github.com/bjoerge)",
+ "Brendan Nee <brendan@blinktag.com> (https://github.com/brendannee)",
+ "Brian Beck <exogen@gmail.com> (https://github.com/exogen)",
+ "Brian C <brian.m.carlson@gmail.com> (https://github.com/brianc)",
+ "Brian Lalor <blalor@bravo5.org> (https://github.com/blalor)",
+ "Brian Moore (https://github.com/bionicbrian)",
+ "Bryan Donovan (https://github.com/BryanDonovan)",
+ "Buck Doyle (https://github.com/backspace)",
+ "C. Scott Ananian <cscott@cscott.net> (https://github.com/cscott)",
+ "Casey Foster (https://github.com/caseywebdev)",
+ "Charles Lowell <cowboyd@frontside.io> (https://github.com/cowboyd)",
+ "Chris Buckley <chris@cmbuckley.co.uk> (https://github.com/cmbuckley)",
+ "Christopher Hiller <boneskull@boneskull.com> (https://github.com/boneskull)",
+ "Chris Wren <chriswrendev@gmail.com> (https://github.com/ChrisWren)",
+ "Clemens Stolle (https://github.com/klaemo)",
+ "Connor Dunn (https://github.com/Connorhd)",
+ "Corey Butler (https://github.com/coreybutler)",
+ "Cory Thomas (https://github.com/dump247)",
+ "cybertk (https://github.com/cybertk)",
+ "Daniel Ericsson (https://github.com/monowerker)",
+ "Daniel St. Jules <danielst.jules@gmail.com> (https://github.com/danielstjules)",
+ "Daniel Stockman <daniel.stockman@gmail.com> (https://github.com/evocateur)",
+ "Dave McKenna <davemckenna01@gmail.com> (https://github.com/davemckenna01)",
+ "David da Silva <yo@dasilvacont.in> (https://github.com/dasilvacontin)",
+ "David Henderson (https://github.com/dhendo)",
+ "Denis Bardadym <bardadymchik@gmail.com> (https://github.com/btd)",
+ "Devin Weaver <suki@tritarget.org> (https://github.com/sukima)",
+ "Diogo Monteiro <diogo.gmt@gmail.com> (https://github.com/diogogmt)",
+ "Dmitry Shirokov <deadrunk@gmail.com> (https://github.com/runk)",
+ "Domenic Denicola <d@domenic.me> (https://github.com/domenic)",
+ "Dominic Barnes <dominic@dbarnes.info> (https://github.com/dominicbarnes)",
+ "domq (https://github.com/domq)",
+ "Douglas Wilson <doug@somethingdoug.com> (https://github.com/dougwilson)",
+ "Duncan Beevers <duncan@dweebd.com> (https://github.com/duncanbeevers)",
+ "Duncan Wong (https://github.com/badunk)",
+ "eiji.ienaga (https://github.com/haru01)",
+ "Fabio Crisci <piuccio@gmail.com> (https://github.com/piuccio)",
+ "Fede Ramirez <i@2fd.me> (https://github.com/2fd)",
+ "Fedor Indutny <fedor@indutny.com> (https://github.com/indutny)",
+ "fengmk2 <m@fengmk2.com> (https://github.com/fengmk2)",
+ "Florian Margaine <florian@margaine.com> (https://github.com/ralt)",
+ "Forbes Lindesay (https://github.com/ForbesLindesay)",
+ "Frederico Silva (https://github.com/fredericosilva)",
+ "Fredrik Enestad <fredrik.enestad@soundtrackyourbrand.com> (https://github.com/fredr)",
+ "Fredrik Lindin (https://github.com/Cowboy-coder)",
+ "Gabriel Silk (https://github.com/gsilk)",
+ "Gareth Aye <gareth.aye@gmail.com> (https://github.com/gaye)",
+ "Gavin Mogan <gavin@gavinmogan.com> (https://github.com/halkeye)",
+ "gigadude (https://github.com/gigadude)",
+ "Giovanni Bassi (https://github.com/giggio)",
+ "Glen Huang <curvedmark@gmail.com> (https://github.com/curvedmark)",
+ "Glen Mailer <glen@stainlessed.co.uk> (https://github.com/glenjamin)",
+ "Greg Perkins <gregperkins@alum.mit.edu> (https://github.com/gregrperkins)",
+ "Guillermo Rauch <rauchg@gmail.com> (https://github.com/rauchg)",
+ "Guy Arye (https://github.com/aryeguy)",
+ "Gyandeep Singh <gyandeeps@gmail.com> (https://github.com/gyandeeps)",
+ "Harish <hyeluri@gmail.com> (https://github.com/hyeluri)",
+ "Harry Brundage <harry.brundage@gmail.com> (https://github.com/airhorns)",
+ "Ian Remmel <design@ianwremmel.com> (https://github.com/ianwremmel)",
+ "Ian Storm Taylor (https://github.com/ianstormtaylor)",
+ "Ian Young <ian@iangreenleaf.com> (https://github.com/iangreenleaf)",
+ "Ivan (https://github.com/ivanstoyanov)",
+ "Jaakko Salonen (https://github.com/jsalonen)",
+ "Jacob Wejendorp <jacob@wejendorp.dk> (https://github.com/wejendorp)",
+ "Jake Craige (https://github.com/jakecraige)",
+ "Jake Marsh (https://github.com/jakemmarsh)",
+ "Jake Mc <jake.mc@icloud.com> (https://github.com/startswithaj)",
+ "Jake Verbaten <raynos2@gmail.com> (https://github.com/Raynos)",
+ "Jakub Nešetřil <jakub@apiary.io> (https://github.com/zzen)",
+ "James Bowes (https://github.com/jbowes)",
+ "James Carr <james.r.carr@gmail.com> (https://github.com/jamescarr)",
+ "James G. Kim <jgkim@jayg.org> (https://github.com/jgkim)",
+ "James Lal <james@lightsofapollo.com> (https://github.com/lightsofapollo)",
+ "James Nylen <jnylen@gmail.com> (https://github.com/nylen)",
+ "Jason (https://github.com/jlai)",
+ "Jason Barry <jay@jcbarry.com> (https://github.com/JCBarry)",
+ "Javier Aranda <javier.aranda.varo@gmail.com> (https://github.com/javierav)",
+ "jcreamer898 (https://github.com/jcreamer898)",
+ "Jean Ponchon (https://github.com/nopnop)",
+ "Jeff Kunkle (https://github.com/kunklejr)",
+ "Jeff Schilling <jeff@manicwave.com> (https://github.com/jschilli)",
+ "JeongHoon Byun (aka Outsider) <outsideris@gmail.com> (https://github.com/outsideris)",
+ "Jeremy Martin (https://github.com/jmar777)",
+ "jimenglish81 (https://github.com/jimenglish81)",
+ "Jimmy Cuadra (https://github.com/jimmycuadra)",
+ "jldailey (https://github.com/jldailey)",
+ "jleyba (https://github.com/jleyba)",
+ "Joey Cozza <joeycozza@gmail.com> (https://github.com/joeycozza)",
+ "Johnathon Sanders (https://github.com/outdooricon)",
+ "John Doty <jrhdoty@gmail.com> (https://github.com/jrhdoty)",
+ "John Firebaugh <john.firebaugh@gmail.com> (https://github.com/jfirebaugh)",
+ "John Reeves (https://github.com/jonnyreeves)",
+ "Jo Liss <joliss42@gmail.com> (https://github.com/joliss)",
+ "Jonas Dohse (https://github.com/dohse)",
+ "Jonathan Kim <hello@jkimbo.co.uk> (https://github.com/jkimbo)",
+ "Jonathan Park <jonathan.daniel.park@gmail.com> (https://github.com/park9140)",
+ "jongleberry <me@jongleberry.com> (https://github.com/jonathanong)",
+ "Jordan Sexton <jordan@jordansexton.com> (https://github.com/jordansexton)",
+ "Joseph Spencer (https://github.com/jsdevel)",
+ "Josh Lory (https://github.com/joshlory)",
+ "Joshua Appelman <joshua@jbna.nl> (https://github.com/jbnicolai)",
+ "Joshua Krall <joshuakrall@pobox.com> (https://github.com/jkrall)",
+ "João Moreno (https://github.com/joaomoreno)",
+ "João Paulo Bochi <jpbochi@gmail.com> (https://github.com/jpbochi)",
+ "jugglinmike (https://github.com/jugglinmike)",
+ "Julien Wajsberg (https://github.com/julienw)",
+ "Jussi Virtanen <contact@jvirtanen.org> (https://github.com/jvirtanen)",
+ "Justin DuJardin (https://github.com/justindujardin)",
+ "Juzer Ali <juzerali@live.com> (https://github.com/juzerali)",
+ "Jérémie Astori (https://github.com/astorije)",
+ "Katie Gengler (https://github.com/kategengler)",
+ "Kazuhito Hokamura (https://github.com/hokaccha)",
+ "Keith Cirkel (https://github.com/keithamus)",
+ "Kent C. Dodds <kent+github@doddsfamily.us> (https://github.com/kentcdodds)",
+ "Kevin Burke <kev@inburke.com> (https://github.com/kevinburke)",
+ "Kevin Conway <kevinjacobconway@gmail.com> (https://github.com/kevinconway)",
+ "Kevin Kirsche <Kev.Kirsche@gmail.com> (https://github.com/kkirsche)",
+ "Kirill Korolyov <kirill.korolyov@gmail.com> (https://github.com/Dremora)",
+ "Koen Punt <mail@koen.pt> (https://github.com/koenpunt)",
+ "Konstantin Käfer <mail@kkaefer.com> (https://github.com/kkaefer)",
+ "Kris Rasmussen (https://github.com/krisr)",
+ "Kyle Mitchell <kyle@kemitchell.com> (https://github.com/kemitchell)",
+ "lakmeer (https://github.com/lakmeer)",
+ "Liam Newman <bitwiseman@gmail.com> (https://github.com/bitwiseman)",
+ "Linus Unnebäck <linus@folkdatorn.se> (https://github.com/LinusU)",
+ "Long Ho <holevietlong@gmail.com> (https://github.com/longlho)",
+ "László Bácsi <lackac@lackac.hu> (https://github.com/lackac)",
+ "Maciej Małecki <me@mmalecki.com> (https://github.com/mmalecki)",
+ "Mal Graty (https://github.com/mal)",
+ "Marcello Bastéa-Forte <marcello@cellosoft.com> (https://github.com/marcello3d)",
+ "Marc Kuo <marc@routific.com> (https://github.com/mck-)",
+ "Mark Banner (https://github.com/Standard8)",
+ "Matija Marohnić <matija.marohnic@gmail.com> (https://github.com/silvenon)",
+ "Matthew Shanley <matthewshanley@littlesecretsrecords.com> (https://github.com/arkadyan)",
+ "mattias-lw (https://github.com/mattias-lw)",
+ "Matt Robenolt <m@robenolt.com> (https://github.com/mattrobenolt)",
+ "Matt Smith <matt@twobitfool.com> (https://github.com/twobitfool)",
+ "Max Goodman <c@chromako.de> (https://github.com/chromakode)",
+ "Maximilian Antoni <mail@maxantoni.de> (https://github.com/mantoni)",
+ "Merrick Christensen <merrick.christensen@gmail.com> (https://github.com/iammerrick)",
+ "michael-adsk (https://github.com/michael-adsk)",
+ "Michael Demmer (https://github.com/demmer)",
+ "Michael Jackson <mjijackson@gmail.com> (https://github.com/mjackson)",
+ "Michael Schoonmaker <michael.r.schoonmaker@gmail.com> (https://github.com/Schoonology)",
+ "Michal Charemza (https://github.com/michalc)",
+ "Mike Olson (https://github.com/mwolson)",
+ "Mislav Marohnić <mislav.marohnic@gmail.com> (https://github.com/mislav)",
+ "mrShturman (https://github.com/mrShturman)",
+ "Nathan Alderson <nathan@nathanalderson.com> (https://github.com/nathanalderson)",
+ "Nathan Black <nathan@nathanblack.org> (https://github.com/nathanboktae)",
+ "Nathan Bowser <nbowser@gmail.com> (https://github.com/nathanbowser)",
+ "Nathan Houle <nathan+github@nathanhoule.com> (https://github.com/ndhoule)",
+ "Nathan Rajlich <nathan@tootallnate.net> (https://github.com/TooTallNate)",
+ "Nick Fitzgerald (https://github.com/fitzgen)",
+ "noirlab (https://github.com/noirlab)",
+ "Noshir Patel <nosh@blackpiano.com> (https://github.com/noshir-patel)",
+ "OlegTsyba <oleg.tsyba.ua@gmail.com> (https://github.com/OlegTsyba)",
+ "omar (https://github.com/omardelarosa)",
+ "Panu Horsmalahti <panu.horsmalahti@iki.fi> (https://github.com/panuhorsmalahti)",
+ "Parker Moore <email@byparker.com> (https://github.com/parkr)",
+ "Paul Armstrong (https://github.com/paularmstrong)",
+ "Paul Miller <paul+gh@paulmillr.com> (https://github.com/paulmillr)",
+ "Pavel Zubkou (https://github.com/irnc)",
+ "Pete Hawkins (https://github.com/phawk)",
+ "Phil Sung <philbert@gmail.com> (https://github.com/psung)",
+ "Prayag Verma <prayag.verma@gmail.com> (https://github.com/pra85)",
+ "qiu zuhui <qiuzuhui@gmail.com> (https://github.com/qiuzuhui)",
+ "Quang Van <quang@boldapps.io> (https://github.com/quangv)",
+ "Rauno (https://github.com/Rauno56)",
+ "Refael Ackermann <me@refack.com> (https://github.com/refack)",
+ "Richard Dingwall <rdingwall@gmail.com> (https://github.com/rdingwall)",
+ "Richard Knop (https://github.com/RichardKnop)",
+ "Rico Sta. Cruz <hi@ricostacruz.com> (https://github.com/rstacruz)",
+ "Robert Rossmann (https://github.com/Alaneor)",
+ "Rob Wu <rob@robwu.nl> (https://github.com/Rob--W)",
+ "Romain (https://github.com/rprieto)",
+ "Roman Neuhauser <rneuhauser@sigpipe.cz> (https://github.com/roman-neuhauser)",
+ "Roman Shtylman (https://github.com/defunctzombie)",
+ "Russ Bradberry <devdazed@me.com> (https://github.com/devdazed)",
+ "Russell Munson (https://github.com/rmunson)",
+ "Ryan <ryan.shaw@min.vc> (https://github.com/ryan-shaw)",
+ "Ryan Hubbard (https://github.com/ryedog)",
+ "Ryunosuke Sato <tricknotes.rs@gmail.com> (https://github.com/tricknotes)",
+ "ryym (https://github.com/ryym)",
+ "Salehen Shovon Rahman <sal@linux.com> (https://github.com/shovon)",
+ "Salvador de la Puente González <salva@unoyunodiez.com> (https://github.com/delapuente)",
+ "Sam Mussell (https://github.com/smussell)",
+ "Samuel Goldszmidt <samuel.goldszmidt@gmail.com> (https://github.com/ouhouhsami)",
+ "Sasha Koss <kossnocorp@gmail.com> (https://github.com/kossnocorp)",
+ "Scott Santucci <ScottFreeCode@gmail.com> (https://github.com/ScottFreeCode)",
+ "Sean Lang <slang800@gmail.com> (https://github.com/slang800)",
+ "seb vincent <seb.vincent@gmail.com> (https://github.com/sebv)",
+ "Seiya Konno <nulltask@gmail.com> (https://github.com/nulltask)",
+ "Sergey Simonchik (https://github.com/segrey)",
+ "Sergio Santoro (https://github.com/taueres)",
+ "Shahar Soel (https://github.com/bd82)",
+ "Shaine Hatch (https://github.com/shaine)",
+ "Shiwei Wang (https://github.com/wsw0108)",
+ "Simon Gaeremynck (https://github.com/simong)",
+ "Simon Goumaz (https://github.com/sgoumaz)",
+ "Sindre Sorhus <sindresorhus@gmail.com> (https://github.com/sindresorhus)",
+ "slientcloud <rjmuqiang@gmail.com> (https://github.com/silentcloud)",
+ "Sorin Iclanzan (https://github.com/iclanzan)",
+ "Standa Opichal <opichals@gmail.com> (https://github.com/opichals)",
+ "Stephen Mathieson <me@stephenmathieson.com> (https://github.com/stephenmathieson)",
+ "Steve Mason (https://github.com/spmason)",
+ "Stewart Taylor <stewart@taylore.net> (https://github.com/Stewart-Taylor)",
+ "Sune Simonsen <sune@we-knowhow.dk> (https://github.com/sunesimonsen)",
+ "Sylvain Faucherand (https://github.com/slyg)",
+ "Takuya Nishigori <nishigori.tak@gmail.com> (https://github.com/nishigori)",
+ "Taylor Gautier (https://github.com/tsgautier)",
+ "Teddy Zeenny (https://github.com/teddyzeenny)",
+ "Thomas Grainger <https//@graingert.co.uk> (https://github.com/graingert)",
+ "Tim Ehat (https://github.com/timehat)",
+ "Timothy Gu <timothygu99@gmail.com> (https://github.com/TimothyGu)",
+ "Timo Tijhof <krinklemail@gmail.com> (https://github.com/Krinkle)",
+ "Tingan Ho <tingan87@gmail.com> (https://github.com/tinganho)",
+ "TJ Holowaychuk <tj@vision-media.ca> (https://github.com/tj)",
+ "Tobias Bieniek <tobias.bieniek@gmail.com> (https://github.com/Turbo87)",
+ "Toby Ho <airportyh@gmail.com> (https://github.com/airportyh)",
+ "Todd Agulnick (https://github.com/tawdle)",
+ "Tom Hughes (https://github.com/tomhughes)",
+ "Tommy Montgomery (https://github.com/tmont)",
+ "traleig1 (https://github.com/traleig1)",
+ "Travis Jeffery <tj@travisjeffery.com> (https://github.com/travisjeffery)",
+ "Tyson Tate <tyson@tysontate.com> (https://github.com/tysontate)",
+ "Valentin Agachi (https://github.com/avaly)",
+ "Victor Costan <victor@costan.us> (https://github.com/pwnall)",
+ "Vladimir Chernis (https://github.com/vlazzle)",
+ "Vlad Magdalin <vlad@webflow.com> (https://github.com/callmevlad)",
+ "Will Langstroth (https://github.com/wlangstroth)",
+ "Wil Moore III <wil.moore@wilmoore.com> (https://github.com/wilmoore)",
+ "Xavier Antoviaque <xavier@opencraft.com> (https://github.com/antoviaque)",
+ "Xavier Damman <xdamman@gmail.com> (https://github.com/xdamman)",
+ "Yanis Wang <yanis.wang@gmail.com> (https://github.com/yaniswang)",
+ "yuitest <developer.yuitest+github@cjhat.net> (https://github.com/yuitest)",
+ "Zhiye Li <github@zhiye.li> (https://github.com/zhiyelee)",
+ "Zhouxuan Yang <fool2fish@gmail.com> (https://github.com/fool2fish)",
+ "Zsolt Takács <firstname at lastname dot cc> (https://github.com/oker1)"
+ ],
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/mochajs/mocha.git"
+ },
+ "bin": {
+ "mocha": "./bin/mocha",
+ "_mocha": "./bin/_mocha"
+ },
+ "engines": {
+ "node": ">= 0.10.x",
+ "npm": ">= 1.4.x"
+ },
+ "scripts": {
+ "test": "make test"
+ },
+ "dependencies": {
+ "browser-stdout": "1.3.0",
+ "commander": "2.9.0",
+ "debug": "2.2.0",
+ "diff": "1.4.0",
+ "escape-string-regexp": "1.0.5",
+ "glob": "7.0.5",
+ "growl": "1.9.2",
+ "json3": "3.3.2",
+ "lodash.create": "3.1.1",
+ "mkdirp": "0.5.1",
+ "supports-color": "3.1.2"
+ },
+ "devDependencies": {
+ "browserify": "^13.0.0",
+ "coffee-script": "^1.10.0",
+ "eslint": "^2.13.1",
+ "expect.js": "^0.3.1",
+ "karma": "^1.1.0",
+ "karma-browserify": "^5.0.5",
+ "karma-expect": "^1.1.2",
+ "karma-no-mocha": "^2.0.0",
+ "karma-phantomjs-launcher": "^0.2.3",
+ "karma-sauce-launcher": "^1.0.0",
+ "karma-spec-reporter": "0.0.26",
+ "phantomjs": "1.9.8",
+ "rimraf": "^2.5.2",
+ "should": "^9.0.2",
+ "through2": "^2.0.1",
+ "watchify": "^3.7.0"
+ },
+ "files": [
+ "bin",
+ "images",
+ "lib",
+ "index.js",
+ "mocha.css",
+ "mocha.js",
+ "browser-entry.js",
+ "LICENSE",
+ "bower.json"
+ ],
+ "browser": {
+ "debug": "./lib/browser/debug.js",
+ "events": "./lib/browser/events.js",
+ "tty": "./lib/browser/tty.js",
+ "./index.js": "./browser-entry.js",
+ "fs": false,
+ "glob": false,
+ "path": false,
+ "supports-color": false
+ },
+ "homepage": "https://mochajs.org",
+ "logo": "https://cldup.com/S9uQ-cOLYz.svg"
+}
diff --git a/tests/lib/mocha-3.1.0/scripts/dedefine.js b/tests/lib/mocha-3.1.0/scripts/dedefine.js
new file mode 100644
index 0000000000..c647c0e083
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/scripts/dedefine.js
@@ -0,0 +1,26 @@
+'use strict';
+
+/**
+ * This is a transform stream we're using to strip AMD calls from
+ * dependencies in our Browserify bundle.
+ */
+
+var through = require('through2');
+var defineRx = /typeof define === ['"]function['"] && define\.amd/g;
+
+function createStream() {
+ return through.obj(function(chunk, enc, next) {
+ this.push(String(chunk)
+ .replace(defineRx, 'false'));
+ next();
+ });
+}
+
+module.exports = function(b) {
+ function wrap() {
+ b.pipeline.get('wrap').push(createStream());
+ }
+
+ b.on('reset', wrap);
+ wrap();
+};
diff --git a/tests/lib/mocha-3.1.0/scripts/travis-after-script.sh b/tests/lib/mocha-3.1.0/scripts/travis-after-script.sh
new file mode 100644
index 0000000000..e93c98f796
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/scripts/travis-after-script.sh
@@ -0,0 +1,9 @@
+#!/usr/bin/env bash
+# syncs Karma test bundles to S3 if $S3 is set
+
+if [ ${S3} ]
+then
+ mkdir -p .karma/${TRAVIS_JOB_NUMBER}
+ cp ./mocha.js ".karma/${TRAVIS_JOB_NUMBER}/mocha.js"
+ aws s3 sync ".karma/${TRAVIS_JOB_NUMBER}" "s3://mochajs/karma-bundles/${TRAVIS_JOB_NUMBER}"
+fi
diff --git a/tests/lib/mocha-3.1.0/scripts/travis-before-install.sh b/tests/lib/mocha-3.1.0/scripts/travis-before-install.sh
new file mode 100644
index 0000000000..9913070ae9
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/scripts/travis-before-install.sh
@@ -0,0 +1,5 @@
+#!/usr/bin/env bash
+
+npm install --production
+# this avoids our mocha.opts (and thus devDependencies) in a roundabout way
+./bin/mocha --opts /dev/null --reporter spec test/sanity/sanity.spec.js
diff --git a/tests/lib/mocha-3.1.0/scripts/travis-before-script.sh b/tests/lib/mocha-3.1.0/scripts/travis-before-script.sh
new file mode 100644
index 0000000000..e5c6b25414
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/scripts/travis-before-script.sh
@@ -0,0 +1,7 @@
+#!/usr/bin/env bash
+# installs awscli from pip if $S3 is set
+
+if [ ${S3} ]
+then
+ sudo pip install awscli
+fi
diff --git a/tests/lib/mocha-3.1.0/test/.eslintrc b/tests/lib/mocha-3.1.0/test/.eslintrc
new file mode 100644
index 0000000000..956287d60c
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/.eslintrc
@@ -0,0 +1,5 @@
+---
+env:
+ mocha: true
+globals:
+ expect: false
diff --git a/tests/lib/mocha-3.1.0/test/acceptance/context.spec.js b/tests/lib/mocha-3.1.0/test/acceptance/context.spec.js
new file mode 100644
index 0000000000..69dea139c9
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/acceptance/context.spec.js
@@ -0,0 +1,72 @@
+describe('Context', function(){
+ beforeEach(function(){
+ this.calls = ['before'];
+ })
+
+ describe('nested', function(){
+ beforeEach(function(){
+ this.calls.push('before two');
+ })
+
+ it('should work', function(){
+ expect(this.calls).to.eql(['before', 'before two']);
+ this.calls.push('test');
+ })
+
+ after(function(){
+ expect(this.calls).to.eql(['before', 'before two', 'test']);
+ this.calls.push('after two');
+ })
+ })
+
+ after(function(){
+ expect(this.calls).to.eql(['before', 'before two', 'test', 'after two']);
+ })
+})
+
+describe('Context Siblings', function(){
+ beforeEach(function(){
+ this.calls = ['before'];
+ })
+
+ describe('sequestered sibling', function(){
+ beforeEach(function(){
+ this.calls.push('before two');
+ this.hiddenFromSibling = 'This should be hidden';
+ })
+
+ it('should work', function(){
+ expect(this.hiddenFromSibling).to.eql('This should be hidden')
+ })
+ })
+
+ describe('sibling verifiction', function(){
+ beforeEach(function(){
+ this.calls.push('before sibling');
+ })
+
+ it('should not have value set within a sibling describe', function(){
+ expect('This should be hidden').not.to.eql(this.hiddenFromSibling);
+ this.visibleFromTestSibling = 'Visible from test sibling';
+ })
+
+ it('should allow test siblings to modify shared context', function(){
+ expect('Visible from test sibling').to.eql(this.visibleFromTestSibling);
+ })
+
+ it('should have reset this.calls before describe', function(){
+ expect(this.calls).to.eql(['before', 'before sibling']);
+ })
+ })
+
+ after(function(){
+ expect(this.calls).to.eql(['before', 'before sibling']);
+ })
+
+})
+
+describe('timeout()', function(){
+ it('should return the timeout', function(){
+ expect(this.timeout()).to.equal(200);
+ });
+});
diff --git a/tests/lib/mocha-3.1.0/test/acceptance/duration.spec.js b/tests/lib/mocha-3.1.0/test/acceptance/duration.spec.js
new file mode 100644
index 0000000000..4f319b8a3c
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/acceptance/duration.spec.js
@@ -0,0 +1,25 @@
+describe('durations', function(){
+ describe('when slow', function(){
+ it('should highlight in red', function(done){
+ setTimeout(function(){
+ done();
+ }, 100);
+ })
+ })
+
+ describe('when reasonable', function(){
+ it('should highlight in yellow', function(done){
+ setTimeout(function(){
+ done();
+ }, 50);
+ })
+ })
+
+ describe('when fast', function(){
+ it('should highlight in green', function(done){
+ setTimeout(function(){
+ done();
+ }, 10);
+ })
+ })
+})
diff --git a/tests/lib/mocha-3.1.0/test/acceptance/fs.spec.js b/tests/lib/mocha-3.1.0/test/acceptance/fs.spec.js
new file mode 100644
index 0000000000..3a70f2752c
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/acceptance/fs.spec.js
@@ -0,0 +1,20 @@
+var fs = require('fs');
+var path = require('path');
+var os = require('os');
+var tmpFile = path.join.bind(path, os.tmpdir());
+
+describe('fs.readFile()', function(){
+ describe('when the file exists', function(){
+ it('should succeed', function(done){
+ fs.writeFile(tmpFile('mocha'), 'wahoo', done)
+ })
+ })
+
+ describe('when the file does not exist', function(){
+ it('should fail', function(done){
+ // uncomment
+ // fs.readFile(tmpFile('does-not-exist'), done);
+ done();
+ })
+ })
+})
diff --git a/tests/lib/mocha-3.1.0/test/acceptance/glob/glob.sh b/tests/lib/mocha-3.1.0/test/acceptance/glob/glob.sh
new file mode 100644
index 0000000000..823ba07fb9
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/acceptance/glob/glob.sh
@@ -0,0 +1,66 @@
+#!/bin/bash
+REL_SCRIPT_DIR="`dirname \"$0\"`"
+SCRIPT_DIR="`( cd \"$REL_SCRIPT_DIR\" && pwd )`"
+
+cd $SCRIPT_DIR || {
+ echo Could not cd to $SCRIPT_DIR from `pwd`
+ exit 1
+}
+
+../../../bin/mocha -R json-stream ./*.js > /tmp/mocha-glob.txt || {
+ echo Globbing ./*.js in `pwd` failed.
+ exit 1
+}
+
+cat /tmp/mocha-glob.txt | grep -q -F '["end",{"suites":1,"tests":1,"passes":1,"pending":0,"failures":0,' || {
+ echo Globbing ./*.js in `pwd` should match glob.js with one test inside.
+ exit 1
+}
+
+../../../bin/mocha -R json-stream ./*-none.js 2> /tmp/mocha-glob.txt && {
+ echo Globbing './*-none.js' in `pwd` failed.
+ exit 1
+}
+
+cat /tmp/mocha-glob.txt | grep -q -F 'Could not find any test files matching pattern' || {
+ echo Globbing './*-none.js' in `pwd` should match no files and run no tests.
+ exit 1
+}
+
+../../../bin/mocha -R json-stream ./*.js ./*-none.js >& /tmp/mocha-glob.txt || {
+ echo Globbing ./*.js ./*-none.js in `pwd` failed.
+ exit 1
+}
+
+cat /tmp/mocha-glob.txt | grep -q -F '["end",{"suites":1,"tests":1,"passes":1,"pending":0,"failures":0,' &&
+cat /tmp/mocha-glob.txt | grep -q -F 'Could not find any test files matching pattern' || {
+ echo Globbing ./*.js ./*-none.js in `pwd` should match glob.js with one test inside and display one warning for the non-existing file.
+ exit 1
+}
+
+# Globbing in windows command-shell differs completely from unix-style globbing.
+# In bash, the shell expands globs and passes the result to executables.
+# In windows, the shell passes globs unexpanded, executables do expansion if they support it.
+# Adding single-quotes around the glob below makes bash pass glob unexpanded,
+# allowing us to test windows-style globbing in bash.
+../../../bin/mocha -R json-stream './*.js' > /tmp/mocha-glob.txt || {
+ echo Globbing './*.js' in `pwd` failed.
+ exit 1
+}
+
+cat /tmp/mocha-glob.txt | grep -q -F '["end",{"suites":1,"tests":1,"passes":1,"pending":0,"failures":0,' || {
+ echo Globbing './*.js' in `pwd` should match glob.js with one test inside.
+ exit 1
+}
+
+../../../bin/mocha -R json-stream './*-none.js' 2> /tmp/mocha-glob.txt && {
+ echo Globbing './*-none.js' in `pwd` failed.
+ exit 1
+}
+
+cat /tmp/mocha-glob.txt | grep -q -F 'Could not find any test files matching pattern' || {
+ echo Globbing './*-none.js' in `pwd` should match no files and run no tests.
+ exit 1
+}
+
+echo Glob-test passed.
diff --git a/tests/lib/mocha-3.1.0/test/acceptance/glob/glob.spec.js b/tests/lib/mocha-3.1.0/test/acceptance/glob/glob.spec.js
new file mode 100644
index 0000000000..3029ae82ee
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/acceptance/glob/glob.spec.js
@@ -0,0 +1,5 @@
+describe('globbing test', function(){
+ it('should find this test', function(){
+ // see glob.sh for details
+ })
+});
diff --git a/tests/lib/mocha-3.1.0/test/acceptance/globals.spec.js b/tests/lib/mocha-3.1.0/test/acceptance/globals.spec.js
new file mode 100644
index 0000000000..f8ef804b23
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/acceptance/globals.spec.js
@@ -0,0 +1,41 @@
+describe('global leaks', function(){
+ before(function(){
+ // uncomment to test
+ // foo = 'hey';
+ // bar = 'hey';
+ })
+
+ beforeEach(function(){
+ // uncomment to test
+ // foo = 'bar'
+ });
+
+ it('should cause tests to fail', function(){
+ // uncomment to test
+ // foo = 'bar';
+ // bar = 'baz';
+ // baz = 'raz';
+ });
+
+ it('should pass when accepted', function(){
+ global.okGlobalA = 1;
+ global.okGlobalB = 1;
+ global.okGlobalC = 1;
+ })
+
+ it('should pass with wildcard', function(){
+ global.callback123 = 'foo';
+ global.callback345 = 'bar';
+ });
+
+ it('should pass when prefixed "mocha-"', function(){
+ // Opera and IE do this for HTML element IDs anyway
+ // but to sure we can assert this in any browser, simulate it.
+ global['mocha-example'] = { nodeType: 1 };
+ });
+
+ afterEach(function(){
+ // uncomment to test
+ // foo = 'bar'
+ });
+});
diff --git a/tests/lib/mocha-3.1.0/test/acceptance/http.spec.js b/tests/lib/mocha-3.1.0/test/acceptance/http.spec.js
new file mode 100644
index 0000000000..43b8588508
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/acceptance/http.spec.js
@@ -0,0 +1,16 @@
+var http = require('http');
+
+var server = http.createServer(function(req, res){
+ res.end('Hello World\n');
+})
+
+server.listen(8888);
+
+describe('http', function(){
+ it('should provide an example', function(done){
+ http.get({ path: '/', port: 8888 }, function(res){
+ expect(res).to.have.property('statusCode', 200);
+ done();
+ })
+ })
+})
diff --git a/tests/lib/mocha-3.1.0/test/acceptance/interfaces/bdd.spec.js b/tests/lib/mocha-3.1.0/test/acceptance/interfaces/bdd.spec.js
new file mode 100644
index 0000000000..ba444c8f7f
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/acceptance/interfaces/bdd.spec.js
@@ -0,0 +1,32 @@
+describe('integer primitives', function(){
+ describe('arithmetic', function(){
+ it('should add', function(){
+ expect(1 + 1).to.equal(2);
+ expect(2 + 2).to.equal(4);
+ })
+
+ it('should subtract', function(){
+ expect(1 - 1).to.equal(0);
+ expect(2 - 1).to.equal(1);
+ })
+ })
+})
+
+describe('integer primitives', function(){
+ describe('arithmetic is not', function(){
+ it('should add', function(){
+ expect(1 + 1).not.to.equal(3);
+ expect(2 + 2).not.to.equal(5);
+ })
+ })
+})
+
+context('test suite', function(){
+ beforeEach(function(){
+ this.number = 5;
+ })
+
+ specify('share a property', function(){
+ expect(this.number).to.equal(5);
+ })
+})
diff --git a/tests/lib/mocha-3.1.0/test/acceptance/interfaces/exports.spec.js b/tests/lib/mocha-3.1.0/test/acceptance/interfaces/exports.spec.js
new file mode 100644
index 0000000000..08db71200b
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/acceptance/interfaces/exports.spec.js
@@ -0,0 +1,43 @@
+var calls = [];
+
+exports.Array = {
+ before: function(){
+ calls.push('before');
+ },
+
+ after: function(){
+ calls.push('after');
+ expect(calls).to.eql([
+ 'before'
+ , 'before each'
+ , 'one'
+ , 'after each'
+ , 'before each'
+ , 'two'
+ , 'after each'
+ , 'after']);
+ },
+
+ '#indexOf()': {
+ beforeEach: function(){
+ calls.push('before each');
+ },
+
+ afterEach: function(){
+ calls.push('after each');
+ },
+
+ 'should return -1 when the value is not present': function(){
+ calls.push('one');
+ expect([1,2,3].indexOf(5)).to.equal(-1);
+ expect([1,2,3].indexOf(0)).to.equal(-1);
+ },
+
+ 'should return the correct index when the value is present': function(){
+ calls.push('two');
+ expect([1,2,3].indexOf(1)).to.equal(0);
+ expect([1,2,3].indexOf(2)).to.equal(1);
+ expect([1,2,3].indexOf(3)).to.equal(2);
+ }
+ }
+};
diff --git a/tests/lib/mocha-3.1.0/test/acceptance/interfaces/qunit.spec.js b/tests/lib/mocha-3.1.0/test/acceptance/interfaces/qunit.spec.js
new file mode 100644
index 0000000000..d452e769c5
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/acceptance/interfaces/qunit.spec.js
@@ -0,0 +1,23 @@
+function ok(expr, msg) {
+ if (!expr) throw new Error(msg);
+}
+
+suite('integer primitives');
+
+test('should add', function(){
+ var number = 2 + 2;
+ ok(number == 4);
+});
+
+test('should decrement', function(){
+ var number = 3;
+ ok(--number == 2);
+ ok(--number == 1);
+ ok(--number == 0);
+});
+
+suite('String');
+
+test('#length', function(){
+ ok('foo'.length == 3);
+});
diff --git a/tests/lib/mocha-3.1.0/test/acceptance/interfaces/tdd.spec.js b/tests/lib/mocha-3.1.0/test/acceptance/interfaces/tdd.spec.js
new file mode 100644
index 0000000000..7ad079e36d
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/acceptance/interfaces/tdd.spec.js
@@ -0,0 +1,40 @@
+suite('integer primitives', function(){
+ suite('arithmetic', function(){
+ var initialValue = 41;
+
+ suiteSetup(function(done){
+ expect(initialValue).to.eql(41);
+ initialValue += 1;
+ done();
+ });
+
+ test('should add', function(){
+ expect(initialValue).to.eql(42);
+ expect(1 + 1).to.equal(2);
+ expect(2 + 2).to.equal(4);
+ });
+
+ test('should subtract', function(){
+ expect(initialValue).to.eql(42);
+ expect(1 - 1).to.equal(0);
+ expect(2 - 1).to.equal(1);
+ });
+
+ test.skip('should skip this test', function(){
+ var zero = 0;
+ expect(zero).to.equal(1, 'this test should have been skipped');
+ });
+
+ suite.skip('should skip this suite', function(){
+ test('should skip this test', function(){
+ var zero = 0;
+ expect(zero).to.equal(1, 'this test should have been skipped');
+ });
+ });
+
+ suiteTeardown(function(done){
+ expect(initialValue).to.eql(42);
+ done();
+ });
+ });
+});
diff --git a/tests/lib/mocha-3.1.0/test/acceptance/lookup-files.spec.js b/tests/lib/mocha-3.1.0/test/acceptance/lookup-files.spec.js
new file mode 100644
index 0000000000..5d4a48d8af
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/acceptance/lookup-files.spec.js
@@ -0,0 +1,90 @@
+'use strict';
+
+var utils = require('../../lib/utils');
+var fs = require('fs');
+var path = require('path');
+var os = require('os');
+var mkdirp = require('mkdirp');
+var rimraf = require('rimraf');
+
+describe('lookupFiles', function() {
+ var tmpDir = path.join(os.tmpDir(), 'mocha-lookup-files');
+ var existsSync = fs.existsSync;
+ var tmpFile = path.join.bind(path, tmpDir);
+ var symlinkSupported = false;
+
+ (function testSymlinkSupport() {
+ makeTempDir();
+
+ fs.writeFileSync(tmpFile('mocha-utils.js'), 'yippy skippy ying yang yow');
+ try {
+ fs.symlinkSync(tmpFile('mocha-utils.js'), tmpFile('mocha-utils-link.js'));
+ symlinkSupported = true;
+ } catch (ignored) {
+ // ignored
+ } finally {
+ removeTempDir();
+ }
+ }());
+
+ beforeEach(function() {
+ makeTempDir();
+
+ fs.writeFileSync(tmpFile('mocha-utils.js'), 'yippy skippy ying yang yow');
+ if (symlinkSupported) {
+ fs.symlinkSync(tmpFile('mocha-utils.js'), tmpFile('mocha-utils-link.js'));
+ }
+ });
+
+ (symlinkSupported ? it : it.skip)('should not choke on symlinks', function() {
+ expect(utils.lookupFiles(tmpDir, ['js'], false))
+ .to
+ .contain(tmpFile('mocha-utils-link.js'))
+ .and
+ .contain(tmpFile('mocha-utils.js'))
+ .and
+ .have
+ .length(2);
+ expect(existsSync(tmpFile('mocha-utils-link.js')))
+ .to
+ .be(true);
+ fs.renameSync(tmpFile('mocha-utils.js'), tmpFile('bob'));
+ expect(existsSync(tmpFile('mocha-utils-link.js')))
+ .to
+ .be(false);
+ expect(utils.lookupFiles(tmpDir, ['js'], false))
+ .to
+ .eql([]);
+ });
+
+ it('should accept a glob "path" value', function() {
+ var res = utils.lookupFiles(tmpFile('mocha-utils*'), ['js'], false)
+ .map(path.normalize.bind(path));
+
+ var expectedLength = 0;
+ var ex = expect(res)
+ .to
+ .contain(tmpFile('mocha-utils.js'));
+ expectedLength++;
+
+ if (symlinkSupported) {
+ ex = ex.and
+ .contain(tmpFile('mocha-utils-link.js'));
+ expectedLength++;
+ }
+
+ ex.and
+ .have
+ .length(expectedLength);
+ });
+
+ afterEach(removeTempDir);
+
+ function makeTempDir() {
+ mkdirp.sync(tmpDir);
+ }
+
+ function removeTempDir() {
+ rimraf.sync(tmpDir);
+ }
+});
diff --git a/tests/lib/mocha-3.1.0/test/acceptance/misc/exit.spec.js b/tests/lib/mocha-3.1.0/test/acceptance/misc/exit.spec.js
new file mode 100644
index 0000000000..113e392300
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/acceptance/misc/exit.spec.js
@@ -0,0 +1,18 @@
+describe('exit', function(){
+ //note --bail works nicely in that it still allows an 'early exit' in an error scenario
+ it('should not exit even in error scenario if called with --no-exit', function(done){
+ done(new Error('failure'));
+ })
+
+ it('should take a long time to exit if called with --no-exit', function(done){
+ done();
+ setTimeout(function() {
+ console.log('all done');
+ }, 2500)
+ })
+
+ it('should kill all processes when SIGINT received', function () {
+ // uncomment to test
+ //while (true) {}
+ });
+})
diff --git a/tests/lib/mocha-3.1.0/test/acceptance/misc/many.spec.js b/tests/lib/mocha-3.1.0/test/acceptance/misc/many.spec.js
new file mode 100644
index 0000000000..26538bc66e
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/acceptance/misc/many.spec.js
@@ -0,0 +1,27 @@
+// Useful for testing SIGINT handler
+// use env.big_number to tune iterations so that you have time to ctrl+c
+
+describe('a load of tests', function(){
+ it('should fail the first test', function(){
+ throw new Error('this should appear in the summary');
+ })
+
+ var iterations = (process.env.big_number || 1e7);
+ function work() {
+ var a = 0;
+ for(var i=0; i<iterations; ++i) {
+ a += i;
+ }
+ }
+
+ function addTest() {
+ it('should pass test ' + i, function(){
+ work();
+ })
+ }
+
+ for(var i=0; i<500; ++i) {
+ addTest();
+ }
+
+})
diff --git a/tests/lib/mocha-3.1.0/test/acceptance/misc/nontty.spec.js b/tests/lib/mocha-3.1.0/test/acceptance/misc/nontty.spec.js
new file mode 100644
index 0000000000..2372a660b9
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/acceptance/misc/nontty.spec.js
@@ -0,0 +1,9 @@
+describe('tests for non-tty', function(){
+ it('should pass', function(){
+
+ })
+
+ it('should fail', function(){
+ throw new Error('oh noes')
+ })
+})
diff --git a/tests/lib/mocha-3.1.0/test/acceptance/misc/only/bdd-require.spec.js b/tests/lib/mocha-3.1.0/test/acceptance/misc/only/bdd-require.spec.js
new file mode 100644
index 0000000000..516dad7afa
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/acceptance/misc/only/bdd-require.spec.js
@@ -0,0 +1,18 @@
+/*jshint node: true */
+
+var mocha = require('../../../../lib/mocha');
+
+var beforeEach = mocha.beforeEach;
+var it = mocha.it;
+var describe = mocha.describe;
+
+describe('it.only via require("mocha")', function() {
+ beforeEach(function() {
+ this.didRunBeforeEach = true;
+ });
+ describe("nested within a describe/context", function() {
+ it.only('should run all enclosing beforeEach hooks', function() {
+ require('assert').equal(this.didRunBeforeEach, true);
+ });
+ });
+});
diff --git a/tests/lib/mocha-3.1.0/test/acceptance/misc/only/bdd.spec.js b/tests/lib/mocha-3.1.0/test/acceptance/misc/only/bdd.spec.js
new file mode 100644
index 0000000000..7a33a74eac
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/acceptance/misc/only/bdd.spec.js
@@ -0,0 +1,125 @@
+describe('should only run .only test in this bdd suite', function() {
+ it('should not run this test', function() {
+ (0).should.equal(1, 'this test should have been skipped');
+ });
+ it.only('should run this test', function() {
+ (0).should.equal(0, 'this .only test should run');
+ });
+ it('should run this test, not (includes the title of the .only test)', function() {
+ (0).should.equal(1, 'this test should have been skipped');
+ });
+});
+
+describe('should not run this suite', function() {
+ it('should not run this test', function() {
+ (true).should.equal(false);
+ });
+
+ it('should not run this test', function() {
+ (true).should.equal(false);
+ });
+
+ it('should not run this test', function() {
+ (true).should.equal(false);
+ });
+});
+
+describe.only('should run all tests in this bdd suite', function() {
+ it('should run this test #1', function() {
+ (true).should.equal(true);
+ });
+
+ it('should run this test #2', function() {
+ (1).should.equal(1);
+ });
+
+ it('should run this test #3', function() {
+ ('foo').should.equal('foo');
+ });
+});
+
+describe('should run only suites that marked as `only`', function() {
+ describe.only('should run all this tdd suite', function() {
+ it('should run this test #1', function() {
+ (true).should.equal(true);
+ });
+
+ it('should run this test #2', function() {
+ (true).should.equal(true);
+ });
+ });
+
+ describe('should not run this suite', function() {
+ it('should run this test', function() {
+ (true).should.equal(false);
+ });
+ });
+});
+
+// Nested situation
+describe('should not run parent tests', function() {
+ it('should not run this test', function() {
+ (true).should.equal(false);
+ });
+ describe('and not the child tests too', function() {
+ it('should not run this test', function() {
+ (true).should.equal(false);
+ });
+ describe.only('but run all the tests in this suite', function() {
+ it('should run this test #1', function() {
+ (true).should.equal(true);
+ });
+ it('should run this test #2', function() {
+ (true).should.equal(true);
+ });
+ });
+ });
+});
+
+// mark test as `only` override the suite behavior
+describe.only('should run only tests that marked as `only`', function() {
+ it('should not run this test #1', function() {
+ (false).should.equal(true);
+ });
+
+ it.only('should run this test #2', function() {
+ (true).should.equal(true);
+ });
+
+ it('should not run this test #3', function() {
+ (false).should.equal(true);
+ });
+
+ it.only('should run this test #4', function() {
+ (true).should.equal(true);
+ });
+});
+
+describe.only('Should run only test cases that mark as only', function() {
+ it.only('should runt his test', function() {
+ (true).should.equal(true);
+ });
+
+ it('should not run this test', function() {
+ (false).should.equal(true);
+ });
+
+ describe('should not run this suite', function() {
+ it('should not run this test', function() {
+ (false).should.equal(true);
+ });
+ });
+});
+
+// Root Suite
+it.only('#Root-Suite, should run this test-case #1', function() {
+ (true).should.equal(true);
+});
+
+it.only('#Root-Suite, should run this test-case #2', function() {
+ (true).should.equal(true);
+});
+
+it('#Root-Suite, should not run this test', function() {
+ (false).should.equal(true);
+});
diff --git a/tests/lib/mocha-3.1.0/test/acceptance/misc/only/global/bdd.spec.js b/tests/lib/mocha-3.1.0/test/acceptance/misc/only/global/bdd.spec.js
new file mode 100644
index 0000000000..e923876f84
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/acceptance/misc/only/global/bdd.spec.js
@@ -0,0 +1,12 @@
+// Root-only test cases
+it.only('#Root-Suite, should run this bdd test-case #1', function() {
+ (true).should.equal(true);
+});
+
+it('#Root-Suite, should not run this bdd test-case #2', function() {
+ (false).should.equal(true);
+});
+
+it('#Root-Suite, should not run this bdd test-case #3', function() {
+ (false).should.equal(true);
+}); \ No newline at end of file
diff --git a/tests/lib/mocha-3.1.0/test/acceptance/misc/only/global/qunit.spec.js b/tests/lib/mocha-3.1.0/test/acceptance/misc/only/global/qunit.spec.js
new file mode 100644
index 0000000000..59ad72c3bf
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/acceptance/misc/only/global/qunit.spec.js
@@ -0,0 +1,12 @@
+// Root-only test cases
+test.only('#Root-Suite, should run this qunit test-case #1', function() {
+ (true).should.equal(true);
+});
+
+test('#Root-Suite, should not run this qunit test-case #2', function() {
+ (false).should.equal(true);
+});
+
+test('#Root-Suite, should not run this qunit test-case #3', function() {
+ (false).should.equal(true);
+}); \ No newline at end of file
diff --git a/tests/lib/mocha-3.1.0/test/acceptance/misc/only/global/tdd.spec.js b/tests/lib/mocha-3.1.0/test/acceptance/misc/only/global/tdd.spec.js
new file mode 100644
index 0000000000..08d456848b
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/acceptance/misc/only/global/tdd.spec.js
@@ -0,0 +1,12 @@
+// Root-only test cases
+test.only('#Root-Suite, should run this tdd test-case #1', function() {
+ (true).should.equal(true);
+});
+
+test('#Root-Suite, should not run this tdd test-case #2', function() {
+ (false).should.equal(true);
+});
+
+test('#Root-Suite, should not run this tdd test-case #3', function() {
+ (false).should.equal(true);
+}); \ No newline at end of file
diff --git a/tests/lib/mocha-3.1.0/test/acceptance/misc/only/qunit.spec.js b/tests/lib/mocha-3.1.0/test/acceptance/misc/only/qunit.spec.js
new file mode 100644
index 0000000000..1248adeba7
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/acceptance/misc/only/qunit.spec.js
@@ -0,0 +1,73 @@
+// Root Suite
+test.only('#Root-Suite, should run this test-case #1', function() {
+ (true).should.equal(true);
+});
+
+test.only('#Root-Suite, should run this test-case #2', function() {
+ (true).should.equal(true);
+});
+
+test('#Root-Suite, should not run this test', function() {
+ (false).should.equal(true);
+});
+
+suite('should only run .only test in this qunit suite');
+
+test('should not run this test', function() {
+ (0).should.equal(1, 'this test should have been skipped');
+});
+test.only('should run this test', function() {
+ (0).should.equal(0, 'this .only test should run');
+});
+test('should run this test, not (includes the title of the .only test)', function() {
+ (0).should.equal(1, 'this test should have been skipped');
+});
+
+// Mark suite
+suite.only('should run all tests in this suite');
+
+test('should run this test #1', function() {
+ (true).should.equal(true);
+});
+
+test('should run this test #2', function() {
+ (true).should.equal(true);
+});
+
+test('should run this test #3', function() {
+ (true).should.equal(true);
+});
+
+// Unmark this suite
+suite('should not run any of this suite\'s tests');
+
+test('should not run this test', function() {
+ (false).should.equal(true);
+});
+
+test('should not run this test', function() {
+ (false).should.equal(true);
+});
+
+test('should not run this test', function() {
+ (false).should.equal(true);
+});
+
+// Mark test as `only` override the suite behavior
+suite.only('should run only tests that marked as `only`');
+
+test('should not run this test #1', function() {
+ (false).should.equal(true);
+});
+
+test.only('should not run this test #2', function() {
+ (true).should.equal(true);
+});
+
+test('should not run this test #3', function() {
+ (false).should.equal(true);
+});
+
+test.only('should not run this test #4', function() {
+ (true).should.equal(true);
+}); \ No newline at end of file
diff --git a/tests/lib/mocha-3.1.0/test/acceptance/misc/only/tdd.spec.js b/tests/lib/mocha-3.1.0/test/acceptance/misc/only/tdd.spec.js
new file mode 100644
index 0000000000..7e37e7a3b3
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/acceptance/misc/only/tdd.spec.js
@@ -0,0 +1,125 @@
+suite('should only run .only test in this tdd suite', function() {
+ test('should not run this test', function() {
+ (0).should.equal(1, 'this test should have been skipped');
+ });
+ test.only('should run this test', function() {
+ (0).should.equal(0, 'this .only test should run');
+ });
+ test('should run this test, not (includes the title of the .only test)', function() {
+ (0).should.equal(1, 'this test should have been skipped');
+ });
+});
+
+suite('should not run this suite', function() {
+ test('should not run this test', function() {
+ (true).should.equal(false);
+ });
+
+ test('should not run this test', function() {
+ (true).should.equal(false);
+ });
+
+ test('should not run this test', function() {
+ (true).should.equal(false);
+ });
+});
+
+suite.only('should run all tests in this tdd suite', function() {
+ test('should run this test #1', function() {
+ (true).should.equal(true);
+ });
+
+ test('should run this test #2', function() {
+ (1).should.equal(1);
+ });
+
+ test('should run this test #3', function() {
+ ('foo').should.equal('foo');
+ });
+});
+
+suite('should run only suites that marked as `only`', function() {
+ suite.only('should run all this tdd suite', function() {
+ test('should run this test #1', function() {
+ (true).should.equal(true);
+ });
+
+ test('should run this test #2', function() {
+ (true).should.equal(true);
+ });
+ });
+
+ suite('should not run this suite', function() {
+ test('should not run this test', function() {
+ (true).should.equal(false);
+ });
+ });
+});
+
+// Nested situation
+suite('should not run parent tests', function() {
+ test('should not run this test', function() {
+ (true).should.equal(false);
+ });
+ suite('and not the child tests too', function() {
+ test('should not run this test', function() {
+ (true).should.equal(false);
+ });
+ suite.only('but run all the tests in this suite', function() {
+ test('should run this test #1', function() {
+ (true).should.equal(true);
+ });
+ test('should run this test #2', function() {
+ (true).should.equal(true);
+ });
+ });
+ });
+});
+
+// mark test as `only` override the suite behavior
+suite.only('should run only tests that marked as `only`', function() {
+ test('should not run this test #1', function() {
+ (false).should.equal(true);
+ });
+
+ test.only('should run this test #2', function() {
+ (true).should.equal(true);
+ });
+
+ test('should not run this test #3', function() {
+ (false).should.equal(true);
+ });
+
+ test.only('should run this test #4', function() {
+ (true).should.equal(true);
+ });
+});
+
+suite.only('Should run only test cases that mark as only', function() {
+ test.only('should runt his test', function() {
+ (true).should.equal(true);
+ });
+
+ test('should not run this test', function() {
+ (false).should.equal(true);
+ });
+
+ suite('should not run this suite', function() {
+ test('should not run this test', function() {
+ (false).should.equal(true);
+ });
+ });
+});
+
+// Root Suite
+test.only('#Root-Suite, should run this test-case #1', function() {
+ (true).should.equal(true);
+});
+
+test.only('#Root-Suite, should run this test-case #2', function() {
+ (true).should.equal(true);
+});
+
+test('#Root-Suite, should not run this test', function() {
+ (false).should.equal(true);
+});
diff --git a/tests/lib/mocha-3.1.0/test/acceptance/overspecified-async.spec.js b/tests/lib/mocha-3.1.0/test/acceptance/overspecified-async.spec.js
new file mode 100644
index 0000000000..2844920379
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/acceptance/overspecified-async.spec.js
@@ -0,0 +1,8 @@
+describe('overspecified asynchronous resolution method', function() {
+ it('should fail when multiple methods are used', function(done) {
+ setTimeout(done, 0);
+
+ // uncomment
+ // return { then: function() {} };
+ });
+});
diff --git a/tests/lib/mocha-3.1.0/test/acceptance/require/a.js b/tests/lib/mocha-3.1.0/test/acceptance/require/a.js
new file mode 100644
index 0000000000..592d827449
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/acceptance/require/a.js
@@ -0,0 +1,2 @@
+global.required = (global.required || [])
+global.required.push('a.js')
diff --git a/tests/lib/mocha-3.1.0/test/acceptance/require/b.coffee b/tests/lib/mocha-3.1.0/test/acceptance/require/b.coffee
new file mode 100644
index 0000000000..045cc7591b
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/acceptance/require/b.coffee
@@ -0,0 +1,2 @@
+global.required ?= []
+global.required.push 'b.coffee'
diff --git a/tests/lib/mocha-3.1.0/test/acceptance/require/c.js b/tests/lib/mocha-3.1.0/test/acceptance/require/c.js
new file mode 100644
index 0000000000..4e681373a1
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/acceptance/require/c.js
@@ -0,0 +1,2 @@
+global.required = (global.required || [])
+global.required.push('c.js')
diff --git a/tests/lib/mocha-3.1.0/test/acceptance/require/d.coffee b/tests/lib/mocha-3.1.0/test/acceptance/require/d.coffee
new file mode 100644
index 0000000000..d5ebbf60ed
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/acceptance/require/d.coffee
@@ -0,0 +1,2 @@
+global.required ?= []
+global.required.push 'd.coffee'
diff --git a/tests/lib/mocha-3.1.0/test/acceptance/require/require.spec.js b/tests/lib/mocha-3.1.0/test/acceptance/require/require.spec.js
new file mode 100644
index 0000000000..22570e62ff
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/acceptance/require/require.spec.js
@@ -0,0 +1,9 @@
+describe('require test', function(){
+ it('should require args in order', function(){
+ var req = global.required;
+ expect(req.indexOf('a.js')).to.equal(0);
+ expect(req.indexOf('b.coffee')).to.equal(1);
+ expect(req.indexOf('c.js')).to.equal(2);
+ expect(req.indexOf('d.coffee')).to.equal(3);
+ })
+});
diff --git a/tests/lib/mocha-3.1.0/test/acceptance/required-tokens.spec.js b/tests/lib/mocha-3.1.0/test/acceptance/required-tokens.spec.js
new file mode 100644
index 0000000000..6944cee40c
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/acceptance/required-tokens.spec.js
@@ -0,0 +1,10 @@
+var assert = require('assert');
+var describe = require('../..').describe;
+var it = require('../..').it;
+
+describe('using imported describe', function () {
+ it('using imported it', function (done) {
+ assert.ok(true);
+ done();
+ })
+})
diff --git a/tests/lib/mocha-3.1.0/test/acceptance/root.spec.js b/tests/lib/mocha-3.1.0/test/acceptance/root.spec.js
new file mode 100644
index 0000000000..037e6a328a
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/acceptance/root.spec.js
@@ -0,0 +1,11 @@
+var calls = [];
+
+before(function(){
+ calls.push('before');
+})
+
+describe('root', function(){
+ it('should be a valid suite', function(){
+ expect(calls).to.eql(['before']);
+ })
+})
diff --git a/tests/lib/mocha-3.1.0/test/acceptance/test.coffee b/tests/lib/mocha-3.1.0/test/acceptance/test.coffee
new file mode 100644
index 0000000000..b8e309f515
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/acceptance/test.coffee
@@ -0,0 +1,6 @@
+
+obj = foo: 'bar'
+
+describe 'coffeescript', ->
+ it 'should work', ->
+ expect(obj).to.eql foo: 'bar'
diff --git a/tests/lib/mocha-3.1.0/test/acceptance/test.foo b/tests/lib/mocha-3.1.0/test/acceptance/test.foo
new file mode 100644
index 0000000000..d00491fd7e
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/acceptance/test.foo
@@ -0,0 +1 @@
+1
diff --git a/tests/lib/mocha-3.1.0/test/acceptance/throw.spec.js b/tests/lib/mocha-3.1.0/test/acceptance/throw.spec.js
new file mode 100644
index 0000000000..46cfbad6ad
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/acceptance/throw.spec.js
@@ -0,0 +1,108 @@
+var Suite = require('../../lib/suite');
+var Test = require('../../lib/test');
+var Runner = require('../../lib/runner');
+
+describe('a test that throws', function () {
+ var suite, runner;
+
+ beforeEach(function(){
+ suite = new Suite('Suite', 'root');
+ runner = new Runner(suite);
+ })
+
+ describe('undefined', function (){
+ it('should not pass if throwing sync and test is sync', function(done) {
+ var test = new Test('im sync and throw undefined sync', function(){
+ throw undefined;
+ });
+ suite.addTest(test);
+ runner = new Runner(suite);
+ runner.on('end', function(){
+ expect(runner.failures).to.equal(1);
+ expect(test.state).to.equal('failed');
+ done();
+ });
+ runner.run();
+ })
+
+ it('should not pass if throwing sync and test is async', function(done){
+ var test = new Test('im async and throw undefined sync', function(done2){
+ throw undefined;
+ process.nexTick(done2);
+ });
+ suite.addTest(test);
+ runner = new Runner(suite);
+ runner.on('end', function(){
+ expect(runner.failures).to.equal(1);
+ expect(test.state).to.equal('failed');
+ done();
+ });
+ runner.run();
+ });
+
+ it('should not pass if throwing async and test is async', function(done){
+ var test = new Test('im async and throw undefined async', function(done2){
+ process.nexTick(function(){
+ throw undefined;
+ done2();
+ });
+ });
+ suite.addTest(test);
+ runner = new Runner(suite);
+ runner.on('end', function(){
+ expect(runner.failures).to.equal(1);
+ expect(test.state).to.equal('failed');
+ done();
+ });
+ runner.run();
+ })
+ })
+
+ describe('null', function (){
+ it('should not pass if throwing sync and test is sync', function(done) {
+ var test = new Test('im sync and throw null sync', function(){
+ throw null;
+ });
+ suite.addTest(test);
+ runner = new Runner(suite);
+ runner.on('end', function(){
+ expect(runner.failures).to.equal(1);
+ expect(test.state).to.equal('failed');
+ done();
+ });
+ runner.run();
+ })
+
+ it('should not pass if throwing sync and test is async', function(done){
+ var test = new Test('im async and throw null sync', function(done2){
+ throw null;
+ process.nexTick(done2);
+ });
+ suite.addTest(test);
+ runner = new Runner(suite);
+ runner.on('end', function(){
+ expect(runner.failures).to.equal(1);
+ expect(test.state).to.equal('failed');
+ done();
+ });
+ runner.run();
+ });
+
+ it('should not pass if throwing async and test is async', function(done){
+ var test = new Test('im async and throw null async', function(done2){
+ process.nexTick(function(){
+ throw null;
+ done2();
+ });
+ });
+ suite.addTest(test);
+ runner = new Runner(suite);
+ runner.on('end', function(){
+ expect(runner.failures).to.equal(1);
+ expect(test.state).to.equal('failed');
+ done();
+ });
+ runner.run();
+ })
+ })
+})
diff --git a/tests/lib/mocha-3.1.0/test/acceptance/timeout.spec.js b/tests/lib/mocha-3.1.0/test/acceptance/timeout.spec.js
new file mode 100644
index 0000000000..f61c3ba566
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/acceptance/timeout.spec.js
@@ -0,0 +1,79 @@
+describe('timeouts', function(){
+ beforeEach(function(done){
+ // uncomment
+ // setTimeout(done, 3000);
+ done();
+ })
+
+ it('should error on timeout', function(done){
+ // uncomment
+ // setTimeout(done, 3000);
+ done();
+ })
+
+ it('should allow overriding per-test', function(done){
+ this.timeout(1000);
+ setTimeout(function(){
+ done();
+ }, 300);
+ })
+
+ describe('disabling', function(){
+ it('should allow overriding per-test', function(done){
+ this.enableTimeouts(false);
+ this.timeout(1);
+ setTimeout(done, 2);
+ });
+
+ it('should work with timeout(0)', function(done) {
+ this.timeout(0);
+ setTimeout(done, 1);
+ })
+
+ describe('using beforeEach', function() {
+ beforeEach(function () {
+ this.timeout(0);
+ })
+
+ it('should work with timeout(0)', function(done) {
+ setTimeout(done, 1);
+ })
+ })
+
+ describe('using before', function() {
+ before(function () {
+ this.timeout(0);
+ })
+
+ it('should work with timeout(0)', function(done) {
+ setTimeout(done, 1);
+ })
+ })
+
+ describe('using enableTimeouts(false)', function() {
+ this.timeout(4);
+
+ it('should suppress timeout(4)', function(done) {
+ // The test is in the before() call.
+ this.enableTimeouts(false);
+ setTimeout(done, 50);
+ })
+ })
+
+ describe('suite-level', function() {
+ this.timeout(0);
+
+ it('should work with timeout(0)', function(done) {
+ setTimeout(done, 1);
+ })
+
+ describe('nested suite', function () {
+ it('should work with timeout(0)', function(done) {
+ setTimeout(done, 1);
+ })
+
+ })
+ })
+ });
+
+})
diff --git a/tests/lib/mocha-3.1.0/test/acceptance/utils.spec.js b/tests/lib/mocha-3.1.0/test/acceptance/utils.spec.js
new file mode 100644
index 0000000000..cab0f42b01
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/acceptance/utils.spec.js
@@ -0,0 +1,406 @@
+var utils = require('../../lib/utils');
+var toISOString = require('../../lib/to-iso-string');
+var JSON = require('json3');
+
+describe('lib/utils', function () {
+ describe('clean', function () {
+ it("should format a single line test function", function () {
+ var fn = [
+ "function () {"
+ , " var a = 1;"
+ , "}"
+ ].join("\n");
+ expect(utils.clean(fn)).to.equal("var a = 1;");
+ });
+
+ it("should format a multi line test indented with spaces", function () {
+ // and no new lines after curly braces, shouldn't matter
+ var fn = [
+ "function(){ var a = 1;"
+ , " var b = 2;" // this one has more spaces
+ , " var c = 3; }"
+ ].join("\n");
+ expect(utils.clean(fn)).to.equal("var a = 1;\n var b = 2;\nvar c = 3;");
+ });
+
+ it("should format a multi line test indented with tabs", function () {
+ var fn = [
+ "function (arg1, arg2) {"
+ , "\tif (true) {"
+ , "\t\tvar a = 1;"
+ , "\t}"
+ , "}"
+ ].join("\n");
+ expect(utils.clean(fn)).to.equal("if (true) {\n\tvar a = 1;\n}");
+ });
+
+ it("should format functions saved in windows style - spaces", function () {
+ var fn = [
+ "function (one) {"
+ , " do {"
+ , ' "nothing";'
+ , " } while (false);"
+ , ' }'
+ ].join("\r\n");
+ expect(utils.clean(fn)).to.equal('do {\n "nothing";\n} while (false);');
+ });
+
+ it("should format functions saved in windows style - tabs", function () {
+ var fn = [
+ "function ( ) {"
+ , "\tif (false) {"
+ , "\t\tvar json = {"
+ , '\t\t\tone : 1'
+ , '\t\t};'
+ , "\t}"
+ , "}"
+ ].join("\r\n");
+ expect(utils.clean(fn)).to.equal("if (false) {\n\tvar json = {\n\t\tone : 1\n\t};\n}");
+ });
+
+ it("should format es6 arrow functions", function () {
+ var fn = [
+ "() => {",
+ " var a = 1;",
+ "}"
+ ].join("\n");
+ expect(utils.clean(fn)).to.equal("var a = 1;");
+ });
+
+ it("should format es6 arrow functions with implicit return", function () {
+ var fn = "() => foo()";
+ expect(utils.clean(fn)).to.equal("foo()");
+ });
+ });
+
+ describe('stringify', function(){
+
+ var stringify = utils.stringify;
+
+ it('should return an object representation of a string created with a String constructor', function() {
+ expect(stringify(new String('foo'))).to.equal('{\n "0": "f"\n "1": "o"\n "2": "o"\n}');
+ });
+
+ it('should return Buffer with .toJSON representation', function() {
+ expect(stringify(new Buffer([0x01]))).to.equal('[\n 1\n]');
+ expect(stringify(new Buffer([0x01, 0x02]))).to.equal('[\n 1\n 2\n]');
+
+ expect(stringify(new Buffer('ABCD'))).to.equal('[\n 65\n 66\n 67\n 68\n]');
+ });
+
+ it('should return Date object with .toISOString() + string prefix', function() {
+ expect(stringify(new Date(0))).to.equal('[Date: ' + shimToISOString(new Date(0)) + ']');
+
+ var date = new Date(); // now
+ expect(stringify(date)).to.equal('[Date: ' + shimToISOString(date) + ']');
+
+ function shimToISOString(date) {
+ if (date.toISOString) {
+ return date.toISOString();
+ } else {
+ return toISOString(date);
+ }
+ }
+ });
+
+ it('should return invalid Date object with .toString() + string prefix', function() {
+ expect(stringify(new Date(''))).to.equal('[Date: ' + new Date('').toString() + ']');
+ });
+
+ describe('#Number', function() {
+ it('should show the handle -0 situations', function() {
+ expect(stringify(-0)).to.eql('-0');
+ expect(stringify(0)).to.eql('0');
+ expect(stringify('-0')).to.eql('"-0"');
+ });
+
+ it('should work well with `NaN` and `Infinity`', function() {
+ expect(stringify(NaN)).to.equal('NaN');
+ expect(stringify(Infinity)).to.equal('Infinity');
+ expect(stringify(-Infinity)).to.equal('-Infinity');
+ });
+
+ it('floats and ints', function() {
+ expect(stringify(1)).to.equal('1');
+ expect(stringify(1.2)).to.equal('1.2');
+ expect(stringify(1e9)).to.equal('1000000000');
+ });
+ });
+
+ describe('canonicalize example', function() {
+ it('should represent the actual full result', function() {
+ var expected = {
+ str: 'string',
+ int: 90,
+ float: 9.99,
+ boolean: false,
+ nil: null,
+ undef: undefined,
+ regex: /^[a-z|A-Z]/,
+ date: new Date(0),
+ func: function() {},
+ infi: Infinity,
+ nan: NaN,
+ zero: -0,
+ buffer: new Buffer([0x01, 0x02]),
+ array: [1,2,3],
+ empArr: [],
+ matrix: [[1], [2,3,4] ],
+ object: { a: 1, b: 2 },
+ canObj: { a: { b: 1, c: 2 }, b: {} },
+ empObj: {}
+ };
+ expected.circular = expected; // Make `Circular` situation
+ var actual = ['{'
+ , ' "array": ['
+ , ' 1'
+ , ' 2'
+ , ' 3'
+ , ' ]'
+ , ' "boolean": false'
+ , ' "buffer": [Buffer: ['
+ , ' 1'
+ , ' 2'
+ , ' ]]'
+ , ' "canObj": {'
+ , ' "a": {'
+ , ' "b": 1'
+ , ' "c": 2'
+ , ' }'
+ , ' "b": {}'
+ , ' }'
+ , ' "circular": [Circular]'
+ , ' "date": [Date: 1970-01-01T00:00:00.000Z]'
+ , ' "empArr": []'
+ , ' "empObj": {}'
+ , ' "float": 9.99'
+ , ' "func": [Function]'
+ , ' "infi": Infinity'
+ , ' "int": 90'
+ , ' "matrix": ['
+ , ' ['
+ , ' 1'
+ , ' ]'
+ , ' ['
+ , ' 2'
+ , ' 3'
+ , ' 4'
+ , ' ]'
+ , ' ]'
+ , ' "nan": NaN'
+ , ' "nil": [null]'
+ , ' "object": {'
+ , ' "a": 1'
+ , ' "b": 2'
+ , ' }'
+ , ' "regex": /^[a-z|A-Z]/'
+ , ' "str": "string"'
+ , ' "undef": [undefined]'
+ , ' "zero": -0'
+ , '}'].join('\n');
+ expect(stringify(expected)).to.equal(actual);
+ });
+ });
+
+ it('should canonicalize the object', function(){
+ var travis = { name: 'travis', age: 24 };
+ var travis2 = { age: 24, name: 'travis' };
+
+ expect(stringify(travis)).to.equal(stringify(travis2));
+ });
+
+ it('should handle circular structures in objects', function(){
+ var travis = { name: 'travis' };
+ travis.whoami = travis;
+
+ expect(stringify(travis)).to.equal('{\n "name": "travis"\n "whoami": [Circular]\n}');
+ });
+
+ it('should handle circular structures in arrays', function(){
+ var travis = ['travis'];
+ travis.push(travis);
+
+ expect(stringify(travis)).to.equal('[\n "travis"\n [Circular]\n]');
+ });
+
+ it('should handle circular structures in functions', function(){
+ var travis = function () {};
+ travis.fn = travis;
+
+ expect(stringify(travis)).to.equal('{\n "fn": [Circular]\n}');
+ });
+
+
+ it('should handle various non-undefined, non-null, non-object, non-array, non-date, and non-function values', function () {
+ var regexp = new RegExp("(?:)"),
+ regExpObj = { regexp: regexp },
+ regexpString = '/(?:)/';
+
+ expect(stringify(regExpObj)).to.equal('{\n "regexp": ' + regexpString + '\n}');
+ expect(stringify(regexp)).to.equal(regexpString);
+
+ var number = 1,
+ numberObj = { number: number },
+ numberString = '1';
+
+ expect(stringify(numberObj)).to.equal('{\n "number": ' + number + '\n}');
+ expect(stringify(number)).to.equal(numberString);
+
+ var boolean = false,
+ booleanObj = { boolean: boolean },
+ booleanString = 'false';
+
+ expect(stringify(booleanObj)).to.equal('{\n "boolean": ' + boolean + '\n}');
+ expect(stringify(boolean)).to.equal(booleanString);
+
+ var string = 'sneepy',
+ stringObj = { string: string };
+
+ expect(stringify(stringObj)).to.equal('{\n "string": "' + string + '"\n}');
+ expect(stringify(string)).to.equal(JSON.stringify(string));
+
+ var nullValue = null,
+ nullObj = { 'null': null },
+ nullString = '[null]';
+
+ expect(stringify(nullObj)).to.equal('{\n "null": [null]\n}');
+ expect(stringify(nullValue)).to.equal(nullString);
+ });
+
+ it('should handle arrays', function () {
+ var array = ['dave', 'dave', 'dave', 'dave'],
+ arrayObj = {array: array},
+ arrayString = ' "dave"\n "dave"\n "dave"\n "dave"'
+
+ expect(stringify(arrayObj)).to.equal('{\n "array": [\n' + arrayString + '\n ]\n}');
+ expect(stringify(array)).to.equal('[' + arrayString.replace(/\s+/g, '\n ') + '\n]');
+ });
+
+ it('should handle functions', function () {
+ var fn = function() {},
+ fnObj = {fn: fn},
+ fnString = '[Function]';
+
+ expect(stringify(fnObj)).to.equal('{\n "fn": ' + fnString + '\n}');
+ expect(stringify(fn)).to.equal('[Function]');
+ });
+
+ it('should handle empty objects', function () {
+ expect(stringify({})).to.equal('{}');
+ expect(stringify({foo: {}})).to.equal('{\n "foo": {}\n}');
+ });
+
+ it('should handle empty arrays', function () {
+ expect(stringify([])).to.equal('[]');
+ expect(stringify({foo: []})).to.equal('{\n "foo": []\n}');
+ });
+
+ it('should handle non-empty arrays', function () {
+ expect(stringify(['a', 'b', 'c'])).to.equal('[\n "a"\n "b"\n "c"\n]')
+ });
+
+ it('should handle empty functions (with no properties)', function () {
+ expect(stringify(function(){})).to.equal('[Function]');
+ expect(stringify({foo: function() {}})).to.equal('{\n "foo": [Function]\n}');
+ expect(stringify({foo: function() {}, bar: 'baz'})).to.equal('{\n "bar": "baz"\n "foo": [Function]\n}');
+ });
+
+ it('should handle functions w/ properties', function () {
+ var fn = function(){};
+ fn.bar = 'baz';
+ expect(stringify(fn)).to.equal('{\n "bar": "baz"\n}');
+ expect(stringify({foo: fn})).to.equal('{\n "foo": {\n "bar": "baz"\n }\n}');
+ });
+
+ it('should handle undefined values', function () {
+ expect(stringify({foo: undefined})).to.equal('{\n "foo": [undefined]\n}');
+ expect(stringify({foo: 'bar', baz: undefined})).to.equal('{\n "baz": [undefined]\n "foo": "bar"\n}');
+ expect(stringify()).to.equal('[undefined]');
+ });
+
+ it('should recurse', function () {
+ expect(stringify({foo: {bar: {baz: {quux: {herp: 'derp'}}}}})).to.equal('{\n "foo": {\n "bar": {\n "baz": {\n "quux": {\n "herp": "derp"\n }\n }\n }\n }\n}');
+ });
+
+ it('might get confusing', function () {
+ expect(stringify(null)).to.equal('[null]');
+ });
+
+ it('should not freak out if it sees a primitive twice', function () {
+ expect(stringify({foo: null, bar: null})).to.equal('{\n "bar": [null]\n "foo": [null]\n}');
+ expect(stringify({foo: 1, bar: 1})).to.equal('{\n "bar": 1\n "foo": 1\n}');
+ });
+
+ it('should stringify dates', function () {
+ var date = new Date(0);
+ expect(stringify(date)).to.equal('[Date: 1970-01-01T00:00:00.000Z]');
+ expect(stringify({date: date})).to.equal('{\n "date": [Date: 1970-01-01T00:00:00.000Z]\n}');
+ });
+
+ it('should handle object without an Object prototype', function () {
+ var a;
+ if (Object.create) {
+ a = Object.create(null);
+ } else {
+ a = {};
+ }
+ a.foo = 1;
+
+ expect(stringify(a)).to.equal('{\n "foo": 1\n}');
+ });
+
+ // In old version node.js, Symbol is not available by default.
+ if (typeof global.Symbol === 'function') {
+ it('should handle Symbol', function () {
+ var symbol = Symbol('value');
+ expect(stringify(symbol)).to.equal('Symbol(value)');
+ expect(stringify({symbol: symbol})).to.equal('{\n "symbol": Symbol(value)\n}')
+ });
+ }
+
+ it('should handle length properties that cannot be coerced to a number', function () {
+ expect(stringify({length: {nonBuiltinProperty: 0}})).to.equal('{\n "length": {\n "nonBuiltinProperty": 0\n }\n}');
+ expect(stringify({length: "a string where length should be"})).to.equal('{\n "length": "a string where length should be"\n}');
+ });
+ });
+
+ describe('type', function () {
+ var type = utils.type;
+ var toString = Object.prototype.toString;
+
+ beforeEach(function() {
+ // some JS engines such as PhantomJS 1.x exhibit this behavior
+ Object.prototype.toString = function() {
+ if (this === global) {
+ return '[object DOMWindow]';
+ }
+ return toString.call(this);
+ };
+ });
+
+ it('should recognize various types', function () {
+ expect(type({})).to.equal('object');
+ expect(type([])).to.equal('array');
+ expect(type(1)).to.equal('number');
+ expect(type(Infinity)).to.equal('number');
+ expect(type(null)).to.equal('null');
+ expect(type(undefined)).to.equal('undefined');
+ expect(type(new Date())).to.equal('date');
+ expect(type(/foo/)).to.equal('regexp');
+ expect(type('type')).to.equal('string');
+ expect(type(global)).to.equal('domwindow');
+ expect(type(true)).to.equal('boolean');
+ });
+
+ describe('when toString on null or undefined stringifies window', function () {
+ it('should recognize null and undefined', function () {
+ expect(type(null)).to.equal('null');
+ expect(type(undefined)).to.equal('undefined');
+ });
+ });
+
+ afterEach(function () {
+ Object.prototype.toString = toString;
+ });
+ });
+});
diff --git a/tests/lib/mocha-3.1.0/test/browser-fixtures/bdd.fixture.js b/tests/lib/mocha-3.1.0/test/browser-fixtures/bdd.fixture.js
new file mode 100644
index 0000000000..72b4a8a47c
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/browser-fixtures/bdd.fixture.js
@@ -0,0 +1,4 @@
+/* eslint-env browser */
+
+window.mocha.timeout(200)
+ .ui('bdd');
diff --git a/tests/lib/mocha-3.1.0/test/browser-fixtures/exports.fixture.js b/tests/lib/mocha-3.1.0/test/browser-fixtures/exports.fixture.js
new file mode 100644
index 0000000000..32c26a12ff
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/browser-fixtures/exports.fixture.js
@@ -0,0 +1,4 @@
+/* eslint-env browser */
+
+window.mocha.timeout(200)
+ .ui('exports');
diff --git a/tests/lib/mocha-3.1.0/test/browser-fixtures/qunit.fixture.js b/tests/lib/mocha-3.1.0/test/browser-fixtures/qunit.fixture.js
new file mode 100644
index 0000000000..8804d0b994
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/browser-fixtures/qunit.fixture.js
@@ -0,0 +1,4 @@
+/* eslint-env browser */
+
+window.mocha.timeout(200)
+ .ui('qunit');
diff --git a/tests/lib/mocha-3.1.0/test/browser-fixtures/tdd.fixture.js b/tests/lib/mocha-3.1.0/test/browser-fixtures/tdd.fixture.js
new file mode 100644
index 0000000000..997a47dc18
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/browser-fixtures/tdd.fixture.js
@@ -0,0 +1,4 @@
+/* eslint-env browser */
+
+window.mocha.timeout(200)
+ .ui('tdd');
diff --git a/tests/lib/mocha-3.1.0/test/browser/array.spec.js b/tests/lib/mocha-3.1.0/test/browser/array.spec.js
new file mode 100644
index 0000000000..26404f6a90
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/browser/array.spec.js
@@ -0,0 +1,38 @@
+describe('Array', function(){
+ describe('#push()', function(){
+ it('should append a value', function(){
+ foo = 'asdf'
+ var arr = [];
+ arr.push('foo');
+ arr.push('bar');
+ arr.push('baz');
+ assert('foo' == arr[0]); // to test indentation
+ assert('bar' == arr[1]);
+ assert('baz' == arr[2]);
+ })
+
+ it('should return the length', function(){
+ var arr = [];
+ assert(1 == arr.push('foo'));
+ assert(2 == arr.push('bar'));
+ assert(3 == arr.push('baz'));
+ })
+ })
+})
+
+describe('Array', function(){
+ describe('#pop()', function(){
+ it('should remove and return the last value', function(){
+ var arr = [1,2,3];
+ assert(arr.pop() == 3);
+ assert(arr.pop() == 2);
+ assert(arr.pop() == -1);
+ })
+
+ it('should adjust .length', function(){
+ var arr = [1,2,3];
+ arr.pop();
+ assert(arr.length == 2);
+ })
+ })
+})
diff --git a/tests/lib/mocha-3.1.0/test/browser/grep.html b/tests/lib/mocha-3.1.0/test/browser/grep.html
new file mode 100644
index 0000000000..0ba47c8533
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/browser/grep.html
@@ -0,0 +1,51 @@
+<html>
+ <head>
+ <title>Mocha</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <link rel="stylesheet" href="../../mocha.css" />
+ <script src="../../mocha.js"></script>
+ <script>mocha.setup('bdd')</script>
+ <script>
+ function assert(expr, msg) {
+ if (!expr) throw new Error(msg || 'failed');
+ }
+ </script>
+ <script src="grep.js"></script>
+ </head>
+ <body>
+ <div id="mocha"></div>
+ <script>
+ (function(window) {
+ var location = window.location;
+ mocha.checkLeaks();
+ var runner = mocha.run();
+ setTimeout(run, 1000);
+
+ function run() {
+ var regex = [
+ '.*', // All
+ 'm{2}', // 'mm...m'
+ '\\d', // Contains number
+ '^\\d{2}(?=\\s\\d$)', // Start with 2 numbers and end with one
+ '^@.*(?=\\(\\)$)', // Run @Array and @Function suite, but only function
+ '^@(?!.*\\)$)', // Run @Array and @Function suite, but only properties
+ '^co', // Start with 'co'
+ 'first$', // Ends with 'first'
+ '^co.*(?=second$)', // Starts with 'co', ends with 'second'
+ '^Date:\\s01\/0(?:[1-4])\/2015$', // Run all tests between '01/[01-04]/2015'
+ encodeURIComponent('^#'), // Run encoded => start with '#'
+ encodeURIComponent('^[^a-z|0-9]+$') // Run encoded => only uppercase suites(include `it` fns), e.g: CONSTANTS
+ ]
+ , qs = location.search.replace('?grep=', '')
+ , re = ~qs.indexOf('%') ? qs : decodeURIComponent(qs)
+ , grep = regex[regex.indexOf(re) + 1];
+
+ return grep
+ ? location.search = 'grep=' + grep
+ : false;
+ }
+ })(window);
+ </script>
+ </body>
+</html>
diff --git a/tests/lib/mocha-3.1.0/test/browser/grep.spec.js b/tests/lib/mocha-3.1.0/test/browser/grep.spec.js
new file mode 100644
index 0000000000..9531b87aa9
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/browser/grep.spec.js
@@ -0,0 +1,108 @@
+// numbers
+describe('21', function() {
+ it('1', function() {
+ assert(true);
+ });
+ it('2', function() {
+ assert(true);
+ });
+});
+// symbols
+describe('@Array', function() {
+ it('.pop()', function() {
+ assert(true);
+ });
+ it('.push()', function() {
+ assert(true);
+ });
+ it('.length', function() {
+ assert(true);
+ });
+});
+
+describe('@Function', function() {
+ it('.call()', function() {
+ assert(true);
+ });
+ it('.apply()', function() {
+ assert(true);
+ });
+ it('.length', function() {
+ assert(true);
+ });
+ it('.name', function() {
+ assert(true);
+ });
+ it('.prototype', function() {
+ assert(true);
+ });
+});
+
+//url with hashtags
+describe('#Services',function() {
+ describe('#http', function() {
+ it('.createClient()', function() {
+ assert(true);
+ });
+ it('.Server()', function() {
+ assert(true);
+ });
+ });
+ describe('#crypto', function() {
+ it('.randomBytes()', function() {
+ assert(true);
+ });
+ it('.Hmac()', function() {
+ assert(true);
+ });
+ });
+});
+
+// Uppercase
+describe('CONSTANTS', function() {
+ it('.STATUS_CODES', function() {
+ assert(true);
+ });
+});
+
+// Dates
+describe('Date:', function() {
+ it('01/02/2015', function() {
+ assert(true);
+ });
+ it('01/03/2015', function() {
+ assert(true);
+ });
+ it('01/06/2015', function() {
+ assert(true);
+ });
+});
+
+// etc..
+describe('booking/summary', function() {
+ it('should be run last', function() {
+ assert(true);
+ });
+});
+
+describe('component/booking/summary', function() {
+ it('should be run second', function() {
+ assert(true);
+ });
+});
+
+describe('component/booking/intro', function() {
+ it('should be run first', function() {
+ assert(true);
+ });
+});
+
+describe('contains numbers', function() {
+ it('should run if the number 92 matching', function() {
+ assert(true);
+ });
+
+ it('should run if the number 8 matching', function() {
+ assert(true);
+ });
+}); \ No newline at end of file
diff --git a/tests/lib/mocha-3.1.0/test/browser/index.html b/tests/lib/mocha-3.1.0/test/browser/index.html
new file mode 100644
index 0000000000..9200b977e5
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/browser/index.html
@@ -0,0 +1,33 @@
+<html>
+ <head>
+ <title>Mocha</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <link rel="stylesheet" href="../../mocha.css" />
+ <script src="../../mocha.js"></script>
+ <script>mocha.setup('bdd')</script>
+ <script>
+ function assert(expr, msg) {
+ if (!expr) throw new Error(msg || 'failed');
+ }
+ </script>
+ <script src="array.js"></script>
+ <script src="../acceptance/duration.js"></script>
+ <script src="../acceptance/timeout.js"></script>
+ <script src="multiple-done.js"></script>
+ <script>
+ onload = function(){
+ mocha.checkLeaks();
+ mocha.globals(['foo']);
+ var runner = mocha.run();
+
+ // runner.on('test end', function(test){
+ // console.log(test.fullTitle());
+ // });
+ };
+ </script>
+ </head>
+ <body>
+ <div id="mocha"></div>
+ </body>
+</html>
diff --git a/tests/lib/mocha-3.1.0/test/browser/large.html b/tests/lib/mocha-3.1.0/test/browser/large.html
new file mode 100644
index 0000000000..1804b3a000
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/browser/large.html
@@ -0,0 +1,24 @@
+<html>
+ <head>
+ <title>Mocha</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <link rel="stylesheet" href="../../mocha.css" />
+ <script src="../../mocha.js"></script>
+ <script>mocha.setup('bdd')</script>
+ <script>
+ function assert(expr, msg) {
+ if (!expr) throw new Error(msg || 'failed');
+ }
+ </script>
+ <script src="large.js"></script>
+ <script>
+ onload = function(){
+ mocha.run();
+ };
+ </script>
+ </head>
+ <body>
+ <div id="mocha"></div>
+ </body>
+</html>
diff --git a/tests/lib/mocha-3.1.0/test/browser/large.spec.js b/tests/lib/mocha-3.1.0/test/browser/large.spec.js
new file mode 100644
index 0000000000..56757eae27
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/browser/large.spec.js
@@ -0,0 +1,48 @@
+var n = 30;
+while (n--) {
+ describe('Array ' + n, function(){
+ var arr;
+
+ beforeEach(function(){
+ arr = [1,2,3];
+ })
+
+ describe('#indexOf()', function(){
+ it('should return -1 when the value is not present', function(){
+ assert(-1 == arr.indexOf(5));
+ })
+
+ it('should return the correct index when the value is present', function(done){
+ assert(0 == arr.indexOf(1));
+ assert(1 == arr.indexOf(2));
+ done();
+ })
+ })
+ })
+}
+
+describe('something', function(){
+ it('should provide a useful error', function(done){
+ setTimeout(function(){
+ throw new Error('boom');
+ done();
+ }, 1);
+ })
+
+ it('should provide an even better error on phantomjs', function(done){
+ setTimeout(function(){
+ var AssertionError = function(message, actual, expected) {
+ this.message = message;
+ this.actual = actual;
+ this.expected = expected;
+ this.showDiff = true;
+ };
+ AssertionError.prototype = Object.create(Error.prototype);
+ AssertionError.prototype.name = 'AssertionError';
+ AssertionError.prototype.constructor = AssertionError;
+
+ mocha.throwError(new AssertionError('kabooom', 'text with a typo', 'text without a typo'));
+ done();
+ }, 1);
+ })
+})
diff --git a/tests/lib/mocha-3.1.0/test/browser/multiple-done.spec.js b/tests/lib/mocha-3.1.0/test/browser/multiple-done.spec.js
new file mode 100644
index 0000000000..d8a9d49ae2
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/browser/multiple-done.spec.js
@@ -0,0 +1,16 @@
+describe('Multiple Done calls', function(){
+ it('should report an error if done was called more than once', function(done){
+ done();
+ done();
+ })
+
+ it('should report an error if an exception happened async after done was called', function (done) {
+ done();
+ setTimeout(done, 50);
+ })
+
+ it('should report an error if an exception happened after done was called', function(done){
+ done();
+ throw new Error("thrown error");
+ })
+})
diff --git a/tests/lib/mocha-3.1.0/test/browser/opts.html b/tests/lib/mocha-3.1.0/test/browser/opts.html
new file mode 100644
index 0000000000..ec49a418fc
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/browser/opts.html
@@ -0,0 +1,30 @@
+<html>
+ <head>
+ <title>Mocha</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <link rel="stylesheet" href="../../mocha.css" />
+ <script src="../../mocha.js"></script>
+ <script>
+ mocha.setup({
+ ui: 'bdd',
+ globals: ['okGlobalA', 'okGlobalB', 'okGlobalC', 'callback*']
+ }).timeout(1500)
+ </script>
+ <script>
+ function assert(expr, msg) {
+ if (!expr) throw new Error(msg || 'failed');
+ }
+ </script>
+ <script src="opts.js"></script>
+ <script src="../acceptance/globals.js"></script>
+ <script>
+ onload = function(){
+ var runner = mocha.run();
+ };
+ </script>
+ </head>
+ <body>
+ <div id="mocha"></div>
+ </body>
+</html>
diff --git a/tests/lib/mocha-3.1.0/test/browser/opts.spec.js b/tests/lib/mocha-3.1.0/test/browser/opts.spec.js
new file mode 100644
index 0000000000..dbbc9ff172
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/browser/opts.spec.js
@@ -0,0 +1,5 @@
+describe('Options', function() {
+ it('should set timeout value', function() {
+ assert(this.test._timeout === 1500);
+ });
+})
diff --git a/tests/lib/mocha-3.1.0/test/browser/stack-trace.html b/tests/lib/mocha-3.1.0/test/browser/stack-trace.html
new file mode 100644
index 0000000000..0f267dab98
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/browser/stack-trace.html
@@ -0,0 +1,24 @@
+<html>
+<head>
+ <title>Mocha</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <link rel="stylesheet" href="../../mocha.css" />
+ <script src="../../mocha.js"></script>
+ <script>mocha.setup('bdd')</script>
+ <script>
+ function assert(expr, err) {
+ if (!expr) throw err;
+ }
+ </script>
+ <script src="stack-trace.js"></script>
+ <script>
+ onload = function() {
+ mocha.run();
+ };
+ </script>
+</head>
+<body>
+<div id="mocha"></div>
+</body>
+</html>
diff --git a/tests/lib/mocha-3.1.0/test/browser/stack-trace.spec.js b/tests/lib/mocha-3.1.0/test/browser/stack-trace.spec.js
new file mode 100644
index 0000000000..b39944db09
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/browser/stack-trace.spec.js
@@ -0,0 +1,20 @@
+'use strict';
+describe('Stack trace', function() {
+ it('should prettify the stack-trace', function() {
+ var err = new Error();
+ // We do this fake stack-trace because we under development,
+ // and our root isn't `node_modules`, `bower` or `components`
+ err.stack = ['Error: failed'
+ , 'at assert (stack-trace.html:11:30)'
+ , 'at Context.<anonymous> (stack-trace.js:5:5)'
+ , 'at callFn (http://localhost:63342/node_modules/mocha.js:4546:21)'
+ , 'at Test.require.register.Runnable.run (http://localhost:63342/node_modules/mocha.js:4539:7)'
+ , 'at Runner.require.register.Runner.runTest (http://localhost:63342/node_modules/mocha.js:4958:10)'
+ , 'at http://localhost:63342/bower_components/mocha.js:5041:12'
+ , 'at next (http://localhost:63342/bower_components/mocha.js:4883:14)'
+ , 'at http://localhost:63342/bower_components/mocha.js:4893:7'
+ , 'at next (http://localhost:63342/bower_components/mocha.js:4828:23)'
+ , 'at http://localhost:63342/bower_components/mocha.js:4860:5'].join('\n');
+ assert(false, err);
+ });
+}); \ No newline at end of file
diff --git a/tests/lib/mocha-3.1.0/test/browser/ui.html b/tests/lib/mocha-3.1.0/test/browser/ui.html
new file mode 100644
index 0000000000..071c7798a0
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/browser/ui.html
@@ -0,0 +1,46 @@
+<html>
+ <head>
+ <title>Mocha</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <link rel="stylesheet" href="../../mocha.css" />
+ <script src="../../mocha.js"></script>
+ <script>mocha.setup('bdd')</script>
+ <script>
+ function assert(expr, msg) {
+ if (!expr) throw new Error(msg || 'failed');
+ }
+ </script>
+ <script src="ui.js"></script>
+ </head>
+ <body>
+ <div id="mocha"></div>
+ <script>
+ (function(window) {
+ var location = window.location;
+ mocha.checkLeaks();
+ var runner = mocha.run();
+ var count = 0;
+ setTimeout(run, 1000);
+
+ function run() {
+ var regex = [
+ '', // All
+ '%5C%24%5C.jQuery', // $.jQuery
+ '%5C%24%5C.jQuery%20%5C.on%5C(%5C)', // $.jQuery .on()
+ ]
+ , qs = location.search.replace('?grep=', '')
+ , re = ~qs.indexOf('%') ? qs : decodeURIComponent(qs)
+ , grep = regex[regex.indexOf(re) + 1]
+ , anchors = document.getElementsByTagName('a');
+
+ // Locate first 'a' element w/ matching grep param; click it
+ for (var i = 0; i < anchors.length; i++) {
+ if (anchors[i].href && anchors[i].href.indexOf(grep) > -1)
+ return void anchors[i].click();
+ }
+ }
+ })(window);
+ </script>
+ </body>
+</html>
diff --git a/tests/lib/mocha-3.1.0/test/browser/ui.spec.js b/tests/lib/mocha-3.1.0/test/browser/ui.spec.js
new file mode 100644
index 0000000000..48236e9497
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/browser/ui.spec.js
@@ -0,0 +1,31 @@
+// test titles containing regex-conflicting characters
+
+// leading $
+describe('$.jQuery', function() {
+ // parens
+ describe('.on()', function () {
+ it('should set an event', function() {
+ assert(true);
+ });
+ });
+
+ describe('.off()', function () {
+ it('should remove an event', function () {
+
+ });
+ });
+});
+
+// another generic describe block to verify it is absent
+// when greeping on $.jQuery
+describe('@Array', function() {
+ it('.pop()', function() {
+ assert(true);
+ });
+ it('.push()', function() {
+ assert(true);
+ });
+ it('.length', function() {
+ assert(true);
+ });
+});
diff --git a/tests/lib/mocha-3.1.0/test/color.spec.js b/tests/lib/mocha-3.1.0/test/color.spec.js
new file mode 100644
index 0000000000..5ee46e71c4
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/color.spec.js
@@ -0,0 +1,18 @@
+var assert = require('assert');
+var child_process = require('child_process');
+var path = require('path');
+
+describe('Mocha', function() {
+ this.timeout(2000);
+
+ it('should not output colors to pipe', function(cb) {
+ var command = [path.join('bin', 'mocha'), '--grep', 'missing-test'];
+ child_process.execFile(process.execPath, command, function(err, stdout, stderr) {
+ if (err) return cb(err);
+
+ assert(stdout.indexOf('[90m') === -1);
+
+ cb(null);
+ });
+ });
+});
diff --git a/tests/lib/mocha-3.1.0/test/compiler/foo.js b/tests/lib/mocha-3.1.0/test/compiler/foo.js
new file mode 100644
index 0000000000..b13101a77b
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/compiler/foo.js
@@ -0,0 +1,8 @@
+var fs = require('fs');
+require.extensions['.foo'] = function(module, filename) {
+ var content;
+ content = fs.readFileSync(filename, 'utf8');
+ var test = 'describe("custom compiler",function(){ it("should work",function() { '
+ + content + '.should.eql(1); }); });';
+ return module._compile(test, filename);
+};
diff --git a/tests/lib/mocha-3.1.0/test/fixture-expect.js b/tests/lib/mocha-3.1.0/test/fixture-expect.js
new file mode 100644
index 0000000000..cacc78425a
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/fixture-expect.js
@@ -0,0 +1 @@
+global.expect = require("expect.js")
diff --git a/tests/lib/mocha-3.1.0/test/grep.spec.js b/tests/lib/mocha-3.1.0/test/grep.spec.js
new file mode 100644
index 0000000000..bbc5c55eba
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/grep.spec.js
@@ -0,0 +1,65 @@
+var Mocha = require('../');
+
+describe('Mocha', function(){
+ describe('"grep" option', function(){
+ it('should add a RegExp to the mocha.options object', function(){
+ var mocha = new Mocha({ grep: /foo.*/ });
+ mocha.options.grep.toString().should.equal('/foo.*/');
+ });
+
+ it('should convert string to a RegExp', function(){
+ var mocha = new Mocha({ grep: 'foo.*' });
+ mocha.options.grep.toString().should.equal('/foo.*/');
+ });
+ });
+
+ describe('"fgrep" option', function(){
+ it('should escape and convert string to a RegExp', function(){
+ var mocha = new Mocha({ fgrep: 'foo.*' });
+ mocha.options.grep.toString().should.equal('/foo\\.\\*/');
+ });
+ });
+
+ describe('.grep()', function() {
+ // Test helper
+ function testGrep(mocha) {
+ return function testGrep(grep, expected) {
+ mocha.grep(grep);
+ mocha.options.grep.toString().should.equal(expected);
+ }
+ }
+
+ it('should add a RegExp to the mocha.options object', function() {
+ var test = testGrep(new Mocha);
+ test(/foo/, '/foo/');
+ });
+
+ it('should convert grep string to a RegExp', function() {
+ var test = testGrep(new Mocha);
+ test('foo', '/foo/');
+ test('^foo.*bar$', '/^foo.*bar$/');
+ test('^@.*(?=\\(\\)$)', '/^@.*(?=\\(\\)$)/');
+ });
+
+ it('should covert grep regex-like string to a RegExp', function() {
+ var test = testGrep(new Mocha);
+ test('/foo/', '/foo/');
+ // Keep the flags
+ test('/baz/i', '/baz/i');
+ test('/bar/g', '/bar/g');
+ test('/^foo(.*)bar/g', '/^foo(.*)bar/g');
+ });
+
+ it('should return it\'s parent Mocha object for chainability', function(){
+ var mocha = new Mocha;
+ mocha.grep().should.equal(mocha);
+ });
+ });
+
+ describe('"invert" option', function(){
+ it('should add a Boolean to the mocha.options object', function(){
+ var mocha = new Mocha({ invert: true });
+ mocha.options.invert.should.be.ok;
+ });
+ });
+});
diff --git a/tests/lib/mocha-3.1.0/test/hook-async.spec.js b/tests/lib/mocha-3.1.0/test/hook-async.spec.js
new file mode 100644
index 0000000000..ae6e642d24
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/hook-async.spec.js
@@ -0,0 +1,129 @@
+describe('async', function(){
+ var calls = [];
+
+ before(function(){
+ calls.push('root before all');
+ })
+
+ after(function(){
+ calls.push('root after all');
+ calls.should.eql([
+ 'root before all'
+ , 'before all'
+ , 'parent before'
+ , 'before'
+ , 'before test one'
+ , 'one'
+ , 'after'
+ , 'after test one passed'
+ , 'parent after'
+ , 'parent before'
+ , 'before'
+ , 'before test two'
+ , 'two'
+ , 'after'
+ , 'after test two passed'
+ , 'parent after'
+ , 'parent before'
+ , 'before'
+ , 'before test three'
+ , 'three'
+ , 'after'
+ , 'after test three passed'
+ , 'parent after'
+ , 'after all'
+ , 'root after all']);
+ })
+
+ beforeEach(function(){
+ calls.push('parent before');
+ })
+
+ afterEach(function(){
+ calls.push('parent after' );
+ })
+
+ describe('hooks', function(){
+ before(function(){
+ calls.push('before all');
+ });
+
+ after(function(){
+ calls.push('after all');
+ });
+
+ beforeEach(function(done){
+ var ctx = this;
+ process.nextTick(function(){
+ calls.push('before');
+ if (ctx.currentTest) {
+ calls.push('before test ' + ctx.currentTest.title);
+ }
+ done();
+ })
+ })
+
+ it('one', function(done){
+ calls.should.eql([
+ 'root before all'
+ , 'before all'
+ , 'parent before'
+ , 'before'
+ , 'before test one']);
+ calls.push('one');
+ process.nextTick(done);
+ })
+
+ it('two', function(){
+ calls.should.eql([
+ 'root before all'
+ , 'before all'
+ , 'parent before'
+ , 'before'
+ , 'before test one'
+ , 'one'
+ , 'after'
+ , 'after test one passed'
+ , 'parent after'
+ , 'parent before'
+ , 'before'
+ , 'before test two']);
+ calls.push('two');
+ })
+
+ it('three', function(){
+ calls.should.eql([
+ 'root before all'
+ , 'before all'
+ , 'parent before'
+ , 'before'
+ , 'before test one'
+ , 'one'
+ , 'after'
+ , 'after test one passed'
+ , 'parent after'
+ , 'parent before'
+ , 'before'
+ , 'before test two'
+ , 'two'
+ , 'after'
+ , 'after test two passed'
+ , 'parent after'
+ , 'parent before'
+ , 'before'
+ , 'before test three']);
+ calls.push('three');
+ })
+
+ afterEach(function(done){
+ var ctx = this;
+ process.nextTick(function(){
+ calls.push('after');
+ if (ctx.currentTest) {
+ calls.push('after test ' + ctx.currentTest.title + ' ' + ctx.currentTest.state);
+ }
+ done();
+ })
+ })
+ })
+})
diff --git a/tests/lib/mocha-3.1.0/test/hook-sync-nested.spec.js b/tests/lib/mocha-3.1.0/test/hook-sync-nested.spec.js
new file mode 100644
index 0000000000..b87c22298f
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/hook-sync-nested.spec.js
@@ -0,0 +1,98 @@
+describe('serial', function(){
+ describe('nested', function(){
+ var calls = [];
+
+ beforeEach(function(){
+ calls.push('parent before');
+ if (this.currentTest) {
+ calls.push('parent before test ' + this.currentTest.title);
+ }
+ })
+
+ afterEach(function(){
+ calls.push('parent after');
+ if (this.currentTest) {
+ calls.push('parent after test ' + this.currentTest.title + ' ' + this.currentTest.state);
+ }
+ });
+
+ it('foo', function(){
+ calls.should.eql([
+ 'parent before'
+ , 'parent before test foo']);
+ calls.push('foo');
+ })
+
+ it('bar', function(){
+ calls.should.eql([
+ 'parent before'
+ , 'parent before test foo'
+ , 'foo'
+ , 'parent after'
+ , 'parent after test foo passed'
+ , 'parent before'
+ , 'parent before test bar']);
+ })
+
+ describe('hooks', function(){
+ beforeEach(function(){
+ calls.push('before');
+ if (this.currentTest) {
+ calls.push('before test ' + this.currentTest.title);
+ }
+ })
+
+ it('one', function(){
+ calls.should.eql([
+ 'parent before'
+ , 'parent before test foo'
+ , 'foo'
+ , 'parent after'
+ , 'parent after test foo passed'
+ , 'parent before'
+ , 'parent before test bar'
+ , 'parent after'
+ , 'parent after test bar passed'
+ , 'parent before'
+ , 'parent before test one'
+ , 'before'
+ , 'before test one']);
+ calls.push('one');
+ })
+
+ it('two', function(){
+ calls.should.eql([
+ 'parent before'
+ , 'parent before test foo'
+ , 'foo'
+ , 'parent after'
+ , 'parent after test foo passed'
+ , 'parent before'
+ , 'parent before test bar'
+ , 'parent after'
+ , 'parent after test bar passed'
+ , 'parent before'
+ , 'parent before test one'
+ , 'before'
+ , 'before test one'
+ , 'one'
+ , 'after'
+ , 'after test one passed'
+ , 'parent after'
+ , 'parent after test one passed'
+ , 'parent before'
+ , 'parent before test two'
+ , 'before'
+ , 'before test two']);
+ calls.push('two');
+ });
+
+ afterEach(function(){
+ calls.push('after');
+ if (this.currentTest) {
+ calls.push('after test ' + this.currentTest.title + ' ' + this.currentTest.state);
+ }
+ })
+ })
+ })
+})
diff --git a/tests/lib/mocha-3.1.0/test/hook-sync.spec.js b/tests/lib/mocha-3.1.0/test/hook-sync.spec.js
new file mode 100644
index 0000000000..1d40f5d0c0
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/hook-sync.spec.js
@@ -0,0 +1,97 @@
+describe('serial', function(){
+ var calls = [];
+
+ beforeEach(function(){
+ calls.push('parent before');
+ })
+
+ afterEach(function(){
+ calls.push('parent after');
+ })
+
+ describe('hooks', function(){
+ beforeEach(function(){
+ calls.push('before');
+ if (this.currentTest) {
+ calls.push('before test ' + this.currentTest.title);
+ }
+ })
+
+ it('one', function(){
+ calls.should.eql([
+ 'parent before'
+ , 'before'
+ , 'before test one']);
+ calls.push('one');
+ })
+
+ it('two', function(){
+ calls.should.eql([
+ 'parent before'
+ , 'before'
+ , 'before test one'
+ , 'one'
+ , 'after'
+ , 'after test one passed'
+ , 'parent after'
+ , 'parent before'
+ , 'before'
+ , 'before test two']);
+ calls.push('two');
+ })
+
+ it('three', function(){
+ calls.should.eql([
+ 'parent before'
+ , 'before'
+ , 'before test one'
+ , 'one'
+ , 'after'
+ , 'after test one passed'
+ , 'parent after'
+ , 'parent before'
+ , 'before'
+ , 'before test two'
+ , 'two'
+ , 'after'
+ , 'after test two passed'
+ , 'parent after'
+ , 'parent before'
+ , 'before'
+ , 'before test three']);
+ calls.push('three');
+ })
+
+ afterEach(function(){
+ calls.push('after');
+ if (this.currentTest) {
+ calls.push('after test ' + this.currentTest.title + ' ' + this.currentTest.state);
+ }
+ })
+
+ after(function(){
+ calls.should.eql([
+ 'parent before'
+ , 'before'
+ , 'before test one'
+ , 'one'
+ , 'after'
+ , 'after test one passed'
+ , 'parent after'
+ , 'parent before'
+ , 'before'
+ , 'before test two'
+ , 'two'
+ , 'after'
+ , 'after test two passed'
+ , 'parent after'
+ , 'parent before'
+ , 'before'
+ , 'before test three'
+ , 'three'
+ , 'after'
+ , 'after test three passed'
+ , 'parent after']);
+ })
+ })
+})
diff --git a/tests/lib/mocha-3.1.0/test/hook-timeout.spec.js b/tests/lib/mocha-3.1.0/test/hook-timeout.spec.js
new file mode 100644
index 0000000000..155c1e95a6
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/hook-timeout.spec.js
@@ -0,0 +1,8 @@
+before(function(done){
+ this.timeout(100);
+ setTimeout(done, 50);
+})
+
+it('should work', function(done) {
+ done();
+});
diff --git a/tests/lib/mocha-3.1.0/test/http-meta-2.spec.js b/tests/lib/mocha-3.1.0/test/http-meta-2.spec.js
new file mode 100644
index 0000000000..fe9662b2e6
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/http-meta-2.spec.js
@@ -0,0 +1,91 @@
+var http = require('http');
+
+var PORT = 8899;
+
+var server = http.createServer(function(req, res){
+ var accept = req.headers.accept || ''
+ , json = ~accept.indexOf('json');
+
+ switch (req.url) {
+ case '/':
+ res.end('hello');
+ break;
+ case '/users':
+ if (json) {
+ res.end('["tobi","loki","jane"]');
+ } else {
+ res.end('tobi, loki, jane');
+ }
+ break;
+ }
+})
+
+function get(url) {
+ var fields
+ , expected
+ , header = {};
+
+ function request(done) {
+ http.get({ path: url, port: PORT, headers: header }, function(res){
+ var buf = '';
+ res.should.have.property('statusCode', 200);
+ res.setEncoding('utf8');
+ res.on('data', function(chunk){ buf += chunk });
+ res.on('end', function(){
+ buf.should.equal(expected);
+ done();
+ });
+ })
+ }
+
+ return {
+ set: function(field, val){
+ header[field] = val;
+ return this;
+ },
+
+ should: {
+ respond: function(body){
+ fields = Object.keys(header).map(function(field){
+ return field + ': ' + header[field];
+ }).join(', ');
+
+ expected = body;
+ describe('GET ' + url, function(){
+ this.timeout(500);
+ if (fields) {
+ describe('when given ' + fields, function(){
+ it('should respond with "' + body + '"', request);
+ });
+ } else {
+ it('should respond with "' + body + '"', request);
+ }
+ });
+ }
+ }
+ };
+}
+
+describe('http server', function(){
+
+ before(function(done) {
+ server.listen(PORT, done);
+ });
+
+ after(function() {
+ server.close();
+ });
+
+ get('/')
+ .should
+ .respond('hello')
+
+ get('/users')
+ .should
+ .respond('tobi, loki, jane')
+
+ get('/users')
+ .set('Accept', 'application/json')
+ .should
+ .respond('["tobi","loki","jane"]')
+})
diff --git a/tests/lib/mocha-3.1.0/test/http-meta.spec.js b/tests/lib/mocha-3.1.0/test/http-meta.spec.js
new file mode 100644
index 0000000000..5d1fb6750b
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/http-meta.spec.js
@@ -0,0 +1,61 @@
+var http = require('http');
+
+var PORT = 8889;
+
+var server = http.createServer(function(req, res){
+ var accept = req.headers.accept || ''
+ , json = ~accept.indexOf('json');
+
+ switch (req.url) {
+ case '/':
+ res.end('hello');
+ break;
+ case '/users':
+ if (json) {
+ res.end('["tobi","loki","jane"]');
+ } else {
+ res.end('tobi, loki, jane');
+ }
+ break;
+ }
+});
+
+
+function get(url, body, header) {
+ return function(done){
+ http.get({ path: url, port: PORT, headers: header || {}}, function(res){
+ var buf = '';
+ res.should.have.property('statusCode', 200);
+ res.setEncoding('utf8');
+ res.on('data', function(chunk){ buf += chunk });
+ res.on('end', function(){
+ buf.should.equal(body);
+ done();
+ });
+ })
+ }
+}
+
+describe('http requests', function () {
+
+ before(function(done) {
+ server.listen(PORT, done);
+ });
+
+ after(function() {
+ server.close();
+ });
+
+ describe('GET /', function () {
+ it('should respond with hello',
+ get('/', 'hello'))
+ })
+
+ describe('GET /users', function(){
+ it('should respond with users',
+ get('/users', 'tobi, loki, jane'))
+
+ it('should respond with users',
+ get('/users', '["tobi","loki","jane"]', { Accept: 'application/json' }))
+ })
+})
diff --git a/tests/lib/mocha-3.1.0/test/integration/diffs.spec.js b/tests/lib/mocha-3.1.0/test/integration/diffs.spec.js
new file mode 100644
index 0000000000..b779b84ada
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/integration/diffs.spec.js
@@ -0,0 +1,44 @@
+var assert = require('assert');
+var helpers = require('./helpers');
+var run = helpers.runMocha;
+var fs = require('fs');
+var getDiffs = helpers.getDiffs;
+
+function getExpectedOutput() {
+ var output = fs.readFileSync('test/integration/fixtures/diffs/output', 'UTF8');
+
+ // Diffs are delimited in file by "// DIFF"
+ return output.split(/\s*\/\/ DIFF/).slice(1).map(function(diff) {
+ return diff.split('\n').filter(Boolean).join('\n');
+ });
+}
+
+describe('diffs', function() {
+ var diffs, expected;
+
+ before(function(done) {
+ run('diffs/diffs.fixture.js', ['-C'], function(err, res) {
+ expected = getExpectedOutput();
+ diffs = getDiffs(res.output);
+ done(err);
+ });
+ });
+
+ [
+ 'should display a diff for small strings',
+ 'should display a diff of canonicalized objects',
+ 'should display a diff for medium strings',
+ 'should display a diff for entire object dumps',
+ 'should display a diff for multi-line strings',
+ 'should display a diff for entire object dumps',
+ 'should display a full-comparison with escaped special characters',
+ 'should display a word diff for large strings',
+ 'should work with objects',
+ 'should show value diffs and not be affected by commas',
+ 'should display diff by data and not like an objects'
+ ].forEach(function(title, i) {
+ it(title, function() {
+ assert.equal(diffs[i], expected[i]);
+ });
+ });
+});
diff --git a/tests/lib/mocha-3.1.0/test/integration/fixtures/cascade.fixture.js b/tests/lib/mocha-3.1.0/test/integration/fixtures/cascade.fixture.js
new file mode 100644
index 0000000000..10b1c37ffd
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/integration/fixtures/cascade.fixture.js
@@ -0,0 +1,57 @@
+describe('one', function() {
+ before(function() {
+ console.log('before one');
+ });
+
+ after(function() {
+ console.log('after one');
+ });
+
+ beforeEach(function() {
+ console.log(' before each one');
+ });
+
+ afterEach(function() {
+ console.log(' after each one');
+ });
+
+ describe('two', function() {
+ before(function() {
+ console.log(' before two');
+ });
+
+ after(function() {
+ console.log(' after two');
+ });
+
+ beforeEach(function() {
+ console.log(' before each two');
+ });
+
+ afterEach(function() {
+ console.log(' after each two');
+ });
+
+ describe('three', function() {
+ before(function() {
+ console.log(' before three');
+ });
+
+ after(function() {
+ console.log(' after three');
+ });
+
+ beforeEach(function() {
+ console.log(' before each three');
+ });
+
+ afterEach(function() {
+ console.log(' after each three');
+ });
+
+ it('should three', function() {
+ console.log(' TEST three');
+ });
+ });
+ });
+});
diff --git a/tests/lib/mocha-3.1.0/test/integration/fixtures/diffs/diffs.css.in b/tests/lib/mocha-3.1.0/test/integration/fixtures/diffs/diffs.css.in
new file mode 100644
index 0000000000..09a3ca5363
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/integration/fixtures/diffs/diffs.css.in
@@ -0,0 +1,9 @@
+body {
+ font: "Helvetica Neue", Helvetica, arial, sans-serif;
+ background: black;
+ color: white;
+}
+
+a {
+ color: blue
+}
diff --git a/tests/lib/mocha-3.1.0/test/integration/fixtures/diffs/diffs.css.out b/tests/lib/mocha-3.1.0/test/integration/fixtures/diffs/diffs.css.out
new file mode 100644
index 0000000000..53b3ec906e
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/integration/fixtures/diffs/diffs.css.out
@@ -0,0 +1,13 @@
+body {
+ font: "Helvetica Neue", Helvetica, arial, sans-serif;
+ background: black;
+ color: #fff;
+}
+
+a {
+ color: blue;
+}
+
+foo {
+ bar: 'baz';
+}
diff --git a/tests/lib/mocha-3.1.0/test/integration/fixtures/diffs/diffs.fixture.js b/tests/lib/mocha-3.1.0/test/integration/fixtures/diffs/diffs.fixture.js
new file mode 100644
index 0000000000..cf538fd777
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/integration/fixtures/diffs/diffs.fixture.js
@@ -0,0 +1,84 @@
+var fs = require('fs');
+var assert = require('assert');
+var cssin = fs.readFileSync('test/integration/fixtures/diffs/diffs.css.in', 'ascii');
+var cssout = fs.readFileSync('test/integration/fixtures/diffs/diffs.css.out', 'ascii');
+
+describe('diffs', function() {
+ var actual, expected;
+
+ it('should display a diff for small strings', function() {
+ actual = 'foo rar baz';
+ expected = 'foo bar baz';
+ actual.should.equal(expected);
+ });
+
+ it('should display a diff of canonicalized objects', function() {
+ actual = { name: 'travis j', age: 23 };
+ expected = { age: 23, name: 'travis' };
+ actual.should.equal(expected);
+ });
+
+ it('should display a diff for medium strings', function() {
+ actual = 'foo bar baz\nfoo rar baz\nfoo bar raz';
+ expected = 'foo bar baz\nfoo bar baz\nfoo bar baz';
+ actual.should.equal(expected);
+ });
+
+ it('should display a diff for entire object dumps', function() {
+ actual = { name: 'joel', age: 30, address: {city: 'new york', country: 'usa' }};
+ expected = { name: 'joe', age: 30, address: {city: 'new york', country: 'us' }};
+ actual.should.equal(expected);
+ });
+
+ it('should display a diff for multi-line strings', function() {
+ actual = 'one two three\nfour zzzz six\nseven eight nine';
+ expected = 'one two three\nfour five six\nseven eight nine';
+ actual.should.equal(expected);
+ });
+
+ it('should display a diff for entire object dumps', function() {
+ actual = { name: 'joel', age: 30, address: {city: 'new york', country: 'usa' }};
+ expected = { name: 'joe', age: 30, address: {city: 'new york', country: 'us' }}
+ actual.should.equal(expected);
+ });
+
+ it('should display a full-comparison with escaped special characters', function() {
+ actual = 'one\ttab\ntwo\t\t\ttabs';
+ expected = 'one\ttab\ntwo\t\ttabs';
+ actual.should.equal(expected);
+ });
+
+ it('should display a word diff for large strings', function() {
+ cssin.should.equal(cssout);
+ });
+
+ it('should work with objects', function() {
+ actual = {
+ name: 'tobi',
+ species: 'ferret',
+ color: 'white',
+ age: 2
+ };
+
+ expected = {
+ name: 'loki',
+ species: 'ferret',
+ color: 'brown',
+ age: 2
+ };
+
+ actual.should.eql(expected);
+ });
+
+ it('should show value diffs and not be affected by commas', function() {
+ actual = { a: 123 };
+ expected = { a: 123, b: 456 };
+ actual.should.equal(expected);
+ });
+
+ it('should display diff by data and not like an objects', function() {
+ actual = new Buffer([0x01]);
+ expected = new Buffer([0x02]);
+ actual.should.equal(expected);
+ });
+});
diff --git a/tests/lib/mocha-3.1.0/test/integration/fixtures/diffs/output b/tests/lib/mocha-3.1.0/test/integration/fixtures/diffs/output
new file mode 100644
index 0000000000..bf56a96397
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/integration/fixtures/diffs/output
@@ -0,0 +1,91 @@
+// DIFF
+ -foo rar baz
+ +foo bar baz
+
+// DIFF
+ {
+ "age": 23
+ - "name": "travis j"
+ + "name": "travis"
+ }
+
+// DIFF
+ foo bar baz
+ -foo rar baz
+ -foo bar raz
+ +foo bar baz
+ +foo bar baz
+
+// DIFF
+ {
+ "address": {
+ "city": "new york"
+ - "country": "usa"
+ + "country": "us"
+ }
+ "age": 30
+ - "name": "joel"
+ + "name": "joe"
+ }
+
+// DIFF
+ one two three
+ -four zzzz six
+ +four five six
+ seven eight nine
+
+// DIFF
+ {
+ "address": {
+ "city": "new york"
+ - "country": "usa"
+ + "country": "us"
+ }
+ "age": 30
+ - "name": "joel"
+ + "name": "joe"
+ }
+
+// DIFF
+ one tab
+ -two tabs
+ +two tabs
+
+// DIFF
+ body {
+ font: "Helvetica Neue", Helvetica, arial, sans-serif;
+ background: black;
+ - color: white;
+ + color: #fff;
+ }
+
+ a {
+ - color: blue
+ + color: blue;
+ }
+ +
+ +foo {
+ + bar: 'baz';
+ +}
+
+// DIFF
+ {
+ "age": 2
+ - "color": "white"
+ - "name": "tobi"
+ + "color": "brown"
+ + "name": "loki"
+ "species": "ferret"
+ }
+
+// DIFF
+ {
+ "a": 123
+ + "b": 456
+ }
+
+// DIFF
+ [
+ - 1
+ + 2
+ ]
diff --git a/tests/lib/mocha-3.1.0/test/integration/fixtures/hooks/after-hook-async-error.fixture.js b/tests/lib/mocha-3.1.0/test/integration/fixtures/hooks/after-hook-async-error.fixture.js
new file mode 100644
index 0000000000..dc55537a60
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/integration/fixtures/hooks/after-hook-async-error.fixture.js
@@ -0,0 +1,19 @@
+describe('spec 1', function () {
+ after(function (done) {
+ console.log('after');
+ process.nextTick(function () {
+ throw new Error('after hook error');
+ });
+ });
+ it('should be called because error is in after hook', function () {
+ console.log('test 1');
+ });
+ it('should be called because error is in after hook', function () {
+ console.log('test 2');
+ });
+});
+describe('spec 2', function () {
+ it('should be called, because hook error was in a sibling suite', function () {
+ console.log('test 3');
+ });
+});
diff --git a/tests/lib/mocha-3.1.0/test/integration/fixtures/hooks/after-hook-error.fixture.js b/tests/lib/mocha-3.1.0/test/integration/fixtures/hooks/after-hook-error.fixture.js
new file mode 100644
index 0000000000..e84856e433
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/integration/fixtures/hooks/after-hook-error.fixture.js
@@ -0,0 +1,17 @@
+describe('spec 1', function () {
+ after(function () {
+ console.log('after');
+ throw new Error('after hook error');
+ });
+ it('should be called because error is in after hook', function () {
+ console.log('test 1');
+ });
+ it('should be called because error is in after hook', function () {
+ console.log('test 2');
+ });
+});
+describe('spec 2', function () {
+ it('should be called, because hook error was in a sibling suite', function () {
+ console.log('test 3');
+ });
+});
diff --git a/tests/lib/mocha-3.1.0/test/integration/fixtures/hooks/afterEach-hook-async-error.fixture.js b/tests/lib/mocha-3.1.0/test/integration/fixtures/hooks/afterEach-hook-async-error.fixture.js
new file mode 100644
index 0000000000..d4f4c9bdd9
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/integration/fixtures/hooks/afterEach-hook-async-error.fixture.js
@@ -0,0 +1,19 @@
+describe('spec 1', function () {
+ afterEach(function (done) {
+ console.log('after');
+ process.nextTick(function () {
+ throw new Error('after each hook error');
+ });
+ });
+ it('should be called because error is in after each hook', function () {
+ console.log('test 1');
+ });
+ it('should not be called', function () {
+ console.log('test 2');
+ });
+});
+describe('spec 2', function () {
+ it('should be called, because hook error was in a sibling suite', function () {
+ console.log('test 3');
+ });
+});
diff --git a/tests/lib/mocha-3.1.0/test/integration/fixtures/hooks/afterEach-hook-error.fixture.js b/tests/lib/mocha-3.1.0/test/integration/fixtures/hooks/afterEach-hook-error.fixture.js
new file mode 100644
index 0000000000..9d28632fa3
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/integration/fixtures/hooks/afterEach-hook-error.fixture.js
@@ -0,0 +1,17 @@
+describe('spec 1', function () {
+ afterEach(function () {
+ console.log('after');
+ throw new Error('after each hook error');
+ });
+ it('should be called because error is in after each hook', function () {
+ console.log('test 1');
+ });
+ it('should not be called', function () {
+ console.log('test 2');
+ });
+});
+describe('spec 2', function () {
+ it('should be called, because hook error was in a sibling suite', function () {
+ console.log('test 3');
+ });
+});
diff --git a/tests/lib/mocha-3.1.0/test/integration/fixtures/hooks/before-hook-async-error-tip.fixture.js b/tests/lib/mocha-3.1.0/test/integration/fixtures/hooks/before-hook-async-error-tip.fixture.js
new file mode 100644
index 0000000000..14e114e959
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/integration/fixtures/hooks/before-hook-async-error-tip.fixture.js
@@ -0,0 +1,11 @@
+describe('spec 1', function() {
+ it('should not blame me', function() { });
+});
+describe('spec 2', function() {
+ before(function(done) {
+ process.nextTick(function () {
+ throw new Error('before hook error');
+ });
+ });
+ it('skipped');
+});
diff --git a/tests/lib/mocha-3.1.0/test/integration/fixtures/hooks/before-hook-async-error.fixture.js b/tests/lib/mocha-3.1.0/test/integration/fixtures/hooks/before-hook-async-error.fixture.js
new file mode 100644
index 0000000000..10ea95156b
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/integration/fixtures/hooks/before-hook-async-error.fixture.js
@@ -0,0 +1,19 @@
+describe('spec 1', function () {
+ before(function (done) {
+ console.log('before');
+ process.nextTick(function () {
+ throw new Error('before hook error');
+ });
+ });
+ it('should not be called because of error in before hook', function () {
+ console.log('test 1');
+ });
+ it('should not be called because of error in before hook', function () {
+ console.log('test 2');
+ });
+});
+describe('spec 2', function () {
+ it('should be called, because hook error was in a sibling suite', function () {
+ console.log('test 3');
+ });
+});
diff --git a/tests/lib/mocha-3.1.0/test/integration/fixtures/hooks/before-hook-error-tip.fixture.js b/tests/lib/mocha-3.1.0/test/integration/fixtures/hooks/before-hook-error-tip.fixture.js
new file mode 100644
index 0000000000..567dfef26b
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/integration/fixtures/hooks/before-hook-error-tip.fixture.js
@@ -0,0 +1,9 @@
+describe('spec 1', function() {
+ it('should not blame me', function() { });
+});
+describe('spec 2', function() {
+ before(function() {
+ throw new Error('before hook error');
+ });
+ it('skipped');
+});
diff --git a/tests/lib/mocha-3.1.0/test/integration/fixtures/hooks/before-hook-error.fixture.js b/tests/lib/mocha-3.1.0/test/integration/fixtures/hooks/before-hook-error.fixture.js
new file mode 100644
index 0000000000..b3d6ea6640
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/integration/fixtures/hooks/before-hook-error.fixture.js
@@ -0,0 +1,17 @@
+describe('spec 1', function () {
+ before(function () {
+ console.log('before');
+ throw new Error('before hook error');
+ });
+ it('should not be called because of error in before hook', function () {
+ console.log('test 1');
+ });
+ it('should not be called because of error in before hook', function () {
+ console.log('test 2');
+ });
+});
+describe('spec 2', function () {
+ it('should be called, because hook error was in a sibling suite', function () {
+ console.log('test 3');
+ });
+});
diff --git a/tests/lib/mocha-3.1.0/test/integration/fixtures/hooks/beforeEach-hook-async-error.fixture.js b/tests/lib/mocha-3.1.0/test/integration/fixtures/hooks/beforeEach-hook-async-error.fixture.js
new file mode 100644
index 0000000000..a34ed755e2
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/integration/fixtures/hooks/beforeEach-hook-async-error.fixture.js
@@ -0,0 +1,19 @@
+describe('spec 1', function () {
+ beforeEach(function (done) {
+ console.log('before');
+ process.nextTick(function () {
+ throw new Error('before each hook error');
+ });
+ });
+ it('should not be called because of error in before each hook', function () {
+ console.log('test 1');
+ });
+ it('should not be called because of error in before each hook', function () {
+ console.log('test 2');
+ });
+});
+describe('spec 2', function () {
+ it('should be called, because hook error was in a sibling suite', function () {
+ console.log('test 3');
+ });
+});
diff --git a/tests/lib/mocha-3.1.0/test/integration/fixtures/hooks/beforeEach-hook-error.fixture.js b/tests/lib/mocha-3.1.0/test/integration/fixtures/hooks/beforeEach-hook-error.fixture.js
new file mode 100644
index 0000000000..bd84e8fe74
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/integration/fixtures/hooks/beforeEach-hook-error.fixture.js
@@ -0,0 +1,17 @@
+describe('spec 1', function () {
+ beforeEach(function () {
+ console.log('before');
+ throw new Error('before each hook error');
+ });
+ it('should not be called because of error in before each hook', function () {
+ console.log('test 1');
+ });
+ it('should not be called because of error in before each hook', function () {
+ console.log('test 2');
+ });
+});
+describe('spec 2', function () {
+ it('should be called, because hook error was in a sibling suite', function () {
+ console.log('test 3');
+ });
+});
diff --git a/tests/lib/mocha-3.1.0/test/integration/fixtures/hooks/multiple-hook-async-error.fixture.js b/tests/lib/mocha-3.1.0/test/integration/fixtures/hooks/multiple-hook-async-error.fixture.js
new file mode 100644
index 0000000000..93ace7ff0d
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/integration/fixtures/hooks/multiple-hook-async-error.fixture.js
@@ -0,0 +1,139 @@
+before(function () {
+ console.log('root before');
+});
+beforeEach(function () {
+ console.log('root before each');
+});
+describe('1', function () {
+ beforeEach(function () {
+ console.log('1 before each');
+ });
+
+ describe('1-1', function () {
+ before(function () {
+ console.log('1-1 before');
+ });
+ beforeEach(function (done) {
+ console.log('1-1 before each');
+ process.nextTick(function () {
+ throw new Error('1-1 before each hook failed');
+ });
+ });
+ it('1-1 test 1', function () {
+ console.log('1-1 test 1');
+ });
+ it('1-1 test 2', function () {
+ console.log('1-1 test 2');
+ });
+ afterEach(function () {
+ console.log('1-1 after each');
+ });
+ after(function (done) {
+ console.log('1-1 after');
+ process.nextTick(function () {
+ throw new Error('1-1 after hook failed');
+ });
+ });
+ });
+
+ describe('1-2', function () {
+ before(function () {
+ console.log('1-2 before');
+ });
+ beforeEach(function () {
+ console.log('1-2 before each');
+ });
+ it('1-2 test 1', function () {
+ console.log('1-2 test 1');
+ });
+ it('1-2 test 2', function () {
+ console.log('1-2 test 2');
+ });
+ afterEach(function (done) {
+ console.log('1-2 after each');
+ process.nextTick(function () {
+ throw new Error('1-2 after each hook failed');
+ });
+ });
+ after(function () {
+ console.log('1-2 after');
+ });
+ });
+
+ afterEach(function () {
+ console.log('1 after each');
+ });
+
+ after(function () {
+ console.log('1 after');
+ });
+});
+
+describe('2', function () {
+ beforeEach(function (done) {
+ console.log('2 before each');
+ process.nextTick(function () {
+ throw new Error('2 before each hook failed');
+ });
+ });
+
+ describe('2-1', function () {
+ before(function () {
+ console.log('2-1 before');
+ });
+ beforeEach(function () {
+ console.log('2-1 before each');
+ });
+ it('2-1 test 1', function () {
+ console.log('2-1 test 1');
+ });
+ it('2-1 test 2', function () {
+ console.log('2-1 test 2');
+ });
+ afterEach(function () {
+ console.log('2-1 after each');
+ });
+ after(function () {
+ console.log('2-1 after');
+ });
+ });
+
+ describe('2-2', function () {
+ before(function () {
+ console.log('2-2 before');
+ });
+ beforeEach(function () {
+ console.log('2-2 before each');
+ });
+ it('2-2 test 1', function () {
+ console.log('2-2 test 1');
+ });
+ it('2-2 test 2', function () {
+ console.log('2-2 test 2');
+ });
+ afterEach(function () {
+ console.log('2-2 after each');
+ });
+ after(function () {
+ console.log('2-2 after');
+ });
+ });
+
+ afterEach(function (done) {
+ console.log('2 after each');
+ process.nextTick(function () {
+ throw new Error('2 after each hook failed');
+ });
+ });
+
+ after(function () {
+ console.log('2 after');
+ });
+});
+
+after(function () {
+ console.log('root after');
+});
+afterEach(function () {
+ console.log('root after each');
+});
diff --git a/tests/lib/mocha-3.1.0/test/integration/fixtures/hooks/multiple-hook-error.fixture.js b/tests/lib/mocha-3.1.0/test/integration/fixtures/hooks/multiple-hook-error.fixture.js
new file mode 100644
index 0000000000..53d167b1cf
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/integration/fixtures/hooks/multiple-hook-error.fixture.js
@@ -0,0 +1,129 @@
+before(function () {
+ console.log('root before');
+});
+beforeEach(function () {
+ console.log('root before each');
+});
+describe('1', function () {
+ beforeEach(function () {
+ console.log('1 before each');
+ });
+
+ describe('1-1', function () {
+ before(function () {
+ console.log('1-1 before');
+ });
+ beforeEach(function () {
+ console.log('1-1 before each');
+ throw new Error('1-1 before each hook failed');
+ });
+ it('1-1 test 1', function () {
+ console.log('1-1 test 1');
+ });
+ it('1-1 test 2', function () {
+ console.log('1-1 test 2');
+ });
+ afterEach(function () {
+ console.log('1-1 after each');
+ });
+ after(function () {
+ console.log('1-1 after');
+ throw new Error('1-1 after hook failed');
+ });
+ });
+
+ describe('1-2', function () {
+ before(function () {
+ console.log('1-2 before');
+ });
+ beforeEach(function () {
+ console.log('1-2 before each');
+ });
+ it('1-2 test 1', function () {
+ console.log('1-2 test 1');
+ });
+ it('1-2 test 2', function () {
+ console.log('1-2 test 2');
+ });
+ afterEach(function () {
+ console.log('1-2 after each');
+ throw new Error('1-2 after each hook failed');
+ });
+ after(function () {
+ console.log('1-2 after');
+ });
+ });
+
+ afterEach(function () {
+ console.log('1 after each');
+ });
+
+ after(function () {
+ console.log('1 after');
+ });
+});
+
+describe('2', function () {
+ beforeEach(function () {
+ console.log('2 before each');
+ throw new Error('2 before each hook failed');
+ });
+
+ describe('2-1', function () {
+ before(function () {
+ console.log('2-1 before');
+ });
+ beforeEach(function () {
+ console.log('2-1 before each');
+ });
+ it('2-1 test 1', function () {
+ console.log('2-1 test 1');
+ });
+ it('2-1 test 2', function () {
+ console.log('2-1 test 2');
+ });
+ afterEach(function () {
+ console.log('2-1 after each');
+ });
+ after(function () {
+ console.log('2-1 after');
+ });
+ });
+
+ describe('2-2', function () {
+ before(function () {
+ console.log('2-2 before');
+ });
+ beforeEach(function () {
+ console.log('2-2 before each');
+ });
+ it('2-2 test 1', function () {
+ console.log('2-2 test 1');
+ });
+ it('2-2 test 2', function () {
+ console.log('2-2 test 2');
+ });
+ afterEach(function () {
+ console.log('2-2 after each');
+ });
+ after(function () {
+ console.log('2-2 after');
+ });
+ });
+
+ afterEach(function () {
+ console.log('2 after each');
+ throw new Error('2 after each hook failed');
+ });
+
+ after(function () {
+ console.log('2 after');
+ });
+});
+
+after(function () {
+ console.log('root after');
+});
+afterEach(function () {
+ console.log('root after each');
+});
diff --git a/tests/lib/mocha-3.1.0/test/integration/fixtures/multiple-done-before.fixture.js b/tests/lib/mocha-3.1.0/test/integration/fixtures/multiple-done-before.fixture.js
new file mode 100644
index 0000000000..80d4adb61a
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/integration/fixtures/multiple-done-before.fixture.js
@@ -0,0 +1,10 @@
+describe('suite', function() {
+ before(function(done) {
+ setTimeout(done, 10);
+ setTimeout(done, 30);
+ });
+
+ it('test1', function(done) {
+ setTimeout(done, 50);
+ });
+});
diff --git a/tests/lib/mocha-3.1.0/test/integration/fixtures/multiple-done-beforeEach.fixture.js b/tests/lib/mocha-3.1.0/test/integration/fixtures/multiple-done-beforeEach.fixture.js
new file mode 100644
index 0000000000..9b4724dea1
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/integration/fixtures/multiple-done-beforeEach.fixture.js
@@ -0,0 +1,14 @@
+describe('suite', function() {
+ beforeEach(function(done) {
+ setTimeout(done, 10);
+ setTimeout(done, 20);
+ });
+
+ it('test1', function(done) {
+ setTimeout(done, 50);
+ });
+
+ it('test2', function(done) {
+ setTimeout(done, 50);
+ });
+});
diff --git a/tests/lib/mocha-3.1.0/test/integration/fixtures/multiple-done-specs.fixture.js b/tests/lib/mocha-3.1.0/test/integration/fixtures/multiple-done-specs.fixture.js
new file mode 100644
index 0000000000..82197061f1
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/integration/fixtures/multiple-done-specs.fixture.js
@@ -0,0 +1,10 @@
+describe('suite', function() {
+ it('test1', function(done) {
+ done();
+ setTimeout(done, 10);
+ });
+
+ it('test2', function(done) {
+ setTimeout(done, 20);
+ });
+});
diff --git a/tests/lib/mocha-3.1.0/test/integration/fixtures/multiple-done.fixture.js b/tests/lib/mocha-3.1.0/test/integration/fixtures/multiple-done.fixture.js
new file mode 100644
index 0000000000..63a704061c
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/integration/fixtures/multiple-done.fixture.js
@@ -0,0 +1,18 @@
+// The suite below should result in an additional error, but does
+// not. Uncomment once this bug is resolved.
+
+// describe('suite', function() {
+// beforeEach(function(done) {
+// done();
+// done();
+// });
+
+// it('test', function() {});
+// });
+
+it('should fail in a test-case', function(done) {
+ process.nextTick(function(){
+ done();
+ done();
+ });
+});
diff --git a/tests/lib/mocha-3.1.0/test/integration/fixtures/options/async-only-async.fixture.js b/tests/lib/mocha-3.1.0/test/integration/fixtures/options/async-only-async.fixture.js
new file mode 100644
index 0000000000..5387d169b7
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/integration/fixtures/options/async-only-async.fixture.js
@@ -0,0 +1,3 @@
+it('should pass', function(done){
+ done();
+});
diff --git a/tests/lib/mocha-3.1.0/test/integration/fixtures/options/async-only-sync.fixture.js b/tests/lib/mocha-3.1.0/test/integration/fixtures/options/async-only-sync.fixture.js
new file mode 100644
index 0000000000..d0dd9fa828
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/integration/fixtures/options/async-only-sync.fixture.js
@@ -0,0 +1 @@
+it('throws an error', function() {});
diff --git a/tests/lib/mocha-3.1.0/test/integration/fixtures/options/bail.fixture.js b/tests/lib/mocha-3.1.0/test/integration/fixtures/options/bail.fixture.js
new file mode 100644
index 0000000000..32d17e9aa8
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/integration/fixtures/options/bail.fixture.js
@@ -0,0 +1,21 @@
+describe('suite1', function() {
+ it('should display this spec', function() {});
+
+ it('should only display this error', function(done) {
+ throw new Error('this should be displayed');
+ });
+
+ it('should not display this error', function(done) {
+ throw new Error('this should not be displayed');
+ });
+});
+
+describe('suite2', function() {
+ before(function(done) {
+ throw new Error('this hook should not be displayed');
+ });
+
+ it('should not display this error', function(done) {
+ throw new Error('this should not be displayed');
+ });
+});
diff --git a/tests/lib/mocha-3.1.0/test/integration/fixtures/options/delay-fail.fixture.js b/tests/lib/mocha-3.1.0/test/integration/fixtures/options/delay-fail.fixture.js
new file mode 100644
index 0000000000..1475c918d4
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/integration/fixtures/options/delay-fail.fixture.js
@@ -0,0 +1,5 @@
+setTimeout(function() {
+ throw new Error('oops');
+ it('test', function() {});
+ run();
+}, 100);
diff --git a/tests/lib/mocha-3.1.0/test/integration/fixtures/options/delay.fixture.js b/tests/lib/mocha-3.1.0/test/integration/fixtures/options/delay.fixture.js
new file mode 100644
index 0000000000..a8bf2d4112
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/integration/fixtures/options/delay.fixture.js
@@ -0,0 +1,14 @@
+var assert = require('assert');
+var delay = 500;
+
+setTimeout(function() {
+ describe('delayed execution', function() {
+ it('should have no effect if attempted twice in the same suite', function() {
+ assert(true);
+ run();
+ assert(true);
+ });
+ });
+
+ run();
+}, delay);
diff --git a/tests/lib/mocha-3.1.0/test/integration/fixtures/options/grep.fixture.js b/tests/lib/mocha-3.1.0/test/integration/fixtures/options/grep.fixture.js
new file mode 100644
index 0000000000..94785dc7db
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/integration/fixtures/options/grep.fixture.js
@@ -0,0 +1,17 @@
+describe('grep', function() {
+ describe('Match', function() {
+ it('should run', function(){});
+ it('should also run', function() {});
+ });
+
+ describe('match', function() {
+ it('should run', function(){});
+ it('should also run', function() {});
+ });
+
+ describe('fail', function() {
+ it('should not be ran', function() {
+ throw new Error('Spec should not run');
+ });
+ });
+});
diff --git a/tests/lib/mocha-3.1.0/test/integration/fixtures/options/only/bdd.fixture.js b/tests/lib/mocha-3.1.0/test/integration/fixtures/options/only/bdd.fixture.js
new file mode 100644
index 0000000000..783ce19b0b
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/integration/fixtures/options/only/bdd.fixture.js
@@ -0,0 +1,71 @@
+describe.only('should run this suite', function() {
+ it('should run this test', function() {});
+
+ it('should run this test', function() {});
+
+ it('should run this test', function() {});
+});
+
+describe('should not run this suite', function() {
+ it('should not run this test', function() {
+ (true).should.equal(false);
+ });
+
+ it('should not run this test', function() {
+ (true).should.equal(false);
+ });
+
+ it('should not run this test', function() {
+ (true).should.equal(false);
+ });
+});
+
+describe.only('should run this suite too', function() {
+ describe('should run this nested suite', function () {
+ it('should run this test', function() {});
+
+ it('should run this test', function() {});
+
+ it('should run this test', function() {});
+ });
+});
+
+describe.only('should run this suite, even', function() {
+ describe('should run this nested suite, even', function () {
+ describe('should run this doubly-nested suite!', function () {
+ it('should run this test', function() {});
+
+ it('should run this test', function() {});
+
+ it('should run this test', function() {});
+ });
+ });
+});
+
+
+describe('should run this suite with an exclusive test', function() {
+ it.only('should run this test', function () {});
+
+ describe('should not run this nested suite', function () {
+ describe.only('should not run this doubly-nested suite', function () {
+ it('should not run this test', function() {});
+
+ it('should not run this test', function() {});
+
+ it('should not run this test', function() {});
+ });
+ });
+});
+
+describe('should run this suite with an exclusive test (reverse order)', function() {
+ describe('should not run this nested suite', function () {
+ describe.only('should not run this doubly-nested suite', function () {
+ it('should not run this test', function() {});
+
+ it('should not run this test', function() {});
+
+ it('should not run this test', function() {});
+ });
+ });
+ it.only('should run this test', function () {});
+});
diff --git a/tests/lib/mocha-3.1.0/test/integration/fixtures/options/only/qunit.fixture.js b/tests/lib/mocha-3.1.0/test/integration/fixtures/options/only/qunit.fixture.js
new file mode 100644
index 0000000000..9fa95f440b
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/integration/fixtures/options/only/qunit.fixture.js
@@ -0,0 +1,26 @@
+suite.only('should run all tests in this suite');
+
+test('should run this test #1', function() {});
+
+test('should run this test #2', function() {});
+
+test('should run this test #3', function() {});
+
+test('should run this test #4', function() {});
+
+test('should run this test #5', function() {});
+
+
+suite('should not run any of this suite\'s tests');
+
+test('should not run this test', function() {
+ (false).should.equal(true);
+});
+
+test('should not run this test', function() {
+ (false).should.equal(true);
+});
+
+test('should not run this test', function() {
+ (false).should.equal(true);
+}); \ No newline at end of file
diff --git a/tests/lib/mocha-3.1.0/test/integration/fixtures/options/only/tdd.fixture.js b/tests/lib/mocha-3.1.0/test/integration/fixtures/options/only/tdd.fixture.js
new file mode 100644
index 0000000000..129a9e5d74
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/integration/fixtures/options/only/tdd.fixture.js
@@ -0,0 +1,35 @@
+suite.only('should run all tests in this tdd suite', function() {
+ test('should run this test #1', function() {});
+
+ test('should run this test #2', function() {});
+
+ test('should run this test #3', function() {});
+
+ test('should run this test #4', function() {});
+});
+
+suite('should not run this suite', function() {
+ test('should not run this test', function() {
+ (true).should.equal(false);
+ });
+
+ test('should not run this test', function() {
+ (true).should.equal(false);
+ });
+
+ test('should not run this test', function() {
+ (true).should.equal(false);
+ });
+});
+
+suite.only('should run this suite too', function() {
+ suite('should run this nested suite', function () {
+ test('should run this test', function() {});
+
+ test('should run this test', function() {});
+
+ test('should run this test', function() {});
+
+ test('should run this test', function() {});
+ });
+});
diff --git a/tests/lib/mocha-3.1.0/test/integration/fixtures/options/retries.fixture.js b/tests/lib/mocha-3.1.0/test/integration/fixtures/options/retries.fixture.js
new file mode 100644
index 0000000000..b2f76e12ea
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/integration/fixtures/options/retries.fixture.js
@@ -0,0 +1,5 @@
+describe('retries', function() {
+ it('should fail', function () {
+ throw new Error('retry failure');
+ });
+});
diff --git a/tests/lib/mocha-3.1.0/test/integration/fixtures/options/sort-alpha.fixture.js b/tests/lib/mocha-3.1.0/test/integration/fixtures/options/sort-alpha.fixture.js
new file mode 100644
index 0000000000..7a5302994f
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/integration/fixtures/options/sort-alpha.fixture.js
@@ -0,0 +1,7 @@
+describe('alpha', function(){
+ it('should be executed first', function(){
+ if (global.beta) {
+ throw new Error('alpha was not executed first');
+ }
+ });
+});
diff --git a/tests/lib/mocha-3.1.0/test/integration/fixtures/options/sort-beta.fixture.js b/tests/lib/mocha-3.1.0/test/integration/fixtures/options/sort-beta.fixture.js
new file mode 100644
index 0000000000..0951f49038
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/integration/fixtures/options/sort-beta.fixture.js
@@ -0,0 +1,5 @@
+describe('beta', function(){
+ it('should be executed second', function(){
+ global.beta = 1;
+ });
+});
diff --git a/tests/lib/mocha-3.1.0/test/integration/fixtures/passing.fixture.js b/tests/lib/mocha-3.1.0/test/integration/fixtures/passing.fixture.js
new file mode 100644
index 0000000000..df91b3e501
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/integration/fixtures/passing.fixture.js
@@ -0,0 +1,11 @@
+var assert = require('assert');
+
+describe('suite', function() {
+ it('test1', function() {
+ assert(true);
+ });
+
+ it('test2', function() {
+ assert(true);
+ });
+});
diff --git a/tests/lib/mocha-3.1.0/test/integration/fixtures/pending/skip-async-before.fixture.js b/tests/lib/mocha-3.1.0/test/integration/fixtures/pending/skip-async-before.fixture.js
new file mode 100644
index 0000000000..114db36d88
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/integration/fixtures/pending/skip-async-before.fixture.js
@@ -0,0 +1,16 @@
+describe('skip in before', function() {
+ before(function(done) {
+ var self = this;
+ setTimeout(function() {
+ self.skip();
+ }, 50);
+ });
+
+ it('should never run this test', function() {
+ throw new Error('never thrown');
+ });
+
+ it('should never run this test', function() {
+ throw new Error('never thrown');
+ });
+});
diff --git a/tests/lib/mocha-3.1.0/test/integration/fixtures/pending/skip-async-beforeEach.fixture.js b/tests/lib/mocha-3.1.0/test/integration/fixtures/pending/skip-async-beforeEach.fixture.js
new file mode 100644
index 0000000000..b8db22b94a
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/integration/fixtures/pending/skip-async-beforeEach.fixture.js
@@ -0,0 +1,16 @@
+describe('skip in beforeEach', function() {
+ beforeEach(function(done) {
+ var self = this;
+ setTimeout(function() {
+ self.skip();
+ }, 50);
+ });
+
+ it('should never run this test', function() {
+ throw new Error('never thrown');
+ });
+
+ it('should never run this test', function() {
+ throw new Error('never thrown');
+ });
+});
diff --git a/tests/lib/mocha-3.1.0/test/integration/fixtures/pending/skip-async-spec.fixture.js b/tests/lib/mocha-3.1.0/test/integration/fixtures/pending/skip-async-spec.fixture.js
new file mode 100644
index 0000000000..6096c59d2a
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/integration/fixtures/pending/skip-async-spec.fixture.js
@@ -0,0 +1,12 @@
+describe('skip in test', function() {
+ it('should skip async', function(done) {
+ var self = this;
+ setTimeout(function() {
+ self.skip();
+ }, 50);
+ });
+
+ it('should run other tests in the suite', function() {
+ // Do nothing
+ });
+});
diff --git a/tests/lib/mocha-3.1.0/test/integration/fixtures/pending/skip-sync-before.fixture.js b/tests/lib/mocha-3.1.0/test/integration/fixtures/pending/skip-sync-before.fixture.js
new file mode 100644
index 0000000000..35152e27f4
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/integration/fixtures/pending/skip-sync-before.fixture.js
@@ -0,0 +1,13 @@
+describe('skip in before', function() {
+ before(function() {
+ this.skip();
+ });
+
+ it('should never run this test', function() {
+ throw new Error('never thrown');
+ });
+
+ it('should never run this test', function() {
+ throw new Error('never thrown');
+ });
+});
diff --git a/tests/lib/mocha-3.1.0/test/integration/fixtures/pending/skip-sync-beforeEach.fixture.js b/tests/lib/mocha-3.1.0/test/integration/fixtures/pending/skip-sync-beforeEach.fixture.js
new file mode 100644
index 0000000000..8d1c442ce2
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/integration/fixtures/pending/skip-sync-beforeEach.fixture.js
@@ -0,0 +1,13 @@
+describe('skip in beforeEach', function() {
+ beforeEach(function() {
+ this.skip();
+ });
+
+ it('should never run this test', function() {
+ throw new Error('never thrown');
+ });
+
+ it('should never run this test', function() {
+ throw new Error('never thrown');
+ });
+});
diff --git a/tests/lib/mocha-3.1.0/test/integration/fixtures/pending/skip-sync-spec.fixture.js b/tests/lib/mocha-3.1.0/test/integration/fixtures/pending/skip-sync-spec.fixture.js
new file mode 100644
index 0000000000..e2bbb739b3
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/integration/fixtures/pending/skip-sync-spec.fixture.js
@@ -0,0 +1,10 @@
+describe('skip in test', function() {
+ it('should skip immediately', function() {
+ this.skip();
+ throw new Error('never thrown');
+ });
+
+ it('should run other tests in the suite', function() {
+ // Do nothing
+ });
+});
diff --git a/tests/lib/mocha-3.1.0/test/integration/fixtures/pending/spec.fixture.js b/tests/lib/mocha-3.1.0/test/integration/fixtures/pending/spec.fixture.js
new file mode 100644
index 0000000000..084dd33588
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/integration/fixtures/pending/spec.fixture.js
@@ -0,0 +1,3 @@
+describe('suite', function() {
+ it('pending spec');
+});
diff --git a/tests/lib/mocha-3.1.0/test/integration/fixtures/regression/1794/issue-1794.fixture.js b/tests/lib/mocha-3.1.0/test/integration/fixtures/regression/1794/issue-1794.fixture.js
new file mode 100644
index 0000000000..1a1637f30a
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/integration/fixtures/regression/1794/issue-1794.fixture.js
@@ -0,0 +1,3 @@
+test('pass', function() {
+ // pass
+});
diff --git a/tests/lib/mocha-3.1.0/test/integration/fixtures/regression/1794/simple-ui.js b/tests/lib/mocha-3.1.0/test/integration/fixtures/regression/1794/simple-ui.js
new file mode 100644
index 0000000000..1fdf33d665
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/integration/fixtures/regression/1794/simple-ui.js
@@ -0,0 +1,27 @@
+var path = '../../../../../lib/',
+ Mocha = require(path + 'mocha');
+ Suite = require(path + 'suite'),
+ Test = require(path + 'test');
+
+/**
+ * A simple UI that only exposes a single function: test
+ */
+module.exports = Mocha.interfaces['simple-ui'] = function(suite) {
+ suite.on('pre-require', function(context, file, mocha) {
+ var common = require(path + 'interfaces/common')([suite], context);
+
+ context.run = mocha.options.delay && common.runWithSuite(suite);
+
+ /**
+ * Describes a specification or test-case with the given `title`
+ * and callback `fn` acting as a thunk.
+ */
+ context.test = function(title, fn) {
+ var test = new Test(title, fn);
+ test.file = file;
+ suite.addTest(test);
+
+ return test;
+ };
+ });
+};
diff --git a/tests/lib/mocha-3.1.0/test/integration/fixtures/regression/issue-1327.fixture.js b/tests/lib/mocha-3.1.0/test/integration/fixtures/regression/issue-1327.fixture.js
new file mode 100644
index 0000000000..43d5553762
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/integration/fixtures/regression/issue-1327.fixture.js
@@ -0,0 +1,15 @@
+it('test 1', function() {
+ console.log('testbody1');
+ process.nextTick(function() {
+ throw 'Too bad';
+ });
+});
+
+it('test 2', function() {
+ console.log('testbody2');
+});
+
+it('test 3', function() {
+ console.log('testbody3');
+ throw new Error('OUCH');
+});
diff --git a/tests/lib/mocha-3.1.0/test/integration/fixtures/regression/issue-1991.fixture.js b/tests/lib/mocha-3.1.0/test/integration/fixtures/regression/issue-1991.fixture.js
new file mode 100644
index 0000000000..96860332a2
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/integration/fixtures/regression/issue-1991.fixture.js
@@ -0,0 +1,47 @@
+function MemoryLeak() {
+ this.myArr = [];
+ for (var i = 0; i < 1000000; i++) {
+ this.myArr.push(i)
+ }
+}
+
+var numOfTests = 300;
+for (var i = 0; i < numOfTests; i += 1) {
+ /*
+ * This Test suite will crash V8 due to:
+ * 'FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - process out of memory'
+ * if all the deferred functions references have not been cleared
+ */
+ describe('Memory Leak Suite #' + i, function () {
+
+ // The <closureVar> variable will be accessed by the test below.
+ // As long as those test's functions are
+ // referenced in memory, the closure variable may not be garbage collected
+ // as it is still referenced.
+ // * In a chrome heap snapshot it will appear under "system / Context" (a scope)
+ var closureVar;
+
+ before(function () {
+ var x = closureVar ? 1 : 2
+ });
+
+ after(function () {
+ var x = closureVar[0]
+ });
+
+ beforeEach(function () {
+ var x = closureVar ? 1 : 2
+ });
+
+ afterEach(function () {
+ var x = closureVar[0]
+ });
+
+ it('access a variable via a closure', function () {
+ // slow performance on older node.js versions
+ this.timeout(1000);
+ closureVar = new MemoryLeak();
+ });
+
+ });
+}
diff --git a/tests/lib/mocha-3.1.0/test/integration/fixtures/regression/issue-2315.js b/tests/lib/mocha-3.1.0/test/integration/fixtures/regression/issue-2315.js
new file mode 100644
index 0000000000..cdfb201059
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/integration/fixtures/regression/issue-2315.js
@@ -0,0 +1,9 @@
+describe('issue-2315: cannot read property currentRetry of undefined', function () {
+ before(function () {
+ process.nextTick(function () {
+ throw new Error();
+ });
+ });
+
+ it('something', function () {});
+});
diff --git a/tests/lib/mocha-3.1.0/test/integration/fixtures/regression/issue-2406.fixture.js b/tests/lib/mocha-3.1.0/test/integration/fixtures/regression/issue-2406.fixture.js
new file mode 100644
index 0000000000..c800228f1e
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/integration/fixtures/regression/issue-2406.fixture.js
@@ -0,0 +1,15 @@
+describe('outer describe', function() {
+ it('should not run this test', function() {});
+ describe('this suite should not run', function() {
+ it('should not run this test', function() {});
+ });
+ describe.only('this .only suite should run', function() {
+ describe('this suite should run', function() {
+ it('should run this test in a nested suite', function() {});
+ });
+ it('should run this test', function() {});
+ });
+ describe('this suite should not run', function() {
+ it('should not run this test', function() {});
+ });
+});
diff --git a/tests/lib/mocha-3.1.0/test/integration/fixtures/regression/issue-2417.fixture.js b/tests/lib/mocha-3.1.0/test/integration/fixtures/regression/issue-2417.fixture.js
new file mode 100644
index 0000000000..e14aab09db
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/integration/fixtures/regression/issue-2417.fixture.js
@@ -0,0 +1,7 @@
+describe('outer describe', function() {
+ describe.only('outer describe.only', function() {
+ it.only('inner it.only', function() {
+ // should run and exit without error
+ });
+ });
+});
diff --git a/tests/lib/mocha-3.1.0/test/integration/fixtures/retries/async.fixture.js b/tests/lib/mocha-3.1.0/test/integration/fixtures/retries/async.fixture.js
new file mode 100644
index 0000000000..0e917e52f3
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/integration/fixtures/retries/async.fixture.js
@@ -0,0 +1,28 @@
+describe('retries', function() {
+ var times = 0;
+ before(function () {
+ console.log('before');
+ });
+
+ after(function () {
+ console.log('after');
+ });
+
+ beforeEach(function() {
+ console.log('before each', times);
+ });
+
+ afterEach(function () {
+ console.log('after each', times);
+ });
+
+ it('should allow override and run appropriate hooks', function (done) {
+ this.timeout(200);
+ this.retries(2);
+ console.log('TEST', times);
+ if (++times < 3) {
+ return setTimeout(done, 300);
+ }
+ setTimeout(done, 50);
+ });
+});
diff --git a/tests/lib/mocha-3.1.0/test/integration/fixtures/retries/early-pass.fixture.js b/tests/lib/mocha-3.1.0/test/integration/fixtures/retries/early-pass.fixture.js
new file mode 100644
index 0000000000..0010d120fa
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/integration/fixtures/retries/early-pass.fixture.js
@@ -0,0 +1,11 @@
+describe('retries', function() {
+ this.retries(1);
+ var times = 0;
+
+ it('should pass after 1 retry', function() {
+ times++;
+ if (times !== 2) {
+ throw new Error('retry error ' + times);
+ }
+ });
+});
diff --git a/tests/lib/mocha-3.1.0/test/integration/fixtures/retries/hooks.fixture.js b/tests/lib/mocha-3.1.0/test/integration/fixtures/retries/hooks.fixture.js
new file mode 100644
index 0000000000..47f6c6a1b7
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/integration/fixtures/retries/hooks.fixture.js
@@ -0,0 +1,25 @@
+describe('retries', function() {
+ var times = 0;
+ before(function () {
+ console.log('before');
+ });
+
+ after(function () {
+ console.log('after');
+ });
+
+ beforeEach(function() {
+ console.log('before each', times);
+ });
+
+ afterEach(function () {
+ console.log('after each', times);
+ });
+
+ it('should allow override and run appropriate hooks', function(){
+ this.retries(4);
+ console.log('TEST', times);
+ times++;
+ throw new Error('retry error');
+ });
+});
diff --git a/tests/lib/mocha-3.1.0/test/integration/fixtures/retries/nested.fixture.js b/tests/lib/mocha-3.1.0/test/integration/fixtures/retries/nested.fixture.js
new file mode 100644
index 0000000000..43c40cb236
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/integration/fixtures/retries/nested.fixture.js
@@ -0,0 +1,9 @@
+describe('retries', function() {
+ this.retries(3);
+ describe('nested', function () {
+ it('should fail after only 1 retry', function(){
+ this.retries(1);
+ throw new Error('retry error');
+ });
+ });
+});
diff --git a/tests/lib/mocha-3.1.0/test/integration/fixtures/suite/suite-no-callback.fixture.js b/tests/lib/mocha-3.1.0/test/integration/fixtures/suite/suite-no-callback.fixture.js
new file mode 100644
index 0000000000..de55b358a3
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/integration/fixtures/suite/suite-no-callback.fixture.js
@@ -0,0 +1 @@
+describe('a suite without a callback');
diff --git a/tests/lib/mocha-3.1.0/test/integration/fixtures/suite/suite-skipped-callback.fixture.js b/tests/lib/mocha-3.1.0/test/integration/fixtures/suite/suite-skipped-callback.fixture.js
new file mode 100644
index 0000000000..b30b67ee2e
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/integration/fixtures/suite/suite-skipped-callback.fixture.js
@@ -0,0 +1 @@
+xdescribe('a pending suite with a callback', function () {});
diff --git a/tests/lib/mocha-3.1.0/test/integration/fixtures/suite/suite-skipped-no-callback.fixture.js b/tests/lib/mocha-3.1.0/test/integration/fixtures/suite/suite-skipped-no-callback.fixture.js
new file mode 100644
index 0000000000..c5bca84a47
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/integration/fixtures/suite/suite-skipped-no-callback.fixture.js
@@ -0,0 +1 @@
+xdescribe('a pending suite without a callback');
diff --git a/tests/lib/mocha-3.1.0/test/integration/fixtures/timeout.fixture.js b/tests/lib/mocha-3.1.0/test/integration/fixtures/timeout.fixture.js
new file mode 100644
index 0000000000..d8c99b2bc3
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/integration/fixtures/timeout.fixture.js
@@ -0,0 +1,17 @@
+describe('timeout', function(){
+ this.timeout(1);
+
+ it('should be honored with sync suites', function() {
+ sleep(2);
+ });
+
+ it('should be honored with async suites', function(done) {
+ sleep(2);
+ done();
+ });
+
+ function sleep(ms) {
+ var start = Date.now();
+ while (start + ms > Date.now());
+ }
+});
diff --git a/tests/lib/mocha-3.1.0/test/integration/fixtures/uncaught-hook.fixture.js b/tests/lib/mocha-3.1.0/test/integration/fixtures/uncaught-hook.fixture.js
new file mode 100644
index 0000000000..9adcb3f726
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/integration/fixtures/uncaught-hook.fixture.js
@@ -0,0 +1,15 @@
+describe('uncaught', function() {
+ beforeEach(function(done) {
+ process.nextTick(function() {
+ throw new Error('oh noes');
+ done();
+ });
+ });
+
+ it('test', function(done) {
+ process.nextTick(function() {
+ throw new Error("I'm uncaught!");
+ done();
+ });
+ });
+});
diff --git a/tests/lib/mocha-3.1.0/test/integration/fixtures/uncaught.fixture.js b/tests/lib/mocha-3.1.0/test/integration/fixtures/uncaught.fixture.js
new file mode 100644
index 0000000000..054d1d857b
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/integration/fixtures/uncaught.fixture.js
@@ -0,0 +1,26 @@
+'use strict';
+
+/**
+ * This file should only generate one failure per spec despite the fact that
+ * Mocha is capable of detecting two distinct exceptions during test execution.
+ */
+
+it('fails exactly once when a global error is thrown first', function(done) {
+ setTimeout(function() {
+ throw new Error('global error');
+
+ setTimeout(function() {
+ done(new Error('test error'));
+ }, 0);
+ }, 0);
+});
+
+it('fails exactly once when a global error is thrown second', function(done) {
+ setTimeout(function() {
+ done(new Error('test error'));
+ }, 0);
+
+ setTimeout(function() {
+ throw new Error('global error');
+ }, 0);
+});
diff --git a/tests/lib/mocha-3.1.0/test/integration/helpers.js b/tests/lib/mocha-3.1.0/test/integration/helpers.js
new file mode 100644
index 0000000000..2720eb3bda
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/integration/helpers.js
@@ -0,0 +1,191 @@
+var spawn = require('child_process').spawn;
+var path = require('path');
+var fs = require('fs');
+var baseReporter = require('../../lib/reporters/base');
+
+module.exports = {
+ /**
+ * Invokes the mocha binary for the given fixture with color output disabled.
+ * Accepts an array of additional command line args to pass. The callback is
+ * invoked with a summary of the run, in addition to its output. The summary
+ * includes the number of passing, pending, and failing tests, as well as the
+ * exit code. Useful for testing different reporters.
+ *
+ * Example response:
+ * {
+ * pending: 0,
+ * passing: 0,
+ * failing: 1,
+ * code: 1,
+ * output: '...'
+ * }
+ *
+ * @param {string} fixturePath
+ * @param {array} args
+ * @param {function} fn
+ */
+ runMocha: function(fixturePath, args, fn) {
+ var path;
+
+ path = resolveFixturePath(fixturePath);
+ args = args || [];
+
+ invokeMocha(args.concat(['-C', path]), function(err, res) {
+ if (err) return fn(err);
+
+ fn(null, getSummary(res));
+ });
+ },
+
+ /**
+ * Invokes the mocha binary on the code of the body of the function.
+ * Accepts an array of additional command line args to pass. The callback is
+ * invoked with a summary of the run, in addition to its output. The summary
+ * includes the number of passing, pending, and failing tests, as well as the
+ * exit code. Useful for testing different reporters.
+ *
+ * Example response:
+ * {
+ * pending: 0,
+ * passing: 0,
+ * failing: 1,
+ * code: 1,
+ * output: '...'
+ * }
+ *
+ * @param {function} fixture
+ * @param {array} args
+ * @param {function} fn
+ */
+ runMochaFunction: function(fixture, args, fn) {
+ var path = resolveFixturePath(fixture.name + '.js' || 'tempfile.js');
+ args = args || [];
+
+ var fixtureContent = 'var fn = ' + fixture.toString() + '; fn()';
+ fs.writeFileSync(path, fixtureContent, 'utf8');
+
+ function cleanup() {
+ fs.unlink(path);
+ fn.apply(this, arguments);
+ }
+
+ invokeMocha(args.concat(['-C', path]), function(err, res) {
+ if (err) {
+ return cleanup(err);
+ }
+
+ cleanup(null, getSummary(res));
+ });
+ },
+
+ /**
+ * Invokes the mocha binary for the given fixture using the JSON reporter,
+ * returning the parsed output, as well as exit code.
+ *
+ * @param {string} fixturePath
+ * @param {array} args
+ * @param {function} fn
+ */
+ runMochaJSON: function(fixturePath, args, fn) {
+ var path;
+
+ path = resolveFixturePath(fixturePath);
+ args = args || [];
+
+ invokeMocha(args.concat(['--reporter', 'json', path]), function(err, res) {
+ if (err) return fn(err);
+
+ try {
+ var result = JSON.parse(res.output);
+ result.code = res.code;
+ } catch (err) {
+ return fn(err);
+ }
+
+ fn(null, result);
+ });
+ },
+
+ /**
+ * Returns an array of diffs corresponding to exceptions thrown from specs,
+ * given the plaintext output (-C) of a mocha run.
+ *
+ * @param {string} output
+ * returns {string[]}
+ */
+ getDiffs: function(output) {
+ var diffs, i, inDiff, inStackTrace;
+
+ diffs = [];
+ output.split('\n').forEach(function(line) {
+ if (line.match(/^ \d+\)/)) {
+ // New spec, e.g. "1) spec title"
+ diffs.push([]);
+ i = diffs.length - 1;
+ inStackTrace = false;
+ inDiff = false;
+ } else if (!diffs.length || inStackTrace) {
+ // Haven't encountered a spec yet
+ // or we're in the middle of a stack trace
+ return;
+ } else if (line.indexOf('+ expected - actual') !== -1) {
+ inDiff = true;
+ } else if (line.match(/at Context/)) {
+ // At the start of a stack trace
+ inStackTrace = true;
+ inDiff = false;
+ } else if (inDiff) {
+ diffs[i].push(line);
+ }
+ });
+
+ // Ignore empty lines before/after diff
+ return diffs.map(function(diff) {
+ return diff.slice(1, -3).join('\n');
+ });
+ },
+
+ /**
+ * regular expression used for splitting lines based on new line / dot symbol.
+ */
+ splitRegExp: new RegExp('[\\n' + baseReporter.symbols.dot + ']+')
+};
+
+function invokeMocha(args, fn) {
+ var output, mocha, listener;
+
+ output = '';
+ args = [path.join('bin', 'mocha')].concat(args);
+ mocha = spawn(process.execPath, args);
+
+ listener = function(data) {
+ output += data;
+ };
+
+ mocha.stdout.on('data', listener);
+ mocha.stderr.on('data', listener);
+ mocha.on('error', fn);
+
+ mocha.on('close', function(code) {
+ fn(null, {
+ output: output.split('\n').join('\n'),
+ code: code
+ });
+ });
+}
+
+function resolveFixturePath(fixture) {
+ return path.join('./test/integration/fixtures', fixture);
+}
+
+function getSummary(res) {
+ return ['passing', 'pending', 'failing'].reduce(function(summary, type) {
+ var pattern, match;
+
+ pattern = new RegExp(' (\\d+) ' + type + '\\s');
+ match = pattern.exec(res.output);
+ summary[type] = (match) ? parseInt(match, 10) : 0;
+
+ return summary;
+ }, res);
+}
diff --git a/tests/lib/mocha-3.1.0/test/integration/hook-err.spec.js b/tests/lib/mocha-3.1.0/test/integration/hook-err.spec.js
new file mode 100644
index 0000000000..be18721f31
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/integration/hook-err.spec.js
@@ -0,0 +1,215 @@
+var assert = require('assert');
+var runMocha = require('./helpers').runMocha;
+var splitRegExp = require('./helpers').splitRegExp;
+var bang = require('../../lib/reporters/base').symbols.bang;
+
+describe('hook error handling', function() {
+ var lines;
+
+ describe('before hook error', function() {
+ before(run('hooks/before-hook-error.fixture.js'));
+ it('should verify results', function() {
+ assert.deepEqual(
+ lines,
+ ['before', bang + 'test 3']
+ );
+ });
+ });
+
+ describe('before hook error tip', function() {
+ before(run('hooks/before-hook-error-tip.fixture.js', onlyErrorTitle));
+ it('should verify results', function() {
+ assert.deepEqual(
+ lines,
+ ['1) spec 2 "before all" hook:']
+ );
+ });
+ });
+
+ describe('before each hook error', function() {
+ before(run('hooks/beforeEach-hook-error.fixture.js'));
+ it('should verify results', function() {
+ assert.deepEqual(
+ lines,
+ ['before', bang + 'test 3']
+ );
+ });
+ });
+
+ describe('after hook error', function() {
+ before(run('hooks/after-hook-error.fixture.js'));
+ it('should verify results', function() {
+ assert.deepEqual(
+ lines,
+ ['test 1', 'test 2', 'after', bang + 'test 3']
+ );
+ });
+ });
+
+ describe('after each hook error', function() {
+ before(run('hooks/afterEach-hook-error.fixture.js'));
+ it('should verify results', function() {
+ assert.deepEqual(
+ lines,
+ ['test 1', 'after', bang + 'test 3']
+ );
+ });
+ });
+
+ describe('multiple hook errors', function() {
+ before(run('hooks/multiple-hook-error.fixture.js'));
+ it('should verify results', function() {
+ assert.deepEqual(
+ lines,
+ [
+ 'root before',
+ '1-1 before',
+ 'root before each',
+ '1 before each',
+ '1-1 before each',
+ bang + '1-1 after each',
+ '1 after each',
+ 'root after each',
+ '1-1 after',
+ bang + '1-2 before',
+ 'root before each',
+ '1 before each',
+ '1-2 before each',
+ '1-2 test 1',
+ '1-2 after each',
+ bang + '1 after each',
+ 'root after each',
+ '1-2 after',
+ '1 after',
+ '2-1 before',
+ 'root before each',
+ '2 before each',
+ bang + '2 after each',
+ bang + 'root after each',
+ '2-1 after',
+ '2 after',
+ 'root after'
+ ]
+ );
+ });
+ });
+
+ describe('async - before hook error', function() {
+ before(run('hooks/before-hook-async-error.fixture.js'));
+ it('should verify results', function() {
+ assert.deepEqual(
+ lines,
+ ['before', bang + 'test 3']
+ );
+ });
+ });
+
+ describe('async - before hook error tip', function() {
+ before(run('hooks/before-hook-async-error-tip.fixture.js', onlyErrorTitle));
+ it('should verify results', function() {
+ assert.deepEqual(
+ lines,
+ ['1) spec 2 "before all" hook:']
+ );
+ });
+ });
+
+ describe('async - before each hook error', function() {
+ before(run('hooks/beforeEach-hook-async-error.fixture.js'));
+ it('should verify results', function() {
+ assert.deepEqual(
+ lines,
+ ['before', bang + 'test 3']
+ );
+ });
+ });
+
+ describe('async - after hook error', function() {
+ before(run('hooks/after-hook-async-error.fixture.js'));
+ it('should verify results', function() {
+ assert.deepEqual(
+ lines,
+ ['test 1', 'test 2', 'after', bang + 'test 3']
+ );
+ });
+ });
+
+ describe('async - after each hook error', function() {
+ before(run('hooks/afterEach-hook-async-error.fixture.js'));
+ it('should verify results', function() {
+ assert.deepEqual(
+ lines,
+ ['test 1', 'after', bang + 'test 3']
+ );
+ });
+ });
+
+ describe('async - multiple hook errors', function() {
+ before(run('hooks/multiple-hook-async-error.fixture.js'));
+ it('should verify results', function() {
+ assert.deepEqual(
+ lines,
+ [
+ 'root before',
+ '1-1 before',
+ 'root before each',
+ '1 before each',
+ '1-1 before each',
+ bang + '1-1 after each',
+ '1 after each',
+ 'root after each',
+ '1-1 after',
+ bang + '1-2 before',
+ 'root before each',
+ '1 before each',
+ '1-2 before each',
+ '1-2 test 1',
+ '1-2 after each',
+ bang + '1 after each',
+ 'root after each',
+ '1-2 after',
+ '1 after',
+ '2-1 before',
+ 'root before each',
+ '2 before each',
+ bang + '2 after each',
+ bang + 'root after each',
+ '2-1 after',
+ '2 after',
+ 'root after'
+ ]
+ );
+ });
+ });
+
+ function run(fnPath, outputFilter) {
+ return function(done) {
+ runMocha(fnPath, [], function(err, res) {
+ assert.ifError(err);
+
+ lines = res.output
+ .split(splitRegExp)
+ .map(function(line) {
+ return line.trim();
+ })
+ .filter(outputFilter || onlyConsoleOutput());
+
+ done();
+ });
+ };
+ }
+});
+
+function onlyConsoleOutput() {
+ var foundSummary = false;
+ return function(line) {
+ if (!foundSummary) {
+ foundSummary = !!(/\(\d+ms\)/).exec(line);
+ }
+ return !foundSummary && line.length > 0;
+ };
+}
+
+function onlyErrorTitle(line) {
+ return !!(/^1\)/).exec(line);
+}
diff --git a/tests/lib/mocha-3.1.0/test/integration/hooks.spec.js b/tests/lib/mocha-3.1.0/test/integration/hooks.spec.js
new file mode 100644
index 0000000000..7633cb5630
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/integration/hooks.spec.js
@@ -0,0 +1,43 @@
+var assert = require('assert');
+var run = require('./helpers').runMocha;
+var splitRegExp = require('./helpers').splitRegExp;
+var args = [];
+
+describe('hooks', function() {
+ it('are ran in correct order', function(done) {
+ run('cascade.fixture.js', args, function(err, res) {
+ var lines, expected;
+
+ assert(!err);
+
+ lines = res.output.split(splitRegExp).map(function(line) {
+ return line.trim();
+ }).filter(function(line) {
+ return line.length;
+ }).slice(0, -1);
+
+ expected = [
+ 'before one',
+ 'before two',
+ 'before three',
+ 'before each one',
+ 'before each two',
+ 'before each three',
+ 'TEST three',
+ 'after each three',
+ 'after each two',
+ 'after each one',
+ 'after three',
+ 'after two',
+ 'after one'
+ ];
+
+ expected.forEach(function(line, i) {
+ assert.equal(lines[i], line);
+ });
+
+ assert.equal(res.code, 0);
+ done();
+ });
+ });
+});
diff --git a/tests/lib/mocha-3.1.0/test/integration/multiple-done.spec.js b/tests/lib/mocha-3.1.0/test/integration/multiple-done.spec.js
new file mode 100644
index 0000000000..47e82dbebb
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/integration/multiple-done.spec.js
@@ -0,0 +1,96 @@
+var assert = require('assert');
+var run = require('./helpers').runMochaJSON;
+var args = [];
+
+describe('multiple calls to done()', function() {
+ var res;
+ describe('from a spec', function() {
+ before(function(done) {
+ run('multiple-done.fixture.js', args, function(err, result) {
+ res = result;
+ done(err);
+ });
+ });
+
+ it('results in failures', function() {
+ assert.equal(res.stats.pending, 0);
+ assert.equal(res.stats.passes, 1);
+ assert.equal(res.stats.failures, 1);
+ assert.equal(res.code, 1);
+ });
+
+ it('throws a descriptive error', function() {
+ assert.equal(res.failures[0].err.message,
+ 'done() called multiple times');
+ });
+ });
+
+ describe('with multiple specs', function() {
+ before(function(done) {
+ run('multiple-done-specs.fixture.js', args, function(err, result) {
+ res = result;
+ done(err);
+ });
+ });
+
+ it('results in a failure', function() {
+ assert.equal(res.stats.pending, 0);
+ assert.equal(res.stats.passes, 2);
+ assert.equal(res.stats.failures, 1);
+ assert.equal(res.code, 1);
+ });
+
+ it('correctly attributes the error', function() {
+ assert.equal(res.failures[0].fullTitle, 'suite test1');
+ assert.equal(res.failures[0].err.message,
+ 'done() called multiple times');
+ });
+ });
+
+ describe('from a before hook', function() {
+ before(function(done) {
+ run('multiple-done-before.fixture.js', args, function(err, result) {
+ res = result;
+ done(err);
+ });
+ });
+
+ it('results in a failure', function() {
+ assert.equal(res.stats.pending, 0);
+ assert.equal(res.stats.passes, 1);
+ assert.equal(res.stats.failures, 1);
+ assert.equal(res.code, 1);
+ });
+
+ it('correctly attributes the error', function() {
+ assert.equal(res.failures[0].fullTitle, 'suite "before all" hook');
+ assert.equal(res.failures[0].err.message,
+ 'done() called multiple times');
+ });
+ });
+
+ describe('from a beforeEach hook', function() {
+ before(function(done) {
+ run('multiple-done-beforeEach.fixture.js', args, function(err, result) {
+ res = result;
+ done(err);
+ });
+ });
+
+ it('results in a failure', function() {
+ assert.equal(res.stats.pending, 0);
+ assert.equal(res.stats.passes, 2);
+ assert.equal(res.stats.failures, 2);
+ assert.equal(res.code, 2);
+ });
+
+ it('correctly attributes the errors', function() {
+ assert.equal(res.failures.length, 2);
+ res.failures.forEach(function(failure) {
+ assert.equal(failure.fullTitle, 'suite "before each" hook');
+ assert.equal(failure.err.message,
+ 'done() called multiple times');
+ });
+ });
+ });
+});
diff --git a/tests/lib/mocha-3.1.0/test/integration/only.spec.js b/tests/lib/mocha-3.1.0/test/integration/only.spec.js
new file mode 100644
index 0000000000..61254ce1d3
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/integration/only.spec.js
@@ -0,0 +1,45 @@
+var run = require('./helpers').runMochaJSON;
+var assert = require('assert');
+
+describe('.only()', function() {
+ describe('bdd', function() {
+ it('should run only tests that marked as `only`', function(done) {
+ run('options/only/bdd.fixture.js', ['--ui', 'bdd'], function(err, res) {
+ assert(!err);
+ assert.equal(res.stats.pending, 0);
+ assert.equal(res.stats.passes, 11);
+ assert.equal(res.stats.failures, 0);
+ assert.equal(res.code, 0);
+ done();
+ });
+ });
+ });
+
+ describe('tdd', function() {
+ it('should run only tests that marked as `only`', function(done) {
+ run('options/only/tdd.fixture.js', ['--ui', 'tdd'], function(err, res) {
+ assert(!err);
+ assert.equal(res.stats.pending, 0);
+ assert.equal(res.stats.passes, 8);
+ assert.equal(res.stats.failures, 0);
+ assert.equal(res.code, 0);
+ done();
+ });
+ });
+ });
+
+ describe('qunit', function() {
+ it('should run only tests that marked as `only`', function(done) {
+ run('options/only/qunit.fixture.js', ['--ui', 'qunit'], function(err, res) {
+ console.log(err);
+
+ assert(!err);
+ assert.equal(res.stats.pending, 0);
+ assert.equal(res.stats.passes, 5);
+ assert.equal(res.stats.failures, 0);
+ assert.equal(res.code, 0);
+ done();
+ });
+ });
+ });
+});
diff --git a/tests/lib/mocha-3.1.0/test/integration/options.spec.js b/tests/lib/mocha-3.1.0/test/integration/options.spec.js
new file mode 100644
index 0000000000..4755647f76
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/integration/options.spec.js
@@ -0,0 +1,182 @@
+var assert = require('assert');
+var run = require('./helpers').runMochaJSON;
+var args = [];
+
+describe('options', function() {
+ describe('--async-only', function() {
+
+ before(function() {
+ args = ['--async-only'];
+ });
+
+ it('should fail synchronous specs', function(done) {
+ run('options/async-only-sync.fixture.js', args, function(err, res) {
+ assert(!err);
+ assert.equal(res.stats.pending, 0);
+ assert.equal(res.stats.passes, 0);
+ assert.equal(res.stats.failures, 1);
+
+ assert.equal(res.failures[0].title, 'throws an error');
+ assert.equal(res.code, 1);
+ done();
+ });
+ });
+
+ it('should allow asynchronous specs', function(done) {
+ run('options/async-only-async.fixture.js', args, function(err, res) {
+ assert(!err);
+ assert.equal(res.stats.pending, 0);
+ assert.equal(res.stats.passes, 1);
+ assert.equal(res.stats.failures, 0);
+
+ assert.equal(res.passes[0].title, 'should pass');
+ assert.equal(res.code, 0);
+ done();
+ });
+ });
+ });
+
+ describe('--bail', function() {
+ before(function() {
+ args = ['--bail'];
+ });
+
+ it('should stop after the first error', function(done) {
+ run('options/bail.fixture.js', args, function(err, res) {
+ assert(!err);
+ assert.equal(res.stats.pending, 0);
+ assert.equal(res.stats.passes, 1);
+ assert.equal(res.stats.failures, 1);
+
+ assert.equal(res.passes[0].title, 'should display this spec');
+ assert.equal(res.failures[0].title, 'should only display this error');
+ assert.equal(res.code, 1);
+ done();
+ });
+ });
+ });
+
+ describe('--sort', function() {
+ before(function() {
+ args = ['--sort'];
+ });
+
+ it('should sort tests in alphabetical order', function(done) {
+ run('options/sort*', args, function(err, res) {
+ assert(!err);
+ assert.equal(res.stats.pending, 0);
+ assert.equal(res.stats.passes, 2);
+ assert.equal(res.stats.failures, 0);
+
+ assert.equal(res.passes[0].fullTitle,
+ 'alpha should be executed first');
+ assert.equal(res.code, 0);
+ done();
+ });
+ });
+ });
+
+ describe('--delay', function() {
+ before(function() {
+ args = ['--delay'];
+ });
+
+ it('should run the generated test suite', function(done) {
+ run('options/delay.fixture.js', args, function(err, res) {
+ assert(!err);
+ assert.equal(res.stats.pending, 0);
+ assert.equal(res.stats.passes, 1);
+ assert.equal(res.stats.failures, 0);
+
+ assert.equal(res.passes[0].title,
+ 'should have no effect if attempted twice in the same suite');
+ assert.equal(res.code, 0);
+ done();
+ });
+ });
+
+ it('should throw an error if the test suite failed to run', function(done) {
+ run('options/delay-fail.fixture.js', args, function(err, res) {
+ assert(!err);
+ assert.equal(res.stats.pending, 0);
+ assert.equal(res.stats.passes, 0);
+ assert.equal(res.stats.failures, 1);
+
+ assert.equal(res.failures[0].title,
+ 'Uncaught error outside test suite');
+ assert.equal(res.code, 1);
+ done();
+ });
+ });
+ });
+
+ describe('--grep', function() {
+ it('runs specs matching a string', function(done) {
+ args = ['--grep', 'match'];
+ run('options/grep.fixture.js', args, function(err, res) {
+ assert(!err);
+ assert.equal(res.stats.pending, 0);
+ assert.equal(res.stats.passes, 2);
+ assert.equal(res.stats.failures, 0);
+ assert.equal(res.code, 0);
+ done();
+ });
+ });
+
+ describe('runs specs matching a RegExp', function() {
+ it('with RegExp like strings(pattern follow by flag)', function(done) {
+ args = ['--grep', '/match/i'];
+ run('options/grep.fixture.js', args, function(err, res) {
+ assert(!err);
+ assert.equal(res.stats.pending, 0);
+ assert.equal(res.stats.passes, 4);
+ assert.equal(res.stats.failures, 0);
+ assert.equal(res.code, 0);
+ done();
+ });
+ });
+
+ it('string as pattern', function(done) {
+ args = ['--grep', '.*'];
+ run('options/grep.fixture.js', args, function(err, res) {
+ assert(!err);
+ assert.equal(res.stats.pending, 0);
+ assert.equal(res.stats.passes, 4);
+ assert.equal(res.stats.failures, 1);
+ assert.equal(res.code, 1);
+ done();
+ });
+ });
+ });
+
+ describe('with --invert', function() {
+ it('runs specs that do not match the pattern', function(done) {
+ args = ['--grep', 'fail', '--invert'];
+ run('options/grep.fixture.js', args, function(err, res) {
+ assert(!err);
+ assert.equal(res.stats.pending, 0);
+ assert.equal(res.stats.passes, 4);
+ assert.equal(res.stats.failures, 0);
+ assert.equal(res.code, 0);
+ done();
+ });
+ });
+ });
+ });
+
+ describe('--retries', function() {
+ it('retries after a certain threshold', function (done) {
+ args = ['--retries', '3'];
+ run('options/retries.fixture.js', args, function(err, res) {
+ assert(!err);
+ assert.equal(res.stats.pending, 0);
+ assert.equal(res.stats.passes, 0);
+ assert.equal(res.stats.tests, 1);
+ assert.equal(res.tests[0].currentRetry, 3);
+ assert.equal(res.stats.failures, 1);
+ assert.equal(res.code, 1);
+ done();
+ });
+ })
+ });
+});
diff --git a/tests/lib/mocha-3.1.0/test/integration/pending.spec.js b/tests/lib/mocha-3.1.0/test/integration/pending.spec.js
new file mode 100644
index 0000000000..4d4beffc2a
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/integration/pending.spec.js
@@ -0,0 +1,100 @@
+var assert = require('assert');
+var run = require('./helpers').runMochaJSON;
+var args = [];
+
+describe('pending', function() {
+ describe('pending specs', function() {
+ it('should be created by omitting a function', function(done) {
+ run('pending/spec.fixture.js', args, function(err, res) {
+ assert(!err);
+ assert.equal(res.stats.pending, 1);
+ assert.equal(res.stats.passes, 0);
+ assert.equal(res.stats.failures, 0);
+ assert.equal(res.code, 0);
+ done();
+ });
+ });
+ });
+
+ describe('synchronous skip()', function() {
+ describe('in spec', function() {
+ it('should immediately skip the spec and run all others', function(done) {
+ run('pending/skip-sync-spec.fixture.js', args, function(err, res) {
+ assert(!err);
+ assert.equal(res.stats.pending, 1);
+ assert.equal(res.stats.passes, 1);
+ assert.equal(res.stats.failures, 0);
+ assert.equal(res.code, 0);
+ done();
+ });
+ });
+ });
+
+ describe('in before', function() {
+ it('should skip all suite specs', function(done) {
+ run('pending/skip-sync-before.fixture.js', args, function(err, res) {
+ assert(!err);
+ assert.equal(res.stats.pending, 2);
+ assert.equal(res.stats.passes, 0);
+ assert.equal(res.stats.failures, 0);
+ assert.equal(res.code, 0);
+ done();
+ });
+ });
+ });
+
+ describe('in beforeEach', function() {
+ it('should skip all suite specs', function(done) {
+ run('pending/skip-sync-beforeEach.fixture.js', args, function(err, res) {
+ assert(!err);
+ assert.equal(res.stats.pending, 2);
+ assert.equal(res.stats.passes, 0);
+ assert.equal(res.stats.failures, 0);
+ assert.equal(res.code, 0);
+ done();
+ });
+ });
+ });
+ });
+
+ describe('asynchronous skip()', function() {
+ describe('in spec', function() {
+ it('should immediately skip the spec and run all others', function(done) {
+ run('pending/skip-async-spec.fixture.js', args, function(err, res) {
+ assert(!err);
+ assert.equal(res.stats.pending, 1);
+ assert.equal(res.stats.passes, 1);
+ assert.equal(res.stats.failures, 0);
+ assert.equal(res.code, 0);
+ done();
+ });
+ });
+ });
+
+ describe('in before', function() {
+ it('should skip all suite specs', function(done) {
+ run('pending/skip-async-before.fixture.js', args, function(err, res) {
+ assert(!err);
+ assert.equal(res.stats.pending, 2);
+ assert.equal(res.stats.passes, 0);
+ assert.equal(res.stats.failures, 0);
+ assert.equal(res.code, 0);
+ done();
+ });
+ });
+ });
+
+ describe('in beforeEach', function() {
+ it('should skip all suite specs', function(done) {
+ run('pending/skip-sync-beforeEach.fixture.js', args, function(err, res) {
+ assert(!err);
+ assert.equal(res.stats.pending, 2);
+ assert.equal(res.stats.passes, 0);
+ assert.equal(res.stats.failures, 0);
+ assert.equal(res.code, 0);
+ done();
+ });
+ });
+ });
+ });
+});
diff --git a/tests/lib/mocha-3.1.0/test/integration/regression.spec.js b/tests/lib/mocha-3.1.0/test/integration/regression.spec.js
new file mode 100644
index 0000000000..f2a435a34c
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/integration/regression.spec.js
@@ -0,0 +1,97 @@
+var assert = require('assert');
+var fs = require('fs');
+var path = require('path');
+var run = require('./helpers').runMocha;
+var runJSON = require('./helpers').runMochaJSON;
+
+describe('regressions', function() {
+ it('issue-1327: should run all 3 specs exactly once', function(done) {
+ var args = [];
+ run('regression/issue-1327.fixture.js', args, function(err, res) {
+ var occurences = function(str) {
+ var pattern = new RegExp(str, 'g');
+ return (res.output.match(pattern) || []).length;
+ };
+
+ assert(!err);
+ assert.equal(occurences('testbody1'), 1);
+ assert.equal(occurences('testbody2'), 1);
+ assert.equal(occurences('testbody3'), 1);
+
+ assert.equal(res.code, 1);
+ done();
+ });
+ });
+
+ it('should not duplicate mocha.opts args in process.argv', function() {
+ var processArgv = process.argv.join('');
+ var mochaOpts = fs.readFileSync(path.join(__dirname, '..', 'mocha.opts'), 'utf-8').split(/[\s]+/).join('');
+ assert.notEqual(processArgv.indexOf(mochaOpts), -1, 'process.argv missing mocha.opts');
+ assert.equal(processArgv.indexOf(mochaOpts), processArgv.lastIndexOf(mochaOpts), 'process.argv contains duplicated mocha.opts');
+ });
+
+ it('issue-1794: Can\'t --require custom UI and use it', function(done) {
+ var simpleUiPath = path.join(__dirname, 'fixtures', 'regression', '1794', 'simple-ui.js');
+ var args = ['--require', simpleUiPath, '--ui', 'simple-ui'];
+ run('regression/1794/issue-1794.fixture.js', args, function(err, res) {
+ assert.equal(res.code, 0, 'Custom UI should be loaded');
+ done();
+ });
+ });
+
+ it('issue-1991: Declarations do not get cleaned up unless you set them to `null` - Memory Leak', function(done) {
+ // on a modern MBP takes ±5 seconds on node 4.0, but on older laptops with node 0.12 ±40 seconds.
+ // Could easily take longer on even weaker machines (Travis-CI containers for example).
+ this.timeout(120000);
+ run('regression/issue-1991.fixture.js', [], function(err, res) {
+ assert.equal(/process out of memory/.test(res.output), false, 'fixture\'s process out of memory!');
+ assert.equal(res.code, 0, 'Runnable fn (it/before[Each]/after[Each]) references should be deleted to avoid memory leaks');
+ done();
+ });
+ })
+
+ describe('issue-2286: after doesn\'t execute if test was skipped in beforeEach', function () {
+ var afterWasRun = false;
+ describe('suite with skipped test for meta test', function () {
+ beforeEach(function () { this.skip(); });
+ after(function () { afterWasRun = true; });
+ it('should be pending', function () {});
+ })
+ after('meta test', function () {
+ afterWasRun.should.be.ok();
+ });
+ });
+
+ it('issue-2315: cannot read property currentRetry of undefined', function (done) {
+ runJSON('regression/issue-2315.js', [], function(err, res) {
+ assert(!err);
+ assert.equal(res.stats.pending, 0);
+ assert.equal(res.stats.passes, 0);
+ assert.equal(res.stats.failures, 1);
+ assert.equal(res.code, 1);
+ done();
+ });
+ });
+
+ it('issue-2406: should run nested describe.only suites', function(done) {
+ this.timeout(2000);
+ runJSON('regression/issue-2406.fixture.js', [], function(err, res) {
+ assert(!err);
+ assert.equal(res.stats.pending, 0);
+ assert.equal(res.stats.passes, 2);
+ assert.equal(res.stats.failures, 0);
+ assert.equal(res.code, 0);
+ done();
+ });
+ });
+
+ it('issue-2417: should not recurse infinitely with .only suites nested within each other', function() {
+ runJSON('regression/issue-2417.fixture.js', [], function(err, res) {
+ assert(!err);
+ assert.equal(res.stats.pending, 0);
+ assert.equal(res.stats.passes, 1);
+ assert.equal(res.stats.failures, 0);
+ assert.equal(res.code, 0);
+ });
+ });
+});
diff --git a/tests/lib/mocha-3.1.0/test/integration/reporters.spec.js b/tests/lib/mocha-3.1.0/test/integration/reporters.spec.js
new file mode 100644
index 0000000000..9595611829
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/integration/reporters.spec.js
@@ -0,0 +1,61 @@
+var assert = require('assert');
+var os = require('os');
+var fs = require('fs');
+var crypto = require('crypto');
+var path = require('path');
+var run = require('./helpers').runMocha;
+
+describe('reporters', function() {
+ describe('markdown', function() {
+ var res;
+
+ before(function(done) {
+ run('passing.fixture.js', ['--reporter', 'markdown'], function(err, result) {
+ res = result;
+ done(err);
+ });
+ });
+
+ it('does not exceed maximum callstack (issue: 1875)', function() {
+ assert(res.output.indexOf('RangeError') === -1, 'Threw RangeError');
+ });
+
+ it('contains spec src', function() {
+ var src = [
+ '```js',
+ 'assert(true);',
+ '```'
+ ].join('\n');
+
+ assert(res.output.indexOf(src) !== -1, 'No assert found');
+ });
+ });
+
+ describe('xunit', function() {
+ it('prints test cases with --reporter-options output (issue: 1864)', function(done) {
+ var randomStr = crypto.randomBytes(8).toString('hex');
+ var tmpDir = os.tmpDir().replace(new RegExp(path.sep + '$'), '');
+ var tmpFile = tmpDir + path.sep + 'test-issue-1864-' + randomStr + '.xml';
+
+ var args = ['--reporter=xunit', '--reporter-options', 'output=' + tmpFile];
+ var expectedOutput = [
+ '<testcase classname="suite" name="test1" time="',
+ '<testcase classname="suite" name="test2" time="',
+ '</testsuite>'
+ ];
+
+ run('passing.fixture.js', args, function(err, result) {
+ if (err) return done(err);
+
+ var xml = fs.readFileSync(tmpFile, 'utf8');
+ fs.unlinkSync(tmpFile);
+
+ expectedOutput.forEach(function(line) {
+ assert(xml.indexOf(line) !== -1, 'XML did not contain ' + line);
+ });
+
+ done(err);
+ });
+ });
+ });
+});
diff --git a/tests/lib/mocha-3.1.0/test/integration/retries.spec.js b/tests/lib/mocha-3.1.0/test/integration/retries.spec.js
new file mode 100644
index 0000000000..ce76545b00
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/integration/retries.spec.js
@@ -0,0 +1,106 @@
+var assert = require('assert');
+var helpers = require('./helpers');
+var args = [];
+var bang = require('../../lib/reporters/base').symbols.bang;
+
+describe('retries', function() {
+ it('are ran in correct order', function(done) {
+ helpers.runMocha('retries/hooks.fixture.js', args, function(err, res) {
+ var lines, expected;
+
+ assert(!err);
+
+ lines = res.output.split(helpers.splitRegExp).map(function(line) {
+ return line.trim();
+ }).filter(function(line) {
+ return line.length;
+ }).slice(0, -1);
+
+ expected = [
+ 'before',
+ 'before each 0',
+ 'TEST 0',
+ 'after each 1',
+ 'before each 1',
+ 'TEST 1',
+ 'after each 2',
+ 'before each 2',
+ 'TEST 2',
+ 'after each 3',
+ 'before each 3',
+ 'TEST 3',
+ 'after each 4',
+ 'before each 4',
+ 'TEST 4',
+ bang + 'after each 5',
+ 'after'
+ ];
+
+ expected.forEach(function(line, i) {
+ assert.equal(lines[i], line);
+ });
+
+ assert.equal(res.code, 1);
+ done();
+ });
+ });
+
+ it('should exit early if test passes', function (done) {
+ helpers.runMochaJSON('retries/early-pass.fixture.js', args, function(err, res) {
+ assert(!err);
+ assert.equal(res.stats.passes, 1);
+ assert.equal(res.stats.failures, 0);
+ assert.equal(res.tests[0].currentRetry, 1);
+ assert.equal(res.stats.tests, 1);
+ assert.equal(res.code, 0);
+ done();
+ });
+ });
+
+ it('should let test override', function (done) {
+ helpers.runMochaJSON('retries/nested.fixture.js', args, function(err, res) {
+ assert(!err);
+ assert.equal(res.stats.passes, 0);
+ assert.equal(res.stats.failures, 1);
+ assert.equal(res.stats.tests, 1);
+ assert.equal(res.tests[0].currentRetry, 1);
+ assert.equal(res.code, 1);
+ done();
+ });
+ });
+
+ it('should not hang w/ async test', function (done) {
+ helpers.runMocha('retries/async.fixture.js', args, function(err, res) {
+ var lines, expected;
+
+ assert(!err);
+
+ lines = res.output.split(helpers.splitRegExp).map(function(line) {
+ return line.trim();
+ }).filter(function(line) {
+ return line.length;
+ }).slice(0, -1);
+
+ expected = [
+ 'before',
+ 'before each 0',
+ 'TEST 0',
+ 'after each 1',
+ 'before each 1',
+ 'TEST 1',
+ 'after each 2',
+ 'before each 2',
+ 'TEST 2',
+ 'after each 3',
+ 'after'
+ ];
+
+ expected.forEach(function(line, i) {
+ assert.equal(lines[i], line);
+ });
+
+ assert.equal(res.code, 0);
+ done();
+ });
+ });
+});
diff --git a/tests/lib/mocha-3.1.0/test/integration/suite.spec.js b/tests/lib/mocha-3.1.0/test/integration/suite.spec.js
new file mode 100644
index 0000000000..00066a34f4
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/integration/suite.spec.js
@@ -0,0 +1,42 @@
+var assert = require('assert');
+var run = require('./helpers').runMocha;
+var args = [];
+
+describe('suite w/no callback', function() {
+ this.timeout(1000);
+ it('should throw a helpful error message when a callback for suite is not supplied', function(done) {
+ run('suite/suite-no-callback.fixture.js', args, function(err, res) {
+ assert(!err);
+ var result = res.output.match(/no callback was supplied/) || [];
+ assert.equal(result.length, 1);
+ done();
+ });
+ });
+});
+
+describe('skipped suite w/no callback', function() {
+ this.timeout(1000);
+ it('should not throw an error when a callback for skipped suite is not supplied', function(done) {
+ run('suite/suite-skipped-no-callback.fixture.js', args, function(err, res) {
+ assert(!err);
+ pattern = new RegExp("Error", 'g');
+ var result = res.output.match(pattern) || [];
+ assert.equal(result.length, 0);
+ done();
+ });
+ });
+});
+
+
+describe('skipped suite w/ callback', function() {
+ this.timeout(1000);
+ it('should not throw an error when a callback for skipped suite is supplied', function(done) {
+ run('suite/suite-skipped-callback.fixture.js', args, function(err, res) {
+ assert(!err);
+ pattern = new RegExp("Error", 'g');
+ var result = res.output.match(pattern) || [];
+ assert.equal(result.length, 0);
+ done();
+ });
+ });
+});
diff --git a/tests/lib/mocha-3.1.0/test/integration/timeout.spec.js b/tests/lib/mocha-3.1.0/test/integration/timeout.spec.js
new file mode 100644
index 0000000000..33b8e33093
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/integration/timeout.spec.js
@@ -0,0 +1,16 @@
+var assert = require('assert');
+var run = require('./helpers').runMochaJSON;
+var args = [];
+
+describe('this.timeout()', function() {
+ it('is respected by sync and async suites', function(done) {
+ run('timeout.fixture.js', args, function(err, res) {
+ assert(!err);
+ assert.equal(res.stats.pending, 0);
+ assert.equal(res.stats.passes, 0);
+ assert.equal(res.stats.failures, 2);
+ assert.equal(res.code, 2);
+ done();
+ });
+ });
+});
diff --git a/tests/lib/mocha-3.1.0/test/integration/uncaught.spec.js b/tests/lib/mocha-3.1.0/test/integration/uncaught.spec.js
new file mode 100644
index 0000000000..87dde90902
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/integration/uncaught.spec.js
@@ -0,0 +1,35 @@
+var assert = require('assert');
+var run = require('./helpers').runMochaJSON;
+var args = [];
+
+describe('uncaught exceptions', function() {
+ it('handles uncaught exceptions from hooks', function(done) {
+ run('uncaught-hook.fixture.js', args, function(err, res) {
+ assert(!err);
+ assert.equal(res.stats.pending, 0);
+ assert.equal(res.stats.passes, 0);
+ assert.equal(res.stats.failures, 1);
+
+ assert.equal(res.failures[0].fullTitle,
+ 'uncaught "before each" hook');
+ assert.equal(res.code, 1);
+ done();
+ });
+ });
+
+ it('handles uncaught exceptions from async specs', function(done) {
+ run('uncaught.fixture.js', args, function(err, res) {
+ assert(!err);
+ assert.equal(res.stats.pending, 0);
+ assert.equal(res.stats.passes, 0);
+ assert.equal(res.stats.failures, 2);
+
+ assert.equal(res.failures[0].title,
+ 'fails exactly once when a global error is thrown first');
+ assert.equal(res.failures[1].title,
+ 'fails exactly once when a global error is thrown second');
+ assert.equal(res.code, 2);
+ done();
+ });
+ });
+});
diff --git a/tests/lib/mocha-3.1.0/test/jsapi/index.js b/tests/lib/mocha-3.1.0/test/jsapi/index.js
new file mode 100644
index 0000000000..a096186b96
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/jsapi/index.js
@@ -0,0 +1,29 @@
+var Mocha = require('../../')
+ , path = require('path');
+
+var mocha = new Mocha({
+ ui: 'bdd',
+ globals: ['okGlobalA', 'okGlobalB', 'okGlobalC', 'callback*'],
+ // ignoreLeaks: true,
+ growl: true
+});
+
+// mocha.reporter('spec');
+require('should');
+
+mocha.addFile('test/suite.spec.js');
+mocha.addFile('test/runner.spec.js');
+mocha.addFile('test/runnable.spec.js');
+mocha.addFile('test/hook-sync.spec.js');
+mocha.addFile('test/hook-sync-nested.spec.js');
+mocha.addFile('test/hook-async.spec.js');
+mocha.addFile('test/acceptance/duration.spec.js');
+mocha.addFile('test/acceptance/fs.spec.js');
+mocha.addFile('test/acceptance/globals.spec.js');
+mocha.addFile('test/acceptance/timeout.spec.js');
+
+mocha.run(function(){
+ console.log('done');
+}).on('pass', function(test){
+ // console.log('... %s', test.title);
+});
diff --git a/tests/lib/mocha-3.1.0/test/mocha.opts b/tests/lib/mocha-3.1.0/test/mocha.opts
new file mode 100644
index 0000000000..cd797e2ae0
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/mocha.opts
@@ -0,0 +1,8 @@
+--require should
+--require ./test/fixture-expect.js
+--reporter dot
+--ui bdd
+--globals okGlobalA,okGlobalB
+--globals okGlobalC
+--globals callback*
+--timeout 200
diff --git a/tests/lib/mocha-3.1.0/test/mocha.spec.js b/tests/lib/mocha-3.1.0/test/mocha.spec.js
new file mode 100644
index 0000000000..46411fc18b
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/mocha.spec.js
@@ -0,0 +1,33 @@
+var Mocha = require('../');
+var Test = Mocha.Test;
+
+describe('Mocha', function(){
+ var blankOpts = { reporter: function(){} }; // no output
+
+ describe('.run(fn)', function(){
+ it('should not raise errors if callback was not provided', function(){
+ var mocha = new Mocha(blankOpts);
+ mocha.run();
+ })
+
+ it('should execute the callback when complete', function(done) {
+ var mocha = new Mocha(blankOpts);
+ mocha.run(function(){
+ done();
+ })
+ })
+
+ it('should execute the callback with the number of failures '+
+ 'as parameter', function(done) {
+ var mocha = new Mocha(blankOpts);
+ var failingTest = new Test('failing test', function(){
+ throw new Error('such fail');
+ });
+ mocha.suite.addTest(failingTest);
+ mocha.run(function(failures) {
+ failures.should.equal(1);
+ done();
+ });
+ })
+ })
+})
diff --git a/tests/lib/mocha-3.1.0/test/ms.spec.js b/tests/lib/mocha-3.1.0/test/ms.spec.js
new file mode 100644
index 0000000000..1fd9740a62
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/ms.spec.js
@@ -0,0 +1,82 @@
+'use strict';
+var ms = require('../lib/ms');
+
+describe('.ms()', function() {
+ // Helpers
+ var time = {
+ minutes: function(n) { return n * 60 * 1000; },
+ hours: function (n) { return n * this.minutes(60); },
+ days: function(n) { return n * this.hours(24); },
+ years: function(n) { return n * this.days(365.25); }
+ };
+ describe('get a value that less than 1 second', function() {
+ it('should return milliseconds representation', function() {
+ ms(200).should.equal('200ms');
+ ms(30).should.equal('30ms');
+ ms(2000).should.not.equal('2000ms');
+ });
+ });
+
+ describe('seconds representation', function() {
+ it('should return short format', function() {
+ ms(2000).should.equal('2s');
+ });
+
+ it('should return long format', function() {
+ ms(2000, { long: true }).should.equal('2 seconds');
+ ms(1000, { long: true }).should.equal('1 second');
+ ms(1010, { long: true }).should.equal('1 second');
+ });
+ });
+
+ describe('minutess representation', function() {
+ it('should return short format', function() {
+ ms(time.minutes(1)).should.equal('1m');
+ });
+
+ it('should return long format', function() {
+ ms(time.minutes(1), { long: true }).should.equal('1 minute');
+ ms(time.minutes(3), { long: true }).should.equal('3 minutes');
+ });
+ });
+
+ describe('hours representation', function() {
+ it('should return short format', function() {
+ ms(time.hours(1)).should.equal('1h');
+ });
+
+ it('should return long format', function() {
+ ms(time.hours(1), { long: true }).should.equal('1 hour');
+ ms(time.hours(3), { long: true }).should.equal('3 hours');
+ });
+ });
+
+ describe('days representation', function() {
+ it('should return short format', function() {
+ ms(time.days(1)).should.equal('1d');
+ });
+
+ it('should return long format', function() {
+ ms(time.days(1), { long: true }).should.equal('1 day');
+ ms(time.days(3), { long: true }).should.equal('3 days');
+ });
+ });
+
+ describe('Getting string value', function() {
+ it('should return the milliseconds representation(Number)', function() {
+ ms('1 second').should.equal(1000);
+
+ ms('1 minute').should.equal(time.minutes(1));
+ ms('6 minutes').should.equal(time.minutes(6));
+
+ ms('1 hour').should.equal(time.hours(1));
+ ms('5 hours').should.equal(time.hours(5));
+
+ ms('1 day').should.equal(time.days(1));
+ ms('3 days').should.equal(time.days(3));
+
+ ms('1 year').should.equal(time.years(1));
+ ms('2 years').should.equal(time.years(2));
+ });
+ });
+});
diff --git a/tests/lib/mocha-3.1.0/test/reporters/base.spec.js b/tests/lib/mocha-3.1.0/test/reporters/base.spec.js
new file mode 100644
index 0000000000..bbd0d3a9a7
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/reporters/base.spec.js
@@ -0,0 +1,214 @@
+var assert = require('assert');
+
+var Base = require('../../lib/reporters/base')
+ , Assert = require('assert').AssertionError;
+
+function makeTest(err) {
+ return {
+ err: err,
+ fullTitle: function () {
+ return 'test title';
+ }
+ };
+}
+
+describe('Base reporter', function () {
+ var stdout
+ , stdoutWrite
+ , useColors;
+
+ beforeEach(function () {
+ stdout = [];
+ stdoutWrite = process.stdout.write;
+ process.stdout.write = function (string) {
+ stdout.push(string);
+ };
+ useColors = Base.useColors;
+ Base.useColors = false;
+ });
+
+ afterEach(function () {
+ process.stdout.write = stdoutWrite;
+ Base.useColors = useColors;
+ });
+
+ describe('showDiff', function() {
+ it('should show diffs by default', function () {
+ var err = new Assert({ actual: 'foo', expected: 'bar' })
+ , errOut;
+
+ var test = makeTest(err);
+
+ Base.list([test]);
+
+ errOut = stdout.join('\n');
+ errOut.should.match(/\- actual/);
+ errOut.should.match(/\+ expected/);
+ });
+
+ it('should show diffs if property set to `true`', function () {
+ var err = new Assert({ actual: 'foo', expected: 'bar' })
+ , errOut;
+
+ err.showDiff = true;
+ var test = makeTest(err);
+
+
+ Base.list([test]);
+
+ errOut = stdout.join('\n');
+ errOut.should.match(/\- actual/);
+ errOut.should.match(/\+ expected/);
+ });
+
+ it('should not show diffs when showDiff property set to `false`', function () {
+ var err = new Assert({ actual: 'foo', expected: 'bar' })
+ , errOut;
+
+ err.showDiff = false;
+ var test = makeTest(err);
+
+ Base.list([test]);
+
+ errOut = stdout.join('\n');
+ errOut.should.not.match(/\- actual/);
+ errOut.should.not.match(/\+ expected/);
+ });
+
+ it('should not show diffs when expected is not defined', function () {
+ var err = new Error('ouch')
+ , errOut;
+
+ var test = makeTest(err);
+
+ Base.list([test]);
+
+ errOut = stdout.join('\n');
+ errOut.should.not.match(/\- actual/);
+ errOut.should.not.match(/\+ expected/);
+ });
+
+ });
+
+ describe('Getting two strings', function() {
+ // Fix regression V1.2.1(see: issue #1241)
+ it('should show strings diff as is', function () {
+ var err = new Error('test'),
+ errOut;
+
+ err.actual = 'foo\nbar';
+ err.expected = 'foo\nbaz';
+ err.showDiff = true;
+ var test = makeTest(err);
+
+ Base.list([test]);
+
+ errOut = stdout.join('\n');
+
+ errOut.should.not.match(/"foo\\nbar"/);
+ errOut.should.match(/foo/).and.match(/bar/);
+ errOut.should.match(/test/);
+ errOut.should.match(/actual/);
+ errOut.should.match(/expected/);
+ });
+ });
+
+ it('should stringify objects', function () {
+ var err = new Error('test'),
+ errOut;
+
+ err.actual = {key:"a1"};
+ err.expected = {key:"e1"};
+ err.showDiff = true;
+ var test = makeTest(err);
+
+ Base.list([test]);
+
+ errOut = stdout.join('\n');
+ errOut.should.match(/"key"/);
+ errOut.should.match(/test/);
+ errOut.should.match(/\- actual/);
+ errOut.should.match(/\+ expected/);
+ });
+
+ it('should stringify Object.create(null)', function () {
+ var err = new Error('test'),
+ errOut;
+
+ err.actual = Object.create(null);
+ err.actual.hasOwnProperty = 1;
+ err.expected = Object.create(null);
+ err.expected.hasOwnProperty = 2;
+ err.showDiff = true;
+ var test = makeTest(err);
+
+ Base.list([test]);
+
+ errOut = stdout.join('\n');
+ errOut.should.match(/"hasOwnProperty"/);
+ errOut.should.match(/test/);
+ errOut.should.match(/\- actual/);
+ errOut.should.match(/\+ expected/);
+ });
+
+ it('should handle error messages that are not strings', function () {
+ var errOut;
+
+ try {
+ assert(false, true);
+ } catch (err) {
+ err.actual = false;
+ err.expected = true;
+ err.showDiff = true;
+ var test = makeTest(err);
+
+ Base.list([test]);
+
+ errOut = stdout.join('\n');
+ errOut.should.match(/\+true/);
+ errOut.should.match(/\-false/);
+ errOut.should.match(/\- actual/);
+ errOut.should.match(/\+ expected/);
+ }
+ });
+
+ it('should remove message from stack', function () {
+ var err = {
+ message: 'Error',
+ stack: 'Error\nfoo\nbar',
+ showDiff: false
+ };
+ var test = makeTest(err);
+
+ Base.list([test]);
+
+ var errOut = stdout.join('\n').trim();
+ errOut.should.equal('1) test title:\n Error\n foo\n bar');
+ });
+
+ it('should use the inspect() property if `message` is not set', function () {
+ var err = {
+ showDiff: false,
+ inspect: function() { return 'an error happened'; },
+ };
+ var test = makeTest(err);
+ Base.list([test]);
+ var errOut = stdout.join('\n').trim();
+ errOut.should.equal('1) test title:\n an error happened');
+ });
+
+ it('should not modify stack if it does not contain message', function () {
+ var err = {
+ message: 'Error',
+ stack: 'foo\nbar',
+ showDiff: false
+ };
+ var test = makeTest(err);
+
+ Base.list([test]);
+
+ var errOut = stdout.join('\n').trim();
+ errOut.should.equal('1) test title:\n Error\n foo\n bar');
+ });
+
+});
diff --git a/tests/lib/mocha-3.1.0/test/reporters/json.spec.js b/tests/lib/mocha-3.1.0/test/reporters/json.spec.js
new file mode 100644
index 0000000000..e7b8955757
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/reporters/json.spec.js
@@ -0,0 +1,61 @@
+var Mocha = require('../../')
+ , Suite = Mocha.Suite
+ , Runner = Mocha.Runner
+ , Test = Mocha.Test;
+
+describe('json reporter', function(){
+ var suite, runner;
+
+ beforeEach(function(){
+ var mocha = new Mocha({
+ reporter: 'json'
+ });
+ suite = new Suite('JSON suite', 'root');
+ runner = new Runner(suite);
+ var mochaReporter = new mocha._reporter(runner);
+ });
+
+ it('should have 1 test failure', function(done){
+ var testTitle = 'json test 1';
+ var error = { message: 'oh shit' };
+
+ suite.addTest(new Test(testTitle, function (done) {
+ done(new Error(error.message));
+ }));
+
+ runner.run(function(failureCount) {
+ failureCount.should.be.exactly(1);
+ runner.should.have.property('testResults');
+ runner.testResults.should.have.property('failures');
+ runner.testResults.failures.should.be.an.instanceOf(Array);
+ runner.testResults.failures.should.have.a.lengthOf(1);
+
+ var failure = runner.testResults.failures[0];
+ failure.should.have.property('title', testTitle);
+ failure.err.message.should.equal(error.message);
+ failure.should.have.properties('err');
+
+ done();
+ });
+ });
+
+ it('should have 1 test pending', function(done) {
+ var testTitle = 'json test 1';
+
+ suite.addTest(new Test(testTitle));
+
+ runner.run(function(failureCount) {
+ failureCount.should.be.exactly(0);
+ runner.should.have.property('testResults');
+ runner.testResults.should.have.property('pending');
+ runner.testResults.pending.should.be.an.instanceOf(Array);
+ runner.testResults.pending.should.have.a.lengthOf(1);
+
+ var pending = runner.testResults.pending[0];
+ pending.should.have.property('title', testTitle);
+
+ done();
+ });
+ })
+
+});
diff --git a/tests/lib/mocha-3.1.0/test/reporters/nyan.spec.js b/tests/lib/mocha-3.1.0/test/reporters/nyan.spec.js
new file mode 100644
index 0000000000..37c9b7c372
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/reporters/nyan.spec.js
@@ -0,0 +1,30 @@
+var reporters = require('../../').reporters
+ , NyanCat = reporters.Nyan;
+
+
+describe('nyan face', function () {
+ it('nyan face:(x .x) when "failures" at least one', function () {
+ var nyanCat = new NyanCat({on: function(){}});
+ nyanCat.stats = { passes: 2, pending: 1, failures: 1 };
+ nyanCat.face.call(nyanCat).should.equal('( x .x)');
+ });
+
+ it('expected nyan face:(x .x) when "pending" at least one and no failing', function () {
+ var nyanCat = new NyanCat({on: function(){}});
+ nyanCat.stats = { passes: 2, pending: 1, failures: 0 };
+ nyanCat.face.call(nyanCat).should.equal('( o .o)');
+ });
+
+ it('expected nyan face:(^ .^) when "passing" only', function () {
+ var nyanCat = new NyanCat({on: function(){}});
+ nyanCat.stats = { passes: 1, pending: 0, failures: 0 };
+ nyanCat.face.call(nyanCat).should.equal('( ^ .^)');
+ });
+
+ it('nyan face:(- .-) when otherwise', function (done) {
+ var nyanCat = new NyanCat({on: function(){}});
+ nyanCat.stats = { passes: 0, pending: 0, failures: 0 };
+ nyanCat.face.call(nyanCat).should.equal('( - .-)');
+ done();
+ });
+});
diff --git a/tests/lib/mocha-3.1.0/test/runnable.spec.js b/tests/lib/mocha-3.1.0/test/runnable.spec.js
new file mode 100644
index 0000000000..d6b020a6a1
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/runnable.spec.js
@@ -0,0 +1,470 @@
+var mocha = require('../')
+ , utils = mocha.utils
+ , Runnable = mocha.Runnable
+ , EventEmitter = require('events').EventEmitter;
+
+describe('Runnable(title, fn)', function(){
+ // For every test we poison the global time-related methods.
+ // runnable.js etc. should keep its own local copy, in order to fix GH-237.
+ // NB: we can't poison global.Date because the normal implementation of
+ // global.setTimeout uses it [1] so if the runnable.js keeps a copy of
+ // global.setTimeout (like it's supposed to), that will blow up.
+ // [1]: https://github.com/joyent/node/blob/7fc835afe362ebd30a0dbec81d3360bd24525222/lib/timers.js#L74
+ var setTimeout = global.setTimeout
+ , setInterval = global.setInterval
+ , clearTimeout = global.clearTimeout
+ , clearInterval = global.clearInterval;
+
+ function poisonPill() {
+ throw new Error("Don't use global time-related stuff.");
+ }
+
+ beforeEach(function(){
+ global.setTimeout =
+ global.setInterval =
+ global.clearTimeout =
+ global.clearInterval = poisonPill;
+ })
+
+ afterEach(function(){
+ global.setTimeout = setTimeout;
+ global.setInterval = setInterval;
+ global.clearTimeout = clearTimeout;
+ global.clearInterval = clearInterval;
+ })
+
+ describe('#timeout(ms)', function(){
+ it('should set the timeout', function(){
+ var run = new Runnable;
+ run.timeout(1000)
+ run.timeout().should.equal(1000);
+ })
+ })
+
+ describe('#timeout(ms) when ms>2^31', function() {
+ it('should set disabled', function() {
+ var run = new Runnable();
+ run.timeout(1e10);
+ run.enableTimeouts().should.be.false;
+ });
+ });
+
+ describe('#enableTimeouts(enabled)', function(){
+ it('should set enabled', function(){
+ var run = new Runnable;
+ run.enableTimeouts(false);
+ run.enableTimeouts().should.equal(false);
+ });
+ });
+
+ describe('#slow(ms)', function() {
+ var run;
+
+ beforeEach(function() {
+ run = new Runnable();
+ });
+
+ it('should set the slow threshold', function() {
+ run.slow(100);
+ run.slow().should.equal(100);
+ });
+
+ it('should not set the slow threshold if the parameter is not passed', function() {
+ run.slow();
+ run.slow().should.equal(75);
+ });
+
+ it('should not set the slow threshold if the parameter is undefined', function() {
+ run.slow(undefined);
+ run.slow().should.equal(75);
+ });
+ })
+
+ describe('.title', function(){
+ it('should be present', function(){
+ new Runnable('foo').title.should.equal('foo');
+ })
+ })
+
+ describe('when arity >= 1', function(){
+ it('should be .async', function(){
+ var run = new Runnable('foo', function(done){});
+ run.async.should.equal(1);
+ run.sync.should.be.false();
+ })
+ })
+
+ describe('when arity == 0', function(){
+ it('should be .sync', function(){
+ var run = new Runnable('foo', function(){});
+ run.async.should.be.equal(0);
+ run.sync.should.be.true();
+ })
+ })
+
+ describe('#globals', function(){
+ it('should allow for whitelisting globals', function(done){
+ var test = new Runnable('foo', function(){});
+ test.async.should.be.equal(0);
+ test.sync.should.be.true();
+ test.globals(['foobar']);
+ test.run(done);
+ })
+ })
+
+ describe('#retries(n)', function(){
+ it('should set the number of retries', function(){
+ var run = new Runnable;
+ run.retries(1);
+ run.retries().should.equal(1);
+ })
+ })
+
+ describe('.run(fn)', function(){
+ describe('when .pending', function(){
+ it('should not invoke the callback', function(done){
+ var test = new Runnable('foo', function(){
+ throw new Error('should not be called');
+ });
+
+ test.pending = true;
+ test.run(done);
+ })
+ })
+
+ describe('when sync', function(){
+ describe('without error', function(){
+ it('should invoke the callback', function(done){
+ var calls = 0;
+ var test = new Runnable('foo', function(){
+ ++calls;
+ });
+
+ test.run(function(err){
+ calls.should.equal(1);
+ test.duration.should.be.type('number');
+ done(err);
+ })
+ })
+ })
+
+ describe('when an exception is thrown', function(){
+ it('should invoke the callback', function(done){
+ var calls = 0;
+ var test = new Runnable('foo', function(){
+ ++calls;
+ throw new Error('fail');
+ });
+
+ test.run(function(err){
+ calls.should.equal(1);
+ err.message.should.equal('fail');
+ done();
+ })
+ })
+ })
+
+ describe('when an exception is thrown and is allowed to remain uncaught', function(){
+ it('throws an error when it is allowed', function(done) {
+ var test = new Runnable('foo', function(){
+ throw new Error('fail');
+ });
+ test.allowUncaught = true;
+ function fail() {
+ test.run(function(err) {});
+ }
+ fail.should.throw('fail');
+ done();
+ })
+ })
+ })
+
+ describe('when timeouts are disabled', function() {
+ it('should not error with timeout', function(done) {
+ var test = new Runnable('foo', function(done){
+ setTimeout(process.nextTick.bind(undefined, done), 2);
+ });
+ test.timeout(1);
+ test.enableTimeouts(false);
+ test.run(done);
+ });
+ });
+
+ describe('when async', function(){
+ describe('without error', function(){
+ it('should invoke the callback', function(done){
+ var calls = 0;
+ var test = new Runnable('foo', function(done){
+ process.nextTick(done);
+ });
+
+ test.run(done);
+ })
+ })
+
+ describe('when the callback is invoked several times', function(){
+ describe('without an error', function(){
+ it('should emit a single "error" event', function(done){
+ var calls = 0;
+ var errCalls = 0;
+
+ var test = new Runnable('foo', function(done){
+ process.nextTick(done);
+ process.nextTick(done);
+ process.nextTick(done);
+ process.nextTick(done);
+ });
+
+ test.on('error', function(err){
+ ++errCalls;
+ err.message.should.equal('done() called multiple times');
+ calls.should.equal(1);
+ errCalls.should.equal(1);
+ done();
+ });
+
+ test.run(function(){
+ ++calls;
+ });
+ })
+ })
+
+ describe('with an error', function(){
+ it('should emit a single "error" event', function(done){
+ var calls = 0;
+ var errCalls = 0;
+
+ var test = new Runnable('foo', function(done){
+ done(new Error('fail'));
+ process.nextTick(done);
+ done(new Error('fail'));
+ process.nextTick(done);
+ process.nextTick(done);
+ });
+
+ test.on('error', function(err){
+ ++errCalls;
+ err.message.should.equal('fail');
+ calls.should.equal(1);
+ errCalls.should.equal(1);
+ done();
+ });
+
+ test.run(function(){
+ ++calls;
+ });
+ })
+ })
+ })
+
+ describe('when an exception is thrown', function(){
+ it('should invoke the callback', function(done){
+ var calls = 0;
+ var test = new Runnable('foo', function(done){
+ throw new Error('fail');
+ process.nextTick(done);
+ });
+
+ test.run(function(err){
+ err.message.should.equal('fail');
+ done();
+ });
+ })
+
+ it('should not throw its own exception if passed a non-object', function (done) {
+ var test = new Runnable('foo', function(done) {
+ throw null;
+ process.nextTick(done);
+ });
+
+ test.run(function(err) {
+ err.message.should.equal(utils.undefinedError().message);
+ done();
+ })
+ });
+ })
+
+ describe('when an exception is thrown and is allowed to remain uncaught', function(){
+ it('throws an error when it is allowed', function(done) {
+ var test = new Runnable('foo', function(done){
+ throw new Error('fail');
+ process.nextTick(done);
+ });
+ test.allowUncaught = true;
+ function fail() {
+ test.run(function(err) {});
+ }
+ fail.should.throw('fail');
+ done();
+ })
+ })
+
+ describe('when an error is passed', function(){
+ it('should invoke the callback', function(done){
+ var calls = 0;
+ var test = new Runnable('foo', function(done){
+ done(new Error('fail'));
+ });
+
+ test.run(function(err){
+ err.message.should.equal('fail');
+ done();
+ });
+ })
+ })
+
+ describe('when done() is invoked with a non-Error object', function(){
+ it('should invoke the callback', function(done){
+ var test = new Runnable('foo', function(done){
+ done({ error: 'Test error' });
+ });
+
+ test.run(function(err){
+ err.message.should.equal('done() invoked with non-Error: {"error":"Test error"}');
+ done();
+ });
+ })
+ })
+
+ describe('when done() is invoked with a string', function(){
+ it('should invoke the callback', function(done){
+ var test = new Runnable('foo', function(done){
+ done('Test error');
+ });
+
+ test.run(function(err){
+ err.message.should.equal('done() invoked with non-Error: Test error');
+ done();
+ });
+ })
+ })
+
+ it('should allow updating the timeout', function(done){
+ var callCount = 0;
+ var increment = function() {
+ callCount++;
+ };
+ var test = new Runnable('foo', function(done){
+ setTimeout(increment, 1);
+ setTimeout(increment, 100);
+ });
+ test.timeout(10);
+ test.run(function(err){
+ err.should.be.ok();
+ callCount.should.equal(1);
+ done();
+ });
+ })
+
+ it('should allow a timeout of 0')
+ })
+
+ describe('when fn returns a promise', function(){
+ describe('when the promise is fulfilled with no value', function(){
+ var fulfilledPromise = {
+ then: function (fulfilled, rejected) {
+ process.nextTick(fulfilled);
+ }
+ };
+
+ it('should invoke the callback', function(done){
+ var test = new Runnable('foo', function(){
+ return fulfilledPromise;
+ });
+
+ test.run(done);
+ })
+ })
+
+ describe('when the promise is fulfilled with a value', function(){
+ var fulfilledPromise = {
+ then: function (fulfilled, rejected) {
+ process.nextTick(function () {
+ fulfilled({});
+ });
+ }
+ };
+
+ it('should invoke the callback', function(done){
+ var test = new Runnable('foo', function(){
+ return fulfilledPromise;
+ });
+
+ test.run(done);
+ })
+ })
+
+ describe('when the promise is rejected', function(){
+ var expectedErr = new Error('fail');
+ var rejectedPromise = {
+ then: function (fulfilled, rejected) {
+ process.nextTick(function () {
+ rejected(expectedErr);
+ });
+ }
+ };
+
+ it('should invoke the callback', function(done){
+ var test = new Runnable('foo', function(){
+ return rejectedPromise;
+ });
+
+ test.run(function(err){
+ err.should.equal(expectedErr);
+ done();
+ });
+ })
+ })
+
+ describe('when the promise is rejected without a reason', function(){
+ var expectedErr = new Error('Promise rejected with no or falsy reason');
+ var rejectedPromise = {
+ then: function (fulfilled, rejected) {
+ process.nextTick(function () {
+ rejected();
+ });
+ }
+ };
+
+ it('should invoke the callback', function(done){
+ var test = new Runnable('foo', function(){
+ return rejectedPromise;
+ });
+
+ test.run(function(err){
+ err.should.eql(expectedErr);
+ done();
+ });
+ })
+ })
+
+ describe('when the promise takes too long to settle', function(){
+ var foreverPendingPromise = {
+ then: function () { }
+ };
+
+ it('should give the timeout error', function(done){
+ var test = new Runnable('foo', function(){
+ return foreverPendingPromise;
+ });
+
+ test.timeout(10);
+ test.run(function(err){
+ err.should.be.ok();
+ done();
+ });
+ })
+ })
+ })
+
+ describe('when fn returns a non-promise', function(){
+ it('should invoke the callback', function(done){
+ var test = new Runnable('foo', function(){
+ return { then: "i ran my tests" };
+ });
+
+ test.run(done);
+ })
+ })
+ })
+})
diff --git a/tests/lib/mocha-3.1.0/test/runner.spec.js b/tests/lib/mocha-3.1.0/test/runner.spec.js
new file mode 100644
index 0000000000..5392d0077b
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/runner.spec.js
@@ -0,0 +1,420 @@
+var mocha = require('../');
+var Suite = mocha.Suite;
+var Runner = mocha.Runner;
+var Test = mocha.Test;
+var Hook = mocha.Hook;
+var path = require('path');
+
+function noop() {}
+
+describe('Runner', function() {
+ var suite;
+ var runner;
+
+ beforeEach(function() {
+ suite = new Suite('Suite', 'root');
+ runner = new Runner(suite);
+ });
+
+ describe('.grep()', function() {
+ it('should update the runner.total with number of matched tests', function() {
+ suite.addTest(new Test('im a test about lions', noop));
+ suite.addTest(new Test('im another test about lions', noop));
+ suite.addTest(new Test('im a test about bears', noop));
+ var newRunner = new Runner(suite);
+ newRunner.grep(/lions/);
+ newRunner.total.should.equal(2);
+ });
+
+ it('should update the runner.total with number of matched tests when inverted', function() {
+ suite.addTest(new Test('im a test about lions', noop));
+ suite.addTest(new Test('im another test about lions', noop));
+ suite.addTest(new Test('im a test about bears', noop));
+ var newRunner = new Runner(suite);
+ newRunner.grep(/lions/, true);
+ newRunner.total.should.equal(1);
+ });
+ });
+
+ describe('.grepTotal()', function() {
+ it('should return the total number of matched tests', function() {
+ suite.addTest(new Test('im a test about lions', noop));
+ suite.addTest(new Test('im another test about lions', noop));
+ suite.addTest(new Test('im a test about bears', noop));
+ runner.grep(/lions/);
+ runner.grepTotal(suite).should.equal(2);
+ });
+
+ it('should return the total number of matched tests when inverted', function() {
+ suite.addTest(new Test('im a test about lions', noop));
+ suite.addTest(new Test('im another test about lions', noop));
+ suite.addTest(new Test('im a test about bears', noop));
+ runner.grep(/lions/, true);
+ runner.grepTotal(suite).should.equal(1);
+ });
+ });
+
+ describe('.globalProps()', function() {
+ it('should include common non enumerable globals', function() {
+ var props = runner.globalProps();
+ props.should.containEql('setTimeout');
+ props.should.containEql('clearTimeout');
+ props.should.containEql('setInterval');
+ props.should.containEql('clearInterval');
+ props.should.containEql('Date');
+ props.should.containEql('XMLHttpRequest');
+ });
+ });
+
+ describe('.globals()', function() {
+ it('should default to the known globals', function() {
+ runner.globals().length.should.be.above(16);
+ });
+
+ it('should white-list globals', function() {
+ runner.globals(['foo', 'bar']);
+ runner.globals().should.containEql('foo');
+ runner.globals().should.containEql('bar');
+ });
+ });
+
+ describe('.checkGlobals(test)', function() {
+ it('should allow variables that match a wildcard', function(done) {
+ runner.globals(['foo*', 'giz*']);
+ global.foo = 'baz';
+ global.gizmo = 'quux';
+ runner.checkGlobals();
+ delete global.foo;
+ delete global.gizmo;
+ done();
+ });
+
+ it('should emit "fail" when a new global is introduced', function(done) {
+ var test = new Test('im a test', noop);
+ runner.checkGlobals();
+ global.foo = 'bar';
+ runner.on('fail', function(_test, err) {
+ _test.should.equal(test);
+ err.message.should.equal('global leak detected: foo');
+ delete global.foo;
+ done();
+ });
+ runner.checkGlobals(test);
+ });
+
+ it('should emit "fail" when a single new disallowed global is introduced after a single extra global is allowed', function(done) {
+ var doneCalled = false;
+ runner.globals('good');
+ global.bad = 1;
+ runner.on('fail', function() {
+ delete global.bad;
+ done();
+ doneCalled = true;
+ });
+ runner.checkGlobals(new Test('yet another test', noop));
+ if (!doneCalled) {
+ done(Error('Expected test failure did not occur.'));
+ }
+ });
+
+ it('should not fail when a new common global is introduced', function() {
+ // verify that the prop isn't enumerable
+ delete global.XMLHttpRequest;
+ global.propertyIsEnumerable('XMLHttpRequest').should.not.be.ok();
+
+ // create a new runner and keep a reference to the test.
+ var test = new Test('im a test about bears', noop);
+ suite.addTest(test);
+ var newRunner = new Runner(suite);
+
+ // make the prop enumerable again.
+ global.XMLHttpRequest = function() {};
+ global.propertyIsEnumerable('XMLHttpRequest').should.be.ok();
+
+ // verify the test hasn't failed.
+ newRunner.checkGlobals(test);
+ test.should.not.have.key('state');
+
+ // clean up our global space.
+ delete global.XMLHttpRequest;
+ });
+
+ it('should pluralize the error message when several are introduced', function(done) {
+ var test = new Test('im a test', noop);
+ runner.checkGlobals();
+ global.foo = 'bar';
+ global.bar = 'baz';
+ runner.on('fail', function(_test, err) {
+ _test.should.equal(test);
+ err.message.should.equal('global leaks detected: foo, bar');
+ delete global.foo;
+ delete global.bar;
+ done();
+ });
+ runner.checkGlobals(test);
+ });
+
+ it('should respect per test whitelisted globals', function() {
+ var test = new Test('im a test about lions', noop);
+ test.globals(['foo']);
+
+ suite.addTest(test);
+ var runner = new Runner(suite);
+
+ global.foo = 'bar';
+
+ // verify the test hasn't failed.
+ runner.checkGlobals(test);
+ test.should.not.have.key('state');
+
+ delete global.foo;
+ });
+
+ it('should respect per test whitelisted globals but still detect other leaks', function(done) {
+ var test = new Test('im a test about lions', noop);
+ test.globals(['foo']);
+
+ suite.addTest(test);
+
+ global.foo = 'bar';
+ global.bar = 'baz';
+ runner.on('fail', function(test, err) {
+ test.title.should.equal('im a test about lions');
+ err.message.should.equal('global leak detected: bar');
+ delete global.foo;
+ done();
+ });
+ runner.checkGlobals(test);
+ });
+
+ it('should emit "fail" when a global beginning with d is introduced', function(done) {
+ global.derp = 'bar';
+ runner.on('fail', function() {
+ delete global.derp;
+ done();
+ });
+ runner.checkGlobals(new Test('herp', function() {}));
+ });
+ });
+
+ describe('.hook(name, fn)', function() {
+ it('should execute hooks after failed test if suite bail is true', function(done) {
+ runner.fail(new Test('failed test', noop));
+ suite.bail(true);
+ suite.afterEach(function() {
+ suite.afterAll(function() {
+ done();
+ });
+ });
+ runner.hook('afterEach', function() {});
+ runner.hook('afterAll', function() {});
+ });
+ });
+
+ describe('.fail(test, err)', function() {
+ it('should increment .failures', function() {
+ runner.failures.should.equal(0);
+ runner.fail(new Test('one', noop), {});
+ runner.failures.should.equal(1);
+ runner.fail(new Test('two', noop), {});
+ runner.failures.should.equal(2);
+ });
+
+ it('should set test.state to "failed"', function() {
+ var test = new Test('some test', noop);
+ runner.fail(test, 'some error');
+ test.state.should.equal('failed');
+ });
+
+ it('should emit "fail"', function(done) {
+ var test = new Test('some other test', noop);
+ var err = {};
+ runner.on('fail', function(test, err) {
+ test.should.equal(test);
+ err.should.equal(err);
+ done();
+ });
+ runner.fail(test, err);
+ });
+
+ it('should emit a helpful message when failed with a string', function(done) {
+ var test = new Test('helpful test', noop);
+ var err = 'string';
+ runner.on('fail', function(test, err) {
+ err.message.should.equal('the string "string" was thrown, throw an Error :)');
+ done();
+ });
+ runner.fail(test, err);
+ });
+
+ it('should emit a the error when failed with an Error instance', function(done) {
+ var test = new Test('a test', noop);
+ var err = new Error('an error message');
+ runner.on('fail', function(test, err) {
+ err.message.should.equal('an error message');
+ done();
+ });
+ runner.fail(test, err);
+ });
+
+ it('should emit the error when failed with an Error-like object', function(done) {
+ var test = new Test('a test', noop);
+ var err = { message: 'an error message' };
+ runner.on('fail', function(test, err) {
+ err.message.should.equal('an error message');
+ done();
+ });
+ runner.fail(test, err);
+ });
+
+ it('should emit a helpful message when failed with an Object', function(done) {
+ var test = new Test('a test', noop);
+ var err = { x: 1 };
+ runner.on('fail', function(test, err) {
+ err.message.should.equal('the object {\n "x": 1\n} was thrown, throw an Error :)');
+ done();
+ });
+ runner.fail(test, err);
+ });
+
+ it('should emit a helpful message when failed with an Array', function(done) {
+ var test = new Test('a test', noop);
+ var err = [
+ 1,
+ 2
+ ];
+ runner.on('fail', function(test, err) {
+ err.message.should.equal('the array [\n 1\n 2\n] was thrown, throw an Error :)');
+ done();
+ });
+ runner.fail(test, err);
+ });
+ });
+
+ describe('.failHook(hook, err)', function() {
+ it('should increment .failures', function() {
+ runner.failures.should.equal(0);
+ runner.failHook(new Test('fail hook 1', noop), {});
+ runner.failures.should.equal(1);
+ runner.failHook(new Test('fail hook 2', noop), {});
+ runner.failures.should.equal(2);
+ });
+
+ it('should augment hook title with current test title', function() {
+ var hook = new Hook('"before each" hook');
+ hook.ctx = { currentTest: new Test('should behave', noop) };
+
+ runner.failHook(hook, {});
+ hook.title.should.equal('"before each" hook for "should behave"');
+
+ hook.ctx.currentTest = new Test('should obey', noop);
+ runner.failHook(hook, {});
+ hook.title.should.equal('"before each" hook for "should obey"');
+ });
+
+ it('should emit "fail"', function(done) {
+ var hook = new Hook();
+ var err = {};
+ runner.on('fail', function(hook, err) {
+ hook.should.equal(hook);
+ err.should.equal(err);
+ done();
+ });
+ runner.failHook(hook, err);
+ });
+
+ it('should emit "end" if suite bail is true', function(done) {
+ var hook = new Hook();
+ var err = {};
+ suite.bail(true);
+ runner.on('end', done);
+ runner.failHook(hook, err);
+ });
+
+ it('should not emit "end" if suite bail is not true', function(done) {
+ var hook = new Hook();
+ var err = {};
+ suite.bail(false);
+ runner.on('end', function() {
+ throw new Error('"end" was emit, but the bail is false');
+ });
+ runner.failHook(hook, err);
+ done();
+ });
+ });
+
+ describe('allowUncaught', function() {
+ it('should allow unhandled errors to propagate through', function(done) {
+ var newRunner = new Runner(suite);
+ newRunner.allowUncaught = true;
+ newRunner.test = new Test('failing test', function() {
+ throw new Error('allow unhandled errors');
+ });
+ function fail() {
+ newRunner.runTest();
+ }
+ fail.should.throw('allow unhandled errors');
+ done();
+ });
+ });
+
+ describe('stackTrace', function() {
+ var stack = [
+ 'AssertionError: foo bar',
+ 'at EventEmitter.<anonymous> (/usr/local/dev/test.js:16:12)',
+ 'at Context.<anonymous> (/usr/local/dev/test.js:19:5)',
+ 'Test.Runnable.run (/usr/local/lib/node_modules/mocha/lib/runnable.js:244:7)',
+ 'Runner.runTest (/usr/local/lib/node_modules/mocha/lib/runner.js:374:10)',
+ '/usr/local/lib/node_modules/mocha/lib/runner.js:452:12',
+ 'next (/usr/local/lib/node_modules/mocha/lib/runner.js:299:14)',
+ '/usr/local/lib/node_modules/mocha/lib/runner.js:309:7',
+ 'next (/usr/local/lib/node_modules/mocha/lib/runner.js:248:23)',
+ 'Immediate._onImmediate (/usr/local/lib/node_modules/mocha/lib/runner.js:276:5)',
+ 'at processImmediate [as _immediateCallback] (timers.js:321:17)'
+ ];
+
+ describe('shortStackTrace', function() {
+ beforeEach(function() {
+ if (path.sep !== '/') {
+ this.skip();
+ }
+ });
+
+ it('should prettify the stack-trace', function(done) {
+ var hook = new Hook();
+ var err = new Error();
+ // Fake stack-trace
+ err.stack = stack.join('\n');
+
+ runner.on('fail', function(hook, err) {
+ err.stack.should.equal(stack.slice(0, 3).join('\n'));
+ done();
+ });
+ runner.failHook(hook, err);
+ });
+ });
+
+ describe('longStackTrace', function() {
+ beforeEach(function() {
+ if (path.sep !== '/') {
+ this.skip();
+ }
+ });
+
+ it('should display the full stack-trace', function(done) {
+ var hook = new Hook();
+ var err = new Error();
+ // Fake stack-trace
+ err.stack = stack.join('\n');
+ // Add --stack-trace option
+ runner.fullStackTrace = true;
+
+ runner.on('fail', function(hook, err) {
+ err.stack.should.equal(stack.join('\n'));
+ done();
+ });
+ runner.failHook(hook, err);
+ });
+ });
+ });
+});
diff --git a/tests/lib/mocha-3.1.0/test/sanity/sanity.spec.js b/tests/lib/mocha-3.1.0/test/sanity/sanity.spec.js
new file mode 100644
index 0000000000..59d5896515
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/sanity/sanity.spec.js
@@ -0,0 +1,9 @@
+'use strict';
+
+var assert = require('assert');
+
+describe('a production installation of Mocha', function() {
+ it('should be able to execute a test', function() {
+ assert.ok(true);
+ });
+});
diff --git a/tests/lib/mocha-3.1.0/test/suite.spec.js b/tests/lib/mocha-3.1.0/test/suite.spec.js
new file mode 100644
index 0000000000..54a1acd667
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/suite.spec.js
@@ -0,0 +1,439 @@
+var mocha = require('../')
+ , Context = mocha.Context
+ , Suite = mocha.Suite
+ , Test = mocha.Test;
+
+describe('Suite', function(){
+ describe('.clone()', function(){
+ beforeEach(function(){
+ this.suite = new Suite('To be cloned');
+ this.suite._timeout = 3043;
+ this.suite._slow = 101;
+ this.suite._bail = true;
+ this.suite.suites.push(1);
+ this.suite.tests.push('hello');
+ this.suite._beforeEach.push(2);
+ this.suite._beforeAll.push(3);
+ this.suite._afterEach.push(4);
+ this.suite._afterAll.push(5);
+ });
+
+ it('should copy the title', function(){
+ this.suite.clone().title.should.equal('To be cloned');
+ });
+
+ it('should copy the timeout value', function(){
+ this.suite.clone().timeout().should.equal(3043);
+ });
+
+ it('should copy the slow value', function(){
+ this.suite.clone().slow().should.equal(101);
+ });
+
+ it('should copy the bail value', function(){
+ this.suite.clone().bail().should.be.true();
+ });
+
+ it('should not copy the values from the suites array', function(){
+ this.suite.clone().suites.should.be.empty();
+ });
+
+ it('should not copy the values from the tests array', function(){
+ this.suite.clone().tests.should.be.empty();
+ });
+
+ it('should not copy the values from the _beforeEach array', function(){
+ this.suite.clone()._beforeEach.should.be.empty();
+ });
+
+ it('should not copy the values from the _beforeAll array', function(){
+ this.suite.clone()._beforeAll.should.be.empty();
+ });
+
+ it('should not copy the values from the _afterEach array', function(){
+ this.suite.clone()._afterEach.should.be.empty();
+ });
+
+ it('should not copy the values from the _afterAll array', function(){
+ this.suite.clone()._afterAll.should.be.empty();
+ });
+ });
+
+ describe('.timeout()', function(){
+ beforeEach(function(){
+ this.suite = new Suite('A Suite');
+ });
+
+ describe('when no argument is passed', function(){
+ it('should return the timeout value', function(){
+ this.suite.timeout().should.equal(2000);
+ });
+ });
+
+ describe('when argument is passed', function(){
+ it('should return the Suite object', function(){
+ var newSuite = this.suite.timeout(5000);
+ newSuite.timeout().should.equal(5000);
+ });
+ });
+ });
+
+ describe('.slow()', function(){
+ beforeEach(function(){
+ this.suite = new Suite('A Suite');
+ });
+
+ describe('when given a string', function(){
+ it('should parse it', function(){
+ this.suite.slow('5 seconds');
+ this.suite.slow().should.equal(5000);
+ })
+ })
+
+ describe('when no argument is passed', function(){
+ it('should return the slow value', function(){
+ this.suite.slow().should.equal(75);
+ });
+ });
+
+ describe('when argument is passed', function(){
+ it('should return the Suite object', function(){
+ var newSuite = this.suite.slow(5000);
+ newSuite.slow().should.equal(5000);
+ });
+ });
+ });
+
+ describe('.bail()', function(){
+ beforeEach(function(){
+ this.suite = new Suite('A Suite');
+ this.suite._bail = true
+ });
+
+ describe('when no argument is passed', function(){
+ it('should return the bail value', function(){
+ this.suite.bail().should.be.true();
+ });
+ });
+
+ describe('when argument is passed', function(){
+ it('should return the Suite object', function(){
+ var newSuite = this.suite.bail(false);
+ newSuite.bail().should.be.false();
+ });
+ });
+ });
+
+ describe('.beforeAll()', function(){
+ beforeEach(function(){
+ this.suite = new Suite('A Suite');
+ });
+
+ describe('wraps the passed in function in a Hook', function(){
+ it('adds it to _beforeAll', function(){
+ var fn = function(){};
+ this.suite.beforeAll(fn);
+
+ this.suite._beforeAll.should.have.length(1);
+ var beforeAllItem = this.suite._beforeAll[0];
+ beforeAllItem.title.should.match(/^"before all" hook/);
+ beforeAllItem.fn.should.equal(fn);
+ });
+
+ it('appends title to hook', function(){
+ var fn = function(){};
+ this.suite.beforeAll('test', fn);
+
+ this.suite._beforeAll.should.have.length(1);
+ var beforeAllItem = this.suite._beforeAll[0];
+ beforeAllItem.title.should.equal('"before all" hook: test');
+ beforeAllItem.fn.should.equal(fn);
+
+ function namedFn(){}
+ this.suite.beforeAll(namedFn);
+ this.suite._beforeAll.should.have.length(2);
+ beforeAllItem = this.suite._beforeAll[1];
+ beforeAllItem.title.should.equal('"before all" hook: namedFn');
+ beforeAllItem.fn.should.equal(namedFn);
+ });
+ });
+ });
+
+ describe('.afterAll()', function(){
+ beforeEach(function(){
+ this.suite = new Suite('A Suite');
+ });
+
+ describe('wraps the passed in function in a Hook', function(){
+ it('adds it to _afterAll', function(){
+ var fn = function(){};
+ this.suite.afterAll(fn);
+
+ this.suite._afterAll.should.have.length(1);
+ var afterAllItem = this.suite._afterAll[0];
+ afterAllItem.title.should.match(/^"after all" hook/);
+ afterAllItem.fn.should.equal(fn);
+ });
+ it('appends title to hook', function(){
+ var fn = function(){};
+ this.suite.afterAll('test', fn);
+
+ this.suite._afterAll.should.have.length(1);
+ var beforeAllItem = this.suite._afterAll[0];
+ beforeAllItem.title.should.equal('"after all" hook: test');
+ beforeAllItem.fn.should.equal(fn);
+
+ function namedFn(){}
+ this.suite.afterAll(namedFn);
+ this.suite._afterAll.should.have.length(2);
+ beforeAllItem = this.suite._afterAll[1];
+ beforeAllItem.title.should.equal('"after all" hook: namedFn');
+ beforeAllItem.fn.should.equal(namedFn);
+ });
+ });
+ });
+
+ describe('.beforeEach()', function(){
+ beforeEach(function(){
+ this.suite = new Suite('A Suite');
+ });
+
+ describe('wraps the passed in function in a Hook', function(){
+ it('adds it to _beforeEach', function(){
+ var fn = function(){};
+ this.suite.beforeEach(fn);
+
+ this.suite._beforeEach.should.have.length(1);
+ var beforeEachItem = this.suite._beforeEach[0];
+ beforeEachItem.title.should.match(/^"before each" hook/);
+ beforeEachItem.fn.should.equal(fn);
+ });
+
+ it('appends title to hook', function(){
+ var fn = function(){};
+ this.suite.beforeEach('test', fn);
+
+ this.suite._beforeEach.should.have.length(1);
+ var beforeAllItem = this.suite._beforeEach[0];
+ beforeAllItem.title.should.equal('"before each" hook: test');
+ beforeAllItem.fn.should.equal(fn);
+
+ function namedFn(){}
+ this.suite.beforeEach(namedFn);
+ this.suite._beforeEach.should.have.length(2);
+ beforeAllItem = this.suite._beforeEach[1];
+ beforeAllItem.title.should.equal('"before each" hook: namedFn');
+ beforeAllItem.fn.should.equal(namedFn);
+ });
+ });
+ });
+
+ describe('.afterEach()', function(){
+ beforeEach(function(){
+ this.suite = new Suite('A Suite');
+ });
+
+ describe('wraps the passed in function in a Hook', function(){
+ it('adds it to _afterEach', function(){
+ var fn = function(){};
+ this.suite.afterEach(fn);
+
+ this.suite._afterEach.should.have.length(1);
+ var afterEachItem = this.suite._afterEach[0];
+ afterEachItem.title.should.match(/^"after each" hook/);
+ afterEachItem.fn.should.equal(fn);
+ });
+
+ it('appends title to hook', function(){
+ var fn = function(){};
+ this.suite.afterEach('test', fn);
+
+ this.suite._afterEach.should.have.length(1);
+ var beforeAllItem = this.suite._afterEach[0];
+ beforeAllItem.title.should.equal('"after each" hook: test');
+ beforeAllItem.fn.should.equal(fn);
+
+ function namedFn(){}
+ this.suite.afterEach(namedFn);
+ this.suite._afterEach.should.have.length(2);
+ beforeAllItem = this.suite._afterEach[1];
+ beforeAllItem.title.should.equal('"after each" hook: namedFn');
+ beforeAllItem.fn.should.equal(namedFn);
+ });
+ });
+ });
+
+ describe('.addSuite()', function(){
+ beforeEach(function(){
+ this.first = new Suite('First suite');
+ this.first.timeout(4002);
+ this.first.slow(200);
+ this.second = new Suite('Second suite');
+ this.first.addSuite(this.second);
+ });
+
+ it('sets the parent on the added Suite', function(){
+ this.second.parent.should.equal(this.first);
+ });
+
+ it('copies the timeout value', function(){
+ this.second.timeout().should.equal(4002);
+ });
+
+ it('copies the slow value', function(){
+ this.second.slow().should.equal(200);
+ });
+
+ it('adds the suite to the suites collection', function(){
+ this.first.suites.should.have.length(1);
+ this.first.suites[0].should.equal(this.second);
+ });
+
+ it('treats suite as pending if its parent is pending', function(){
+ this.first.pending = true
+ this.second.isPending.should.be.true
+ });
+ });
+
+ // describe('.addTest()', function(){
+ // beforeEach(function(){
+ // this.suite = new Suite('A Suite', new Context);
+ // this.suite.timeout(4002);
+ // this.test = new Test('test');
+ // this.suite.addTest(this.test);
+ // });
+ //
+ // it('sets the parent on the added test', function(){
+ // this.test.parent.should.equal(this.suite);
+ // });
+ //
+ // it('copies the timeout value', function(){
+ // this.test.timeout().should.equal(4002);
+ // });
+ //
+ // it('adds the test to the tests collection', function(){
+ // this.suite.tests.should.have.length(1);
+ // this.suite.tests[0].should.equal(this.test);
+ // });
+ // });
+
+ describe('.fullTitle()', function(){
+ beforeEach(function(){
+ this.suite = new Suite('A Suite');
+ });
+
+ describe('when there is no parent', function(){
+ it('returns the suite title', function(){
+ this.suite.fullTitle().should.equal('A Suite');
+ });
+ });
+
+ describe('when there is a parent', function(){
+ it('returns the combination of parent\'s and suite\'s title', function(){
+ var parentSuite = new Suite('I am a parent');
+ parentSuite.addSuite(this.suite);
+ this.suite.fullTitle().should.equal('I am a parent A Suite');
+ });
+ });
+ });
+
+ describe('.total()', function(){
+ beforeEach(function(){
+ this.suite = new Suite('A Suite');
+ });
+
+ describe('when there are no nested suites or tests', function(){
+ it('should return 0', function(){
+ this.suite.total().should.equal(0);
+ });
+ });
+
+ describe('when there are several tests in the suite', function(){
+ it('should return the number', function(){
+ this.suite.addTest(new Test('a child test'));
+ this.suite.addTest(new Test('another child test'));
+ this.suite.total().should.equal(2);
+ });
+ });
+ });
+
+ describe('.eachTest(fn)', function(){
+ beforeEach(function(){
+ this.suite = new Suite('A Suite');
+ });
+
+ describe('when there are no nested suites or tests', function(){
+ it('should return 0', function(){
+ var n = 0;
+ function fn(){ n++; }
+ this.suite.eachTest(fn);
+ n.should.equal(0);
+ });
+ });
+
+ describe('when there are several tests in the suite', function(){
+ it('should return the number', function(){
+ this.suite.addTest(new Test('a child test'));
+ this.suite.addTest(new Test('another child test'));
+
+ var n = 0;
+ function fn(){ n++; }
+ this.suite.eachTest(fn);
+ n.should.equal(2);
+ });
+ });
+
+ describe('when there are several levels of nested suites', function(){
+ it('should return the number', function(){
+ this.suite.addTest(new Test('a child test'));
+ var suite = new Suite('a child suite');
+ suite.addTest(new Test('a test in a child suite'));
+ this.suite.addSuite(suite);
+
+ var n = 0;
+ function fn(){ n++; }
+ this.suite.eachTest(fn);
+ n.should.equal(2);
+ });
+ });
+
+ });
+
+ describe('initialization', function() {
+ it('should throw an error if the title isn\'t a string', function() {
+ (function() {
+ new Suite(undefined, 'root');
+ }).should.throw();
+
+ (function() {
+ new Suite(function(){}, 'root');
+ }).should.throw();
+ });
+
+ it('should not throw if the title is a string', function() {
+ (function() {
+ new Suite('Bdd suite', 'root');
+ }).should.not.throw();
+ });
+ });
+});
+
+describe('Test', function() {
+ describe('initialization', function() {
+ it('should throw an error if the title isn\'t a string', function() {
+ (function() {
+ new Test(function(){});
+ }).should.throw();
+
+ (function() {
+ new Test(undefined, function(){});
+ }).should.throw();
+ });
+
+ it('should not throw if the title is a string', function() {
+ (function() {
+ new Test('test-case', function(){});
+ }).should.not.throw();
+ });
+ });
+}); \ No newline at end of file
diff --git a/tests/lib/mocha-3.1.0/test/test.spec.js b/tests/lib/mocha-3.1.0/test/test.spec.js
new file mode 100644
index 0000000000..5dea7919db
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/test.spec.js
@@ -0,0 +1,76 @@
+var mocha = require('../')
+ , should = require('should')
+ , Context = mocha.Context
+ , Test = mocha.Test;
+
+describe('Test', function(){
+ describe('.clone()', function(){
+ beforeEach(function(){
+ this._test = new Test('To be cloned', function () {});
+ this._test._timeout = 3043;
+ this._test._slow = 101;
+ this._test._enableTimeouts = true;
+ this._test._retries = 3;
+ this._test._currentRetry = 1;
+ this._test._allowedGlobals = ['foo'];
+ this._test.parent = 'foo';
+ this._test.file = 'bar';
+ });
+
+ it('should copy the title', function(){
+ this._test.clone().title.should.equal('To be cloned');
+ });
+
+ it('should copy the timeout value', function(){
+ this._test.clone().timeout().should.equal(3043);
+ });
+
+ it('should copy the slow value', function(){
+ this._test.clone().slow().should.equal(101);
+ });
+
+ it('should copy the enableTimeouts value', function(){
+ this._test.clone().enableTimeouts().should.be.true();
+ });
+
+ it('should copy the retries value', function(){
+ this._test.clone().retries().should.equal(3);
+ });
+
+ it('should copy the currentRetry value', function(){
+ this._test.clone().currentRetry().should.equal(1);
+ });
+
+ it('should copy the globals value', function(){
+ this._test.clone().globals().should.not.be.empty();
+ });
+
+ it('should copy the parent value', function(){
+ this._test.clone().parent.should.equal('foo');
+ });
+
+ it('should copy the file value', function(){
+ this._test.clone().file.should.equal('bar');
+ });
+ });
+
+ describe('.isPending()', function(){
+ beforeEach(function(){
+ this._test = new Test('Is it skipped', function () {});
+ });
+
+ it('should not be pending by default', function(){
+ should(this._test.isPending()).not.be.ok();
+ });
+
+ it('should be pending when marked as such', function(){
+ this._test.pending = true;
+ should(this._test.isPending()).be.ok();
+ });
+
+ it('should be pending when its parent is pending', function(){
+ this._test.parent = { isPending: function(){ return true } };
+ should(this._test.isPending()).be.ok();
+ });
+ });
+});
diff --git a/tests/lib/mocha-3.1.0/test/utils.spec.js b/tests/lib/mocha-3.1.0/test/utils.spec.js
new file mode 100644
index 0000000000..4683809ae6
--- /dev/null
+++ b/tests/lib/mocha-3.1.0/test/utils.spec.js
@@ -0,0 +1,259 @@
+var mocha = require('..');
+var utils = mocha.utils;
+var path = require('path');
+var JSON = require('json3');
+
+describe('utils', function() {
+ describe('.clean()', function() {
+ var clean = utils.clean;
+ it('should remove the wrapping function declaration', function() {
+ clean('function (one, two, three) {\n//code\n}').should.equal('//code');
+ });
+
+ it('should handle newlines in the function declaration', function() {
+ clean('function (one, two, three)\n {\n//code\n}').should.equal('//code');
+ });
+
+ it('should remove space character indentation from the function body', function() {
+ clean(' //line1\n //line2').should.equal('//line1\n //line2');
+ });
+
+ it('should remove tab character indentation from the function body', function() {
+ clean('\t//line1\n\t\t//line2').should.equal('//line1\n\t//line2');
+ });
+
+ it('should handle functions with tabs in their declarations', function() {
+ clean('function\t(\t)\t{\n//code\n}').should.equal('//code');
+ });
+
+ it('should handle named functions without space after name', function() {
+ clean('function withName() {\n//code\n}').should.equal('//code');
+ });
+
+ it('should handle named functions with space after name', function() {
+ clean('function withName () {\n//code\n}').should.equal('//code');
+ });
+
+ it('should handle functions with no space between the end and the closing brace', function() {
+ clean('function() {/*code*/}').should.equal('/*code*/');
+ });
+
+ it('should handle functions with parentheses in the same line', function() {
+ clean('function() { if (true) { /* code */ } }').should.equal('if (true) { /* code */ }');
+ });
+
+ it('should handle empty functions', function() {
+ clean('function() {}').should.equal('');
+ });
+ });
+
+ describe('.isBuffer()', function() {
+ var isBuffer = utils.isBuffer;
+ it('should test if object is a Buffer', function() {
+ isBuffer(new Buffer([0x01])).should.equal(true);
+ isBuffer({}).should.equal(false);
+ })
+ });
+
+ describe('.map()', function() {
+ var map = utils.map;
+ it('should behave same as Array.prototype.map', function() {
+ var arr = [1, 2, 3];
+ map(arr, JSON.stringify).should.eql(arr.map(JSON.stringify));
+ });
+
+ it('should call the callback with 3 arguments[currentValue, index, array]', function() {
+ var index = 0;
+ map([1, 2, 3], function(e, i, arr) {
+ e.should.equal(arr[index]);
+ i.should.equal(index++);
+ })
+ });
+
+ it('should apply with the given scope', function() {
+ var scope = {};
+ map(['a', 'b', 'c'], function() {
+ this.should.equal(scope);
+ }, scope);
+ });
+ });
+
+ describe('.parseQuery()', function() {
+ var parseQuery = utils.parseQuery;
+ it('should get queryString and return key-value object', function() {
+ parseQuery('?foo=1&bar=2&baz=3').should.eql({
+ foo: '1',
+ bar: '2',
+ baz: '3'
+ });
+
+ parseQuery('?r1=^@(?!.*\\)$)&r2=m{2}&r3=^co.*').should.eql({
+ r1: '^@(?!.*\\)$)',
+ r2: 'm{2}',
+ r3: '^co.*'
+ });
+ })
+ });
+
+ describe('.stackTraceFilter()', function() {
+ describe('on node', function() {
+ var filter = utils.stackTraceFilter();
+
+ describe('on POSIX OS', function () {
+ before(function () {
+ if (path.sep !== '/') {
+ this.skip();
+ }
+ });
+
+ it('should get a stack-trace as a string and prettify it', function () {
+ var stack = [
+ 'AssertionError: foo bar',
+ 'at EventEmitter.<anonymous> (/usr/local/dev/test.js:16:12)',
+ 'at Context.<anonymous> (/usr/local/dev/test.js:19:5)',
+ 'Test.Runnable.run (/usr/local/lib/node_modules/mocha/lib/runnable.js:244:7)',
+ 'Runner.runTest (/usr/local/lib/node_modules/mocha/lib/runner.js:374:10)',
+ '/usr/local/lib/node_modules/mocha/lib/runner.js:452:12',
+ 'next (/usr/local/lib/node_modules/mocha/lib/runner.js:299:14)',
+ '/usr/local/lib/node_modules/mocha/lib/runner.js:309:7',
+ 'next (/usr/local/lib/node_modules/mocha/lib/runner.js:248:23)',
+ 'Immediate._onImmediate (/usr/local/lib/node_modules/mocha/lib/runner.js:276:5)',
+ 'at processImmediate [as _immediateCallback] (timers.js:321:17)'
+ ];
+ filter(stack.join('\n'))
+ .should
+ .equal(stack.slice(0, 3)
+ .join('\n'));
+
+ stack = [
+ 'AssertionError: bar baz',
+ 'at /usr/local/dev/some-test-file.js:25:8',
+ 'at tryCatcher (/usr/local/dev/own/tmp/node_modules/bluebird/js/main/util.js:24:31)',
+ 'at Promise._resolveFromResolver (/usr/local/dev/own/tmp/node_modules/bluebird/js/main/promise.js:439:31)',
+ 'at new Promise (/usr/local/dev/own/tmp/node_modules/bluebird/js/main/promise.js:53:37)',
+ 'at yourFunction (/usr/local/dev/own/tmp/test1.js:24:13)',
+ 'at Context.<anonymous> (/usr/local/dev/some-test-file:30:4)',
+ 'Test.Runnable.run (/usr/local/lib/node_modules/mocha/lib/runnable.js:218:15)',
+ 'next (/usr/local/lib/node_modules/mocha/lib/runner.js:248:23)',
+ 'Immediate._onImmediate (/usr/local/lib/node_modules/mocha/lib/runner.js:276:5)',
+ 'at processImmediate [as _immediateCallback] (timers.js:321:17)'
+ ];
+
+ filter(stack.join('\n'))
+ .should
+ .equal(stack.slice(0, 7)
+ .join('\n'));
+ });
+
+ it('does not ignore other bower_components and components',
+ function () {
+ var stack = [
+ 'Error: failed',
+ 'at assert (index.html:11:26)',
+ 'at Context.<anonymous> (test.js:17:18)',
+ 'at bower_components/should/should.js:4827:7',
+ 'at next (file:///.../bower_components/should/should.js:4766:23)',
+ 'at components/should/5.0.0/should.js:4827:7',
+ 'at next (file:///.../components/should/5.0.0/should.js:4766:23)',
+ 'at file:///.../bower_components/mocha/mocha.js:4794:5',
+ 'at timeslice (.../components/mocha/mocha.js:6218:27)',
+ 'at Test.require.register.Runnable.run (file:///.../components/mochajs/mocha/2.1.0/mocha.js:4463:15)',
+ 'at Runner.require.register.Runner.runTest (file:///.../components/mochajs/mocha/2.1.0/mocha.js:4892:10)',
+ 'at file:///.../components/mochajs/mocha/2.1.0/mocha.js:4970:12',
+ 'at next (file:///.../components/mochajs/mocha/2.1.0/mocha.js:4817:14)'
+ ];
+ filter(stack.join('\n'))
+ .should
+ .equal(stack.slice(0, 7)
+ .join('\n'));
+ });
+
+ it('should replace absolute with relative paths', function () {
+ var stack = [
+ 'Error: ' + process.cwd() + '/bla.js has a problem',
+ 'at foo (' + process.cwd() + '/foo/index.js:13:226)',
+ 'at bar (/usr/local/dev/own/tmp/node_modules/bluebird/js/main/promise.js:11:26)'
+ ];
+
+ var expected = [
+ 'Error: ' + process.cwd() + '/bla.js has a problem',
+ 'at foo (foo/index.js:13:226)',
+ 'at bar (/usr/local/dev/own/tmp/node_modules/bluebird/js/main/promise.js:11:26)'
+ ];
+
+ filter(stack.join('\n'))
+ .should
+ .equal(expected.join('\n'));
+ });
+ });
+
+ describe('on Windows', function() {
+ before(function () {
+ if (path.sep === '/') {
+ this.skip();
+ }
+ });
+
+ it('should work on Windows', function () {
+ var stack = [
+ 'Error: failed',
+ 'at Context.<anonymous> (C:\\Users\\ishida\\src\\test\\test\\mytest.js:5:9)',
+ 'at callFn (C:\\Users\\ishida\\src\\test\\node_modules\\mocha\\lib\\runnable.js:326:21)',
+ 'at Test.Runnable.run (C:\\Users\\ishida\\src\\test\\node_modules\\mocha\\lib\\runnable.js:319:7)',
+ 'at Runner.runTest (C:\\Users\\ishida\\src\\test\\node_modules\\mocha\\lib\\runner.js:422:10)',
+ 'at C:\\Users\\ishida\\src\\test\\node_modules\\mocha\\lib\\runner.js:528:12',
+ 'at next (C:\\Users\\ishida\\src\\test\\node_modules\\mocha\\lib\\runner.js:342:14)',
+ 'at C:\\Users\\ishida\\src\\test\\node_modules\\mocha\\lib\\runner.js:352:7',
+ 'at next (C:\\Users\\ishida\\src\\test\\node_modules\\mocha\\lib\\runner.js:284:14)',
+ 'at Immediate._onImmediate (C:\\Users\\ishida\\src\\test\\node_modules\\mocha\\lib\\runner.js:320:5)'
+ ];
+ filter(stack.join('\n'))
+ .should
+ .equal(stack.slice(0, 2)
+ .join('\n'));
+ });
+ });
+ });
+
+ describe('on browser', function() {
+ var filter;
+ before(function() {
+ global.document = true;
+ global.location = { href: 'localhost:3000/foo/bar/index.html' };
+ filter = utils.stackTraceFilter();
+ });
+ it('does not strip out other bower_components', function() {
+ var stack = ['Error: failed'
+ , 'at assert (index.html:11:26)'
+ , 'at Context.<anonymous> (test.js:17:18)'
+ , 'at bower_components/should/should.js:4827:7'
+ , 'at next (bower_components/should/should.js:4766:23)'
+ , 'at components/should/5.0.0/should.js:4827:7'
+ , 'at next (components/should/5.0.0/should.js:4766:23)'
+ , 'at Runner.require.register.Runner.runTest (node_modules/mocha.js:4892:10)'
+ , 'at localhost:3000/foo/bar/node_modules/mocha.js:4970:12'
+ , 'at next (node_modules/mocha.js:4817:14)'];
+ filter(stack.join('\n')).should.equal(stack.slice(0,7).join('\n'));
+ });
+
+ after(function() {
+ delete global.document;
+ delete global.location;
+ });
+ });
+ });
+
+ describe('.isPromise', function() {
+ it('should return true if the value is Promise-ish', function() {
+ utils.isPromise({then: function() {}}).should.be.true;
+ });
+
+ it('should return false if the value is not an object', function() {
+ utils.isPromise(1).should.be.false;
+ });
+
+ it('should return false if the value is an object w/o a "then" function', function() {
+ utils.isPromise({}).should.be.false;
+ });
+ });
+});
diff --git a/tests/lib/q-1.4.1/CHANGES.md b/tests/lib/q-1.4.1/CHANGES.md
index cd351fdb85..eb60b0d7af 100644
--- a/tests/lib/q-1.4.1/CHANGES.md
+++ b/tests/lib/q-1.4.1/CHANGES.md
@@ -655,7 +655,7 @@ Their replacements are listed here:
- Fixed a minor bug in thenable assimilation, regressed
because of the change in the forwarding protocol.
- Fixed behavior of "q/util" `deep` method on dates and
- other primitives. Github issue #11.
+ other primitives. GitHub issue #11.
## 0.2.6
diff --git a/tests/lib/screenshot-testing/support/app.js b/tests/lib/screenshot-testing/support/app.js
index 4617112baf..42115a8d79 100644
--- a/tests/lib/screenshot-testing/support/app.js
+++ b/tests/lib/screenshot-testing/support/app.js
@@ -63,7 +63,7 @@ Application.prototype.printHelpAndExit = function () {
console.log(" the tests are in another plugin. For use with travis build.");
console.log(" --assume-artifacts: Assume the diffviewer and processed screenshots will be stored on the.");
console.log(" builds artifacts server. For use with travis build.");
- console.log(" --screenshot-repo: Specifies the github repository that contains the expected screenshots");
+ console.log(" --screenshot-repo: Specifies the GitHub repository that contains the expected screenshots");
console.log(" to link to in the diffviewer. For use with travis build.");
console.log(" --core: Only execute UI tests that are for Piwik core or Piwik core plugins.");
console.log(" --first-half: Only execute first half of all the test suites. Will be only applied if no")
@@ -142,7 +142,7 @@ Application.prototype.loadTestModules = function () {
// we apply this option only if not a specific plugin or test suite was requested. Only there for travis to
// split tests into multiple jobs.
var numTestsFirstHalf = Math.round(mocha.suite.suites.length / 2);
- numTestsFirstHalf += 7;
+ numTestsFirstHalf += 8;
mocha.suite.suites = mocha.suite.suites.filter(function (suite, index) {
if (options['run-first-half-only'] && index < numTestsFirstHalf) {
return true;
@@ -264,4 +264,4 @@ Application.prototype.appendMissingExpected = function (screenName) {
fs.write(missingExpectedFilePath, screenName + "\n", "a");
};
-exports.Application = new Application(); \ No newline at end of file
+exports.Application = new Application();
diff --git a/tests/lib/screenshot-testing/support/diff-viewer.js b/tests/lib/screenshot-testing/support/diff-viewer.js
index a3fc42d9b7..92180e4730 100644
--- a/tests/lib/screenshot-testing/support/diff-viewer.js
+++ b/tests/lib/screenshot-testing/support/diff-viewer.js
@@ -70,7 +70,7 @@ DiffViewerGenerator.prototype.generate = function (callback) {
}
expectedHtml += '<a href="' + expectedUrl + '">Expected</a>&nbsp;';
- githubUrl = '<a href="' + expectedUrlGithub + '">Github</a>';
+ githubUrl = '<a href="' + expectedUrlGithub + '">GitHub</a>';
} else {
var expectedHtml = '<em>Not found</em>';
}
@@ -123,4 +123,4 @@ DiffViewerGenerator.prototype.generate = function (callback) {
callback();
};
-exports.DiffViewerGenerator = DiffViewerGenerator; \ No newline at end of file
+exports.DiffViewerGenerator = DiffViewerGenerator;
diff --git a/tests/lib/screenshot-testing/support/page-renderer.js b/tests/lib/screenshot-testing/support/page-renderer.js
index 34fca8c69c..1551a68511 100644
--- a/tests/lib/screenshot-testing/support/page-renderer.js
+++ b/tests/lib/screenshot-testing/support/page-renderer.js
@@ -110,6 +110,10 @@ PageRenderer.prototype.evaluate = function (impl, waitTime) {
this.queuedEvents.push([this._evaluate, waitTime, impl]);
};
+PageRenderer.prototype.execCallback = function (callback, waitTime) {
+ this.queuedEvents.push([this._execCallback, waitTime, callback]);
+};
+
PageRenderer.prototype.downloadLink = function (selector, waitTime) {
this.queuedEvents.push([this._downloadLink, waitTime, selector]);
};
@@ -277,6 +281,11 @@ PageRenderer.prototype._evaluate = function (impl, callback) {
callback();
};
+PageRenderer.prototype._execCallback = function (actualCallback, callback) {
+ actualCallback();
+ callback();
+};
+
PageRenderer.prototype._downloadLink = function (str, callback) {
var url = this.webpage.evaluate(function (selector) {
return $(selector).attr('href');